OSDN Git Service

ASoC: max98927: Handle reset gpio when probing i2c
authorAlejandro Tafalla <atafalla@dnyon.com>
Thu, 7 Oct 2021 02:38:56 +0000 (04:38 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 7 Oct 2021 14:45:18 +0000 (15:45 +0100)
The max98927 codec on some devices requires pulling a reset gpio before
responding to any i2c command. This commit adds support for it through
an optional reset-gpios property.

Signed-off-by: Alejandro Tafalla <atafalla@dnyon.com>
Link: https://lore.kernel.org/r/d74b12a79ae9ca728d5d9e64c55b3e59e8c0e509.1633572679.git.atafalla@dnyon.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/max98927.c
sound/soc/codecs/max98927.h

index 8b206ee..5ba5f87 100644 (file)
@@ -897,6 +897,19 @@ static int max98927_i2c_probe(struct i2c_client *i2c,
                        "Failed to allocate regmap: %d\n", ret);
                return ret;
        }
+       
+       max98927->reset_gpio 
+               = devm_gpiod_get_optional(&i2c->dev, "reset", GPIOD_OUT_HIGH);
+       if (IS_ERR(max98927->reset_gpio)) {
+               ret = PTR_ERR(max98927->reset_gpio);
+               return dev_err_probe(&i2c->dev, ret, "failed to request GPIO reset pin");
+       }
+
+       if (max98927->reset_gpio) {
+               gpiod_set_value_cansleep(max98927->reset_gpio, 0);
+               /* Wait for i2c port to be ready */
+               usleep_range(5000, 6000);
+       }
 
        /* Check Revision ID */
        ret = regmap_read(max98927->regmap,
@@ -921,6 +934,17 @@ static int max98927_i2c_probe(struct i2c_client *i2c,
        return ret;
 }
 
+static int max98927_i2c_remove(struct i2c_client *i2c)
+{
+       struct max98927_priv *max98927 = i2c_get_clientdata(i2c);
+
+       if (max98927->reset_gpio) {
+               gpiod_set_value_cansleep(max98927->reset_gpio, 1);
+       }
+
+       return 0;
+}
+
 static const struct i2c_device_id max98927_i2c_id[] = {
        { "max98927", 0},
        { },
@@ -952,6 +976,7 @@ static struct i2c_driver max98927_i2c_driver = {
                .pm = &max98927_pm,
        },
        .probe  = max98927_i2c_probe,
+       .remove = max98927_i2c_remove,
        .id_table = max98927_i2c_id,
 };
 
index 05f495d..13f5066 100644 (file)
@@ -255,6 +255,7 @@ struct max98927_priv {
        struct regmap *regmap;
        struct snd_soc_component *component;
        struct max98927_pdata *pdata;
+       struct gpio_desc *reset_gpio; 
        unsigned int spk_gain;
        unsigned int sysclk;
        unsigned int v_l_slot;