MIPS: BCM63xx: fix GPIO set/get for BCM6345
PATCH v2 3/3 MIPS: BCM63xx: fix GPIO set/get for BCM6345
On BCM6345, the register offsets for the set/get GPIO registers is wrong. Use the same logic as the one present in arch/mips/bcm63xx/irq.c to define the correct gpio_out_low_reg value when support for BCM6345 is compiled in.
Signed-off-by Florian Fainelli <[email protected]>
---
Changes since v1:
- rebased against mips-for-linux-next
- use the same logic as the one present in arch/mips/bcm63xx/irq.c
arch/mips/bcm63xx/gpio.c +36 -5
@@ -4,7 +4,7 @@* for more details. * * Copyright (C) 2008 Maxime Bizon <[email protected]> -* Copyright (C) 2008 Florian Fainelli <[email protected]> +* Copyright (C) 2008-2011 Florian Fainelli <[email protected]> */ #include <linux/kernel.h>
@@ -18,6 +18,34 @@#include <bcm63xx_io.h> #include <bcm63xx_regs.h> +#ifndef BCMCPU_RUNTIME_DETECT +#define gpio_out_low_reg GPIO_DATA_LO_REG +#ifdef CONFIG_BCM63XX_CPU_6345 +#ifdef gpio_out_low_reg +#undef gpio_out_low_reg +#define gpio_out_low_reg GPIO_DATA_LO_REG_6345 +#endif /* gpio_out_low_reg */ +#endif /* CONFIG_BCM63XX_CPU_6345 */ + +static inline void bcm63xx_gpio_out_low_reg_init (void ) +{ +} +#else /* ! BCMCPU_RUNTIME_DETECT */ +static u32 gpio_out_low_reg; + +static void bcm63xx_gpio_out_low_reg_init (void ) +{ +switch (bcm63xx_get_cpu_id ()) { +case BCM6345_CPU_ID : + gpio_out_low_reg =GPIO_DATA_LO_REG_6345 ; +break ; +default : + gpio_out_low_reg =GPIO_DATA_LO_REG ; +break ; + } +} +#endif /* ! BCMCPU_RUNTIME_DETECT */ +static DEFINE_SPINLOCK (bcm63xx_gpio_lock);static u32 gpio_out_low, gpio_out_high;
@@ -33,7 +61,7 @@ static void bcm63xx_gpio_set(struct gpio_chip *chip,BUG ();if (gpio <32 ) { - reg =GPIO_DATA_LO_REG ; + reg = gpio_out_low_reg; mask =1 << gpio; v = &gpio_out_low; }else {
@@ -60,7 +88,7 @@ static int bcm63xx_gpio_get(struct gpio_chip *chip, unsigned gpio)BUG ();if (gpio <32 ) { - reg =GPIO_DATA_LO_REG ; + reg = gpio_out_low_reg; mask =1 << gpio; }else { reg =GPIO_DATA_HI_REG ;
@@ -125,8 +153,11 @@ static struct gpio_chip bcm63xx_gpio_chip = {int __init bcm63xx_gpio_init (void ) { - gpio_out_low =bcm_gpio_readl (GPIO_DATA_LO_REG ); - gpio_out_high =bcm_gpio_readl (GPIO_DATA_HI_REG ); +bcm63xx_gpio_out_low_reg_init (); + + gpio_out_low =bcm_gpio_readl (gpio_out_low_reg); +if (!BCMCPU_IS_6345 ()) + gpio_out_high =bcm_gpio_readl (GPIO_DATA_HI_REG ); bcm63xx_gpio_chip.ngpio =bcm63xx_gpio_count ();pr_info ("registering %d GPIOs\n" , bcm63xx_gpio_chip.ngpio);
arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h +1 -0
@@ -437,6 +437,7 @@#define GPIO_CTL_LO_REG 0x4#define GPIO_DATA_HI_REG 0x8#define GPIO_DATA_LO_REG 0xC +#define GPIO_DATA_LO_REG_6345 0x8/* GPIO mux registers and constants */ #define GPIO_MODE_REG 0x18
Signature · 1 line
1.7.5.4
Thanks, queued for 3.3.
Ralf