brcm47xx: resolve GPIO conflict for WRT54GSv1
authorMirko Parthey <mirko.parthey@web.de>
Mon, 26 Jun 2017 16:25:46 +0000 (18:25 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 2 Jul 2017 20:44:06 +0000 (22:44 +0200)
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>
target/linux/brcm47xx/patches-4.4/209-b44-register-adm-switch.patch
target/linux/generic/files/drivers/net/phy/adm6996.c
target/linux/generic/files/include/linux/platform_data/adm6996-gpio.h

index 115b6aea79ddd7eac76b69bbc99a97c4d0b768f7..7e3d1d61737c33512ed9e32bc89d4c863754e69a 100644 (file)
@@ -19,7 +19,7 @@ Subject: [PATCH 210/210] b44: register adm switch
  
  #include <asm/uaccess.h>
  #include <asm/io.h>
-@@ -2240,6 +2242,70 @@ static void b44_adjust_link(struct net_d
+@@ -2240,6 +2242,69 @@ static void b44_adjust_link(struct net_d
        }
  }
  
@@ -50,11 +50,10 @@ Subject: [PATCH 210/210] b44: register adm switch
 +      else
 +              adm_data.eedi = 4;
 +
-+      gpio = bcm47xx_nvram_gpio_pin("adm_rc");
-+      if (gpio >= 0)
-+              adm_data.eerc = gpio;
-+      else
-+              adm_data.eerc = 5;
++      /*
++       * 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";
@@ -90,7 +89,7 @@ Subject: [PATCH 210/210] b44: register adm switch
  static int b44_register_phy_one(struct b44 *bp)
  {
        struct mii_bus *mii_bus;
-@@ -2283,6 +2349,9 @@ static int b44_register_phy_one(struct b
+@@ -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))) {
  
@@ -100,7 +99,7 @@ Subject: [PATCH 210/210] b44: register adm switch
                dev_info(sdev->dev,
                         "could not find PHY at %i, use fixed one\n",
                         bp->phy_addr);
-@@ -2479,6 +2548,7 @@ static void b44_remove_one(struct ssb_de
+@@ -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);
index 25776b83665160d2f6a6a91953df71b4bd31ba81..d9ea828929380eb67d54c6fe2ed415c44f9e4801 100644 (file)
@@ -67,7 +67,6 @@ struct adm6996_priv {
        u8 eecs;
        u8 eesk;
        u8 eedi;
-       u8 eerc;
 
        enum adm6996_model model;
 
@@ -1141,7 +1140,6 @@ static int adm6996_gpio_probe(struct platform_device *pdev)
 
        priv->eecs = pdata->eecs;
        priv->eedi = pdata->eedi;
-       priv->eerc = pdata->eerc;
        priv->eesk = pdata->eesk;
 
        priv->model = pdata->model;
@@ -1152,9 +1150,6 @@ static int adm6996_gpio_probe(struct platform_device *pdev)
        if (ret)
                return ret;
        ret = devm_gpio_request(&pdev->dev, priv->eedi, "adm_eedi");
-       if (ret)
-               return ret;
-       ret = devm_gpio_request(&pdev->dev, priv->eerc, "adm_eerc");
        if (ret)
                return ret;
        ret = devm_gpio_request(&pdev->dev, priv->eesk, "adm_eesk");
index e4fcfafa74d3d8f8dd5abc3efaa69b0a9e582399..d5af9bbf6e5588956e9ac2e85d2cc7a7863c3122 100644 (file)
@@ -23,7 +23,6 @@ struct adm6996_gpio_platform_data {
        u8 eecs;
        u8 eesk;
        u8 eedi;
-       u8 eerc;
        enum adm6996_model model;
 };