mfd: twl6040: Switch to using gpiod API
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 26 Sep 2022 05:44:20 +0000 (22:44 -0700)
committerLee Jones <lee@kernel.org>
Wed, 7 Dec 2022 13:28:07 +0000 (13:28 +0000)
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: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20220926054421.1546436-4-dmitry.torokhov@gmail.com
drivers/mfd/twl6040.c
include/linux/mfd/twl6040.h

index dd9543f..fc97fa5 100644 (file)
@@ -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);
        }
index 1fc7450..cb1e7a9 100644 (file)
@@ -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;