mfd: stmpe: switch to using gpiod API
PATCH v2 1/1 mfd: stmpe: switch to using gpiod API
This patch switches the driver away from legacy gpio/of_gpio API to gpiod API, and removes use of of_get_named_gpio_flags() which I want to make private to gpiolib.
We also need to patch relevant DTS files, as the original code relied on the fact that of_get_named_gpio_flags() would fetch any data encoded in GPIO flags, even if it does not reflect valid flags for a GPIO.
---
v1->v2:
- add DTS changes, as noticed by Francesco Dolcini.
I guess we could do a dance of changing stmpe to check the flags coming from DTS and try to distinguish IRQ flags from proper GPIO flags, then have a separate patch changing DTSes, and finally a 2nd patch to stmpe to use GPIOD API, but I am hoping we could apply this in one go...
arch/arm/boot/dts/tegra30-apalis-v1.1.dtsi | 2 +- arch/arm/boot/dts/tegra30-apalis.dtsi | 2 +- arch/arm/boot/dts/tegra30-colibri.dtsi | 2 +- drivers/mfd/stmpe.c | 36 ++++++++-------------- 4 files changed, 16 insertions(+), 26 deletions(-)
arch/arm/boot/dts/tegra30-apalis-v1.1.dtsi +1 -1
@@ -993,7 +993,7 @@ ldo8_reg: ldo8 { touchscreen@41 { compatible = "st,stmpe811"; reg = <0x41>; - irq-gpio = <&gpio TEGRA_GPIO(V, 0) IRQ_TYPE_LEVEL_LOW>; + irq-gpio = <&gpio TEGRA_GPIO(V, 0) GPIO_ACTIVE_LOW>; interrupt-controller; id = <0>; blocks = <0x5>;
arch/arm/boot/dts/tegra30-apalis.dtsi +1 -1
@@ -976,7 +976,7 @@ ldo8_reg: ldo8 { touchscreen@41 { compatible = "st,stmpe811"; reg = <0x41>; - irq-gpio = <&gpio TEGRA_GPIO(V, 0) IRQ_TYPE_LEVEL_LOW>; + irq-gpio = <&gpio TEGRA_GPIO(V, 0) GPIO_ACTIVE_LOW>; interrupt-controller; id = <0>; blocks = <0x5>;
arch/arm/boot/dts/tegra30-colibri.dtsi +1 -1
@@ -849,7 +849,7 @@ ldo8_reg: ldo8 { touchscreen@41 { compatible = "st,stmpe811"; reg = <0x41>; - irq-gpio = <&gpio TEGRA_GPIO(V, 0) IRQ_TYPE_LEVEL_LOW>; + irq-gpio = <&gpio TEGRA_GPIO(V, 0) GPIO_ACTIVE_LOW>; interrupt-controller; id = <0>; blocks = <0x5>;
drivers/mfd/stmpe.c +13 -23
@@ -8,14 +8,13 @@*/ #include <linux/err.h> -#include <linux/gpio.h> +#include <linux/gpio/consumer.h> #include <linux/export.h> #include <linux/kernel.h> #include <linux/interrupt.h> #include <linux/irq.h> #include <linux/irqdomain.h> #include <linux/of.h> -#include <linux/of_gpio.h> #include <linux/pm.h> #include <linux/slab.h> #include <linux/mfd/core.h>
@@ -30,17 +29,12 @@* @irq_trigger: IRQ trigger to use for the interrupt to the host * @autosleep: bool to enable/disable stmpe autosleep * @autosleep_timeout: inactivity timeout in milliseconds for autosleep -* @irq_over_gpio: true if gpio is used to get irq -* @irq_gpio: gpio number over which irq will be requested (significant only if -* irq_over_gpio is true) */ struct stmpe_platform_data {int id;unsigned int blocks;unsigned int irq_trigger;bool autosleep; -bool irq_over_gpio; -int irq_gpio;int autosleep_timeout; };
@@ -1349,13 +1343,6 @@ static void stmpe_of_probe(struct stmpe_platform_data *pdata,if (pdata->id <0 ) pdata->id =-1 ; - pdata->irq_gpio =of_get_named_gpio_flags (np,"irq-gpio" ,0 , - &pdata->irq_trigger); -if (gpio_is_valid (pdata->irq_gpio)) - pdata->irq_over_gpio =1 ; -else - pdata->irq_trigger =IRQF_TRIGGER_NONE ; -of_property_read_u32 (np,"st,autosleep-timeout" , &pdata->autosleep_timeout);
@@ -1381,6 +1368,7 @@ int stmpe_probe(struct stmpe_client_info *ci, enum stmpe_partnum partnum)struct stmpe_platform_data *pdata;struct device_node *np = ci->dev->of_node;struct stmpe *stmpe; +struct gpio_desc *irq_gpio;int ret;u32 val;
@@ -1434,18 +1422,20 @@ int stmpe_probe(struct stmpe_client_info *ci, enum stmpe_partnum partnum)if (ci->init) ci->init (stmpe); -if (pdata->irq_over_gpio) { - ret =devm_gpio_request_one (ci->dev, pdata->irq_gpio, -GPIOF_DIR_IN ,"stmpe" ); -if (ret) { -dev_err (stmpe->dev,"failed to request IRQ GPIO: %d\n" , - ret); -return ret; - } + irq_gpio =devm_gpiod_get_optional (ci->dev,"irq" ,GPIOD_ASIS ); + ret =PTR_ERR_OR_ZERO (irq_gpio); +if (ret) { +dev_err (stmpe->dev,"failed to request IRQ GPIO: %d\n" , ret); +return ret; + } - stmpe->irq =gpio_to_irq (pdata->irq_gpio); +if (irq_gpio) { + stmpe->irq =gpiod_to_irq (irq_gpio); + pdata->irq_trigger =gpiod_is_active_low (irq_gpio) ? +IRQF_TRIGGER_LOW :IRQF_TRIGGER_HIGH ; }else { stmpe->irq = ci->irq; + pdata->irq_trigger =IRQF_TRIGGER_NONE ; }if (stmpe->irq <0 ) {
Signature · 5 lines
2.37.2.789.g6183377224-goog -- Dmitry
Quoted 9 lines · Dmitry Torokhov
This patch switches the driver away from legacy gpio/of_gpio API to gpiod API, and removes use of
of_get_named_gpio_flags()which I want to make private to gpiolib.We also need to patch relevant DTS files, as the original code relied on the fact that
of_get_named_gpio_flags()would fetch any data encoded in GPIO flags, even if it does not reflect valid flags for a GPIO.Signed-off-by Dmitry Torokhov <[email protected]>
Quoted 9 lines
---
v1->v2:
- add DTS changes, as noticed by Francesco Dolcini.I guess we could do a dance of changing stmpe to check the flags coming from DTS and try to distinguish IRQ flags from proper GPIO flags, then have a separate patch changing DTSes, and finally a 2nd patch to stmpe to use GPIOD API, but I am hoping we could apply this in one go...
It's a mess, let's just apply it and forget about it. It's one of those trees falling in the forest and noone is there to hear it fall-type of things.
Yours,
Linus Walleij
Quoted 19 lines · Dmitry Torokhov
This patch switches the driver away from legacy gpio/of_gpio API to gpiod API, and removes use of
of_get_named_gpio_flags()which I want to make private to gpiolib.We also need to patch relevant DTS files, as the original code relied on the fact that
of_get_named_gpio_flags()would fetch any data encoded in GPIO flags, even if it does not reflect valid flags for a GPIO.Signed-off-by Dmitry Torokhov <[email protected]>---
v1->v2:
- add DTS changes, as noticed by Francesco Dolcini.I guess we could do a dance of changing stmpe to check the flags coming from DTS and try to distinguish IRQ flags from proper GPIO flags, then have a separate patch changing DTSes, and finally a 2nd patch to stmpe to use GPIOD API, but I am hoping we could apply this in one go...
Quoted 5 lines
arch/arm/boot/dts/tegra30-apalis-v1.1.dtsi | 2 +- arch/arm/boot/dts/tegra30-apalis.dtsi | 2 +- arch/arm/boot/dts/tegra30-colibri.dtsi | 2 +- drivers/mfd/stmpe.c | 36 ++++++++-------------- 4 files changed, 16 insertions(+), 26 deletions(-)
Applied, thanks.
Signature · 1 line
Lee Jones [李琼斯]