]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ASoC: codec: arizona: Convert to use GPIO descriptors
authorLinus Walleij <linusw@kernel.org>
Sat, 14 Mar 2026 22:56:49 +0000 (23:56 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 16 Mar 2026 13:11:47 +0000 (13:11 +0000)
This converts the Arizona driver to use GPIO descriptors
exclusively, deletes the legacy code path an updates the
in-tree user of legacy GPIO.

The GPIO lines for mic detect polarity and headphone ID
detection are made exclusively descriptor-oriented. The
headphone ID detection could actually only be used by
the legacy GPIO code, but I converted it to use a
descriptor if someone would actually need it so we don't
just drop useful code.

The compatible "wlf,hpdet-id-gpio" is not in the device
tree bindings and only intended to be used by software
nodes if any. If someone insists I can try to add a
binding for it, but I doubt there is any real user so
it seems pointless.

Signed-off-by: Linus Walleij <linusw@kernel.org>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Link: https://patch.msgid.link/20260314-asoc-arizona-v1-1-ecc9a165307c@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
arch/arm/mach-s3c/mach-crag6410-module.c
include/linux/mfd/arizona/pdata.h
sound/soc/codecs/arizona-jack.c
sound/soc/codecs/arizona.h

index 4ffcf024b09df0c27ab64bce494d9a91e6c31a8c..14b0f9cc103e0ef95824c3cc522a2aa112fde9f5 100644 (file)
@@ -239,7 +239,6 @@ static struct gpiod_lookup_table wm8994_gpiod_table = {
 static struct arizona_pdata wm5102_reva_pdata = {
        .gpio_base = CODEC_GPIO_BASE,
        .irq_flags = IRQF_TRIGGER_HIGH,
-       .micd_pol_gpio = CODEC_GPIO_BASE + 4,
        .micd_rate = 6,
        .gpio_defaults = {
                [2] = 0x10000, /* AIF3TXLRCLK */
@@ -265,6 +264,8 @@ static struct gpiod_lookup_table wm5102_reva_gpiod_table = {
        .table = {
                GPIO_LOOKUP("GPION", 7,
                            "wlf,ldoena", GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("arizona", 4,
+                           "wlf,micd-pol", GPIO_ACTIVE_HIGH),
                { },
        },
 };
@@ -272,7 +273,6 @@ static struct gpiod_lookup_table wm5102_reva_gpiod_table = {
 static struct arizona_pdata wm5102_pdata = {
        .gpio_base = CODEC_GPIO_BASE,
        .irq_flags = IRQF_TRIGGER_HIGH,
-       .micd_pol_gpio = CODEC_GPIO_BASE + 2,
        .gpio_defaults = {
                [2] = 0x10000, /* AIF3TXLRCLK */
                [3] = 0x4,     /* OPCLK */
@@ -297,6 +297,8 @@ static struct gpiod_lookup_table wm5102_gpiod_table = {
        .table = {
                GPIO_LOOKUP("GPION", 7,
                            "wlf,ldo1ena", GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("arizona", 2,
+                           "wlf,micd-pol", GPIO_ACTIVE_HIGH),
                { },
        },
 };
index f72e6d4b14a7842b0085bd95c1e22a0967f0e81e..d465dcd8c90aaf2bc24e1273a122eee962374f9b 100644 (file)
@@ -117,11 +117,6 @@ struct arizona_pdata {
        /** Check for line output with HPDET method */
        bool hpdet_acc_id_line;
 
-#ifdef CONFIG_GPIOLIB_LEGACY
-       /** GPIO used for mic isolation with HPDET */
-       int hpdet_id_gpio;
-#endif
-
        /** Channel to use for headphone detection */
        unsigned int hpdet_channel;
 
@@ -131,11 +126,6 @@ struct arizona_pdata {
        /** Extra debounce timeout used during initial mic detection (ms) */
        unsigned int micd_detect_debounce;
 
-#ifdef CONFIG_GPIOLIB_LEGACY
-       /** GPIO for mic detection polarity */
-       int micd_pol_gpio;
-#endif
-
        /** Mic detect ramp rate */
        unsigned int micd_bias_start_time;
 
index 303c1d44ebd8cf26066c131b0c588efb2082d5a7..a9063bac2752bc99fe5b39147c050ed105698710 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/interrupt.h>
 #include <linux/err.h>
 #include <linux/gpio/consumer.h>
-#include <linux/gpio.h>
 #include <linux/input.h>
 #include <linux/pm_runtime.h>
 #include <linux/property.h>
@@ -459,11 +458,6 @@ static int arizona_hpdet_do_id(struct arizona_priv *info, int *reading,
                               bool *mic)
 {
        struct arizona *arizona = info->arizona;
-#ifdef CONFIG_GPIOLIB_LEGACY
-       int id_gpio = arizona->pdata.hpdet_id_gpio;
-#else
-       int id_gpio = 0;
-#endif
 
        if (!arizona->pdata.hpdet_acc_id)
                return 0;
@@ -474,9 +468,8 @@ static int arizona_hpdet_do_id(struct arizona_priv *info, int *reading,
         */
        info->hpdet_res[info->num_hpdet_res++] = *reading;
 
-#ifdef CONFIG_GPIOLIB_LEGACY
        /* Only check the mic directly if we didn't already ID it */
-       if (id_gpio && info->num_hpdet_res == 1) {
+       if (info->hpdet_id_gpio && info->num_hpdet_res == 1) {
                dev_dbg(arizona->dev, "Measuring mic\n");
 
                regmap_update_bits(arizona->regmap,
@@ -486,13 +479,12 @@ static int arizona_hpdet_do_id(struct arizona_priv *info, int *reading,
                                   ARIZONA_ACCDET_MODE_HPR |
                                   info->micd_modes[0].src);
 
-               gpio_set_value_cansleep(id_gpio, 1);
+               gpiod_set_value_cansleep(info->hpdet_id_gpio, 1);
 
                regmap_update_bits(arizona->regmap, ARIZONA_HEADPHONE_DETECT_1,
                                   ARIZONA_HP_POLL, ARIZONA_HP_POLL);
                return -EAGAIN;
        }
-#endif
 
        /* OK, got both.  Now, compare... */
        dev_dbg(arizona->dev, "HPDET measured %d %d\n",
@@ -514,7 +506,7 @@ static int arizona_hpdet_do_id(struct arizona_priv *info, int *reading,
        /*
         * If we measure the mic as high impedance
         */
-       if (!id_gpio || info->hpdet_res[1] > 50) {
+       if (!info->hpdet_id_gpio || info->hpdet_res[1] > 50) {
                dev_dbg(arizona->dev, "Detected mic\n");
                *mic = true;
                info->detecting = true;
@@ -533,9 +525,6 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
 {
        struct arizona_priv *info = data;
        struct arizona *arizona = info->arizona;
-#ifdef CONFIG_GPIOLIB_LEGACY
-       int id_gpio = arizona->pdata.hpdet_id_gpio;
-#endif
        int ret, reading, state, report;
        bool mic = false;
 
@@ -591,10 +580,8 @@ done:
 
        arizona_extcon_hp_clamp(info, false);
 
-#ifdef CONFIG_GPIOLIB_LEGACY
-       if (id_gpio)
-               gpio_set_value_cansleep(id_gpio, 0);
-#endif
+       if (info->hpdet_id_gpio)
+               gpiod_set_value_cansleep(info->hpdet_id_gpio, 0);
 
        /* If we have a mic then reenable MICDET */
        if (state && (mic || info->mic))
@@ -1325,58 +1312,33 @@ int arizona_jack_codec_dev_probe(struct arizona_priv *info, struct device *dev)
                regmap_update_bits(arizona->regmap, ARIZONA_GP_SWITCH_1,
                                ARIZONA_SW1_MODE_MASK, arizona->pdata.gpsw);
 
-#ifdef CONFIG_GPIOLIB_LEGACY
-       if (pdata->micd_pol_gpio > 0) {
-               if (info->micd_modes[0].gpio)
-                       mode = GPIOF_OUT_INIT_HIGH;
-               else
-                       mode = GPIOF_OUT_INIT_LOW;
-
-               ret = devm_gpio_request_one(dev, pdata->micd_pol_gpio,
-                                           mode, "MICD polarity");
-               if (ret != 0) {
-                       dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
-                               pdata->micd_pol_gpio, ret);
-                       return ret;
-               }
-
-               info->micd_pol_gpio = gpio_to_desc(pdata->micd_pol_gpio);
-       } else
-#endif
-       {
-               if (info->micd_modes[0].gpio)
-                       mode = GPIOD_OUT_HIGH;
-               else
-                       mode = GPIOD_OUT_LOW;
+       if (info->micd_modes[0].gpio)
+               mode = GPIOD_OUT_HIGH;
+       else
+               mode = GPIOD_OUT_LOW;
 
-               /* We can't use devm here because we need to do the get
-                * against the MFD device, as that is where the of_node
-                * will reside, but if we devm against that the GPIO
-                * will not be freed if the extcon driver is unloaded.
-                */
-               info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
-                                                        "wlf,micd-pol",
-                                                        mode);
-               if (IS_ERR(info->micd_pol_gpio)) {
-                       ret = PTR_ERR(info->micd_pol_gpio);
-                       dev_err_probe(arizona->dev, ret, "getting microphone polarity GPIO\n");
-                       return ret;
-               }
+       /* We can't use devm here because we need to do the get
+        * against the MFD device, as that is where the of_node
+        * will reside, but if we devm against that the GPIO
+        * will not be freed if the extcon driver is unloaded.
+        */
+       info->micd_pol_gpio = gpiod_get_optional(arizona->dev,
+                                                "wlf,micd-pol",
+                                                mode);
+       if (IS_ERR(info->micd_pol_gpio)) {
+               ret = PTR_ERR(info->micd_pol_gpio);
+               dev_err_probe(arizona->dev, ret, "getting microphone polarity GPIO\n");
+               return ret;
        }
 
-#ifdef CONFIG_GPIOLIB_LEGACY
-       if (arizona->pdata.hpdet_id_gpio > 0) {
-               ret = devm_gpio_request_one(dev, arizona->pdata.hpdet_id_gpio,
-                                           GPIOF_OUT_INIT_LOW,
-                                           "HPDET");
-               if (ret != 0) {
-                       dev_err(arizona->dev, "Failed to request GPIO%d: %d\n",
-                               arizona->pdata.hpdet_id_gpio, ret);
-                       gpiod_put(info->micd_pol_gpio);
-                       return ret;
-               }
+       info->hpdet_id_gpio = gpiod_get_optional(arizona->dev,
+                                                "wlf,hpdet-id-gpio",
+                                                mode);
+       if (IS_ERR(info->hpdet_id_gpio)) {
+               ret = PTR_ERR(info->hpdet_id_gpio);
+               dev_err_probe(arizona->dev, ret, "getting headphone detect ID GPIO\n");
+               return ret;
        }
-#endif
 
        return 0;
 }
@@ -1385,6 +1347,7 @@ EXPORT_SYMBOL_GPL(arizona_jack_codec_dev_probe);
 int arizona_jack_codec_dev_remove(struct arizona_priv *info)
 {
        gpiod_put(info->micd_pol_gpio);
+       gpiod_put(info->hpdet_id_gpio);
        return 0;
 }
 EXPORT_SYMBOL_GPL(arizona_jack_codec_dev_remove);
index ecd8890eefc18b4db03c3bc2750c399b1ae19e77..0703182d87b3e97c8e454307745b6a9348c01d05 100644 (file)
@@ -100,6 +100,7 @@ struct arizona_priv {
        struct snd_soc_jack *jack;
        struct regulator *micvdd;
        struct gpio_desc *micd_pol_gpio;
+       struct gpio_desc *hpdet_id_gpio;
 
        u16 last_jackdet;