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

mfd: twl6040: Switch to using gpiod API



This patch switches the dirver from legacy gpio API to a newer gpiod
API so that we can eventually drop the former.

Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarLee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20220926054421.1546436-4-dmitry.torokhov@gmail.com
parent 7ca91a33
Loading
Loading
Loading
Loading
+13 −16
Original line number Diff line number Diff line
@@ -17,9 +17,8 @@
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/regmap.h>
@@ -251,7 +250,7 @@ static int twl6040_power_up_automatic(struct twl6040 *twl6040)
{
	int time_left;

	gpio_set_value(twl6040->audpwron, 1);
	gpiod_set_value_cansleep(twl6040->audpwron, 1);

	time_left = wait_for_completion_timeout(&twl6040->ready,
						msecs_to_jiffies(144));
@@ -262,7 +261,7 @@ static int twl6040_power_up_automatic(struct twl6040 *twl6040)
		intid = twl6040_reg_read(twl6040, TWL6040_REG_INTID);
		if (!(intid & TWL6040_READYINT)) {
			dev_err(twl6040->dev, "automatic power-up failed\n");
			gpio_set_value(twl6040->audpwron, 0);
			gpiod_set_value_cansleep(twl6040->audpwron, 0);
			return -ETIMEDOUT;
		}
	}
@@ -290,7 +289,7 @@ int twl6040_power(struct twl6040 *twl6040, int on)
		/* Allow writes to the chip */
		regcache_cache_only(twl6040->regmap, false);

		if (gpio_is_valid(twl6040->audpwron)) {
		if (twl6040->audpwron) {
			/* use automatic power-up sequence */
			ret = twl6040_power_up_automatic(twl6040);
			if (ret) {
@@ -337,9 +336,9 @@ int twl6040_power(struct twl6040 *twl6040, int on)
		if (--twl6040->power_count)
			goto out;

		if (gpio_is_valid(twl6040->audpwron)) {
		if (twl6040->audpwron) {
			/* use AUDPWRON line */
			gpio_set_value(twl6040->audpwron, 0);
			gpiod_set_value_cansleep(twl6040->audpwron, 0);

			/* power-down sequence latency */
			usleep_range(500, 700);
@@ -711,18 +710,16 @@ static int twl6040_probe(struct i2c_client *client)
	}

	/* ERRATA: Automatic power-up is not possible in ES1.0 */
	if (twl6040_get_revid(twl6040) > TWL6040_REV_ES1_0)
		twl6040->audpwron = of_get_named_gpio(node,
						      "ti,audpwron-gpio", 0);
	else
		twl6040->audpwron = -EINVAL;

	if (gpio_is_valid(twl6040->audpwron)) {
		ret = devm_gpio_request_one(&client->dev, twl6040->audpwron,
					    GPIOF_OUT_INIT_LOW, "audpwron");
	if (twl6040_get_revid(twl6040) > TWL6040_REV_ES1_0) {
		twl6040->audpwron = devm_gpiod_get_optional(&client->dev,
							    "ti,audpwron",
							    GPIOD_OUT_LOW);
		ret = PTR_ERR_OR_ZERO(twl6040->audpwron);
		if (ret)
			goto gpio_err;

		gpiod_set_consumer_name(twl6040->audpwron, "audpwron");

		/* Clear any pending interrupt */
		twl6040_reg_read(twl6040, TWL6040_REG_INTID);
	}
+3 −2
Original line number Diff line number Diff line
@@ -196,13 +196,14 @@ struct twl6040_gpo_data {
};

struct twl6040_platform_data {
	int audpwron_gpio;	/* audio power-on gpio */
	struct gpio_desc *audpwron_gpio;	/* audio power-on gpio */

	struct twl6040_codec_data *codec;
	struct twl6040_vibra_data *vibra;
	struct twl6040_gpo_data *gpo;
};

struct gpio_desc;
struct regmap;
struct regmap_irq_chips_data;

@@ -218,7 +219,7 @@ struct twl6040 {
	struct mfd_cell cells[TWL6040_CELLS];
	struct completion ready;

	int audpwron;
	struct gpio_desc *audpwron;
	int power_count;
	int rev;