diff options
Diffstat (limited to 'drivers/gpio/timbgpio.c')
-rw-r--r-- | drivers/gpio/timbgpio.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/gpio/timbgpio.c b/drivers/gpio/timbgpio.c index d4295fa5369e..ddd053108a13 100644 --- a/drivers/gpio/timbgpio.c +++ b/drivers/gpio/timbgpio.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/io.h> | 27 | #include <linux/io.h> |
28 | #include <linux/timb_gpio.h> | 28 | #include <linux/timb_gpio.h> |
29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
30 | #include <linux/slab.h> | ||
30 | 31 | ||
31 | #define DRIVER_NAME "timb-gpio" | 32 | #define DRIVER_NAME "timb-gpio" |
32 | 33 | ||
@@ -130,6 +131,7 @@ static int timbgpio_irq_type(unsigned irq, unsigned trigger) | |||
130 | unsigned long flags; | 131 | unsigned long flags; |
131 | u32 lvr, flr, bflr = 0; | 132 | u32 lvr, flr, bflr = 0; |
132 | u32 ver; | 133 | u32 ver; |
134 | int ret = 0; | ||
133 | 135 | ||
134 | if (offset < 0 || offset > tgpio->gpio.ngpio) | 136 | if (offset < 0 || offset > tgpio->gpio.ngpio) |
135 | return -EINVAL; | 137 | return -EINVAL; |
@@ -153,8 +155,10 @@ static int timbgpio_irq_type(unsigned irq, unsigned trigger) | |||
153 | } | 155 | } |
154 | 156 | ||
155 | if ((trigger & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) { | 157 | if ((trigger & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) { |
156 | if (ver < 3) | 158 | if (ver < 3) { |
157 | return -EINVAL; | 159 | ret = -EINVAL; |
160 | goto out; | ||
161 | } | ||
158 | else { | 162 | else { |
159 | flr |= 1 << offset; | 163 | flr |= 1 << offset; |
160 | bflr |= 1 << offset; | 164 | bflr |= 1 << offset; |
@@ -174,9 +178,10 @@ static int timbgpio_irq_type(unsigned irq, unsigned trigger) | |||
174 | iowrite32(bflr, tgpio->membase + TGPIO_BFLR); | 178 | iowrite32(bflr, tgpio->membase + TGPIO_BFLR); |
175 | 179 | ||
176 | iowrite32(1 << offset, tgpio->membase + TGPIO_ICR); | 180 | iowrite32(1 << offset, tgpio->membase + TGPIO_ICR); |
177 | spin_unlock_irqrestore(&tgpio->lock, flags); | ||
178 | 181 | ||
179 | return 0; | 182 | out: |
183 | spin_unlock_irqrestore(&tgpio->lock, flags); | ||
184 | return ret; | ||
180 | } | 185 | } |
181 | 186 | ||
182 | static void timbgpio_irq(unsigned int irq, struct irq_desc *desc) | 187 | static void timbgpio_irq(unsigned int irq, struct irq_desc *desc) |