]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/staging/iio/adc/ad7780.c
staging:iio:ad7780: Make powerdown GPIO optional
[karo-tx-linux.git] / drivers / staging / iio / adc / ad7780.c
index 5f807ce3bf114fcb3b082cbc76c2ac5557965573..1dd7cdb1dbc80d73bcc19e5e1dca6ec357fedb88 100644 (file)
@@ -73,7 +73,8 @@ static int ad7780_set_mode(struct ad_sigma_delta *sigma_delta,
                break;
        }
 
-       gpio_set_value(st->powerdown_gpio, val);
+       if (gpio_is_valid(st->powerdown_gpio))
+               gpio_set_value(st->powerdown_gpio, val);
 
        return 0;
 }
@@ -148,11 +149,6 @@ static int __devinit ad7780_probe(struct spi_device *spi)
        struct iio_dev *indio_dev;
        int ret, voltage_uv = 0;
 
-       if (!pdata) {
-               dev_dbg(&spi->dev, "no platform data?\n");
-               return -ENODEV;
-       }
-
        indio_dev = iio_device_alloc(sizeof(*st));
        if (indio_dev == NULL)
                return -ENOMEM;
@@ -174,8 +170,6 @@ static int __devinit ad7780_probe(struct spi_device *spi)
        st->chip_info =
                &ad7780_chip_info_tbl[spi_get_device_id(spi)->driver_data];
 
-       st->powerdown_gpio = pdata->gpio_pdrst;
-
        if (pdata && pdata->vref_mv)
                st->int_vref_mv = pdata->vref_mv;
        else if (voltage_uv)
@@ -192,11 +186,17 @@ static int __devinit ad7780_probe(struct spi_device *spi)
        indio_dev->num_channels = 1;
        indio_dev->info = &ad7780_info;
 
-       ret = gpio_request_one(pdata->gpio_pdrst, GPIOF_OUT_INIT_LOW,
+       if (pdata && gpio_is_valid(pdata->gpio_pdrst)) {
+
+               ret = gpio_request_one(pdata->gpio_pdrst, GPIOF_OUT_INIT_LOW,
                               "AD7780 /PDRST");
-       if (ret) {
-               dev_err(&spi->dev, "failed to request GPIO PDRST\n");
-               goto error_disable_reg;
+               if (ret) {
+                       dev_err(&spi->dev, "failed to request GPIO PDRST\n");
+                       goto error_disable_reg;
+               }
+               st->powerdown_gpio = pdata->gpio_pdrst;
+       } else {
+               st->powerdown_gpio = -1;
        }
 
        ret = ad_sd_setup_buffer_and_trigger(indio_dev);
@@ -212,7 +212,8 @@ static int __devinit ad7780_probe(struct spi_device *spi)
 error_cleanup_buffer_and_trigger:
        ad_sd_cleanup_buffer_and_trigger(indio_dev);
 error_free_gpio:
-       gpio_free(pdata->gpio_pdrst);
+       if (pdata && gpio_is_valid(pdata->gpio_pdrst))
+               gpio_free(pdata->gpio_pdrst);
 error_disable_reg:
        if (!IS_ERR(st->reg))
                regulator_disable(st->reg);
@@ -233,7 +234,9 @@ static int __devexit ad7780_remove(struct spi_device *spi)
        iio_device_unregister(indio_dev);
        ad_sd_cleanup_buffer_and_trigger(indio_dev);
 
-       gpio_free(st->powerdown_gpio);
+       if (gpio_is_valid(st->powerdown_gpio))
+               gpio_free(st->powerdown_gpio);
+
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
                regulator_put(st->reg);