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
This commit is contained in:
parent
2b3b4c95f1
commit
74aca7d913
4 changed files with 20 additions and 38 deletions
|
@ -42,7 +42,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
}
|
}
|
||||||
--- a/arch/mips/bcm63xx/gpio.c
|
--- a/arch/mips/bcm63xx/gpio.c
|
||||||
+++ b/arch/mips/bcm63xx/gpio.c
|
+++ b/arch/mips/bcm63xx/gpio.c
|
||||||
@@ -8,15 +8,24 @@
|
@@ -8,15 +8,23 @@
|
||||||
* Copyright (C) Jonas Gorski <jogo@openwrt.org>
|
* Copyright (C) Jonas Gorski <jogo@openwrt.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -58,24 +58,15 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
#include <bcm63xx_gpio.h>
|
#include <bcm63xx_gpio.h>
|
||||||
#include <bcm63xx_regs.h>
|
#include <bcm63xx_regs.h>
|
||||||
|
|
||||||
+/* for registering lookups; make them large enough to hold OF names */
|
+static const char * const gpio_chip_labels[] = {
|
||||||
+static char *gpio_chip_labels[] = {
|
+ "bcm63xx-gpio.0",
|
||||||
+ "xxxxxxxx.gpio-controller",
|
+ "bcm63xx-gpio.1",
|
||||||
+ "xxxxxxxx.gpio-controller",
|
|
||||||
+};
|
+};
|
||||||
+
|
+
|
||||||
static void __init bcm63xx_gpio_init_one(int id, int dir, int data, int ngpio)
|
static void __init bcm63xx_gpio_init_one(int id, int dir, int data, int ngpio)
|
||||||
{
|
{
|
||||||
struct resource res[2];
|
struct resource res[2];
|
||||||
@@ -40,6 +49,7 @@ static void __init bcm63xx_gpio_init_one
|
@@ -64,3 +72,25 @@ int __init bcm63xx_gpio_init(void)
|
||||||
pdata.base = id * 32;
|
|
||||||
pdata.ngpio = ngpio;
|
|
||||||
|
|
||||||
+ sprintf(gpio_chip_labels[id], "bcm63xx-gpio.%d", id);
|
|
||||||
platform_device_register_resndata(NULL, "bcm63xx-gpio", id, res, 2,
|
|
||||||
&pdata, sizeof(pdata));
|
|
||||||
}
|
|
||||||
@@ -64,3 +74,25 @@ int __init bcm63xx_gpio_init(void)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,13 +17,13 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
|
||||||
+#include "boards/board_common.h"
|
+#include "boards/board_common.h"
|
||||||
+
|
+
|
||||||
/* for registering lookups; make them large enough to hold OF names */
|
static const char * const gpio_chip_labels[] = {
|
||||||
static char *gpio_chip_labels[] = {
|
"bcm63xx-gpio.0",
|
||||||
"xxxxxxxx.gpio-controller",
|
"bcm63xx-gpio.1",
|
||||||
@@ -50,8 +52,9 @@ static void __init bcm63xx_gpio_init_one
|
@@ -48,8 +50,9 @@ static void __init bcm63xx_gpio_init_one
|
||||||
|
pdata.base = id * 32;
|
||||||
pdata.ngpio = ngpio;
|
pdata.ngpio = ngpio;
|
||||||
|
|
||||||
sprintf(gpio_chip_labels[id], "bcm63xx-gpio.%d", id);
|
|
||||||
- platform_device_register_resndata(NULL, "bcm63xx-gpio", id, res, 2,
|
- platform_device_register_resndata(NULL, "bcm63xx-gpio", id, res, 2,
|
||||||
- &pdata, sizeof(pdata));
|
- &pdata, sizeof(pdata));
|
||||||
+ if (!board_of_device_present("gpio0"))
|
+ if (!board_of_device_present("gpio0"))
|
||||||
|
|
|
@ -42,7 +42,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
}
|
}
|
||||||
--- a/arch/mips/bcm63xx/gpio.c
|
--- a/arch/mips/bcm63xx/gpio.c
|
||||||
+++ b/arch/mips/bcm63xx/gpio.c
|
+++ b/arch/mips/bcm63xx/gpio.c
|
||||||
@@ -8,15 +8,24 @@
|
@@ -8,15 +8,23 @@
|
||||||
* Copyright (C) Jonas Gorski <jogo@openwrt.org>
|
* Copyright (C) Jonas Gorski <jogo@openwrt.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -58,24 +58,15 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
#include <bcm63xx_gpio.h>
|
#include <bcm63xx_gpio.h>
|
||||||
#include <bcm63xx_regs.h>
|
#include <bcm63xx_regs.h>
|
||||||
|
|
||||||
+/* for registering lookups; make them large enough to hold OF names */
|
+static const char * const gpio_chip_labels[] = {
|
||||||
+static char *gpio_chip_labels[] = {
|
+ "bcm63xx-gpio.0",
|
||||||
+ "xxxxxxxx.gpio-controller",
|
+ "bcm63xx-gpio.1",
|
||||||
+ "xxxxxxxx.gpio-controller",
|
|
||||||
+};
|
+};
|
||||||
+
|
+
|
||||||
static void __init bcm63xx_gpio_init_one(int id, int dir, int data, int ngpio)
|
static void __init bcm63xx_gpio_init_one(int id, int dir, int data, int ngpio)
|
||||||
{
|
{
|
||||||
struct resource res[2];
|
struct resource res[2];
|
||||||
@@ -40,6 +49,7 @@ static void __init bcm63xx_gpio_init_one
|
@@ -64,3 +72,25 @@ int __init bcm63xx_gpio_init(void)
|
||||||
pdata.base = id * 32;
|
|
||||||
pdata.ngpio = ngpio;
|
|
||||||
|
|
||||||
+ sprintf(gpio_chip_labels[id], "bcm63xx-gpio.%d", id);
|
|
||||||
platform_device_register_resndata(NULL, "bcm63xx-gpio", id, res, 2,
|
|
||||||
&pdata, sizeof(pdata));
|
|
||||||
}
|
|
||||||
@@ -64,3 +74,25 @@ int __init bcm63xx_gpio_init(void)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,13 +17,13 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
|
||||||
+#include "boards/board_common.h"
|
+#include "boards/board_common.h"
|
||||||
+
|
+
|
||||||
/* for registering lookups; make them large enough to hold OF names */
|
static const char * const gpio_chip_labels[] = {
|
||||||
static char *gpio_chip_labels[] = {
|
"bcm63xx-gpio.0",
|
||||||
"xxxxxxxx.gpio-controller",
|
"bcm63xx-gpio.1",
|
||||||
@@ -50,8 +52,9 @@ static void __init bcm63xx_gpio_init_one
|
@@ -48,8 +50,9 @@ static void __init bcm63xx_gpio_init_one
|
||||||
|
pdata.base = id * 32;
|
||||||
pdata.ngpio = ngpio;
|
pdata.ngpio = ngpio;
|
||||||
|
|
||||||
sprintf(gpio_chip_labels[id], "bcm63xx-gpio.%d", id);
|
|
||||||
- platform_device_register_resndata(NULL, "bcm63xx-gpio", id, res, 2,
|
- platform_device_register_resndata(NULL, "bcm63xx-gpio", id, res, 2,
|
||||||
- &pdata, sizeof(pdata));
|
- &pdata, sizeof(pdata));
|
||||||
+ if (!board_of_device_present("gpio0"))
|
+ if (!board_of_device_present("gpio0"))
|
||||||
|
|
Loading…
Reference in a new issue