]> git.itanic.dy.fi Git - linux-stable/commitdiff
ASoC: wm8996: Convert to GPIO descriptors
authorLinus Walleij <linus.walleij@linaro.org>
Fri, 8 Dec 2023 10:09:29 +0000 (11:09 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 8 Dec 2023 14:32:00 +0000 (14:32 +0000)
This converts the WM8996 codec to use GPIO descriptors, an a similar
way to WM5100.

The driver is instantiating a GPIO chip named wm8996, and we get
rid of the base address for the GPIO chip from the platform data and
just use dynamic numbering. Move base and ngpio into the static
gpio_chip template.

Fix up the only in-tree user which is the Cragganmore 6410 module.

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-5-c4dab6f521ec@linaro.org
Signed-off-by: Mark Brown <broonie@kernel.org>
arch/arm/mach-s3c/mach-crag6410-module.c
include/sound/wm8996.h
sound/soc/codecs/wm8996.c

index 59456fbebf1b3f5ae211c6f83f4ebc5e5c1201af..2de1a89f6e9976b1b656aad31c9a15254055a2b1 100644 (file)
@@ -127,9 +127,16 @@ static struct wm8996_retune_mobile_config wm8996_retune[] = {
        },
 };
 
+static struct gpiod_lookup_table wm8996_gpiod_table = {
+       .dev_id = "1-001a", /* Device 001a on I2C bus 1 */
+       .table = {
+               GPIO_LOOKUP("GPION", 7,
+                           "wlf,ldo1ena", GPIO_ACTIVE_HIGH),
+               { },
+       },
+};
+
 static struct wm8996_pdata wm8996_pdata __initdata = {
-       .ldo_ena = S3C64XX_GPN(7),
-       .gpio_base = CODEC_GPIO_BASE,
        .micdet_def = 1,
        .inl_mode = WM8996_DIFFERRENTIAL_1,
        .inr_mode = WM8996_DIFFERRENTIAL_1,
@@ -370,7 +377,8 @@ static const struct {
          .spi_devs = balblair_devs,
          .num_spi_devs = ARRAY_SIZE(balblair_devs) },
        { .id = 0x39, .rev = 0xff, .name = "1254-EV1 Dallas Dhu",
-         .i2c_devs = wm1254_devs, .num_i2c_devs = ARRAY_SIZE(wm1254_devs) },
+         .i2c_devs = wm1254_devs, .num_i2c_devs = ARRAY_SIZE(wm1254_devs),
+         .gpiod_table = &wm8996_gpiod_table },
        { .id = 0x3a, .rev = 0xff, .name = "1259-EV1 Tobermory",
          .i2c_devs = wm1259_devs, .num_i2c_devs = ARRAY_SIZE(wm1259_devs) },
        { .id = 0x3b, .rev = 0xff, .name = "1255-EV1 Kilchoman",
index 247f9917e33d0ec9b2a1d7e9344fade7230febeb..342abeef288f3eb11f6614b917f3d97a5570da94 100644 (file)
@@ -33,8 +33,6 @@ struct wm8996_retune_mobile_config {
 struct wm8996_pdata {
        int irq_flags;  /** Set IRQ trigger flags; default active low */
 
-       int ldo_ena;  /** GPIO for LDO1; -1 for none */
-
        int micdet_def;  /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */
 
        enum wm8996_inmode inl_mode;
@@ -42,7 +40,6 @@ struct wm8996_pdata {
 
        u32 spkmute_seq;  /** Value for register 0x802 */
 
-       int gpio_base;
        u32 gpio_default[5];
 
        int num_retune_mobile_cfgs;
index df6195778c570a96d47b8b1ffc9f22ff773de7fe..e738326e33eda6f12af2850df1615626161f5228 100644 (file)
@@ -14,7 +14,7 @@
 #include <linux/pm.h>
 #include <linux/gcd.h>
 #include <linux/gpio/driver.h>
-#include <linux/gpio.h>
+#include <linux/gpio/consumer.h>
 #include <linux/i2c.h>
 #include <linux/regmap.h>
 #include <linux/regulator/consumer.h>
@@ -51,7 +51,7 @@ struct wm8996_priv {
        struct regmap *regmap;
        struct snd_soc_component *component;
 
-       int ldo1ena;
+       struct gpio_desc *ldo_ena;
 
        int sysclk;
        int sysclk_src;
@@ -1596,9 +1596,9 @@ static int wm8996_set_bias_level(struct snd_soc_component *component,
                                return ret;
                        }
 
-                       if (wm8996->pdata.ldo_ena >= 0) {
-                               gpio_set_value_cansleep(wm8996->pdata.ldo_ena,
-                                                       1);
+                       if (wm8996->ldo_ena) {
+                               gpiod_set_value_cansleep(wm8996->ldo_ena,
+                                                        1);
                                msleep(5);
                        }
 
@@ -1615,8 +1615,8 @@ static int wm8996_set_bias_level(struct snd_soc_component *component,
 
        case SND_SOC_BIAS_OFF:
                regcache_cache_only(wm8996->regmap, true);
-               if (wm8996->pdata.ldo_ena >= 0) {
-                       gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0);
+               if (wm8996->ldo_ena) {
+                       gpiod_set_value_cansleep(wm8996->ldo_ena, 0);
                        regcache_cache_only(wm8996->regmap, true);
                }
                regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies),
@@ -2188,6 +2188,8 @@ static const struct gpio_chip wm8996_template_chip = {
        .direction_input        = wm8996_gpio_direction_in,
        .get                    = wm8996_gpio_get,
        .can_sleep              = 1,
+       .ngpio                  = 5,
+       .base                   = -1,
 };
 
 static void wm8996_init_gpio(struct wm8996_priv *wm8996)
@@ -2195,14 +2197,8 @@ static void wm8996_init_gpio(struct wm8996_priv *wm8996)
        int ret;
 
        wm8996->gpio_chip = wm8996_template_chip;
-       wm8996->gpio_chip.ngpio = 5;
        wm8996->gpio_chip.parent = wm8996->dev;
 
-       if (wm8996->pdata.gpio_base)
-               wm8996->gpio_chip.base = wm8996->pdata.gpio_base;
-       else
-               wm8996->gpio_chip.base = -1;
-
        ret = gpiochip_add_data(&wm8996->gpio_chip, wm8996);
        if (ret != 0)
                dev_err(wm8996->dev, "Failed to add GPIOs: %d\n", ret);
@@ -2771,15 +2767,15 @@ static int wm8996_i2c_probe(struct i2c_client *i2c)
                memcpy(&wm8996->pdata, dev_get_platdata(&i2c->dev),
                       sizeof(wm8996->pdata));
 
-       if (wm8996->pdata.ldo_ena > 0) {
-               ret = gpio_request_one(wm8996->pdata.ldo_ena,
-                                      GPIOF_OUT_INIT_LOW, "WM8996 ENA");
-               if (ret < 0) {
-                       dev_err(&i2c->dev, "Failed to request GPIO %d: %d\n",
-                               wm8996->pdata.ldo_ena, ret);
-                       goto err;
-               }
+       wm8996->ldo_ena = devm_gpiod_get_optional(&i2c->dev, "wlf,ldo1ena",
+                                                 GPIOD_OUT_LOW);
+       if (IS_ERR(wm8996->ldo_ena)) {
+               ret = PTR_ERR(wm8996->ldo_ena);
+               dev_err(&i2c->dev, "Failed to request LDO ENA GPIO: %d\n",
+                       ret);
+               goto err;
        }
+       gpiod_set_consumer_name(wm8996->ldo_ena, "WM8996 ENA");
 
        for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++)
                wm8996->supplies[i].supply = wm8996_supply_names[i];
@@ -2814,8 +2810,8 @@ static int wm8996_i2c_probe(struct i2c_client *i2c)
                goto err_gpio;
        }
 
-       if (wm8996->pdata.ldo_ena > 0) {
-               gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 1);
+       if (wm8996->ldo_ena) {
+               gpiod_set_value_cansleep(wm8996->ldo_ena, 1);
                msleep(5);
        }
 
@@ -2847,8 +2843,8 @@ static int wm8996_i2c_probe(struct i2c_client *i2c)
        dev_info(&i2c->dev, "revision %c\n",
                 (reg & WM8996_CHIP_REV_MASK) + 'A');
 
-       if (wm8996->pdata.ldo_ena > 0) {
-               gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0);
+       if (wm8996->ldo_ena) {
+               gpiod_set_value_cansleep(wm8996->ldo_ena, 0);
                regcache_cache_only(wm8996->regmap, true);
        } else {
                ret = regmap_write(wm8996->regmap, WM8996_SOFTWARE_RESET,
@@ -3054,12 +3050,10 @@ static int wm8996_i2c_probe(struct i2c_client *i2c)
        wm8996_free_gpio(wm8996);
 err_regmap:
 err_enable:
-       if (wm8996->pdata.ldo_ena > 0)
-               gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0);
+       if (wm8996->ldo_ena)
+               gpiod_set_value_cansleep(wm8996->ldo_ena, 0);
        regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies);
 err_gpio:
-       if (wm8996->pdata.ldo_ena > 0)
-               gpio_free(wm8996->pdata.ldo_ena);
 err:
 
        return ret;
@@ -3070,10 +3064,8 @@ static void wm8996_i2c_remove(struct i2c_client *client)
        struct wm8996_priv *wm8996 = i2c_get_clientdata(client);
 
        wm8996_free_gpio(wm8996);
-       if (wm8996->pdata.ldo_ena > 0) {
-               gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0);
-               gpio_free(wm8996->pdata.ldo_ena);
-       }
+       if (wm8996->ldo_ena)
+               gpiod_set_value_cansleep(wm8996->ldo_ena, 0);
 }
 
 static const struct i2c_device_id wm8996_i2c_id[] = {