platform/x86: intel_int0002_vgpio: Pass irqchip when adding gpiochip
We need to convert all old gpio irqchips to pass the irqchip setup along when adding the gpio_chip. For more info see drivers/gpio/TODO. For chained irqchips this is a pretty straight-forward conversion. This driver requests the IRQ directly in the driver so it needs to pass a NULL parent handler. We may revisit this code later and pull reqular shared IRQ handler into gpiolib, so leave a FIXME. Cc: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Tested-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This commit is contained in:
committed by
Andy Shevchenko
parent
fa2a590d0d
commit
4a8d82cdec
@@ -164,8 +164,8 @@ static int int0002_probe(struct platform_device *pdev)
|
|||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
const struct x86_cpu_id *cpu_id;
|
const struct x86_cpu_id *cpu_id;
|
||||||
struct irq_chip *irq_chip;
|
|
||||||
struct gpio_chip *chip;
|
struct gpio_chip *chip;
|
||||||
|
struct gpio_irq_chip *girq;
|
||||||
int irq, ret;
|
int irq, ret;
|
||||||
|
|
||||||
/* Menlow has a different INT0002 device? <sigh> */
|
/* Menlow has a different INT0002 device? <sigh> */
|
||||||
@@ -192,15 +192,11 @@ static int int0002_probe(struct platform_device *pdev)
|
|||||||
chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1;
|
chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1;
|
||||||
chip->irq.init_valid_mask = int0002_init_irq_valid_mask;
|
chip->irq.init_valid_mask = int0002_init_irq_valid_mask;
|
||||||
|
|
||||||
ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(dev, "Error adding gpio chip: %d\n", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We manually request the irq here instead of passing a flow-handler
|
* We directly request the irq here instead of passing a flow-handler
|
||||||
* to gpiochip_set_chained_irqchip, because the irq is shared.
|
* to gpiochip_set_chained_irqchip, because the irq is shared.
|
||||||
|
* FIXME: augment this if we managed to pull handling of shared
|
||||||
|
* IRQs into gpiolib.
|
||||||
*/
|
*/
|
||||||
ret = devm_request_irq(dev, irq, int0002_irq,
|
ret = devm_request_irq(dev, irq, int0002_irq,
|
||||||
IRQF_SHARED, "INT0002", chip);
|
IRQF_SHARED, "INT0002", chip);
|
||||||
@@ -209,17 +205,21 @@ static int int0002_probe(struct platform_device *pdev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
irq_chip = (struct irq_chip *)cpu_id->driver_data;
|
girq = &chip->irq;
|
||||||
|
girq->chip = (struct irq_chip *)cpu_id->driver_data;
|
||||||
|
/* This let us handle the parent IRQ in the driver */
|
||||||
|
girq->parent_handler = NULL;
|
||||||
|
girq->num_parents = 0;
|
||||||
|
girq->parents = NULL;
|
||||||
|
girq->default_type = IRQ_TYPE_NONE;
|
||||||
|
girq->handler = handle_edge_irq;
|
||||||
|
|
||||||
ret = gpiochip_irqchip_add(chip, irq_chip, 0, handle_edge_irq,
|
ret = devm_gpiochip_add_data(dev, chip, NULL);
|
||||||
IRQ_TYPE_NONE);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "Error adding irqchip: %d\n", ret);
|
dev_err(dev, "Error adding gpio chip: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpiochip_set_chained_irqchip(chip, irq_chip, irq, NULL);
|
|
||||||
|
|
||||||
device_init_wakeup(dev, true);
|
device_init_wakeup(dev, true);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user