You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.1 KiB
122 lines
3.1 KiB
7 years ago
|
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 */
|