MIPS: BCM47XX: Add new file for device specific workarounds
authorRafał Miłecki <zajec5@gmail.com>
Fri, 21 Mar 2014 09:08:08 +0000 (10:08 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Mon, 31 Mar 2014 16:17:12 +0000 (18:17 +0200)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Cc: linux-mips@linux-mips.org
Cc: Hauke Mehrtens <hauke@hauke-m.de>
Patchwork: https://patchwork.linux-mips.org/patch/6627/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/bcm47xx/Makefile
arch/mips/bcm47xx/bcm47xx_private.h
arch/mips/bcm47xx/setup.c
arch/mips/bcm47xx/workarounds.c [new file with mode: 0644]

index 4688b6a..d58c51b 100644 (file)
@@ -4,4 +4,4 @@
 #
 
 obj-y                          += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
-obj-y                          += board.o buttons.o leds.o
+obj-y                          += board.o buttons.o leds.o workarounds.o
index 5c94ace..0194c3b 100644 (file)
@@ -9,4 +9,7 @@ int __init bcm47xx_buttons_register(void);
 /* leds.c */
 void __init bcm47xx_leds_register(void);
 
+/* workarounds.c */
+void __init bcm47xx_workarounds(void);
+
 #endif
index b847d03..63a4b0e 100644 (file)
@@ -282,6 +282,7 @@ static int __init bcm47xx_register_bus_complete(void)
        }
        bcm47xx_buttons_register();
        bcm47xx_leds_register();
+       bcm47xx_workarounds();
 
        fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status);
        return 0;
diff --git a/arch/mips/bcm47xx/workarounds.c b/arch/mips/bcm47xx/workarounds.c
new file mode 100644 (file)
index 0000000..e81ce46
--- /dev/null
@@ -0,0 +1,31 @@
+#include "bcm47xx_private.h"
+
+#include <linux/gpio.h>
+#include <bcm47xx_board.h>
+#include <bcm47xx.h>
+
+static void __init bcm47xx_workarounds_netgear_wnr3500l(void)
+{
+       const int usb_power = 12;
+       int err;
+
+       err = gpio_request_one(usb_power, GPIOF_OUT_INIT_HIGH, "usb_power");
+       if (err)
+               pr_err("Failed to request USB power gpio: %d\n", err);
+       else
+               gpio_free(usb_power);
+}
+
+void __init bcm47xx_workarounds(void)
+{
+       enum bcm47xx_board board = bcm47xx_board_get();
+
+       switch (board) {
+       case BCM47XX_BOARD_NETGEAR_WNR3500L:
+               bcm47xx_workarounds_netgear_wnr3500l();
+               break;
+       default:
+               /* No workaround(s) needed */
+               break;
+       }
+}