From: Greg Kroah-Hartman Date: Thu, 19 Mar 2020 14:57:01 +0000 (+0100) Subject: fix gpio build issue in 5.5 tree X-Git-Tag: v4.4.217~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3dc869d844ece248fd07bc82e661c5363f8fedd6;p=thirdparty%2Fkernel%2Fstable-queue.git fix gpio build issue in 5.5 tree --- diff --git a/queue-5.5/gpiolib-add-support-for-the-irqdomain-which-doesn-t-.patch b/queue-5.5/gpiolib-add-support-for-the-irqdomain-which-doesn-t-.patch deleted file mode 100644 index a0eaf533a5d..00000000000 --- a/queue-5.5/gpiolib-add-support-for-the-irqdomain-which-doesn-t-.patch +++ /dev/null @@ -1,256 +0,0 @@ -From 55f9c35937b7f1ab1747a346c5ae83e4c751ac5d Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Tue, 14 Jan 2020 16:28:19 +0800 -Subject: gpiolib: Add support for the irqdomain which doesn't use irq_fwspec - as arg - -From: Kevin Hao - -[ Upstream commit 242587616710576808dc8d7cdf18cfe0d7bf9831 ] - -Some gpio's parent irqdomain may not use the struct irq_fwspec as -argument, such as msi irqdomain. So rename the callback -populate_parent_fwspec() to populate_parent_alloc_arg() and make it -allocate and populate the specific struct which is needed by the -parent irqdomain. - -Signed-off-by: Kevin Hao -Link: https://lore.kernel.org/r/20200114082821.14015-3-haokexin@gmail.com -Signed-off-by: Linus Walleij -Signed-off-by: Sasha Levin ---- - drivers/gpio/gpio-tegra186.c | 13 +++++-- - drivers/gpio/gpiolib.c | 45 +++++++++++++++--------- - drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 2 +- - drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | 2 +- - include/linux/gpio/driver.h | 21 +++++------ - 5 files changed, 49 insertions(+), 34 deletions(-) - -diff --git a/drivers/gpio/gpio-tegra186.c b/drivers/gpio/gpio-tegra186.c -index 55b43b7ce88db..de241263d4be3 100644 ---- a/drivers/gpio/gpio-tegra186.c -+++ b/drivers/gpio/gpio-tegra186.c -@@ -448,17 +448,24 @@ static int tegra186_gpio_irq_domain_translate(struct irq_domain *domain, - return 0; - } - --static void tegra186_gpio_populate_parent_fwspec(struct gpio_chip *chip, -- struct irq_fwspec *fwspec, -+static void *tegra186_gpio_populate_parent_fwspec(struct gpio_chip *chip, - unsigned int parent_hwirq, - unsigned int parent_type) - { - struct tegra_gpio *gpio = gpiochip_get_data(chip); -+ struct irq_fwspec *fwspec; - -+ fwspec = kmalloc(sizeof(*fwspec), GFP_KERNEL); -+ if (!fwspec) -+ return NULL; -+ -+ fwspec->fwnode = chip->irq.parent_domain->fwnode; - fwspec->param_count = 3; - fwspec->param[0] = gpio->soc->instance; - fwspec->param[1] = parent_hwirq; - fwspec->param[2] = parent_type; -+ -+ return fwspec; - } - - static int tegra186_gpio_child_to_parent_hwirq(struct gpio_chip *chip, -@@ -621,7 +628,7 @@ static int tegra186_gpio_probe(struct platform_device *pdev) - irq->chip = &gpio->intc; - irq->fwnode = of_node_to_fwnode(pdev->dev.of_node); - irq->child_to_parent_hwirq = tegra186_gpio_child_to_parent_hwirq; -- irq->populate_parent_fwspec = tegra186_gpio_populate_parent_fwspec; -+ irq->populate_parent_alloc_arg = tegra186_gpio_populate_parent_fwspec; - irq->child_offset_to_irq = tegra186_gpio_child_offset_to_irq; - irq->child_irq_domain_ops.translate = tegra186_gpio_irq_domain_translate; - irq->handler = handle_simple_irq; -diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c -index 175c6363cf611..cdbaa8bf72f74 100644 ---- a/drivers/gpio/gpiolib.c -+++ b/drivers/gpio/gpiolib.c -@@ -2003,7 +2003,7 @@ static int gpiochip_hierarchy_irq_domain_alloc(struct irq_domain *d, - irq_hw_number_t hwirq; - unsigned int type = IRQ_TYPE_NONE; - struct irq_fwspec *fwspec = data; -- struct irq_fwspec parent_fwspec; -+ void *parent_arg; - unsigned int parent_hwirq; - unsigned int parent_type; - struct gpio_irq_chip *girq = &gc->irq; -@@ -2042,24 +2042,21 @@ static int gpiochip_hierarchy_irq_domain_alloc(struct irq_domain *d, - NULL, NULL); - irq_set_probe(irq); - -- /* -- * Create a IRQ fwspec to send up to the parent irqdomain: -- * specify the hwirq we address on the parent and tie it -- * all together up the chain. -- */ -- parent_fwspec.fwnode = d->parent->fwnode; - /* This parent only handles asserted level IRQs */ -- girq->populate_parent_fwspec(gc, &parent_fwspec, parent_hwirq, -- parent_type); -+ parent_arg = girq->populate_parent_alloc_arg(gc, parent_hwirq, parent_type); -+ if (!parent_arg) -+ return -ENOMEM; -+ - chip_info(gc, "alloc_irqs_parent for %d parent hwirq %d\n", - irq, parent_hwirq); - irq_set_lockdep_class(irq, gc->irq.lock_key, gc->irq.request_key); -- ret = irq_domain_alloc_irqs_parent(d, irq, 1, &parent_fwspec); -+ ret = irq_domain_alloc_irqs_parent(d, irq, 1, parent_arg); - if (ret) - chip_err(gc, - "failed to allocate parent hwirq %d for hwirq %lu\n", - parent_hwirq, hwirq); - -+ kfree(parent_arg); - return ret; - } - -@@ -2096,8 +2093,8 @@ static int gpiochip_hierarchy_add_domain(struct gpio_chip *gc) - if (!gc->irq.child_offset_to_irq) - gc->irq.child_offset_to_irq = gpiochip_child_offset_to_irq_noop; - -- if (!gc->irq.populate_parent_fwspec) -- gc->irq.populate_parent_fwspec = -+ if (!gc->irq.populate_parent_alloc_arg) -+ gc->irq.populate_parent_alloc_arg = - gpiochip_populate_parent_fwspec_twocell; - - gpiochip_hierarchy_setup_domain_ops(&gc->irq.child_irq_domain_ops); -@@ -2123,27 +2120,43 @@ static bool gpiochip_hierarchy_is_hierarchical(struct gpio_chip *gc) - return !!gc->irq.parent_domain; - } - --void gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip, -- struct irq_fwspec *fwspec, -+void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip, - unsigned int parent_hwirq, - unsigned int parent_type) - { -+ struct irq_fwspec *fwspec; -+ -+ fwspec = kmalloc(sizeof(*fwspec), GFP_KERNEL); -+ if (!fwspec) -+ return NULL; -+ -+ fwspec->fwnode = chip->irq.parent_domain->fwnode; - fwspec->param_count = 2; - fwspec->param[0] = parent_hwirq; - fwspec->param[1] = parent_type; -+ -+ return fwspec; - } - EXPORT_SYMBOL_GPL(gpiochip_populate_parent_fwspec_twocell); - --void gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip, -- struct irq_fwspec *fwspec, -+void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip, - unsigned int parent_hwirq, - unsigned int parent_type) - { -+ struct irq_fwspec *fwspec; -+ -+ fwspec = kmalloc(sizeof(*fwspec), GFP_KERNEL); -+ if (!fwspec) -+ return NULL; -+ -+ fwspec->fwnode = chip->irq.parent_domain->fwnode; - fwspec->param_count = 4; - fwspec->param[0] = 0; - fwspec->param[1] = parent_hwirq; - fwspec->param[2] = 0; - fwspec->param[3] = parent_type; -+ -+ return fwspec; - } - EXPORT_SYMBOL_GPL(gpiochip_populate_parent_fwspec_fourcell); - -diff --git a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c -index 653d1095bfeaf..fe0be8a6ebb7b 100644 ---- a/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c -+++ b/drivers/pinctrl/qcom/pinctrl-spmi-gpio.c -@@ -1060,7 +1060,7 @@ static int pmic_gpio_probe(struct platform_device *pdev) - girq->fwnode = of_node_to_fwnode(state->dev->of_node); - girq->parent_domain = parent_domain; - girq->child_to_parent_hwirq = pmic_gpio_child_to_parent_hwirq; -- girq->populate_parent_fwspec = gpiochip_populate_parent_fwspec_fourcell; -+ girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_fourcell; - girq->child_offset_to_irq = pmic_gpio_child_offset_to_irq; - girq->child_irq_domain_ops.translate = pmic_gpio_domain_translate; - -diff --git a/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c b/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c -index dca86886b1f99..73d986a903f1b 100644 ---- a/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c -+++ b/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c -@@ -794,7 +794,7 @@ static int pm8xxx_gpio_probe(struct platform_device *pdev) - girq->fwnode = of_node_to_fwnode(pctrl->dev->of_node); - girq->parent_domain = parent_domain; - girq->child_to_parent_hwirq = pm8xxx_child_to_parent_hwirq; -- girq->populate_parent_fwspec = gpiochip_populate_parent_fwspec_fourcell; -+ girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_fourcell; - girq->child_offset_to_irq = pm8xxx_child_offset_to_irq; - girq->child_irq_domain_ops.translate = pm8xxx_domain_translate; - -diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h -index e2480ef94c559..9bb43467ed11d 100644 ---- a/include/linux/gpio/driver.h -+++ b/include/linux/gpio/driver.h -@@ -94,16 +94,15 @@ struct gpio_irq_chip { - unsigned int *parent_type); - - /** -- * @populate_parent_fwspec: -+ * @populate_parent_alloc_arg : - * -- * This optional callback populates the &struct irq_fwspec for the -- * parent's IRQ domain. If this is not specified, then -+ * This optional callback allocates and populates the specific struct -+ * for the parent's IRQ domain. If this is not specified, then - * &gpiochip_populate_parent_fwspec_twocell will be used. A four-cell - * variant named &gpiochip_populate_parent_fwspec_fourcell is also - * available. - */ -- void (*populate_parent_fwspec)(struct gpio_chip *chip, -- struct irq_fwspec *fwspec, -+ void *(*populate_parent_alloc_arg)(struct gpio_chip *chip, - unsigned int parent_hwirq, - unsigned int parent_type); - -@@ -537,26 +536,22 @@ struct bgpio_pdata { - - #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY - --void gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip, -- struct irq_fwspec *fwspec, -+void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip, - unsigned int parent_hwirq, - unsigned int parent_type); --void gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip, -- struct irq_fwspec *fwspec, -+void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip, - unsigned int parent_hwirq, - unsigned int parent_type); - - #else - --static inline void gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip, -- struct irq_fwspec *fwspec, -+static inline void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip, - unsigned int parent_hwirq, - unsigned int parent_type) - { - } - --static inline void gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip, -- struct irq_fwspec *fwspec, -+static inline void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip, - unsigned int parent_hwirq, - unsigned int parent_type) - { --- -2.20.1 - diff --git a/queue-5.5/pinctrl-qcom-ssbi-gpio-fix-fwspec-parsing-bug.patch b/queue-5.5/pinctrl-qcom-ssbi-gpio-fix-fwspec-parsing-bug.patch index 7183b34f693..134f60f5671 100644 --- a/queue-5.5/pinctrl-qcom-ssbi-gpio-fix-fwspec-parsing-bug.patch +++ b/queue-5.5/pinctrl-qcom-ssbi-gpio-fix-fwspec-parsing-bug.patch @@ -20,23 +20,21 @@ Fixes: ae436fe81053 ("pinctrl: ssbi-gpio: convert to hierarchical IRQ helpers in Link: https://lore.kernel.org/r/20200306143416.1476250-1-linus.walleij@linaro.org Signed-off-by: Linus Walleij Signed-off-by: Sasha Levin +[Kevin: Replace .populate_parent_alloc_arg with .populate_parent_fwspec] +Signed-off-by: Kevin Hao +Signed-off-by: Greg Kroah-Hartman --- - drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | 2 +- + drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c b/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c -index 73d986a903f1b..3059b245ad2b2 100644 --- a/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c +++ b/drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c -@@ -794,7 +794,7 @@ static int pm8xxx_gpio_probe(struct platform_device *pdev) +@@ -794,7 +794,7 @@ static int pm8xxx_gpio_probe(struct plat girq->fwnode = of_node_to_fwnode(pctrl->dev->of_node); girq->parent_domain = parent_domain; girq->child_to_parent_hwirq = pm8xxx_child_to_parent_hwirq; -- girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_fourcell; -+ girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_twocell; +- girq->populate_parent_fwspec = gpiochip_populate_parent_fwspec_fourcell; ++ girq->populate_parent_fwspec = gpiochip_populate_parent_fwspec_twocell; girq->child_offset_to_irq = pm8xxx_child_offset_to_irq; girq->child_irq_domain_ops.translate = pm8xxx_domain_translate; --- -2.20.1 - diff --git a/queue-5.5/series b/queue-5.5/series index 54f7ac5380e..f0b5808ce79 100644 --- a/queue-5.5/series +++ b/queue-5.5/series @@ -1,4 +1,3 @@ -gpiolib-add-support-for-the-irqdomain-which-doesn-t-.patch pinctrl-qcom-ssbi-gpio-fix-fwspec-parsing-bug.patch mmc-core-default-to-generic_cmd6_time-as-timeout-in-.patch mmc-core-allow-host-controllers-to-require-r1b-for-c.patch