openwrtv3/target/linux/brcm63xx/patches-4.4/377-MIPS-BCM63XX-register-lookup-for-ephy-reset-gpio.patch
Jonas Gorski 74aca7d913 brcm63xx: fix platform gpio lookups for gpios < 32
Overwriting static strings is never a good idea, especially expecting
identical strings to be stored in different memory locations.

This caused the lookups to always return the second chip's name. Fix
this by just initializing the lookup with the right values, so we
don't need to modify the strings at all.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>

SVN-Revision: 48303
2016-01-18 10:46:50 +00:00

129 lines
3.7 KiB
Diff

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
@@ -258,9 +258,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 <jogo@openwrt.org>
*/
+#include <asm/addrspace.h>
+
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/basic_mmio_gpio.h>
#include <linux/gpio.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];
@@ -64,3 +72,25 @@ int __init bcm63xx_gpio_init(void)
return 0;
}
+
+static struct gpiod_lookup_table ephy_reset = {
+ .dev_id = "bcm63xx_enet_shared.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 = "ephy-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>
@@ -54,8 +55,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;