Commit b61d8e63 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Jonathan Cameron
Browse files

iio: proximity: sx9500: Add GPIO ACPI mapping table



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: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent c0879ed6
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -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;