diff options
Diffstat (limited to 'drivers/gpio/gpio-omap.c')
-rw-r--r-- | drivers/gpio/gpio-omap.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index efc85a279d54..f8c550de6c72 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c | |||
@@ -208,9 +208,11 @@ static inline void omap_gpio_dbck_disable(struct gpio_bank *bank) | |||
208 | * OMAP's debounce time is in 31us steps | 208 | * OMAP's debounce time is in 31us steps |
209 | * <debounce time> = (GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME + 1) x 31 | 209 | * <debounce time> = (GPIO_DEBOUNCINGTIME[7:0].DEBOUNCETIME + 1) x 31 |
210 | * so we need to convert and round up to the closest unit. | 210 | * so we need to convert and round up to the closest unit. |
211 | * | ||
212 | * Return: 0 on success, negative error otherwise. | ||
211 | */ | 213 | */ |
212 | static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset, | 214 | static int omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset, |
213 | unsigned debounce) | 215 | unsigned debounce) |
214 | { | 216 | { |
215 | void __iomem *reg; | 217 | void __iomem *reg; |
216 | u32 val; | 218 | u32 val; |
@@ -218,11 +220,12 @@ static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset, | |||
218 | bool enable = !!debounce; | 220 | bool enable = !!debounce; |
219 | 221 | ||
220 | if (!bank->dbck_flag) | 222 | if (!bank->dbck_flag) |
221 | return; | 223 | return -ENOTSUPP; |
222 | 224 | ||
223 | if (enable) { | 225 | if (enable) { |
224 | debounce = DIV_ROUND_UP(debounce, 31) - 1; | 226 | debounce = DIV_ROUND_UP(debounce, 31) - 1; |
225 | debounce &= OMAP4_GPIO_DEBOUNCINGTIME_MASK; | 227 | if ((debounce & OMAP4_GPIO_DEBOUNCINGTIME_MASK) != debounce) |
228 | return -EINVAL; | ||
226 | } | 229 | } |
227 | 230 | ||
228 | l = BIT(offset); | 231 | l = BIT(offset); |
@@ -255,6 +258,8 @@ static void omap2_set_gpio_debounce(struct gpio_bank *bank, unsigned offset, | |||
255 | bank->context.debounce = debounce; | 258 | bank->context.debounce = debounce; |
256 | bank->context.debounce_en = val; | 259 | bank->context.debounce_en = val; |
257 | } | 260 | } |
261 | |||
262 | return 0; | ||
258 | } | 263 | } |
259 | 264 | ||
260 | /** | 265 | /** |
@@ -964,14 +969,20 @@ static int omap_gpio_debounce(struct gpio_chip *chip, unsigned offset, | |||
964 | { | 969 | { |
965 | struct gpio_bank *bank; | 970 | struct gpio_bank *bank; |
966 | unsigned long flags; | 971 | unsigned long flags; |
972 | int ret; | ||
967 | 973 | ||
968 | bank = gpiochip_get_data(chip); | 974 | bank = gpiochip_get_data(chip); |
969 | 975 | ||
970 | raw_spin_lock_irqsave(&bank->lock, flags); | 976 | raw_spin_lock_irqsave(&bank->lock, flags); |
971 | omap2_set_gpio_debounce(bank, offset, debounce); | 977 | ret = omap2_set_gpio_debounce(bank, offset, debounce); |
972 | raw_spin_unlock_irqrestore(&bank->lock, flags); | 978 | raw_spin_unlock_irqrestore(&bank->lock, flags); |
973 | 979 | ||
974 | return 0; | 980 | if (ret) |
981 | dev_info(chip->parent, | ||
982 | "Could not set line %u debounce to %u microseconds (%d)", | ||
983 | offset, debounce, ret); | ||
984 | |||
985 | return ret; | ||
975 | } | 986 | } |
976 | 987 | ||
977 | static int omap_gpio_set_config(struct gpio_chip *chip, unsigned offset, | 988 | static int omap_gpio_set_config(struct gpio_chip *chip, unsigned offset, |
@@ -1085,7 +1096,8 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc) | |||
1085 | * REVISIT: Once we have OMAP1 supporting SPARSE_IRQ, we can drop | 1096 | * REVISIT: Once we have OMAP1 supporting SPARSE_IRQ, we can drop |
1086 | * irq_alloc_descs() since a base IRQ offset will no longer be needed. | 1097 | * irq_alloc_descs() since a base IRQ offset will no longer be needed. |
1087 | */ | 1098 | */ |
1088 | irq_base = irq_alloc_descs(-1, 0, bank->width, 0); | 1099 | irq_base = devm_irq_alloc_descs(bank->chip.parent, |
1100 | -1, 0, bank->width, 0); | ||
1089 | if (irq_base < 0) { | 1101 | if (irq_base < 0) { |
1090 | dev_err(bank->chip.parent, "Couldn't allocate IRQ numbers\n"); | 1102 | dev_err(bank->chip.parent, "Couldn't allocate IRQ numbers\n"); |
1091 | return -ENODEV; | 1103 | return -ENODEV; |