/branches/18.06.1/target/linux/brcm63xx/patches-4.9/377-MIPS-BCM63XX-register-lookup-for-ephy-reset-gpio.patch |
@@ -0,0 +1,128 @@ |
From d13bdf92ec885105cf107183f8464c40e5f3b93b Mon Sep 17 00:00:00 2001 |
From: Jonas Gorski <jogo@openwrt.org> |
Date: Sat, 21 Feb 2015 17:21:59 +0100 |
Subject: [PATCH 4/6] MIPS: BCM63XX: register lookup for ephy-reset gpio |
|
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org> |
--- |
arch/mips/bcm63xx/boards/board_bcm963xx.c | 2 +- |
arch/mips/bcm63xx/boards/board_common.c | 7 +++-- |
arch/mips/bcm63xx/gpio.c | 32 ++++++++++++++++++++ |
arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h | 2 ++ |
.../mips/include/asm/mach-bcm63xx/board_bcm963xx.h | 5 +-- |
5 files changed, 42 insertions(+), 6 deletions(-) |
|
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c |
+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c |
@@ -55,7 +55,7 @@ static struct board_info __initdata boar |
}, |
|
.ephy_reset_gpio = 36, |
- .ephy_reset_gpio_flags = GPIOF_INIT_HIGH, |
+ .ephy_reset_gpio_flags = GPIO_ACTIVE_LOW, |
}; |
#endif |
|
--- a/arch/mips/bcm63xx/boards/board_common.c |
+++ b/arch/mips/bcm63xx/boards/board_common.c |
@@ -247,9 +247,10 @@ int __init board_register_devices(void) |
|
platform_device_register(&bcm63xx_gpio_leds); |
|
- if (board.ephy_reset_gpio && board.ephy_reset_gpio_flags) |
- gpio_request_one(board.ephy_reset_gpio, |
- board.ephy_reset_gpio_flags, "ephy-reset"); |
+ if (board.ephy_reset_gpio && board.ephy_reset_gpio_flags) { |
+ bcm63xx_gpio_ephy_reset(board.ephy_reset_gpio, |
+ board.ephy_reset_gpio_flags); |
+ } |
|
return 0; |
} |
--- a/arch/mips/bcm63xx/gpio.c |
+++ b/arch/mips/bcm63xx/gpio.c |
@@ -8,14 +8,22 @@ |
* Copyright (C) Jonas Gorski <jogo@openwrt.org> |
*/ |
|
+#include <asm/addrspace.h> |
+ |
#include <linux/kernel.h> |
#include <linux/platform_device.h> |
#include <linux/gpio/driver.h> |
+#include <linux/gpio/machine.h> |
|
#include <bcm63xx_cpu.h> |
#include <bcm63xx_gpio.h> |
#include <bcm63xx_regs.h> |
|
+static const char * const gpio_chip_labels[] = { |
+ "bcm63xx-gpio.0", |
+ "bcm63xx-gpio.1", |
+}; |
+ |
static void __init bcm63xx_gpio_init_one(int id, int dir, int data, int ngpio) |
{ |
struct resource res[2]; |
@@ -63,3 +71,25 @@ int __init bcm63xx_gpio_init(void) |
return 0; |
|
} |
+ |
+static struct gpiod_lookup_table ephy_reset = { |
+ .dev_id = "bcm63xx_enet-0", |
+ .table = { |
+ { /* filled at runtime */ }, |
+ { }, |
+ }, |
+}; |
+ |
+ |
+void bcm63xx_gpio_ephy_reset(int hw_gpio, enum gpio_lookup_flags flags) |
+{ |
+ if (ephy_reset.table[0].chip_label) |
+ return; |
+ |
+ ephy_reset.table[0].chip_label = gpio_chip_labels[hw_gpio / 32]; |
+ ephy_reset.table[0].chip_hwnum = hw_gpio % 32; |
+ ephy_reset.table[0].con_id = "reset"; |
+ ephy_reset.table[0].flags = flags; |
+ |
+ gpiod_add_lookup_table(&ephy_reset); |
+} |
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h |
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_gpio.h |
@@ -2,9 +2,11 @@ |
#define BCM63XX_GPIO_H |
|
#include <linux/init.h> |
+#include <linux/gpio/machine.h> |
#include <bcm63xx_cpu.h> |
|
int __init bcm63xx_gpio_init(void); |
+void bcm63xx_gpio_ephy_reset(int hw_gpio, enum gpio_lookup_flags flags); |
|
static inline unsigned long bcm63xx_gpio_count(void) |
{ |
--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h |
+++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h |
@@ -3,6 +3,7 @@ |
|
#include <linux/types.h> |
#include <linux/gpio.h> |
+#include <linux/gpio/machine.h> |
#include <linux/leds.h> |
#include <bcm63xx_dev_enet.h> |
#include <bcm63xx_dev_usb_usbd.h> |
@@ -49,8 +50,8 @@ struct board_info { |
/* External PHY reset GPIO */ |
unsigned int ephy_reset_gpio; |
|
- /* External PHY reset GPIO flags from gpio.h */ |
- unsigned long ephy_reset_gpio_flags; |
+ /* External PHY reset GPIO flags from gpio/machine.h */ |
+ enum gpio_lookup_flags ephy_reset_gpio_flags; |
|
/* fallback sprom config */ |
struct fallback_sprom_data fallback_sprom; |