/branches/gl-inet/target/linux/brcm47xx/patches-4.9/209-b44-register-adm-switch.patch |
@@ -0,0 +1,121 @@ |
From b36f694256f41bc71571f467646d015dda128d14 Mon Sep 17 00:00:00 2001 |
From: Hauke Mehrtens <hauke@hauke-m.de> |
Date: Sat, 9 Nov 2013 17:03:59 +0100 |
Subject: [PATCH 210/210] b44: register adm switch |
|
--- |
drivers/net/ethernet/broadcom/b44.c | 57 +++++++++++++++++++++++++++++++++++ |
drivers/net/ethernet/broadcom/b44.h | 3 ++ |
2 files changed, 60 insertions(+) |
|
--- a/drivers/net/ethernet/broadcom/b44.c |
+++ b/drivers/net/ethernet/broadcom/b44.c |
@@ -31,6 +31,8 @@ |
#include <linux/ssb/ssb.h> |
#include <linux/slab.h> |
#include <linux/phy.h> |
+#include <linux/platform_device.h> |
+#include <linux/platform_data/adm6996-gpio.h> |
|
#include <asm/uaccess.h> |
#include <asm/io.h> |
@@ -2250,6 +2252,69 @@ static void b44_adjust_link(struct net_d |
} |
} |
|
+#ifdef CONFIG_BCM47XX |
+static int b44_register_adm_switch(struct b44 *bp) |
+{ |
+ int gpio; |
+ 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"); |
+ if (gpio >= 0) |
+ adm_data.eecs = gpio; |
+ else |
+ adm_data.eecs = 2; |
+ |
+ gpio = bcm47xx_nvram_gpio_pin("adm_eesk"); |
+ if (gpio >= 0) |
+ adm_data.eesk = gpio; |
+ else |
+ adm_data.eesk = 3; |
+ |
+ gpio = bcm47xx_nvram_gpio_pin("adm_eedi"); |
+ if (gpio >= 0) |
+ adm_data.eedi = gpio; |
+ else |
+ adm_data.eedi = 4; |
+ |
+ /* |
+ * We ignore the "adm_rc" GPIO here. The driver does not use it, |
+ * and it conflicts with the Reset button GPIO on the Linksys WRT54GSv1. |
+ */ |
+ |
+ 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) { |
+ pdev = platform_device_register_full(&info); |
+ if (IS_ERR(pdev)) |
+ return PTR_ERR(pdev); |
+ |
+ bp->adm_switch = pdev; |
+ } |
+ return 0; |
+} |
+static void b44_unregister_adm_switch(struct b44 *bp) |
+{ |
+ if (bp->adm_switch) |
+ platform_device_unregister(bp->adm_switch); |
+} |
+#else |
+static int b44_register_adm_switch(struct b44 *bp) |
+{ |
+ return 0; |
+} |
+static void b44_unregister_adm_switch(struct b44 *bp) |
+{ |
+ |
+} |
+#endif /* CONFIG_BCM47XX */ |
+ |
static int b44_register_phy_one(struct b44 *bp) |
{ |
struct mii_bus *mii_bus; |
@@ -2285,6 +2350,9 @@ static int b44_register_phy_one(struct b |
if (!mdiobus_is_registered_device(bp->mii_bus, bp->phy_addr) && |
(sprom->boardflags_lo & (B44_BOARDFLAG_ROBO | B44_BOARDFLAG_ADM))) { |
|
+ if (sprom->boardflags_lo & B44_BOARDFLAG_ADM) |
+ b44_register_adm_switch(bp); |
+ |
dev_info(sdev->dev, |
"could not find PHY at %i, use fixed one\n", |
bp->phy_addr); |
@@ -2476,6 +2544,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); |
netif_napi_del(&bp->napi); |
--- a/drivers/net/ethernet/broadcom/b44.h |
+++ b/drivers/net/ethernet/broadcom/b44.h |
@@ -407,6 +407,9 @@ struct b44 { |
struct mii_bus *mii_bus; |
int old_link; |
struct mii_if_info mii_if; |
+ |
+ /* platform device for associated switch */ |
+ struct platform_device *adm_switch; |
}; |
|
#endif /* _B44_H */ |