iio: sx9500: add GPIO reset pin
authorVlad Dogaru <vlad.dogaru@intel.com>
Sun, 12 Apr 2015 17:09:21 +0000 (20:09 +0300)
committerJonathan Cameron <jic23@kernel.org>
Sat, 18 Apr 2015 19:14:54 +0000 (20:14 +0100)
If a GPIO reset pin is listed in ACPI or Device Tree, use it to reset
the device on initialization.

Signed-off-by: Vlad Dogaru <vlad.dogaru@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/proximity/sx9500.c

index 1b3d894e8c69a6ad96081466a68b5e1a0021ac3c..f1e9d734b6b6ba6ad11a44094b0da0a2efcd41d2 100644 (file)
@@ -33,6 +33,7 @@
 #define SX9500_IRQ_NAME                        "sx9500_event"
 
 #define SX9500_GPIO_INT                        "interrupt"
+#define SX9500_GPIO_RESET              "reset"
 
 /* Register definitions. */
 #define SX9500_REG_IRQ_SRC             0x00
@@ -85,6 +86,7 @@ struct sx9500_data {
        struct i2c_client *client;
        struct iio_trigger *trig;
        struct regmap *regmap;
+       struct gpio_desc *gpiod_rst;
        /*
         * Last reading of the proximity status for each channel.  We
         * only send an event to user space when this changes.
@@ -829,6 +831,13 @@ static int sx9500_init_device(struct iio_dev *indio_dev)
        int ret, i;
        unsigned int val;
 
+       if (data->gpiod_rst) {
+               gpiod_set_value_cansleep(data->gpiod_rst, 0);
+               usleep_range(1000, 2000);
+               gpiod_set_value_cansleep(data->gpiod_rst, 1);
+               usleep_range(1000, 2000);
+       }
+
        ret = regmap_write(data->regmap, SX9500_REG_IRQ_MSK, 0);
        if (ret < 0)
                return ret;
@@ -875,6 +884,13 @@ static void sx9500_gpio_probe(struct i2c_client *client,
                else
                        client->irq = gpiod_to_irq(gpio);
        }
+
+       data->gpiod_rst = devm_gpiod_get_index(dev, SX9500_GPIO_RESET,
+                                              0, GPIOD_OUT_HIGH);
+       if (IS_ERR(data->gpiod_rst)) {
+               dev_warn(dev, "gpio get reset pin failed\n");
+               data->gpiod_rst = NULL;
+       }
 }
 
 static int sx9500_probe(struct i2c_client *client,
@@ -898,8 +914,6 @@ static int sx9500_probe(struct i2c_client *client,
        if (IS_ERR(data->regmap))
                return PTR_ERR(data->regmap);
 
-       sx9500_init_device(indio_dev);
-
        indio_dev->dev.parent = &client->dev;
        indio_dev->name = SX9500_DRIVER_NAME;
        indio_dev->channels = sx9500_channels;
@@ -910,6 +924,10 @@ static int sx9500_probe(struct i2c_client *client,
 
        sx9500_gpio_probe(client, data);
 
+       ret = sx9500_init_device(indio_dev);
+       if (ret < 0)
+               return ret;
+
        if (client->irq <= 0)
                dev_warn(&client->dev, "no valid irq found\n");
        else {