[alsa-devel] [PATCH RESEND 1/2] ASoC: cs42l52: Add support for platform data reset GPIO
This patch adds support for grabbing a reset GPIO from platform data and resetting the codec
Signed-off-by: Brian Austin brian.austin@cirrus.com --- include/sound/cs42l52.h | 3 +++ sound/soc/codecs/cs42l52.c | 25 ++++++++++++++++++++----- sound/soc/codecs/cs42l52.h | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/include/sound/cs42l52.h b/include/sound/cs42l52.h index a902e51..853df80 100644 --- a/include/sound/cs42l52.h +++ b/include/sound/cs42l52.h @@ -33,6 +33,9 @@ struct cs42l52_platform_data {
/* MCLK Freq */ unsigned int mclk_freq; + + /* !RST GPIO */ + unsigned int reset_gpio; };
#endif /* __CS42L52_H */ diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index be2ba1b..6782d4875 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c @@ -17,6 +17,7 @@ #include <linux/kernel.h> #include <linux/init.h> #include <linux/delay.h> +#include <linux/gpio.h> #include <linux/pm.h> #include <linux/i2c.h> #include <linux/input.h> @@ -1205,6 +1206,7 @@ static int cs42l52_i2c_probe(struct i2c_client *i2c_client, const struct i2c_device_id *id) { struct cs42l52_private *cs42l52; + struct cs42l52_platform_data *pdata = dev_get_platdata(&i2c_client->dev); int ret; unsigned int devid = 0; unsigned int reg; @@ -1222,12 +1224,23 @@ static int cs42l52_i2c_probe(struct i2c_client *i2c_client, return ret; }
+ if (pdata) + cs42l52->pdata = *pdata; + + if (cs42l52->pdata.reset_gpio) { + ret = gpio_request_one(cs42l52->pdata.reset_gpio, + GPIOF_OUT_INIT_HIGH, "CS42L52 /RST"); + if (ret < 0) { + dev_err(&i2c_client->dev, "Failed to request /RST %d: %d\n", + cs42l52->pdata.reset_gpio, ret); + return ret; + } + gpio_set_value_cansleep(cs42l52->pdata.reset_gpio, 0); + gpio_set_value_cansleep(cs42l52->pdata.reset_gpio, 1); + } + i2c_set_clientdata(i2c_client, cs42l52); - - if (dev_get_platdata(&i2c_client->dev)) - memcpy(&cs42l52->pdata, dev_get_platdata(&i2c_client->dev), - sizeof(cs42l52->pdata)); - + ret = regmap_register_patch(cs42l52->regmap, cs42l52_threshold_patch, ARRAY_SIZE(cs42l52_threshold_patch)); if (ret != 0) @@ -1243,6 +1256,8 @@ static int cs42l52_i2c_probe(struct i2c_client *i2c_client, devid, CS42L52_CHIP_ID); return ret; } + dev_info(&i2c_client->dev, + "Cirrus Logic CS42L52, Revision: %02X\n", reg & 0xFF);
regcache_cache_only(cs42l52->regmap, true);
diff --git a/sound/soc/codecs/cs42l52.h b/sound/soc/codecs/cs42l52.h index 4277012..1a9412d 100644 --- a/sound/soc/codecs/cs42l52.h +++ b/sound/soc/codecs/cs42l52.h @@ -269,6 +269,6 @@ #define CS42L52_FIX_BITS1 0x3E #define CS42L52_FIX_BITS2 0x47
-#define CS42L52_MAX_REGISTER 0x34 +#define CS42L52_MAX_REGISTER 0x47
#endif
Moving Platform Data config to bus probe and convert to regmap_update_bits. This will work nicer when converted to device tree instead of having it split into multiple probes
Signed-off-by: Brian Austin brian.austin@cirrus.com --- sound/soc/codecs/cs42l52.c | 69 +++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 35 deletions(-)
diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 6782d4875..5bee30b 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c @@ -1117,40 +1117,6 @@ static int cs42l52_probe(struct snd_soc_codec *codec) cs42l52->sysclk = CS42L52_DEFAULT_CLK; cs42l52->config.format = CS42L52_DEFAULT_FORMAT;
- /* Set Platform MICx CFG */ - snd_soc_update_bits(codec, CS42L52_MICA_CTL, - CS42L52_MIC_CTL_TYPE_MASK, - cs42l52->pdata.mica_cfg << - CS42L52_MIC_CTL_TYPE_SHIFT); - - snd_soc_update_bits(codec, CS42L52_MICB_CTL, - CS42L52_MIC_CTL_TYPE_MASK, - cs42l52->pdata.micb_cfg << - CS42L52_MIC_CTL_TYPE_SHIFT); - - /* if Single Ended, Get Mic_Select */ - if (cs42l52->pdata.mica_cfg) - snd_soc_update_bits(codec, CS42L52_MICA_CTL, - CS42L52_MIC_CTL_MIC_SEL_MASK, - cs42l52->pdata.mica_sel << - CS42L52_MIC_CTL_MIC_SEL_SHIFT); - if (cs42l52->pdata.micb_cfg) - snd_soc_update_bits(codec, CS42L52_MICB_CTL, - CS42L52_MIC_CTL_MIC_SEL_MASK, - cs42l52->pdata.micb_sel << - CS42L52_MIC_CTL_MIC_SEL_SHIFT); - - /* Set Platform Charge Pump Freq */ - snd_soc_update_bits(codec, CS42L52_CHARGE_PUMP, - CS42L52_CHARGE_PUMP_MASK, - cs42l52->pdata.chgfreq << - CS42L52_CHARGE_PUMP_SHIFT); - - /* Set Platform Bias Level */ - snd_soc_update_bits(codec, CS42L52_IFACE_CTL2, - CS42L52_IFACE_CTL2_BIAS_LVL, - cs42l52->pdata.micbias_lvl); - return ret; }
@@ -1259,8 +1225,41 @@ static int cs42l52_i2c_probe(struct i2c_client *i2c_client, dev_info(&i2c_client->dev, "Cirrus Logic CS42L52, Revision: %02X\n", reg & 0xFF);
- regcache_cache_only(cs42l52->regmap, true); + /* Set Platform Data */ + if (cs42l52->pdata.mica_cfg) + regmap_update_bits(cs42l52->regmap, CS42L52_MICA_CTL, + CS42L52_MIC_CTL_TYPE_MASK, + cs42l52->pdata.mica_cfg << + CS42L52_MIC_CTL_TYPE_SHIFT); + + if (cs42l52->pdata.micb_cfg) + regmap_update_bits(cs42l52->regmap, CS42L52_MICB_CTL, + CS42L52_MIC_CTL_TYPE_MASK, + cs42l52->pdata.micb_cfg << + CS42L52_MIC_CTL_TYPE_SHIFT);
+ if (cs42l52->pdata.mica_sel) + regmap_update_bits(cs42l52->regmap, CS42L52_MICA_CTL, + CS42L52_MIC_CTL_MIC_SEL_MASK, + cs42l52->pdata.mica_sel << + CS42L52_MIC_CTL_MIC_SEL_SHIFT); + if (cs42l52->pdata.micb_sel) + regmap_update_bits(cs42l52->regmap, CS42L52_MICB_CTL, + CS42L52_MIC_CTL_MIC_SEL_MASK, + cs42l52->pdata.micb_sel << + CS42L52_MIC_CTL_MIC_SEL_SHIFT); + + if (cs42l52->pdata.chgfreq) + regmap_update_bits(cs42l52->regmap, CS42L52_CHARGE_PUMP, + CS42L52_CHARGE_PUMP_MASK, + cs42l52->pdata.chgfreq << + CS42L52_CHARGE_PUMP_SHIFT); + + if (cs42l52->pdata.micbias_lvl) + regmap_update_bits(cs42l52->regmap, CS42L52_IFACE_CTL2, + CS42L52_IFACE_CTL2_BIAS_LVL, + cs42l52->pdata.micbias_lvl); + ret = snd_soc_register_codec(&i2c_client->dev, &soc_codec_dev_cs42l52, &cs42l52_dai, 1); if (ret < 0)
On Thu, Oct 24, 2013 at 09:29:07AM -0500, Brian Austin wrote:
Moving Platform Data config to bus probe and convert to regmap_update_bits. This will work nicer when converted to device tree instead of having it split into multiple probes
This also fails to apply.
On Thu, Oct 24, 2013 at 09:29:06AM -0500, Brian Austin wrote:
This patch adds support for grabbing a reset GPIO from platform data and resetting the codec
This doesn't seem to apply against Linus' tree for me and I don't appear to currently be carrying any changes to it. Can you check please? The issue appears to be include/sound, looks like you've got some extra platform data in your tree. Also...
- dev_info(&i2c_client->dev,
"Cirrus Logic CS42L52, Revision: %02X\n", reg & 0xFF);
...this is fine but should be a separate patch, likewise...
-#define CS42L52_MAX_REGISTER 0x34 +#define CS42L52_MAX_REGISTER 0x47
...this.
participants (2)
-
Brian Austin
-
Mark Brown