#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/delay.h>
-#include <linux/rtl8366s.h>
+#include <linux/rtl8366.h>
#include <asm/mach-ar71xx/ar71xx.h>
}
};
-static struct rtl8366s_initval dir825b1_rtl8366s_initvals[] = {
+static struct rtl8366_initval dir825b1_rtl8366s_initvals[] = {
{ .reg = 0x06, .val = 0x0108 },
};
-static struct rtl8366s_platform_data dir825b1_rtl8366s_data = {
+static struct rtl8366_platform_data dir825b1_rtl8366s_data = {
.gpio_sda = DIR825B1_GPIO_RTL8366_SDA,
.gpio_sck = DIR825B1_GPIO_RTL8366_SCK,
.num_initvals = ARRAY_SIZE(dir825b1_rtl8366s_initvals),
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/platform_device.h>
-#include <linux/rtl8366rb.h>
+#include <linux/rtl8366.h>
#include <asm/mach-ar71xx/ar71xx.h>
#include "machtype.h"
}
};
-static struct rtl8366rb_platform_data tl_wr1043nd_rtl8366rb_data = {
+static struct rtl8366_platform_data tl_wr1043nd_rtl8366rb_data = {
.gpio_sda = TL_WR1043ND_GPIO_RTL8366_SDA,
.gpio_sck = TL_WR1043ND_GPIO_RTL8366_SCK,
};
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/delay.h>
-#include <linux/rtl8366s.h>
+#include <linux/rtl8366.h>
#include <asm/mach-ar71xx/ar71xx.h>
}
};
-static struct rtl8366s_platform_data wndr3700_rtl8366s_data = {
+static struct rtl8366_platform_data wndr3700_rtl8366s_data = {
.gpio_sda = WNDR3700_GPIO_RTL8366_SDA,
.gpio_sck = WNDR3700_GPIO_RTL8366_SCK,
};
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
#include <linux/nxp_74hc153.h>
-#include <linux/rtl8366s.h>
+#include <linux/rtl8366.h>
#include <asm/mips_machine.h>
#include <asm/mach-ar71xx/ar71xx.h>
}
};
-static struct rtl8366s_platform_data wzrhpg300nh_rtl8366s_data = {
+static struct rtl8366_platform_data wzrhpg300nh_rtl8366_data = {
.gpio_sda = WZRHPG300NH_GPIO_RTL8366_SDA,
.gpio_sck = WZRHPG300NH_GPIO_RTL8366_SCK,
};
.name = RTL8366S_DRIVER_NAME,
.id = -1,
.dev = {
- .platform_data = &wzrhpg300nh_rtl8366s_data,
+ .platform_data = &wzrhpg300nh_rtl8366_data,
+ }
+};
+
+static struct platform_device wzrhpg301nh_rtl8366rb_device = {
+ .name = RTL8366RB_DRIVER_NAME,
+ .id = -1,
+ .dev = {
+ .platform_data = &wzrhpg300nh_rtl8366_data,
}
};
static void __init wzrhpg300nh_setup(void)
{
u8 *eeprom = (u8 *) KSEG1ADDR(0x1fff1000);
+ bool hasrtl8366rb = false;
ar71xx_set_mac_base(eeprom + WZRHPG300NH_MAC_OFFSET);
- ar71xx_eth0_pll_data.pll_1000 = 0x1e000100;
- ar71xx_eth0_data.mii_bus_dev = &wzrhpg300nh_rtl8366s_device.dev;
+ if (rtl8366_smi_detect(&wzrhpg300nh_rtl8366_data) == RTL8366_TYPE_RB)
+ hasrtl8366rb = true;
+
+ if (hasrtl8366rb) {
+ ar71xx_eth0_pll_data.pll_1000 = 0x1f000000;
+ ar71xx_eth0_data.mii_bus_dev = &wzrhpg301nh_rtl8366rb_device.dev;
+ ar71xx_eth1_pll_data.pll_1000 = 0x100;
+ ar71xx_eth1_data.mii_bus_dev = &wzrhpg301nh_rtl8366rb_device.dev;
+ } else {
+ ar71xx_eth0_pll_data.pll_1000 = 0x1e000100;
+ ar71xx_eth0_data.mii_bus_dev = &wzrhpg300nh_rtl8366s_device.dev;
+ ar71xx_eth1_pll_data.pll_1000 = 0x1e000100;
+ ar71xx_eth1_data.mii_bus_dev = &wzrhpg300nh_rtl8366s_device.dev;
+ }
+
ar71xx_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
ar71xx_eth0_data.speed = SPEED_1000;
ar71xx_eth0_data.duplex = DUPLEX_FULL;
- ar71xx_eth1_pll_data.pll_1000 = 0x1e000100;
- ar71xx_eth1_data.mii_bus_dev = &wzrhpg300nh_rtl8366s_device.dev;
ar71xx_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
ar71xx_eth1_data.phy_mask = 0x10;
#include <linux/gpio.h>
#include <linux/spinlock.h>
#include <linux/skbuff.h>
+#include <linux/rtl8366.h>
#ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
#include <linux/debugfs.h>
}
EXPORT_SYMBOL_GPL(rtl8366_smi_alloc);
-int rtl8366_smi_init(struct rtl8366_smi *smi)
+static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name)
{
int err;
- if (!smi->ops)
- return -EINVAL;
-
- err = gpio_request(smi->gpio_sda, dev_name(smi->parent));
+ err = gpio_request(smi->gpio_sda, name);
if (err) {
- dev_err(smi->parent, "gpio_request failed for %u, err=%d\n",
+ printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n",
smi->gpio_sda, err);
goto err_out;
}
- err = gpio_request(smi->gpio_sck, dev_name(smi->parent));
+ err = gpio_request(smi->gpio_sck, name);
if (err) {
- dev_err(smi->parent, "gpio_request failed for %u, err=%d\n",
+ printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n",
smi->gpio_sck, err);
goto err_free_sda;
}
+ spin_lock_init(&smi->lock);
+ return 0;
+
+ err_free_sda:
+ gpio_free(smi->gpio_sda);
+ err_out:
+ return err;
+}
+
+static void __rtl8366_smi_cleanup(struct rtl8366_smi *smi)
+{
+ gpio_free(smi->gpio_sck);
+ gpio_free(smi->gpio_sda);
+}
+
+enum rtl8366_type rtl8366_smi_detect(struct rtl8366_platform_data *pdata)
+{
+ static struct rtl8366_smi smi;
+ enum rtl8366_type type = RTL8366_TYPE_UNKNOWN;
+ u32 reg = 0;
+
+ memset(&smi, 0, sizeof(smi));
+ smi.gpio_sda = pdata->gpio_sda;
+ smi.gpio_sck = pdata->gpio_sck;
+
+ if (__rtl8366_smi_init(&smi, "rtl8366"))
+ goto out;
+
+ if (rtl8366_smi_read_reg(&smi, 0x5c, ®))
+ goto cleanup;
+
+ switch(reg) {
+ case 0x6027:
+ printk("Found an RTL8366S switch\n");
+ type = RTL8366_TYPE_S;
+ break;
+ case 0x5937:
+ printk("Found an RTL8366RB switch\n");
+ type = RTL8366_TYPE_RB;
+ break;
+ default:
+ printk("Found an Unknown RTL8366 switch (id=0x%04x)\n", reg);
+ break;
+ }
+
+cleanup:
+ __rtl8366_smi_cleanup(&smi);
+out:
+ return type;
+}
+
+int rtl8366_smi_init(struct rtl8366_smi *smi)
+{
+ int err;
+
+ if (!smi->ops)
+ return -EINVAL;
+
+ err = __rtl8366_smi_init(smi, dev_name(smi->parent));
+ if (err)
+ goto err_out;
+
spin_lock_init(&smi->lock);
dev_info(smi->parent, "using GPIO pins %u (SDA) and %u (SCK)\n",
return 0;
err_free_sck:
- gpio_free(smi->gpio_sck);
- err_free_sda:
- gpio_free(smi->gpio_sda);
+ __rtl8366_smi_cleanup(smi);
err_out:
return err;
}
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/skbuff.h>
-#include <linux/rtl8366rb.h>
+#include <linux/rtl8366.h>
#include "rtl8366_smi.h"
static int __devinit rtl8366rb_probe(struct platform_device *pdev)
{
static int rtl8366_smi_version_printed;
- struct rtl8366rb_platform_data *pdata;
+ struct rtl8366_platform_data *pdata;
struct rtl8366_smi *smi;
int err;
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/skbuff.h>
-#include <linux/rtl8366s.h>
+#include <linux/rtl8366.h>
#include "rtl8366_smi.h"
static int rtl8366s_hw_init(struct rtl8366_smi *smi)
{
- struct rtl8366s_platform_data *pdata;
+ struct rtl8366_platform_data *pdata;
int err;
pdata = smi->parent->platform_data;
static int __devinit rtl8366s_probe(struct platform_device *pdev)
{
static int rtl8366_smi_version_printed;
- struct rtl8366s_platform_data *pdata;
+ struct rtl8366_platform_data *pdata;
struct rtl8366_smi *smi;
int err;
--- /dev/null
+/*
+ * Platform data definition for the Realtek RTL8366RB/S ethernet switch driver
+ *
+ * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#ifndef _RTL8366_H
+#define _RTL8366_H
+
+#define RTL8366_DRIVER_NAME "rtl8366"
+#define RTL8366S_DRIVER_NAME "rtl8366s"
+#define RTL8366RB_DRIVER_NAME "rtl8366rb"
+
+enum rtl8366_type {
+ RTL8366_TYPE_UNKNOWN,
+ RTL8366_TYPE_S,
+ RTL8366_TYPE_RB,
+};
+
+struct rtl8366_initval {
+ unsigned reg;
+ u16 val;
+};
+
+struct rtl8366_platform_data {
+ unsigned gpio_sda;
+ unsigned gpio_sck;
+ unsigned num_initvals;
+ struct rtl8366_initval *initvals;
+};
+
+enum rtl8366_type rtl8366_smi_detect(struct rtl8366_platform_data *pdata);
+
+#endif /* _RTL8366_H */
+++ /dev/null
-/*
- * Platform data definition for the Realtek RTL8366S ethernet switch driver
- *
- * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- */
-
-#ifndef _RTL8366RB_H
-#define _RTL8366RB_H
-
-#define RTL8366RB_DRIVER_NAME "rtl8366rb"
-
-struct rtl8366rb_platform_data {
- unsigned gpio_sda;
- unsigned gpio_sck;
-};
-
-#endif /* _RTL8366RB_SMI_H */
+++ /dev/null
-/*
- * Platform data definition for the Realtek RTL8366S ethernet switch driver
- *
- * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 as published
- * by the Free Software Foundation.
- */
-
-#ifndef _RTL8366S_H
-#define _RTL8366S_H
-
-#define RTL8366S_DRIVER_NAME "rtl8366s"
-
-struct rtl8366s_initval {
- unsigned reg;
- u16 val;
-};
-
-struct rtl8366s_platform_data {
- unsigned gpio_sda;
- unsigned gpio_sck;
- unsigned num_initvals;
- struct rtl8366s_initval *initvals;
-};
-
-#endif /* _RTL8366_SMI_H */