|
@@ -813,6 +813,41 @@ static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int msm_gpio_irq_reqres(struct irq_data *d)
|
|
|
+{
|
|
|
+ struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
|
|
+ struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!try_module_get(gc->owner))
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ ret = msm_pinmux_request_gpio(pctrl->pctrl, NULL, d->hwirq);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ msm_gpio_direction_input(gc, d->hwirq);
|
|
|
+
|
|
|
+ if (gpiochip_lock_as_irq(gc, d->hwirq)) {
|
|
|
+ dev_err(gc->parent,
|
|
|
+ "unable to lock HW IRQ %lu for IRQ\n",
|
|
|
+ d->hwirq);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+out:
|
|
|
+ module_put(gc->owner);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static void msm_gpio_irq_relres(struct irq_data *d)
|
|
|
+{
|
|
|
+ struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
|
|
+
|
|
|
+ gpiochip_unlock_as_irq(gc, d->hwirq);
|
|
|
+ module_put(gc->owner);
|
|
|
+}
|
|
|
+
|
|
|
static void msm_gpio_irq_handler(struct irq_desc *desc)
|
|
|
{
|
|
|
struct gpio_chip *gc = irq_desc_get_handler_data(desc);
|
|
@@ -911,6 +946,8 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
|
|
|
pctrl->irq_chip.irq_ack = msm_gpio_irq_ack;
|
|
|
pctrl->irq_chip.irq_set_type = msm_gpio_irq_set_type;
|
|
|
pctrl->irq_chip.irq_set_wake = msm_gpio_irq_set_wake;
|
|
|
+ pctrl->irq_chip.irq_request_resources = msm_gpio_irq_reqres;
|
|
|
+ pctrl->irq_chip.irq_release_resources = msm_gpio_irq_relres;
|
|
|
|
|
|
ret = gpiochip_add_data(&pctrl->chip, pctrl);
|
|
|
if (ret) {
|