diff options
| -rw-r--r-- | sound/soc/codecs/twl4030.c | 55 | 
1 files changed, 47 insertions, 8 deletions
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c index b4d1a4e794d..e7f608996c4 100644 --- a/sound/soc/codecs/twl4030.c +++ b/sound/soc/codecs/twl4030.c @@ -26,6 +26,8 @@  #include <linux/pm.h>  #include <linux/i2c.h>  #include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_gpio.h>  #include <linux/i2c/twl.h>  #include <linux/slab.h>  #include <linux/gpio.h> @@ -295,13 +297,57 @@ static inline void twl4030_reset_registers(struct snd_soc_codec *codec)  } -static void twl4030_init_chip(struct snd_soc_codec *codec) +static void twl4030_setup_pdata_of(struct twl4030_codec_data *pdata, +				   struct device_node *node) +{ +	int value; + +	of_property_read_u32(node, "ti,digimic_delay", +			     &pdata->digimic_delay); +	of_property_read_u32(node, "ti,ramp_delay_value", +			     &pdata->ramp_delay_value); +	of_property_read_u32(node, "ti,offset_cncl_path", +			     &pdata->offset_cncl_path); +	if (!of_property_read_u32(node, "ti,hs_extmute", &value)) +		pdata->hs_extmute = value; + +	pdata->hs_extmute_gpio = of_get_named_gpio(node, +						   "ti,hs_extmute_gpio", 0); +	if (gpio_is_valid(pdata->hs_extmute_gpio)) +		pdata->hs_extmute = 1; +} + +static struct twl4030_codec_data *twl4030_get_pdata(struct snd_soc_codec *codec)  {  	struct twl4030_codec_data *pdata = dev_get_platdata(codec->dev); +	struct device_node *twl4030_codec_node = NULL; + +	twl4030_codec_node = of_find_node_by_name(codec->dev->parent->of_node, +						  "codec"); + +	if (!pdata && twl4030_codec_node) { +		pdata = devm_kzalloc(codec->dev, +				     sizeof(struct twl4030_codec_data), +				     GFP_KERNEL); +		if (!pdata) { +			dev_err(codec->dev, "Can not allocate memory\n"); +			return NULL; +		} +		twl4030_setup_pdata_of(pdata, twl4030_codec_node); +	} + +	return pdata; +} + +static void twl4030_init_chip(struct snd_soc_codec *codec) +{ +	struct twl4030_codec_data *pdata;  	struct twl4030_priv *twl4030 = snd_soc_codec_get_drvdata(codec);  	u8 reg, byte;  	int i = 0; +	pdata = twl4030_get_pdata(codec); +  	if (pdata && pdata->hs_extmute &&  	    gpio_is_valid(pdata->hs_extmute_gpio)) {  		int ret; @@ -2290,13 +2336,6 @@ static struct snd_soc_codec_driver soc_codec_dev_twl4030 = {  static int __devinit twl4030_codec_probe(struct platform_device *pdev)  { -	struct twl4030_codec_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_twl4030,  			twl4030_dai, ARRAY_SIZE(twl4030_dai));  }  |