|
@@ -19,66 +19,78 @@ Subject: [PATCH 210/210] b44: register adm switch
|
|
|
|
|
|
|
|
#include <asm/uaccess.h>
|
|
#include <asm/uaccess.h>
|
|
|
#include <asm/io.h>
|
|
#include <asm/io.h>
|
|
|
-@@ -2227,6 +2229,58 @@ static void b44_adjust_link(struct net_d
|
|
|
|
|
|
|
+@@ -2227,6 +2229,70 @@ static void b44_adjust_link(struct net_d
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef CONFIG_BCM47XX
|
|
+#ifdef CONFIG_BCM47XX
|
|
|
-+static struct adm6996_gpio_platform_data b44_adm_data = {
|
|
|
|
|
-+ .eecs = 2,
|
|
|
|
|
-+ .eesk = 3,
|
|
|
|
|
-+ .eedi = 4,
|
|
|
|
|
-+ .eerc = 5,
|
|
|
|
|
-+ .model = ADM6996L,
|
|
|
|
|
-+};
|
|
|
|
|
-+
|
|
|
|
|
-+static struct platform_device b44_adm_dev = {
|
|
|
|
|
-+ .name = "adm6996_gpio",
|
|
|
|
|
-+ .id = -1,
|
|
|
|
|
-+ .dev = {
|
|
|
|
|
-+ .platform_data = &b44_adm_data,
|
|
|
|
|
-+ },
|
|
|
|
|
-+};
|
|
|
|
|
-+
|
|
|
|
|
+static int b44_register_adm_switch(struct b44 *bp)
|
|
+static int b44_register_adm_switch(struct b44 *bp)
|
|
|
+{
|
|
+{
|
|
|
+ int gpio;
|
|
+ int gpio;
|
|
|
-+ int err;
|
|
|
|
|
|
|
++ struct platform_device *pdev;
|
|
|
|
|
++ struct adm6996_gpio_platform_data adm_data = {0};
|
|
|
|
|
++ struct platform_device_info info = {0};
|
|
|
+
|
|
+
|
|
|
|
|
++ adm_data.model = ADM6996L;
|
|
|
+ gpio = bcm47xx_nvram_gpio_pin("adm_eecs");
|
|
+ gpio = bcm47xx_nvram_gpio_pin("adm_eecs");
|
|
|
+ if (gpio >= 0)
|
|
+ if (gpio >= 0)
|
|
|
-+ b44_adm_data.eecs = gpio;
|
|
|
|
|
|
|
++ adm_data.eecs = gpio;
|
|
|
|
|
++ else
|
|
|
|
|
++ adm_data.eecs = 2;
|
|
|
+
|
|
+
|
|
|
+ gpio = bcm47xx_nvram_gpio_pin("adm_eesk");
|
|
+ gpio = bcm47xx_nvram_gpio_pin("adm_eesk");
|
|
|
+ if (gpio >= 0)
|
|
+ if (gpio >= 0)
|
|
|
-+ b44_adm_data.eesk = gpio;
|
|
|
|
|
|
|
++ adm_data.eesk = gpio;
|
|
|
|
|
++ else
|
|
|
|
|
++ adm_data.eesk = 3;
|
|
|
+
|
|
+
|
|
|
+ gpio = bcm47xx_nvram_gpio_pin("adm_eedi");
|
|
+ gpio = bcm47xx_nvram_gpio_pin("adm_eedi");
|
|
|
+ if (gpio >= 0)
|
|
+ if (gpio >= 0)
|
|
|
-+ b44_adm_data.eedi = gpio;
|
|
|
|
|
|
|
++ adm_data.eedi = gpio;
|
|
|
|
|
++ else
|
|
|
|
|
++ adm_data.eedi = 4;
|
|
|
+
|
|
+
|
|
|
+ gpio = bcm47xx_nvram_gpio_pin("adm_rc");
|
|
+ gpio = bcm47xx_nvram_gpio_pin("adm_rc");
|
|
|
+ if (gpio >= 0)
|
|
+ if (gpio >= 0)
|
|
|
-+ b44_adm_data.eerc = gpio;
|
|
|
|
|
|
|
++ adm_data.eerc = gpio;
|
|
|
|
|
++ else
|
|
|
|
|
++ adm_data.eerc = 5;
|
|
|
|
|
++
|
|
|
|
|
++ info.parent = bp->sdev->dev;
|
|
|
|
|
++ info.name = "adm6996_gpio";
|
|
|
|
|
++ info.id = -1;
|
|
|
|
|
++ info.data = &adm_data;
|
|
|
|
|
++ info.size_data = sizeof(adm_data);
|
|
|
+
|
|
+
|
|
|
+ if (!bp->adm_switch) {
|
|
+ if (!bp->adm_switch) {
|
|
|
-+ err = platform_device_register(&b44_adm_dev);
|
|
|
|
|
-+ if (!err)
|
|
|
|
|
-+ bp->adm_switch = &b44_adm_dev;
|
|
|
|
|
|
|
++ pdev = platform_device_register_full(&info);
|
|
|
|
|
++ if (IS_ERR(pdev))
|
|
|
|
|
++ return PTR_ERR(pdev);
|
|
|
|
|
++
|
|
|
|
|
++ bp->adm_switch = pdev;
|
|
|
+ }
|
|
+ }
|
|
|
-+ return err;
|
|
|
|
|
|
|
++ return 0;
|
|
|
|
|
++}
|
|
|
|
|
++static void b44_unregister_adm_switch(struct b44 *bp)
|
|
|
|
|
++{
|
|
|
|
|
++ if (bp->adm_switch)
|
|
|
|
|
++ platform_device_unregister(bp->adm_switch);
|
|
|
+}
|
|
+}
|
|
|
+#else
|
|
+#else
|
|
|
+static int b44_register_adm_switch(struct b44 *bp)
|
|
+static int b44_register_adm_switch(struct b44 *bp)
|
|
|
+{
|
|
+{
|
|
|
+ return 0;
|
|
+ return 0;
|
|
|
+}
|
|
+}
|
|
|
|
|
++static void b44_unregister_adm_switch(struct b44 *bp)
|
|
|
|
|
++{
|
|
|
|
|
++
|
|
|
|
|
++}
|
|
|
+#endif /* CONFIG_BCM47XX */
|
|
+#endif /* CONFIG_BCM47XX */
|
|
|
+
|
|
+
|
|
|
static int b44_register_phy_one(struct b44 *bp)
|
|
static int b44_register_phy_one(struct b44 *bp)
|
|
|
{
|
|
{
|
|
|
struct mii_bus *mii_bus;
|
|
struct mii_bus *mii_bus;
|
|
|
-@@ -2270,6 +2324,9 @@ static int b44_register_phy_one(struct b
|
|
|
|
|
|
|
+@@ -2270,6 +2336,9 @@ static int b44_register_phy_one(struct b
|
|
|
if (!bp->mii_bus->phy_map[bp->phy_addr] &&
|
|
if (!bp->mii_bus->phy_map[bp->phy_addr] &&
|
|
|
(sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
|
|
(sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) {
|
|
|
|
|
|
|
@@ -88,6 +100,14 @@ Subject: [PATCH 210/210] b44: register adm switch
|
|
|
dev_info(sdev->dev,
|
|
dev_info(sdev->dev,
|
|
|
"could not find PHY at %i, use fixed one\n",
|
|
"could not find PHY at %i, use fixed one\n",
|
|
|
bp->phy_addr);
|
|
bp->phy_addr);
|
|
|
|
|
+@@ -2465,6 +2534,7 @@ static void b44_remove_one(struct ssb_de
|
|
|
|
|
+ unregister_netdev(dev);
|
|
|
|
|
+ if (bp->flags & B44_FLAG_EXTERNAL_PHY)
|
|
|
|
|
+ b44_unregister_phy_one(bp);
|
|
|
|
|
++ b44_unregister_adm_switch(bp);
|
|
|
|
|
+ ssb_device_disable(sdev, 0);
|
|
|
|
|
+ ssb_bus_may_powerdown(sdev->bus);
|
|
|
|
|
+ free_netdev(dev);
|
|
|
--- a/drivers/net/ethernet/broadcom/b44.h
|
|
--- a/drivers/net/ethernet/broadcom/b44.h
|
|
|
+++ b/drivers/net/ethernet/broadcom/b44.h
|
|
+++ b/drivers/net/ethernet/broadcom/b44.h
|
|
|
@@ -404,6 +404,9 @@ struct b44 {
|
|
@@ -404,6 +404,9 @@ struct b44 {
|