]> git.itanic.dy.fi Git - linux-stable/commitdiff
ASoC: wm2200: Convert to GPIO descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Fri, 8 Dec 2023 10:09:27 +0000 (11:09 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 8 Dec 2023 14:31:59 +0000 (14:31 +0000)
This converts the WM2200 codec to use GPIO descriptors.
This is a pretty straight-forward conversion, and it also
switches over the single in-tree user in the S3C
Cragganmore module for S3C 6410.

This coded does not seem to get selected or be selectable
through Kconfig, I had to hack another soundcard Kconfig
entry to select it for compile tests.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20231208-descriptors-sound-wlf-v1-3-c4dab6f521ec@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
arch/arm/mach-s3c/mach-crag6410-module.c
include/sound/wm2200.h
sound/soc/codecs/wm2200.c

index a9a713641047d8a6a7e914651b2e83ab4d273b0e..1df6b7e52c9d2b65dd4c212415e062bfe3ccce4c 100644 (file)
@@ -305,12 +305,20 @@ static const struct i2c_board_info wm6230_i2c_devs[] = {
 };
 
 static struct wm2200_pdata wm2200_pdata = {
-       .ldo_ena = S3C64XX_GPN(7),
        .gpio_defaults = {
                [2] = 0x0005,  /* GPIO3 24.576MHz output clock */
        },
 };
 
+static struct gpiod_lookup_table wm2200_gpiod_table = {
+       .dev_id = "1-003a", /* Device 003a on I2C bus 1 */
+       .table = {
+               GPIO_LOOKUP("GPION", 7,
+                           "wlf,ldo1ena", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static const struct i2c_board_info wm2200_i2c[] = {
        { I2C_BOARD_INFO("wm2200", 0x3a),
          .platform_data = &wm2200_pdata, },
@@ -372,7 +380,8 @@ static const struct {
          .num_spi_devs = ARRAY_SIZE(wm5102_spi_devs),
          .gpiod_table = &wm5102_gpiod_table },
        { .id = 0x3f, .rev = -1, .name = "WM2200-6271-CS90-M-REV1",
-         .i2c_devs = wm2200_i2c, .num_i2c_devs = ARRAY_SIZE(wm2200_i2c) },
+         .i2c_devs = wm2200_i2c, .num_i2c_devs = ARRAY_SIZE(wm2200_i2c),
+         .gpiod_table = &wm2200_gpiod_table },
 };
 
 static int wlf_gf_module_probe(struct i2c_client *i2c)
index 9987e6c09bdce74bc4e389a9d85da47e95e05b33..2e4913ee25056ebab1b29a9f9f5f16a947b46ea4 100644 (file)
@@ -42,8 +42,6 @@ struct wm2200_micbias {
 };
 
 struct wm2200_pdata {
-       int reset;      /** GPIO controlling /RESET, if any */
-       int ldo_ena;    /** GPIO controlling LODENA, if any */
        int irq_flags;
 
        int gpio_defaults[4];
index 9679906c6bd50298d78b6056d985c5a66333087c..69c9c2bd7e7bba4aecaa239602e176932225cb91 100644 (file)
@@ -14,7 +14,7 @@
 #include <linux/pm.h>
 #include <linux/firmware.h>
 #include <linux/gcd.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/i2c.h>
 #include <linux/pm_runtime.h>
 #include <linux/regulator/consumer.h>
@@ -79,6 +79,8 @@ struct wm2200_priv {
        struct snd_soc_component *component;
        struct wm2200_pdata pdata;
        struct regulator_bulk_data core_supplies[WM2200_NUM_CORE_SUPPLIES];
+       struct gpio_desc *ldo_ena;
+       struct gpio_desc *reset;
 
        struct completion fll_lock;
        int fll_fout;
@@ -975,9 +977,10 @@ static const struct reg_sequence wm2200_reva_patch[] = {
 
 static int wm2200_reset(struct wm2200_priv *wm2200)
 {
-       if (wm2200->pdata.reset) {
-               gpio_set_value_cansleep(wm2200->pdata.reset, 0);
-               gpio_set_value_cansleep(wm2200->pdata.reset, 1);
+       if (wm2200->reset) {
+               /* Descriptor flagged active low, so this will be inverted */
+               gpiod_set_value_cansleep(wm2200->reset, 1);
+               gpiod_set_value_cansleep(wm2200->reset, 0);
 
                return 0;
        } else {
@@ -2246,28 +2249,28 @@ static int wm2200_i2c_probe(struct i2c_client *i2c)
                return ret;
        }
 
-       if (wm2200->pdata.ldo_ena) {
-               ret = devm_gpio_request_one(&i2c->dev, wm2200->pdata.ldo_ena,
-                                           GPIOF_OUT_INIT_HIGH,
-                                           "WM2200 LDOENA");
-               if (ret < 0) {
-                       dev_err(&i2c->dev, "Failed to request LDOENA %d: %d\n",
-                               wm2200->pdata.ldo_ena, ret);
-                       goto err_enable;
-               }
+       wm2200->ldo_ena = devm_gpiod_get_optional(&i2c->dev, "wlf,ldo1ena",
+                                                 GPIOD_OUT_HIGH);
+       if (IS_ERR(wm2200->ldo_ena)) {
+               ret = PTR_ERR(wm2200->ldo_ena);
+               dev_err(&i2c->dev, "Failed to request LDOENA GPIO %d\n",
+                       ret);
+               goto err_enable;
+       }
+       if (wm2200->ldo_ena) {
+               gpiod_set_consumer_name(wm2200->ldo_ena, "WM2200 LDOENA");
                msleep(2);
        }
 
-       if (wm2200->pdata.reset) {
-               ret = devm_gpio_request_one(&i2c->dev, wm2200->pdata.reset,
-                                           GPIOF_OUT_INIT_HIGH,
-                                           "WM2200 /RESET");
-               if (ret < 0) {
-                       dev_err(&i2c->dev, "Failed to request /RESET %d: %d\n",
-                               wm2200->pdata.reset, ret);
-                       goto err_ldo;
-               }
+       wm2200->reset = devm_gpiod_get_optional(&i2c->dev, "reset",
+                                               GPIOD_OUT_LOW);
+       if (IS_ERR(wm2200->reset)) {
+               ret = PTR_ERR(wm2200->reset);
+               dev_err(&i2c->dev, "Failed to request RESET GPIO %d\n",
+                       ret);
+               goto err_ldo;
        }
+       gpiod_set_consumer_name(wm2200->reset, "WM2200 /RESET");
 
        ret = regmap_read(wm2200->regmap, WM2200_SOFTWARE_RESET, &reg);
        if (ret < 0) {
@@ -2403,11 +2406,9 @@ static int wm2200_i2c_probe(struct i2c_client *i2c)
        if (i2c->irq)
                free_irq(i2c->irq, wm2200);
 err_reset:
-       if (wm2200->pdata.reset)
-               gpio_set_value_cansleep(wm2200->pdata.reset, 0);
+       gpiod_set_value_cansleep(wm2200->reset, 1);
 err_ldo:
-       if (wm2200->pdata.ldo_ena)
-               gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 0);
+       gpiod_set_value_cansleep(wm2200->ldo_ena, 0);
 err_enable:
        regulator_bulk_disable(ARRAY_SIZE(wm2200->core_supplies),
                               wm2200->core_supplies);
@@ -2421,10 +2422,9 @@ static void wm2200_i2c_remove(struct i2c_client *i2c)
        pm_runtime_disable(&i2c->dev);
        if (i2c->irq)
                free_irq(i2c->irq, wm2200);
-       if (wm2200->pdata.reset)
-               gpio_set_value_cansleep(wm2200->pdata.reset, 0);
-       if (wm2200->pdata.ldo_ena)
-               gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 0);
+       /* Assert RESET, disable LDO */
+       gpiod_set_value_cansleep(wm2200->reset, 1);
+       gpiod_set_value_cansleep(wm2200->ldo_ena, 0);
        regulator_bulk_disable(ARRAY_SIZE(wm2200->core_supplies),
                               wm2200->core_supplies);
 }
@@ -2436,8 +2436,7 @@ static int wm2200_runtime_suspend(struct device *dev)
 
        regcache_cache_only(wm2200->regmap, true);
        regcache_mark_dirty(wm2200->regmap);
-       if (wm2200->pdata.ldo_ena)
-               gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 0);
+       gpiod_set_value_cansleep(wm2200->ldo_ena, 0);
        regulator_bulk_disable(ARRAY_SIZE(wm2200->core_supplies),
                               wm2200->core_supplies);
 
@@ -2457,8 +2456,8 @@ static int wm2200_runtime_resume(struct device *dev)
                return ret;
        }
 
-       if (wm2200->pdata.ldo_ena) {
-               gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 1);
+       if (wm2200->ldo_ena) {
+               gpiod_set_value_cansleep(wm2200->ldo_ena, 1);
                msleep(2);
        }