1dace8cbe0
On the Linksys WRT54GSv1, the adm6996 switch driver and the gpio_button_hotplug module both claim GPIO 6, which is connected to the Reset button. When the switch driver's request wins, the Reset button cannot work. This makes it impossible to enter failsafe mode without a serial console. Stop requesting the "adm_rc" GPIO in the switch driver, since it is not used anywhere. Fixes FS#792. Signed-off-by: Mirko Parthey <mirko.parthey@web.de>
121 lines
3.1 KiB
Diff
121 lines
3.1 KiB
Diff
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>
|
|
@@ -2240,6 +2242,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;
|
|
@@ -2283,6 +2348,9 @@ static int b44_register_phy_one(struct b
|
|
if (!bp->mii_bus->phy_map[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);
|
|
@@ -2479,6 +2547,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
|
|
@@ -408,6 +408,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 */
|