Loading arch/arm64/boot/dts/qcom/msm8953-pinctrl.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ gpio-controller; #gpio-cells = <2>; interrupt-controller; interrupt-parent = <&wakegpio>; #interrupt-cells = <2>; pmx-uartconsole { Loading arch/arm64/boot/dts/qcom/msm8953.dtsi +1 −1 Original line number Diff line number Diff line Loading @@ -231,7 +231,7 @@ wakegpio: wake-gpio { compatible = "qcom,mpm-gpio-msm8953", "qcom,mpm-gpio"; interrupt-controller; interrupt-parent = <&tlmm>; interrupt-parent = <&intc>; #interrupt-cells = <2>; }; Loading drivers/irqchip/qcom/mpm.c +35 −41 Original line number Diff line number Diff line Loading @@ -202,19 +202,35 @@ static inline void msm_mpm_set_type(struct irq_data *d, } } static void msm_mpm_chip_mask(struct irq_data *d) static void msm_mpm_gpio_chip_mask(struct irq_data *d) { msm_mpm_enable_irq(d, false); } static void msm_mpm_gpio_chip_unmask(struct irq_data *d) { msm_mpm_enable_irq(d, true); } static int msm_mpm_gpio_chip_set_type(struct irq_data *d, unsigned int type) { msm_mpm_set_type(d, type); return 0; } static void msm_mpm_gic_chip_mask(struct irq_data *d) { msm_mpm_enable_irq(d, false); irq_chip_mask_parent(d); } static void msm_mpm_chip_unmask(struct irq_data *d) static void msm_mpm_gic_chip_unmask(struct irq_data *d) { msm_mpm_enable_irq(d, true); irq_chip_unmask_parent(d); } static int msm_mpm_chip_set_type(struct irq_data *d, unsigned int type) static int msm_mpm_gic_chip_set_type(struct irq_data *d, unsigned int type) { msm_mpm_set_type(d, type); return irq_chip_set_type_parent(d, type); Loading @@ -223,21 +239,21 @@ static int msm_mpm_chip_set_type(struct irq_data *d, unsigned int type) static struct irq_chip msm_mpm_gic_chip = { .name = "mpm-gic", .irq_eoi = irq_chip_eoi_parent, .irq_mask = msm_mpm_chip_mask, .irq_disable = msm_mpm_chip_mask, .irq_unmask = msm_mpm_chip_unmask, .irq_mask = msm_mpm_gic_chip_mask, .irq_disable = msm_mpm_gic_chip_mask, .irq_unmask = msm_mpm_gic_chip_unmask, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_set_type = msm_mpm_chip_set_type, .irq_set_type = msm_mpm_gic_chip_set_type, .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE, .irq_set_affinity = irq_chip_set_affinity_parent, }; static struct irq_chip msm_mpm_gpio_chip = { .name = "mpm-gpio", .irq_mask = msm_mpm_chip_mask, .irq_disable = msm_mpm_chip_mask, .irq_unmask = msm_mpm_chip_unmask, .irq_set_type = msm_mpm_chip_set_type, .irq_mask = msm_mpm_gpio_chip_mask, .irq_disable = msm_mpm_gpio_chip_mask, .irq_unmask = msm_mpm_gpio_chip_unmask, .irq_set_type = msm_mpm_gpio_chip_set_type, .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_set_vcpu_affinity = irq_chip_set_vcpu_affinity_parent, Loading Loading @@ -267,7 +283,6 @@ static int msm_mpm_gpio_chip_alloc(struct irq_domain *domain, { int ret = 0; struct irq_fwspec *fwspec = data; struct irq_fwspec parent_fwspec; irq_hw_number_t hwirq; unsigned int type = IRQ_TYPE_NONE; Loading @@ -277,10 +292,8 @@ static int msm_mpm_gpio_chip_alloc(struct irq_domain *domain, irq_domain_set_hwirq_and_chip(domain, virq, hwirq, &msm_mpm_gpio_chip, NULL); parent_fwspec = *fwspec; parent_fwspec.fwnode = domain->parent->fwnode; return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &parent_fwspec); return 0; } static const struct irq_domain_ops msm_mpm_gpio_chip_domain_ops = { Loading Loading @@ -643,22 +656,21 @@ static int __init mpm_gic_chip_init(struct device_node *node, IRQCHIP_DECLARE(mpm_gic_chip, "qcom,mpm-gic", mpm_gic_chip_init); static int mpm_gpio_chip_probe(struct platform_device *pdev) static int __init mpm_gpio_chip_init(struct device_node *node, struct device_node *parent) { struct device_node *node, *parent; struct irq_domain *parent_domain; const struct of_device_id *id; node = pdev->dev.of_node; parent = of_irq_find_parent(node); if (!parent) { pr_err("%s(): no parent for mpm-gpio\n", node->full_name); pr_err("%s(): no parent for mpm-gic\n", node->full_name); return -ENXIO; } parent_domain = irq_find_host(parent); if (!parent_domain) { pr_err("unable to obtain gpio parent domain defer probe\n"); return -EPROBE_DEFER; return -ENXIO; } id = of_match_node(mpm_gpio_chip_data_table, node); if (!id) { Loading @@ -678,22 +690,4 @@ static int mpm_gpio_chip_probe(struct platform_device *pdev) return 0; } static const struct of_device_id msm_mpm_dt_match[] = { { .compatible = "qcom,mpm-gpio"}, { }, }; static struct platform_driver msm_mpm_driver = { .probe = mpm_gpio_chip_probe, .driver = { .name = "qcom,mpm-gpio", .of_match_table = msm_mpm_dt_match, }, }; static int __init msm_mpm_gpio_init(void) { return platform_driver_register(&msm_mpm_driver); } arch_initcall(msm_mpm_gpio_init) IRQCHIP_DECLARE(mpm_gpio_chip, "qcom,mpm-gpio", mpm_gpio_chip_init); drivers/pinctrl/qcom/pinctrl-msm.c +63 −30 Original line number Diff line number Diff line Loading @@ -584,6 +584,9 @@ static void msm_gpio_irq_mask(struct irq_data *d) clear_bit(d->hwirq, pctrl->enabled_irqs); spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_mask_parent(d); } static void msm_gpio_irq_enable(struct irq_data *d) Loading Loading @@ -612,6 +615,9 @@ static void msm_gpio_irq_enable(struct irq_data *d) set_bit(d->hwirq, pctrl->enabled_irqs); spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_enable_parent(d); } static void msm_gpio_irq_unmask(struct irq_data *d) Loading @@ -633,6 +639,9 @@ static void msm_gpio_irq_unmask(struct irq_data *d) set_bit(d->hwirq, pctrl->enabled_irqs); spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_unmask_parent(d); } static void msm_gpio_irq_ack(struct irq_data *d) Loading Loading @@ -746,6 +755,9 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type) spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_set_type_parent(d, type); if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) irq_set_handler_locked(d, handle_level_irq); else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) Loading @@ -766,6 +778,9 @@ static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on) spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_set_wake_parent(d, on); return 0; } Loading Loading @@ -839,16 +854,20 @@ static int msm_gpio_domain_translate(struct irq_domain *d, static int msm_gpio_domain_alloc(struct irq_domain *domain, unsigned int virq, unsigned int nr_irqs, void *arg) { int ret; int ret = 0; irq_hw_number_t hwirq; struct irq_fwspec *fwspec = arg; struct irq_fwspec *fwspec = arg, parent_fwspec; ret = msm_gpio_domain_translate(domain, fwspec, &hwirq, NULL); if (ret) return ret; msm_gpio_domain_set_info(domain, virq, hwirq); return ret; parent_fwspec = *fwspec; parent_fwspec.fwnode = domain->parent->fwnode; return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &parent_fwspec); } static const struct irq_domain_ops msm_gpio_domain_ops = { Loading @@ -873,16 +892,9 @@ static void setup_pdc_gpio(struct irq_domain *domain, unsigned int parent_irq, unsigned int gpio) { int irq; struct irq_fwspec fwspec; fwspec.fwnode = domain->fwnode; fwspec.param[0] = gpio; fwspec.param[1] = IRQ_TYPE_NONE; fwspec.param_count = 2; if (gpio != 0) { irq = irq_create_fwspec_mapping(&fwspec); irq = irq_find_mapping(domain, gpio); irq_set_parent(irq, parent_irq); irq_set_chip(irq, &msm_dirconn_irq_chip); irq_set_handler_data(parent_irq, irq_get_irq_data(irq)); Loading Loading @@ -1387,7 +1399,14 @@ static void msm_gpio_setup_dir_connects(struct msm_pinctrl *pctrl) static int msm_gpiochip_to_irq(struct gpio_chip *chip, unsigned int offset) { return irq_find_mapping(chip->irqdomain, offset); struct irq_fwspec fwspec; fwspec.fwnode = of_node_to_fwnode(chip->of_node); fwspec.param[0] = offset; fwspec.param[1] = IRQ_TYPE_NONE; fwspec.param_count = 2; return irq_create_fwspec_mapping(&fwspec); } static int msm_gpio_init(struct msm_pinctrl *pctrl) Loading @@ -1395,6 +1414,7 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) struct gpio_chip *chip; int ret; unsigned ngpio = pctrl->soc->ngpios; struct device_node *irq_parent = NULL; struct irq_domain *domain_parent; if (WARN_ON(ngpio > MAX_NR_GPIO)) Loading @@ -1407,11 +1427,6 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) chip->parent = pctrl->dev; chip->owner = THIS_MODULE; chip->of_node = pctrl->dev->of_node; chip->irqchip = &msm_gpio_irq_chip; chip->irq_handler = handle_fasteoi_irq; chip->irq_default_type = IRQ_TYPE_NONE; chip->to_irq = msm_gpiochip_to_irq; chip->lock_key = NULL; ret = gpiochip_add_data(&pctrl->chip, pctrl); if (ret) { Loading @@ -1426,7 +1441,14 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) return ret; } domain_parent = irq_find_host(of_irq_find_parent(chip->of_node)); irq_parent = of_irq_find_parent(chip->of_node); if (of_device_is_compatible(irq_parent, "qcom,mpm-gpio")) { chip->irqchip = &msm_gpio_irq_chip; chip->irq_handler = handle_fasteoi_irq; chip->irq_default_type = IRQ_TYPE_NONE; chip->to_irq = msm_gpiochip_to_irq; chip->lock_key = NULL; domain_parent = irq_find_host(irq_parent); if (!domain_parent) { pr_err("unable to find parent domain\n"); gpiochip_remove(&pctrl->chip); Loading @@ -1442,9 +1464,20 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n"); chip->irqchip = NULL; gpiochip_remove(&pctrl->chip); return -ENOSYS; return -ENXIO; } } else { ret = gpiochip_irqchip_add(chip, &msm_gpio_irq_chip, 0, handle_fasteoi_irq, IRQ_TYPE_NONE); if (ret) { dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n"); gpiochip_remove(&pctrl->chip); return ret; } } gpiochip_set_chained_irqchip(chip, &msm_gpio_irq_chip, pctrl->irq, msm_gpio_irq_handler); Loading Loading
arch/arm64/boot/dts/qcom/msm8953-pinctrl.dtsi +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ gpio-controller; #gpio-cells = <2>; interrupt-controller; interrupt-parent = <&wakegpio>; #interrupt-cells = <2>; pmx-uartconsole { Loading
arch/arm64/boot/dts/qcom/msm8953.dtsi +1 −1 Original line number Diff line number Diff line Loading @@ -231,7 +231,7 @@ wakegpio: wake-gpio { compatible = "qcom,mpm-gpio-msm8953", "qcom,mpm-gpio"; interrupt-controller; interrupt-parent = <&tlmm>; interrupt-parent = <&intc>; #interrupt-cells = <2>; }; Loading
drivers/irqchip/qcom/mpm.c +35 −41 Original line number Diff line number Diff line Loading @@ -202,19 +202,35 @@ static inline void msm_mpm_set_type(struct irq_data *d, } } static void msm_mpm_chip_mask(struct irq_data *d) static void msm_mpm_gpio_chip_mask(struct irq_data *d) { msm_mpm_enable_irq(d, false); } static void msm_mpm_gpio_chip_unmask(struct irq_data *d) { msm_mpm_enable_irq(d, true); } static int msm_mpm_gpio_chip_set_type(struct irq_data *d, unsigned int type) { msm_mpm_set_type(d, type); return 0; } static void msm_mpm_gic_chip_mask(struct irq_data *d) { msm_mpm_enable_irq(d, false); irq_chip_mask_parent(d); } static void msm_mpm_chip_unmask(struct irq_data *d) static void msm_mpm_gic_chip_unmask(struct irq_data *d) { msm_mpm_enable_irq(d, true); irq_chip_unmask_parent(d); } static int msm_mpm_chip_set_type(struct irq_data *d, unsigned int type) static int msm_mpm_gic_chip_set_type(struct irq_data *d, unsigned int type) { msm_mpm_set_type(d, type); return irq_chip_set_type_parent(d, type); Loading @@ -223,21 +239,21 @@ static int msm_mpm_chip_set_type(struct irq_data *d, unsigned int type) static struct irq_chip msm_mpm_gic_chip = { .name = "mpm-gic", .irq_eoi = irq_chip_eoi_parent, .irq_mask = msm_mpm_chip_mask, .irq_disable = msm_mpm_chip_mask, .irq_unmask = msm_mpm_chip_unmask, .irq_mask = msm_mpm_gic_chip_mask, .irq_disable = msm_mpm_gic_chip_mask, .irq_unmask = msm_mpm_gic_chip_unmask, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_set_type = msm_mpm_chip_set_type, .irq_set_type = msm_mpm_gic_chip_set_type, .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE, .irq_set_affinity = irq_chip_set_affinity_parent, }; static struct irq_chip msm_mpm_gpio_chip = { .name = "mpm-gpio", .irq_mask = msm_mpm_chip_mask, .irq_disable = msm_mpm_chip_mask, .irq_unmask = msm_mpm_chip_unmask, .irq_set_type = msm_mpm_chip_set_type, .irq_mask = msm_mpm_gpio_chip_mask, .irq_disable = msm_mpm_gpio_chip_mask, .irq_unmask = msm_mpm_gpio_chip_unmask, .irq_set_type = msm_mpm_gpio_chip_set_type, .flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE, .irq_retrigger = irq_chip_retrigger_hierarchy, .irq_set_vcpu_affinity = irq_chip_set_vcpu_affinity_parent, Loading Loading @@ -267,7 +283,6 @@ static int msm_mpm_gpio_chip_alloc(struct irq_domain *domain, { int ret = 0; struct irq_fwspec *fwspec = data; struct irq_fwspec parent_fwspec; irq_hw_number_t hwirq; unsigned int type = IRQ_TYPE_NONE; Loading @@ -277,10 +292,8 @@ static int msm_mpm_gpio_chip_alloc(struct irq_domain *domain, irq_domain_set_hwirq_and_chip(domain, virq, hwirq, &msm_mpm_gpio_chip, NULL); parent_fwspec = *fwspec; parent_fwspec.fwnode = domain->parent->fwnode; return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &parent_fwspec); return 0; } static const struct irq_domain_ops msm_mpm_gpio_chip_domain_ops = { Loading Loading @@ -643,22 +656,21 @@ static int __init mpm_gic_chip_init(struct device_node *node, IRQCHIP_DECLARE(mpm_gic_chip, "qcom,mpm-gic", mpm_gic_chip_init); static int mpm_gpio_chip_probe(struct platform_device *pdev) static int __init mpm_gpio_chip_init(struct device_node *node, struct device_node *parent) { struct device_node *node, *parent; struct irq_domain *parent_domain; const struct of_device_id *id; node = pdev->dev.of_node; parent = of_irq_find_parent(node); if (!parent) { pr_err("%s(): no parent for mpm-gpio\n", node->full_name); pr_err("%s(): no parent for mpm-gic\n", node->full_name); return -ENXIO; } parent_domain = irq_find_host(parent); if (!parent_domain) { pr_err("unable to obtain gpio parent domain defer probe\n"); return -EPROBE_DEFER; return -ENXIO; } id = of_match_node(mpm_gpio_chip_data_table, node); if (!id) { Loading @@ -678,22 +690,4 @@ static int mpm_gpio_chip_probe(struct platform_device *pdev) return 0; } static const struct of_device_id msm_mpm_dt_match[] = { { .compatible = "qcom,mpm-gpio"}, { }, }; static struct platform_driver msm_mpm_driver = { .probe = mpm_gpio_chip_probe, .driver = { .name = "qcom,mpm-gpio", .of_match_table = msm_mpm_dt_match, }, }; static int __init msm_mpm_gpio_init(void) { return platform_driver_register(&msm_mpm_driver); } arch_initcall(msm_mpm_gpio_init) IRQCHIP_DECLARE(mpm_gpio_chip, "qcom,mpm-gpio", mpm_gpio_chip_init);
drivers/pinctrl/qcom/pinctrl-msm.c +63 −30 Original line number Diff line number Diff line Loading @@ -584,6 +584,9 @@ static void msm_gpio_irq_mask(struct irq_data *d) clear_bit(d->hwirq, pctrl->enabled_irqs); spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_mask_parent(d); } static void msm_gpio_irq_enable(struct irq_data *d) Loading Loading @@ -612,6 +615,9 @@ static void msm_gpio_irq_enable(struct irq_data *d) set_bit(d->hwirq, pctrl->enabled_irqs); spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_enable_parent(d); } static void msm_gpio_irq_unmask(struct irq_data *d) Loading @@ -633,6 +639,9 @@ static void msm_gpio_irq_unmask(struct irq_data *d) set_bit(d->hwirq, pctrl->enabled_irqs); spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_unmask_parent(d); } static void msm_gpio_irq_ack(struct irq_data *d) Loading Loading @@ -746,6 +755,9 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type) spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_set_type_parent(d, type); if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) irq_set_handler_locked(d, handle_level_irq); else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)) Loading @@ -766,6 +778,9 @@ static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on) spin_unlock_irqrestore(&pctrl->lock, flags); if (d->parent_data) irq_chip_set_wake_parent(d, on); return 0; } Loading Loading @@ -839,16 +854,20 @@ static int msm_gpio_domain_translate(struct irq_domain *d, static int msm_gpio_domain_alloc(struct irq_domain *domain, unsigned int virq, unsigned int nr_irqs, void *arg) { int ret; int ret = 0; irq_hw_number_t hwirq; struct irq_fwspec *fwspec = arg; struct irq_fwspec *fwspec = arg, parent_fwspec; ret = msm_gpio_domain_translate(domain, fwspec, &hwirq, NULL); if (ret) return ret; msm_gpio_domain_set_info(domain, virq, hwirq); return ret; parent_fwspec = *fwspec; parent_fwspec.fwnode = domain->parent->fwnode; return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &parent_fwspec); } static const struct irq_domain_ops msm_gpio_domain_ops = { Loading @@ -873,16 +892,9 @@ static void setup_pdc_gpio(struct irq_domain *domain, unsigned int parent_irq, unsigned int gpio) { int irq; struct irq_fwspec fwspec; fwspec.fwnode = domain->fwnode; fwspec.param[0] = gpio; fwspec.param[1] = IRQ_TYPE_NONE; fwspec.param_count = 2; if (gpio != 0) { irq = irq_create_fwspec_mapping(&fwspec); irq = irq_find_mapping(domain, gpio); irq_set_parent(irq, parent_irq); irq_set_chip(irq, &msm_dirconn_irq_chip); irq_set_handler_data(parent_irq, irq_get_irq_data(irq)); Loading Loading @@ -1387,7 +1399,14 @@ static void msm_gpio_setup_dir_connects(struct msm_pinctrl *pctrl) static int msm_gpiochip_to_irq(struct gpio_chip *chip, unsigned int offset) { return irq_find_mapping(chip->irqdomain, offset); struct irq_fwspec fwspec; fwspec.fwnode = of_node_to_fwnode(chip->of_node); fwspec.param[0] = offset; fwspec.param[1] = IRQ_TYPE_NONE; fwspec.param_count = 2; return irq_create_fwspec_mapping(&fwspec); } static int msm_gpio_init(struct msm_pinctrl *pctrl) Loading @@ -1395,6 +1414,7 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) struct gpio_chip *chip; int ret; unsigned ngpio = pctrl->soc->ngpios; struct device_node *irq_parent = NULL; struct irq_domain *domain_parent; if (WARN_ON(ngpio > MAX_NR_GPIO)) Loading @@ -1407,11 +1427,6 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) chip->parent = pctrl->dev; chip->owner = THIS_MODULE; chip->of_node = pctrl->dev->of_node; chip->irqchip = &msm_gpio_irq_chip; chip->irq_handler = handle_fasteoi_irq; chip->irq_default_type = IRQ_TYPE_NONE; chip->to_irq = msm_gpiochip_to_irq; chip->lock_key = NULL; ret = gpiochip_add_data(&pctrl->chip, pctrl); if (ret) { Loading @@ -1426,7 +1441,14 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) return ret; } domain_parent = irq_find_host(of_irq_find_parent(chip->of_node)); irq_parent = of_irq_find_parent(chip->of_node); if (of_device_is_compatible(irq_parent, "qcom,mpm-gpio")) { chip->irqchip = &msm_gpio_irq_chip; chip->irq_handler = handle_fasteoi_irq; chip->irq_default_type = IRQ_TYPE_NONE; chip->to_irq = msm_gpiochip_to_irq; chip->lock_key = NULL; domain_parent = irq_find_host(irq_parent); if (!domain_parent) { pr_err("unable to find parent domain\n"); gpiochip_remove(&pctrl->chip); Loading @@ -1442,9 +1464,20 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n"); chip->irqchip = NULL; gpiochip_remove(&pctrl->chip); return -ENOSYS; return -ENXIO; } } else { ret = gpiochip_irqchip_add(chip, &msm_gpio_irq_chip, 0, handle_fasteoi_irq, IRQ_TYPE_NONE); if (ret) { dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n"); gpiochip_remove(&pctrl->chip); return ret; } } gpiochip_set_chained_irqchip(chip, &msm_gpio_irq_chip, pctrl->irq, msm_gpio_irq_handler); Loading