|
@@ -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);
|
|
|
|