From d13bdf92ec885105cf107183f8464c40e5f3b93b Mon Sep 17 00:00:00 2001 From: Jonas Gorski 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 --- 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 /* CONFIG_BCM63XX_CPU_3368 */ --- 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,15 +8,23 @@ * Copyright (C) Jonas Gorski */ +#include + #include #include #include #include +#include #include #include #include +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]; @@ -64,3 +72,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 @@ -3,9 +3,11 @@ #define BCM63XX_GPIO_H #include +#include #include 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 @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -50,8 +51,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;