Commit 80f01ca1fce2d5045b98f01989017767339b8700
Exists in
master
and in
6 other branches
Merge branch 'gpio/merge' of git://git.secretlab.ca/git/linux-2.6
* 'gpio/merge' of git://git.secretlab.ca/git/linux-2.6: gpio: pca953x: propagate the errno from the chip_init functions gpio: pca953x: remove unneeded check for chip type gpio/omap: check return value from irq_alloc_generic_chip gpio/omap: replace MOD_REG_BIT macro with static inline
Showing 2 changed files Side-by-side Diff
drivers/gpio/gpio-omap.c
... | ... | @@ -148,14 +148,18 @@ |
148 | 148 | return (__raw_readl(reg) & GPIO_BIT(bank, gpio)) != 0; |
149 | 149 | } |
150 | 150 | |
151 | -#define MOD_REG_BIT(reg, bit_mask, set) \ | |
152 | -do { \ | |
153 | - int l = __raw_readl(base + reg); \ | |
154 | - if (set) l |= bit_mask; \ | |
155 | - else l &= ~bit_mask; \ | |
156 | - __raw_writel(l, base + reg); \ | |
157 | -} while(0) | |
151 | +static inline void _gpio_rmw(void __iomem *base, u32 reg, u32 mask, bool set) | |
152 | +{ | |
153 | + int l = __raw_readl(base + reg); | |
158 | 154 | |
155 | + if (set) | |
156 | + l |= mask; | |
157 | + else | |
158 | + l &= ~mask; | |
159 | + | |
160 | + __raw_writel(l, base + reg); | |
161 | +} | |
162 | + | |
159 | 163 | /** |
160 | 164 | * _set_gpio_debounce - low level gpio debounce time |
161 | 165 | * @bank: the gpio bank we're acting upon |
162 | 166 | |
163 | 167 | |
... | ... | @@ -210,28 +214,28 @@ |
210 | 214 | u32 gpio_bit = 1 << gpio; |
211 | 215 | |
212 | 216 | if (cpu_is_omap44xx()) { |
213 | - MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT0, gpio_bit, | |
214 | - trigger & IRQ_TYPE_LEVEL_LOW); | |
215 | - MOD_REG_BIT(OMAP4_GPIO_LEVELDETECT1, gpio_bit, | |
216 | - trigger & IRQ_TYPE_LEVEL_HIGH); | |
217 | - MOD_REG_BIT(OMAP4_GPIO_RISINGDETECT, gpio_bit, | |
218 | - trigger & IRQ_TYPE_EDGE_RISING); | |
219 | - MOD_REG_BIT(OMAP4_GPIO_FALLINGDETECT, gpio_bit, | |
220 | - trigger & IRQ_TYPE_EDGE_FALLING); | |
217 | + _gpio_rmw(base, OMAP4_GPIO_LEVELDETECT0, gpio_bit, | |
218 | + trigger & IRQ_TYPE_LEVEL_LOW); | |
219 | + _gpio_rmw(base, OMAP4_GPIO_LEVELDETECT1, gpio_bit, | |
220 | + trigger & IRQ_TYPE_LEVEL_HIGH); | |
221 | + _gpio_rmw(base, OMAP4_GPIO_RISINGDETECT, gpio_bit, | |
222 | + trigger & IRQ_TYPE_EDGE_RISING); | |
223 | + _gpio_rmw(base, OMAP4_GPIO_FALLINGDETECT, gpio_bit, | |
224 | + trigger & IRQ_TYPE_EDGE_FALLING); | |
221 | 225 | } else { |
222 | - MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT0, gpio_bit, | |
223 | - trigger & IRQ_TYPE_LEVEL_LOW); | |
224 | - MOD_REG_BIT(OMAP24XX_GPIO_LEVELDETECT1, gpio_bit, | |
225 | - trigger & IRQ_TYPE_LEVEL_HIGH); | |
226 | - MOD_REG_BIT(OMAP24XX_GPIO_RISINGDETECT, gpio_bit, | |
227 | - trigger & IRQ_TYPE_EDGE_RISING); | |
228 | - MOD_REG_BIT(OMAP24XX_GPIO_FALLINGDETECT, gpio_bit, | |
229 | - trigger & IRQ_TYPE_EDGE_FALLING); | |
226 | + _gpio_rmw(base, OMAP24XX_GPIO_LEVELDETECT0, gpio_bit, | |
227 | + trigger & IRQ_TYPE_LEVEL_LOW); | |
228 | + _gpio_rmw(base, OMAP24XX_GPIO_LEVELDETECT1, gpio_bit, | |
229 | + trigger & IRQ_TYPE_LEVEL_HIGH); | |
230 | + _gpio_rmw(base, OMAP24XX_GPIO_RISINGDETECT, gpio_bit, | |
231 | + trigger & IRQ_TYPE_EDGE_RISING); | |
232 | + _gpio_rmw(base, OMAP24XX_GPIO_FALLINGDETECT, gpio_bit, | |
233 | + trigger & IRQ_TYPE_EDGE_FALLING); | |
230 | 234 | } |
231 | 235 | if (likely(!(bank->non_wakeup_gpios & gpio_bit))) { |
232 | 236 | if (cpu_is_omap44xx()) { |
233 | - MOD_REG_BIT(OMAP4_GPIO_IRQWAKEN0, gpio_bit, | |
234 | - trigger != 0); | |
237 | + _gpio_rmw(base, OMAP4_GPIO_IRQWAKEN0, gpio_bit, | |
238 | + trigger != 0); | |
235 | 239 | } else { |
236 | 240 | /* |
237 | 241 | * GPIO wakeup request can only be generated on edge |
... | ... | @@ -1086,6 +1090,11 @@ |
1086 | 1090 | |
1087 | 1091 | gc = irq_alloc_generic_chip("MPUIO", 1, irq_start, bank->base, |
1088 | 1092 | handle_simple_irq); |
1093 | + if (!gc) { | |
1094 | + dev_err(bank->dev, "Memory alloc failed for gc\n"); | |
1095 | + return; | |
1096 | + } | |
1097 | + | |
1089 | 1098 | ct = gc->chip_types; |
1090 | 1099 | |
1091 | 1100 | /* NOTE: No ack required, reading IRQ status clears it. */ |
drivers/gpio/gpio-pca953x.c
... | ... | @@ -596,9 +596,6 @@ |
596 | 596 | |
597 | 597 | /* set platform specific polarity inversion */ |
598 | 598 | ret = pca953x_write_reg(chip, PCA953X_INVERT, invert); |
599 | - if (ret) | |
600 | - goto out; | |
601 | - return 0; | |
602 | 599 | out: |
603 | 600 | return ret; |
604 | 601 | } |
... | ... | @@ -640,7 +637,7 @@ |
640 | 637 | struct pca953x_platform_data *pdata; |
641 | 638 | struct pca953x_chip *chip; |
642 | 639 | int irq_base=0, invert=0; |
643 | - int ret = 0; | |
640 | + int ret; | |
644 | 641 | |
645 | 642 | chip = kzalloc(sizeof(struct pca953x_chip), GFP_KERNEL); |
646 | 643 | if (chip == NULL) |
647 | 644 | |
... | ... | @@ -673,10 +670,10 @@ |
673 | 670 | pca953x_setup_gpio(chip, id->driver_data & PCA_GPIO_MASK); |
674 | 671 | |
675 | 672 | if (chip->chip_type == PCA953X_TYPE) |
676 | - device_pca953x_init(chip, invert); | |
677 | - else if (chip->chip_type == PCA957X_TYPE) | |
678 | - device_pca957x_init(chip, invert); | |
673 | + ret = device_pca953x_init(chip, invert); | |
679 | 674 | else |
675 | + ret = device_pca957x_init(chip, invert); | |
676 | + if (ret) | |
680 | 677 | goto out_failed; |
681 | 678 | |
682 | 679 | ret = pca953x_irq_setup(chip, id, irq_base); |