diff options
Diffstat (limited to 'sound/soc/codecs/wm8904.c')
| -rw-r--r-- | sound/soc/codecs/wm8904.c | 27 | 
1 files changed, 17 insertions, 10 deletions
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index f7c549949c54..4d2d2b1380d5 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c @@ -11,6 +11,7 @@   * published by the Free Software Foundation.   */ +#include <linux/clk.h>  #include <linux/module.h>  #include <linux/moduleparam.h>  #include <linux/init.h> @@ -49,6 +50,7 @@ static const char *wm8904_supply_names[WM8904_NUM_SUPPLIES] = {  /* codec private data */  struct wm8904_priv {  	struct regmap *regmap; +	struct clk *mclk;  	enum wm8904_type devtype; @@ -1290,16 +1292,16 @@ static int wm8904_hw_params(struct snd_pcm_substream *substream,  		wm8904->bclk = snd_soc_params_to_bclk(params);  	} -	switch (params_format(params)) { -	case SNDRV_PCM_FORMAT_S16_LE: +	switch (params_width(params)) { +	case 16:  		break; -	case SNDRV_PCM_FORMAT_S20_3LE: +	case 20:  		aif1 |= 0x40;  		break; -	case SNDRV_PCM_FORMAT_S24_LE: +	case 24:  		aif1 |= 0x80;  		break; -	case SNDRV_PCM_FORMAT_S32_LE: +	case 32:  		aif1 |= 0xc0;  		break;  	default: @@ -1828,6 +1830,7 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,  	switch (level) {  	case SND_SOC_BIAS_ON: +		clk_prepare_enable(wm8904->mclk);  		break;  	case SND_SOC_BIAS_PREPARE: @@ -1894,6 +1897,7 @@ static int wm8904_set_bias_level(struct snd_soc_codec *codec,  		regulator_bulk_disable(ARRAY_SIZE(wm8904->supplies),  				       wm8904->supplies); +		clk_disable_unprepare(wm8904->mclk);  		break;  	}  	codec->dapm.bias_level = level; @@ -2013,12 +2017,8 @@ static void wm8904_handle_pdata(struct snd_soc_codec *codec)  		/* We need an array of texts for the enum API */  		wm8904->drc_texts = kmalloc(sizeof(char *)  					    * pdata->num_drc_cfgs, GFP_KERNEL); -		if (!wm8904->drc_texts) { -			dev_err(codec->dev, -				"Failed to allocate %d DRC config texts\n", -				pdata->num_drc_cfgs); +		if (!wm8904->drc_texts)  			return; -		}  		for (i = 0; i < pdata->num_drc_cfgs; i++)  			wm8904->drc_texts[i] = pdata->drc_cfgs[i].name; @@ -2110,6 +2110,13 @@ static int wm8904_i2c_probe(struct i2c_client *i2c,  	if (wm8904 == NULL)  		return -ENOMEM; +	wm8904->mclk = devm_clk_get(&i2c->dev, "mclk"); +	if (IS_ERR(wm8904->mclk)) { +		ret = PTR_ERR(wm8904->mclk); +		dev_err(&i2c->dev, "Failed to get MCLK\n"); +		return ret; +	} +  	wm8904->regmap = devm_regmap_init_i2c(i2c, &wm8904_regmap);  	if (IS_ERR(wm8904->regmap)) {  		ret = PTR_ERR(wm8904->regmap);  | 
