ASoC: uda1380: Request GPIOs at bus probe time
[linux-2.6-block.git] / sound / soc / codecs / uda1380.c
index 533e3bb444e4d2ee05ee6772db636539cb726af0..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,
@@ -775,18 +742,35 @@ static struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
        },
 };
 
-#if IS_ENABLED(CONFIG_I2C)
 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;
 
@@ -815,27 +799,8 @@ static struct i2c_driver uda1380_i2c_driver = {
        .remove =   uda1380_i2c_remove,
        .id_table = uda1380_i2c_id,
 };
-#endif
 
-static int __init uda1380_modinit(void)
-{
-       int ret = 0;
-#if IS_ENABLED(CONFIG_I2C)
-       ret = i2c_add_driver(&uda1380_i2c_driver);
-       if (ret != 0)
-               pr_err("Failed to register UDA1380 I2C driver: %d\n", ret);
-#endif
-       return ret;
-}
-module_init(uda1380_modinit);
-
-static void __exit uda1380_exit(void)
-{
-#if IS_ENABLED(CONFIG_I2C)
-       i2c_del_driver(&uda1380_i2c_driver);
-#endif
-}
-module_exit(uda1380_exit);
+module_i2c_driver(uda1380_i2c_driver);
 
 MODULE_AUTHOR("Giorgio Padrin");
 MODULE_DESCRIPTION("Audio support for codec Philips UDA1380");