From bb977eb73bea20ad2ccd39f10fb2f2b607fef1fc Mon Sep 17 00:00:00 2001 From: juhosg Date: Sat, 12 Nov 2011 10:54:09 +0000 Subject: ar71xx: fix GPIO direction setup for AR934x git-svn-id: svn://svn.openwrt.org/openwrt/trunk@28974 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/linux/ar71xx/files/arch/mips/ar71xx/gpio.c | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/target/linux/ar71xx/files/arch/mips/ar71xx/gpio.c b/target/linux/ar71xx/files/arch/mips/ar71xx/gpio.c index 10d80817f..137a01815 100644 --- a/target/linux/ar71xx/files/arch/mips/ar71xx/gpio.c +++ b/target/linux/ar71xx/files/arch/mips/ar71xx/gpio.c @@ -90,6 +90,43 @@ static int ar71xx_gpio_direction_output(struct gpio_chip *chip, return 0; } +static int ar934x_gpio_direction_input(struct gpio_chip *chip, + unsigned offset) +{ + void __iomem *base = ar71xx_gpio_base; + unsigned long flags; + + spin_lock_irqsave(&ar71xx_gpio_lock, flags); + + __raw_writel(__raw_readl(base + GPIO_REG_OE) | (1 << offset), + base + GPIO_REG_OE); + + spin_unlock_irqrestore(&ar71xx_gpio_lock, flags); + + return 0; +} + +static int ar934x_gpio_direction_output(struct gpio_chip *chip, + unsigned offset, int value) +{ + void __iomem *base = ar71xx_gpio_base; + unsigned long flags; + + spin_lock_irqsave(&ar71xx_gpio_lock, flags); + + if (value) + __raw_writel(1 << offset, base + GPIO_REG_SET); + else + __raw_writel(1 << offset, base + GPIO_REG_CLEAR); + + __raw_writel(__raw_readl(base + GPIO_REG_OE) & ~(1 << offset), + base + GPIO_REG_OE); + + spin_unlock_irqrestore(&ar71xx_gpio_lock, flags); + + return 0; +} + static struct gpio_chip ar71xx_gpio_chip = { .label = "ar71xx", .get = ar71xx_gpio_get_value, @@ -181,6 +218,8 @@ void __init ar71xx_gpio_init(void) case AR71XX_SOC_AR9342: case AR71XX_SOC_AR9344: ar71xx_gpio_chip.ngpio = AR934X_GPIO_COUNT; + ar71xx_gpio_chip.direction_input = ar934x_gpio_direction_input; + ar71xx_gpio_chip.direction_output = ar934x_gpio_direction_output; break; default: -- cgit v1.2.3