Commit ac3e9119 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Lee Jones
Browse files

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.

Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarLee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/YxeS1BK2OBH1P/kO@google.com
parent 62a0261c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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>;
+1 −1
Original line number Diff line number Diff line
@@ -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>;
+1 −1
Original line number Diff line number Diff line
@@ -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>;
+13 −23
Original line number Diff line number Diff line
@@ -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");
	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);
		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) {