diff options
| -rw-r--r-- | sound/soc/codecs/wm8903.c | 65 | 
1 files changed, 31 insertions, 34 deletions
diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c index f5d47c8e540..7261a68aac6 100644 --- a/sound/soc/codecs/wm8903.c +++ b/sound/soc/codecs/wm8903.c @@ -1895,9 +1895,7 @@ static void wm8903_free_gpio(struct wm8903_priv *wm8903)  static int wm8903_probe(struct snd_soc_codec *codec)  {  	struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); -	struct wm8903_platform_data *pdata = wm8903->pdata;  	int ret; -	int trigger, irq_pol;  	u16 val;  	wm8903->codec = codec; @@ -1909,32 +1907,6 @@ static int wm8903_probe(struct snd_soc_codec *codec)  		return ret;  	} -	if (wm8903->irq) { -		if (pdata->irq_active_low) { -			trigger = IRQF_TRIGGER_LOW; -			irq_pol = WM8903_IRQ_POL; -		} else { -			trigger = IRQF_TRIGGER_HIGH; -			irq_pol = 0; -		} - -		snd_soc_update_bits(codec, WM8903_INTERRUPT_CONTROL, -				    WM8903_IRQ_POL, irq_pol); -		 -		ret = request_threaded_irq(wm8903->irq, NULL, wm8903_irq, -					   trigger | IRQF_ONESHOT, -					   "wm8903", wm8903); -		if (ret != 0) { -			dev_err(codec->dev, "Failed to request IRQ: %d\n", -				ret); -			return ret; -		} - -		/* Enable write sequencer interrupts */ -		snd_soc_update_bits(codec, WM8903_INTERRUPT_STATUS_1_MASK, -				    WM8903_IM_WSEQ_BUSY_EINT, 0); -	} -  	/* power on device */  	wm8903_set_bias_level(codec, SND_SOC_BIAS_STANDBY); @@ -1975,11 +1947,7 @@ static int wm8903_probe(struct snd_soc_codec *codec)  /* power down chip */  static int wm8903_remove(struct snd_soc_codec *codec)  { -	struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); -  	wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF); -	if (wm8903->irq) -		free_irq(wm8903->irq, wm8903);  	return 0;  } @@ -2089,8 +2057,9 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,  {  	struct wm8903_platform_data *pdata = dev_get_platdata(&i2c->dev);  	struct wm8903_priv *wm8903; +	int trigger;  	bool mic_gpio = false; -	unsigned int val; +	unsigned int val, irq_pol;  	int ret, i;  	wm8903 = devm_kzalloc(&i2c->dev,  sizeof(struct wm8903_priv), @@ -2108,7 +2077,6 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,  	}  	i2c_set_clientdata(i2c, wm8903); -	wm8903->irq = i2c->irq;  	/* If no platform data was supplied, create storage for defaults */  	if (pdata) { @@ -2202,6 +2170,33 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,  	wm8903->mic_delay = pdata->micdet_delay; +	if (i2c->irq) { +		if (pdata->irq_active_low) { +			trigger = IRQF_TRIGGER_LOW; +			irq_pol = WM8903_IRQ_POL; +		} else { +			trigger = IRQF_TRIGGER_HIGH; +			irq_pol = 0; +		} + +		regmap_update_bits(wm8903->regmap, WM8903_INTERRUPT_CONTROL, +				   WM8903_IRQ_POL, irq_pol); + +		ret = request_threaded_irq(i2c->irq, NULL, wm8903_irq, +					   trigger | IRQF_ONESHOT, +					   "wm8903", wm8903); +		if (ret != 0) { +			dev_err(wm8903->dev, "Failed to request IRQ: %d\n", +				ret); +			return ret; +		} + +		/* Enable write sequencer interrupts */ +		regmap_update_bits(wm8903->regmap, +				   WM8903_INTERRUPT_STATUS_1_MASK, +				   WM8903_IM_WSEQ_BUSY_EINT, 0); +	} +  	ret = snd_soc_register_codec(&i2c->dev,  			&soc_codec_dev_wm8903, &wm8903_dai, 1);  	if (ret != 0) @@ -2216,6 +2211,8 @@ static __devexit int wm8903_i2c_remove(struct i2c_client *client)  {  	struct wm8903_priv *wm8903 = i2c_get_clientdata(client); +	if (client->irq) +		free_irq(client->irq, wm8903);  	wm8903_free_gpio(wm8903);  	snd_soc_unregister_codec(&client->dev);  |