diff options
-rw-r--r-- | arch/mips/bcm47xx/Makefile | 2 | ||||
-rw-r--r-- | arch/mips/bcm47xx/bcm47xx_private.h | 3 | ||||
-rw-r--r-- | arch/mips/bcm47xx/setup.c | 1 | ||||
-rw-r--r-- | arch/mips/bcm47xx/workarounds.c | 31 |
4 files changed, 36 insertions, 1 deletions
diff --git a/arch/mips/bcm47xx/Makefile b/arch/mips/bcm47xx/Makefile index 4688b6a6211b..d58c51b5e501 100644 --- a/arch/mips/bcm47xx/Makefile +++ b/arch/mips/bcm47xx/Makefile | |||
@@ -4,4 +4,4 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o | 6 | obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o |
7 | obj-y += board.o buttons.o leds.o | 7 | obj-y += board.o buttons.o leds.o workarounds.o |
diff --git a/arch/mips/bcm47xx/bcm47xx_private.h b/arch/mips/bcm47xx/bcm47xx_private.h index 5c94acebf76a..0194c3b9a729 100644 --- a/arch/mips/bcm47xx/bcm47xx_private.h +++ b/arch/mips/bcm47xx/bcm47xx_private.h | |||
@@ -9,4 +9,7 @@ int __init bcm47xx_buttons_register(void); | |||
9 | /* leds.c */ | 9 | /* leds.c */ |
10 | void __init bcm47xx_leds_register(void); | 10 | void __init bcm47xx_leds_register(void); |
11 | 11 | ||
12 | /* workarounds.c */ | ||
13 | void __init bcm47xx_workarounds(void); | ||
14 | |||
12 | #endif | 15 | #endif |
diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c index b847d0373443..63a4b0e915dc 100644 --- a/arch/mips/bcm47xx/setup.c +++ b/arch/mips/bcm47xx/setup.c | |||
@@ -282,6 +282,7 @@ static int __init bcm47xx_register_bus_complete(void) | |||
282 | } | 282 | } |
283 | bcm47xx_buttons_register(); | 283 | bcm47xx_buttons_register(); |
284 | bcm47xx_leds_register(); | 284 | bcm47xx_leds_register(); |
285 | bcm47xx_workarounds(); | ||
285 | 286 | ||
286 | fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status); | 287 | fixed_phy_add(PHY_POLL, 0, &bcm47xx_fixed_phy_status); |
287 | return 0; | 288 | return 0; |
diff --git a/arch/mips/bcm47xx/workarounds.c b/arch/mips/bcm47xx/workarounds.c new file mode 100644 index 000000000000..e81ce4623070 --- /dev/null +++ b/arch/mips/bcm47xx/workarounds.c | |||
@@ -0,0 +1,31 @@ | |||
1 | #include "bcm47xx_private.h" | ||
2 | |||
3 | #include <linux/gpio.h> | ||
4 | #include <bcm47xx_board.h> | ||
5 | #include <bcm47xx.h> | ||
6 | |||
7 | static void __init bcm47xx_workarounds_netgear_wnr3500l(void) | ||
8 | { | ||
9 | const int usb_power = 12; | ||
10 | int err; | ||
11 | |||
12 | err = gpio_request_one(usb_power, GPIOF_OUT_INIT_HIGH, "usb_power"); | ||
13 | if (err) | ||
14 | pr_err("Failed to request USB power gpio: %d\n", err); | ||
15 | else | ||
16 | gpio_free(usb_power); | ||
17 | } | ||
18 | |||
19 | void __init bcm47xx_workarounds(void) | ||
20 | { | ||
21 | enum bcm47xx_board board = bcm47xx_board_get(); | ||
22 | |||
23 | switch (board) { | ||
24 | case BCM47XX_BOARD_NETGEAR_WNR3500L: | ||
25 | bcm47xx_workarounds_netgear_wnr3500l(); | ||
26 | break; | ||
27 | default: | ||
28 | /* No workaround(s) needed */ | ||
29 | break; | ||
30 | } | ||
31 | } | ||