Commit b7c95d91 authored by Mark Brown's avatar Mark Brown

ASoC: wm8903: Move interrupt request to I2C probe

There's no reason to defer requesting of the interrupt until the CODEC
probe and doing so results in more work if we hit an error as we'll have
registered the CODEC with the core. It's neater to acquire as many of the
resources we'll need as we can in the bus probe function.
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Tested-by: default avatarStephen Warren <swarren@wwwdotorg.org>
parent e373cbfb
...@@ -1895,9 +1895,7 @@ static void wm8903_free_gpio(struct wm8903_priv *wm8903) ...@@ -1895,9 +1895,7 @@ static void wm8903_free_gpio(struct wm8903_priv *wm8903)
static int wm8903_probe(struct snd_soc_codec *codec) static int wm8903_probe(struct snd_soc_codec *codec)
{ {
struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec); struct wm8903_priv *wm8903 = snd_soc_codec_get_drvdata(codec);
struct wm8903_platform_data *pdata = wm8903->pdata;
int ret; int ret;
int trigger, irq_pol;
u16 val; u16 val;
wm8903->codec = codec; wm8903->codec = codec;
...@@ -1909,32 +1907,6 @@ static int wm8903_probe(struct snd_soc_codec *codec) ...@@ -1909,32 +1907,6 @@ static int wm8903_probe(struct snd_soc_codec *codec)
return ret; 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 */ /* power on device */
wm8903_set_bias_level(codec, SND_SOC_BIAS_STANDBY); wm8903_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
...@@ -1975,11 +1947,7 @@ static int wm8903_probe(struct snd_soc_codec *codec) ...@@ -1975,11 +1947,7 @@ static int wm8903_probe(struct snd_soc_codec *codec)
/* power down chip */ /* power down chip */
static int wm8903_remove(struct snd_soc_codec *codec) 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); wm8903_set_bias_level(codec, SND_SOC_BIAS_OFF);
if (wm8903->irq)
free_irq(wm8903->irq, wm8903);
return 0; return 0;
} }
...@@ -2089,8 +2057,9 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, ...@@ -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_platform_data *pdata = dev_get_platdata(&i2c->dev);
struct wm8903_priv *wm8903; struct wm8903_priv *wm8903;
int trigger;
bool mic_gpio = false; bool mic_gpio = false;
unsigned int val; unsigned int val, irq_pol;
int ret, i; int ret, i;
wm8903 = devm_kzalloc(&i2c->dev, sizeof(struct wm8903_priv), wm8903 = devm_kzalloc(&i2c->dev, sizeof(struct wm8903_priv),
...@@ -2108,7 +2077,6 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, ...@@ -2108,7 +2077,6 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,
} }
i2c_set_clientdata(i2c, wm8903); i2c_set_clientdata(i2c, wm8903);
wm8903->irq = i2c->irq;
/* If no platform data was supplied, create storage for defaults */ /* If no platform data was supplied, create storage for defaults */
if (pdata) { if (pdata) {
...@@ -2202,6 +2170,33 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c, ...@@ -2202,6 +2170,33 @@ static __devinit int wm8903_i2c_probe(struct i2c_client *i2c,
wm8903->mic_delay = pdata->micdet_delay; 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, ret = snd_soc_register_codec(&i2c->dev,
&soc_codec_dev_wm8903, &wm8903_dai, 1); &soc_codec_dev_wm8903, &wm8903_dai, 1);
if (ret != 0) if (ret != 0)
...@@ -2216,6 +2211,8 @@ static __devexit int wm8903_i2c_remove(struct i2c_client *client) ...@@ -2216,6 +2211,8 @@ static __devexit int wm8903_i2c_remove(struct i2c_client *client)
{ {
struct wm8903_priv *wm8903 = i2c_get_clientdata(client); struct wm8903_priv *wm8903 = i2c_get_clientdata(client);
if (client->irq)
free_irq(client->irq, wm8903);
wm8903_free_gpio(wm8903); wm8903_free_gpio(wm8903);
snd_soc_unregister_codec(&client->dev); snd_soc_unregister_codec(&client->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment