ASoC: uda1380: Request GPIOs at bus probe time
[linux-2.6-block.git] / sound / soc / codecs / uda1380.c
index 8e52439a58fda9ddbce5fa860038c834cef4dd64..2918fdb95e58581555fe7ef3ae3c6019040b86b3 100644 (file)
@@ -698,25 +698,10 @@ static int uda1380_probe(struct snd_soc_codec *codec)
        codec->hw_write = (hw_write_t)i2c_master_send;
        codec->control_data = uda1380->control_data;
 
-       if (!pdata)
-               return -EINVAL;
-
-       if (gpio_is_valid(pdata->gpio_reset)) {
-               ret = gpio_request_one(pdata->gpio_reset, GPIOF_OUT_INIT_LOW,
-                                      "uda1380 reset");
-               if (ret)
-                       goto err_out;
-       }
-
-       if (gpio_is_valid(pdata->gpio_power)) {
-               ret = gpio_request_one(pdata->gpio_power, GPIOF_OUT_INIT_LOW,
-                                  "uda1380 power");
-               if (ret)
-                       goto err_free_gpio;
-       } else {
+       if (!gpio_is_valid(pdata->gpio_power)) {
                ret = uda1380_reset(codec);
                if (ret)
-                       goto err_free_gpio;
+                       return ret;
        }
 
        INIT_WORK(&uda1380->work, uda1380_flush_work);
@@ -732,29 +717,11 @@ static int uda1380_probe(struct snd_soc_codec *codec)
                break;
        }
 
-       return 0;
-
-err_free_gpio:
-       if (gpio_is_valid(pdata->gpio_reset))
-               gpio_free(pdata->gpio_reset);
-err_out:
-       return ret;
-}
-
-/* power down chip */
-static int uda1380_remove(struct snd_soc_codec *codec)
-{
-       struct uda1380_platform_data *pdata =codec->dev->platform_data;
-
-       gpio_free(pdata->gpio_reset);
-       gpio_free(pdata->gpio_power);
-
        return 0;
 }
 
 static struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
        .probe =        uda1380_probe,
-       .remove =       uda1380_remove,
        .read =         uda1380_read_reg_cache,
        .write =        uda1380_write,
        .set_bias_level = uda1380_set_bias_level,
@@ -778,14 +745,32 @@ static struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
 static int uda1380_i2c_probe(struct i2c_client *i2c,
                             const struct i2c_device_id *id)
 {
+       struct uda1380_platform_data *pdata = i2c->dev.platform_data;
        struct uda1380_priv *uda1380;
        int ret;
 
+       if (!pdata)
+               return -EINVAL;
+
        uda1380 = devm_kzalloc(&i2c->dev, sizeof(struct uda1380_priv),
                               GFP_KERNEL);
        if (uda1380 == NULL)
                return -ENOMEM;
 
+       if (gpio_is_valid(pdata->gpio_reset)) {
+               ret = devm_gpio_request_one(&i2c->dev, pdata->gpio_reset,
+                       GPIOF_OUT_INIT_LOW, "uda1380 reset");
+               if (ret)
+                       return ret;
+       }
+
+       if (gpio_is_valid(pdata->gpio_power)) {
+               ret = devm_gpio_request_one(&i2c->dev, pdata->gpio_power,
+                       GPIOF_OUT_INIT_LOW, "uda1380 power");
+               if (ret)
+                       return ret;
+       }
+
        i2c_set_clientdata(i2c, uda1380);
        uda1380->control_data = i2c;