]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
iio: proximity: sx9500: Add GPIO ACPI mapping table
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 26 Feb 2018 19:37:35 +0000 (21:37 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 3 Mar 2018 15:11:27 +0000 (15:11 +0000)
In order to satisfy GPIO ACPI library requirements convert users of
gpiod_get_index() to correctly behave when there no mapping is provided
by firmware.

Here we add explicit mapping between _CRS GpioIo() resources and
their names used in the driver.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/proximity/sx9500.c

index b8a2c2c8cac510f2dac62eec7c39d42939776984..ff80409e0c446fa01b659341c0de465ee7a23a92 100644 (file)
@@ -32,9 +32,6 @@
 #define SX9500_DRIVER_NAME             "sx9500"
 #define SX9500_IRQ_NAME                        "sx9500_event"
 
-#define SX9500_GPIO_INT                        "interrupt"
-#define SX9500_GPIO_RESET              "reset"
-
 /* Register definitions. */
 #define SX9500_REG_IRQ_SRC             0x00
 #define SX9500_REG_STAT                        0x01
@@ -866,26 +863,44 @@ static int sx9500_init_device(struct iio_dev *indio_dev)
        return sx9500_init_compensation(indio_dev);
 }
 
+static const struct acpi_gpio_params reset_gpios = { 0, 0, false };
+static const struct acpi_gpio_params interrupt_gpios = { 2, 0, false };
+
+static const struct acpi_gpio_mapping acpi_sx9500_gpios[] = {
+       { "reset-gpios", &reset_gpios, 1 },
+       /*
+        * Some platforms have a bug in ACPI GPIO description making IRQ
+        * GPIO to be output only. Ask the GPIO core to ignore this limit.
+        */
+       { "interrupt-gpios", &interrupt_gpios, 1, ACPI_GPIO_QUIRK_NO_IO_RESTRICTION },
+       { },
+};
+
 static void sx9500_gpio_probe(struct i2c_client *client,
                              struct sx9500_data *data)
 {
        struct gpio_desc *gpiod_int;
        struct device *dev;
+       int ret;
 
        if (!client)
                return;
 
        dev = &client->dev;
 
+       ret = devm_acpi_dev_add_driver_gpios(dev, acpi_sx9500_gpios);
+       if (ret)
+               dev_dbg(dev, "Unable to add GPIO mapping table\n");
+
        if (client->irq <= 0) {
-               gpiod_int = devm_gpiod_get(dev, SX9500_GPIO_INT, GPIOD_IN);
+               gpiod_int = devm_gpiod_get(dev, "interrupt", GPIOD_IN);
                if (IS_ERR(gpiod_int))
                        dev_err(dev, "gpio get irq failed\n");
                else
                        client->irq = gpiod_to_irq(gpiod_int);
        }
 
-       data->gpiod_rst = devm_gpiod_get(dev, SX9500_GPIO_RESET, GPIOD_OUT_HIGH);
+       data->gpiod_rst = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
        if (IS_ERR(data->gpiod_rst)) {
                dev_warn(dev, "gpio get reset pin failed\n");
                data->gpiod_rst = NULL;