diff options
Diffstat (limited to 'drivers/gpio/gpio-mvebu.c')
| -rw-r--r-- | drivers/gpio/gpio-mvebu.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c index cf7afb9eb61..be65c0451ad 100644 --- a/drivers/gpio/gpio-mvebu.c +++ b/drivers/gpio/gpio-mvebu.c | |||
| @@ -92,6 +92,11 @@ static inline void __iomem *mvebu_gpioreg_out(struct mvebu_gpio_chip *mvchip) | |||
| 92 | return mvchip->membase + GPIO_OUT_OFF; | 92 | return mvchip->membase + GPIO_OUT_OFF; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | static inline void __iomem *mvebu_gpioreg_blink(struct mvebu_gpio_chip *mvchip) | ||
| 96 | { | ||
| 97 | return mvchip->membase + GPIO_BLINK_EN_OFF; | ||
| 98 | } | ||
| 99 | |||
| 95 | static inline void __iomem *mvebu_gpioreg_io_conf(struct mvebu_gpio_chip *mvchip) | 100 | static inline void __iomem *mvebu_gpioreg_io_conf(struct mvebu_gpio_chip *mvchip) |
| 96 | { | 101 | { |
| 97 | return mvchip->membase + GPIO_IO_CONF_OFF; | 102 | return mvchip->membase + GPIO_IO_CONF_OFF; |
| @@ -206,6 +211,23 @@ static int mvebu_gpio_get(struct gpio_chip *chip, unsigned pin) | |||
| 206 | return (u >> pin) & 1; | 211 | return (u >> pin) & 1; |
| 207 | } | 212 | } |
| 208 | 213 | ||
| 214 | static void mvebu_gpio_blink(struct gpio_chip *chip, unsigned pin, int value) | ||
| 215 | { | ||
| 216 | struct mvebu_gpio_chip *mvchip = | ||
| 217 | container_of(chip, struct mvebu_gpio_chip, chip); | ||
| 218 | unsigned long flags; | ||
| 219 | u32 u; | ||
| 220 | |||
| 221 | spin_lock_irqsave(&mvchip->lock, flags); | ||
| 222 | u = readl_relaxed(mvebu_gpioreg_blink(mvchip)); | ||
| 223 | if (value) | ||
| 224 | u |= 1 << pin; | ||
| 225 | else | ||
| 226 | u &= ~(1 << pin); | ||
| 227 | writel_relaxed(u, mvebu_gpioreg_blink(mvchip)); | ||
| 228 | spin_unlock_irqrestore(&mvchip->lock, flags); | ||
| 229 | } | ||
| 230 | |||
| 209 | static int mvebu_gpio_direction_input(struct gpio_chip *chip, unsigned pin) | 231 | static int mvebu_gpio_direction_input(struct gpio_chip *chip, unsigned pin) |
| 210 | { | 232 | { |
| 211 | struct mvebu_gpio_chip *mvchip = | 233 | struct mvebu_gpio_chip *mvchip = |
| @@ -244,6 +266,7 @@ static int mvebu_gpio_direction_output(struct gpio_chip *chip, unsigned pin, | |||
| 244 | if (ret) | 266 | if (ret) |
| 245 | return ret; | 267 | return ret; |
| 246 | 268 | ||
| 269 | mvebu_gpio_blink(chip, pin, 0); | ||
| 247 | mvebu_gpio_set(chip, pin, value); | 270 | mvebu_gpio_set(chip, pin, value); |
| 248 | 271 | ||
| 249 | spin_lock_irqsave(&mvchip->lock, flags); | 272 | spin_lock_irqsave(&mvchip->lock, flags); |
