diff options
author | Girish S Ghongdemath <girishsg@ti.com> | 2011-11-23 16:11:55 -0600 |
---|---|---|
committer | Ziyann <jaraidaniel@gmail.com> | 2014-12-05 22:20:31 +0100 |
commit | 5142401251ad070e56bd217c4ad1a1bef62440d9 (patch) | |
tree | bea9ff7be27a5b89c6e367e257c943ae3b242239 | |
parent | e70d3d74bd2ccb003f712795a07eda7f8761edc3 (diff) | |
download | kernel_samsung_tuna-5142401251ad070e56bd217c4ad1a1bef62440d9.zip kernel_samsung_tuna-5142401251ad070e56bd217c4ad1a1bef62440d9.tar.gz kernel_samsung_tuna-5142401251ad070e56bd217c4ad1a1bef62440d9.tar.bz2 |
ASoC: twl6040: Add VDDHF regulator
Use regulator framework to enable/disable VDDHF voltage supply
for handsfree drivers. Not providing a valid regulator for VDDHF
through regulator framework doesn't have any negative impact as
long as VDDHF is actually supplied by some other way (e.g. voltage
supply enabled through bootloader or machine initialization).
Ported from p-android-omap-2.6.35
Change-Id: I9df90a695ed9afcb6da916fb53bb3965c5292226
Signed-off-by: Girish S G <girishsg@ti.com>
Signed-off-by: Misael Lopez Cruz <misael.lopez@ti.com>
Signed-off-by: Akash Choudhari <akashc@ti.com>
Signed-off-by: Girish S Ghongdemath <girishsg@ti.com>
Signed-off-by: Gabriel M. Beddingfield <gabrbedd@ti.com>
Conflicts:
sound/soc/codecs/twl6040.c
-rw-r--r-- | include/linux/i2c/twl.h | 3 | ||||
-rw-r--r-- | sound/soc/codecs/twl6040.c | 32 |
2 files changed, 35 insertions, 0 deletions
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h index aed8fd4..24187ba 100644 --- a/include/linux/i2c/twl.h +++ b/include/linux/i2c/twl.h @@ -780,6 +780,9 @@ struct twl4030_codec_audio_data { u16 hf_right_step; u16 ep_step; void (*set_hs_extmute)(int mute); + + /* twl6040 */ + int vddhf_uV; }; struct twl4030_codec_vibra_data { diff --git a/sound/soc/codecs/twl6040.c b/sound/soc/codecs/twl6040.c index add745e..8e355f2 100644 --- a/sound/soc/codecs/twl6040.c +++ b/sound/soc/codecs/twl6040.c @@ -31,6 +31,7 @@ #include <linux/wakelock.h> #include <linux/i2c/twl.h> #include <linux/mfd/twl6040-codec.h> +#include <linux/regulator/consumer.h> #include <sound/core.h> #include <sound/pcm.h> @@ -88,6 +89,7 @@ struct twl6040_data { int headset_mode; unsigned int clk_in; unsigned int sysclk; + struct regulator *vddhf_reg; u16 hs_left_step; u16 hs_right_step; u16 hf_left_step; @@ -99,6 +101,7 @@ struct twl6040_data { struct workqueue_struct *workqueue; struct delayed_work delayed_work; struct mutex mutex; + int hfdrv; struct twl6040_output headset; struct twl6040_output earphone; struct twl6040_output handsfree; @@ -1789,6 +1792,24 @@ static int twl6040_probe(struct snd_soc_codec *codec) mutex_init(&priv->mutex); + priv->vddhf_reg = regulator_get(codec->dev, "vddhf"); + if (IS_ERR(priv->vddhf_reg)) { + ret = PTR_ERR(priv->vddhf_reg); + dev_warn(codec->dev, "couldn't get VDDHF regulator %d\n", + ret); + priv->vddhf_reg = NULL; + } + + if (priv->vddhf_reg) { + ret = regulator_set_voltage(priv->vddhf_reg, + pdata->vddhf_uV, pdata->vddhf_uV); + if (ret) { + dev_warn(codec->dev, "failed to set VDDHF voltage %d\n", + ret); + goto reg_err; + } + } + init_completion(&priv->headset.ramp_done); init_completion(&priv->handsfree.ramp_done); init_completion(&priv->earphone.ramp_done); @@ -1853,6 +1874,8 @@ irq_err: wake_lock_destroy(&priv->wake_lock); destroy_workqueue(priv->ep_workqueue); epwork_err: + if (priv->vddhf_reg) + regulator_put(priv->vddhf_reg); destroy_workqueue(priv->hs_workqueue); hswork_err: destroy_workqueue(priv->hf_workqueue); @@ -1870,6 +1893,8 @@ static int twl6040_remove(struct snd_soc_codec *codec) twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF); twl6040_free_irq(codec->control_data, TWL6040_IRQ_PLUG, codec); twl6040_free_irq(codec->control_data, TWL6040_IRQ_HF, codec); + if (priv->vddhf_reg) + regulator_put(priv->vddhf_reg); wake_lock_destroy(&priv->wake_lock); destroy_workqueue(priv->workqueue); destroy_workqueue(priv->hf_workqueue); @@ -1895,6 +1920,13 @@ static struct snd_soc_codec_driver soc_codec_dev_twl6040 = { static int __devinit twl6040_codec_probe(struct platform_device *pdev) { + struct twl4030_codec_audio_data *pdata = pdev->dev.platform_data; + + if (!pdata) { + dev_err(&pdev->dev, "platform_data is missing\n"); + return -EINVAL; + } + return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_twl6040, twl6040_dai, ARRAY_SIZE(twl6040_dai)); } |