Merge remote-tracking branch 'asoc/topic/fsl' into asoc-next
[deliverable/linux.git] / sound / soc / codecs / twl6040.c
index 3fc3fc64dd8b47a85ca142d3ef95dfe637908754..9b9a6e587610540c310c39387791f588592e1a4c 100644 (file)
@@ -69,13 +69,8 @@ struct twl6040_data {
        int hs_power_mode_locked;
        unsigned int clk_in;
        unsigned int sysclk;
-       u16 hs_left_step;
-       u16 hs_right_step;
-       u16 hf_left_step;
-       u16 hf_right_step;
        struct twl6040_jack_data hs_jack;
        struct snd_soc_codec *codec;
-       struct workqueue_struct *workqueue;
        struct mutex mutex;
 };
 
@@ -404,8 +399,7 @@ static irqreturn_t twl6040_audio_handler(int irq, void *data)
        struct snd_soc_codec *codec = data;
        struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
 
-       queue_delayed_work(priv->workqueue, &priv->hs_jack.work,
-                          msecs_to_jiffies(200));
+       schedule_delayed_work(&priv->hs_jack.work, msecs_to_jiffies(200));
 
        return IRQ_HANDLED;
 }
@@ -1115,7 +1109,6 @@ static int twl6040_suspend(struct snd_soc_codec *codec)
 static int twl6040_resume(struct snd_soc_codec *codec)
 {
        twl6040_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-       twl6040_set_bias_level(codec, codec->dapm.suspend_bias_level);
 
        return 0;
 }
@@ -1127,83 +1120,46 @@ static int twl6040_resume(struct snd_soc_codec *codec)
 static int twl6040_probe(struct snd_soc_codec *codec)
 {
        struct twl6040_data *priv;
-       struct twl6040_codec_data *pdata = dev_get_platdata(codec->dev);
        struct platform_device *pdev = container_of(codec->dev,
                                                   struct platform_device, dev);
        int ret = 0;
 
-       priv = kzalloc(sizeof(struct twl6040_data), GFP_KERNEL);
+       priv = devm_kzalloc(codec->dev, sizeof(*priv), GFP_KERNEL);
        if (priv == NULL)
                return -ENOMEM;
+
        snd_soc_codec_set_drvdata(codec, priv);
 
        priv->codec = codec;
        codec->control_data = dev_get_drvdata(codec->dev->parent);
 
-       if (pdata && pdata->hs_left_step && pdata->hs_right_step) {
-               priv->hs_left_step = pdata->hs_left_step;
-               priv->hs_right_step = pdata->hs_right_step;
-       } else {
-               priv->hs_left_step = 1;
-               priv->hs_right_step = 1;
-       }
-
-       if (pdata && pdata->hf_left_step && pdata->hf_right_step) {
-               priv->hf_left_step = pdata->hf_left_step;
-               priv->hf_right_step = pdata->hf_right_step;
-       } else {
-               priv->hf_left_step = 1;
-               priv->hf_right_step = 1;
-       }
-
        priv->plug_irq = platform_get_irq(pdev, 0);
        if (priv->plug_irq < 0) {
                dev_err(codec->dev, "invalid irq\n");
-               ret = -EINVAL;
-               goto work_err;
-       }
-
-       priv->workqueue = alloc_workqueue("twl6040-codec", 0, 0);
-       if (!priv->workqueue) {
-               ret = -ENOMEM;
-               goto work_err;
+               return -EINVAL;
        }
 
        INIT_DELAYED_WORK(&priv->hs_jack.work, twl6040_accessory_work);
 
        mutex_init(&priv->mutex);
 
-       ret = request_threaded_irq(priv->plug_irq, NULL, twl6040_audio_handler,
-                                  0, "twl6040_irq_plug", codec);
+       ret = devm_request_threaded_irq(codec->dev, priv->plug_irq, NULL,
+                                       twl6040_audio_handler, IRQF_NO_SUSPEND,
+                                       "twl6040_irq_plug", codec);
        if (ret) {
                dev_err(codec->dev, "PLUG IRQ request failed: %d\n", ret);
-               goto plugirq_err;
+               return ret;
        }
 
        twl6040_init_chip(codec);
 
        /* power on device */
-       ret = twl6040_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
-       if (!ret)
-               return 0;
-
-       /* Error path */
-       free_irq(priv->plug_irq, codec);
-plugirq_err:
-       destroy_workqueue(priv->workqueue);
-work_err:
-       kfree(priv);
-       return ret;
+       return twl6040_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
 }
 
 static int twl6040_remove(struct snd_soc_codec *codec)
 {
-       struct twl6040_data *priv = snd_soc_codec_get_drvdata(codec);
-
        twl6040_set_bias_level(codec, SND_SOC_BIAS_OFF);
-       free_irq(priv->plug_irq, codec);
-       destroy_workqueue(priv->workqueue);
-       kfree(priv);
 
        return 0;
 }
This page took 0.047492 seconds and 5 git commands to generate.