123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- From 5c102aea3f4ffea811eec719edd638fc7888e9c3 Mon Sep 17 00:00:00 2001
- From: Yong Li <sdliyong@gmail.com>
- Date: Thu, 31 Mar 2016 15:33:08 +0800
- Subject: [PATCH 16/18] iot2000-hack: gpio: pca953x: provide GPIO base based on
- _UID
- Custom kernel for Intel Galileo Gen2 provides and moreover libmraa relies on
- the continuous GPIO space. To do such we have to configure GPIO base per each
- GPIO expander. The only value we can use is the ACPI _UID.
- Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
- Upstream-status: Inappropriate, custom code for legacy userspace
- Signed-off-by: Saul Wold <sgw@linux.intel.com>
- Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
- Signed-off-by: Yong Li <sdliyong@gmail.com>
- Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
- Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
- ---
- drivers/gpio/gpio-pca953x.c | 44 +++++++++++++++++++++++++++++++++++++-------
- 1 file changed, 37 insertions(+), 7 deletions(-)
- diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
- index b45ba6be69ef..8b467c0db1cb 100644
- --- a/drivers/gpio/gpio-pca953x.c
- +++ b/drivers/gpio/gpio-pca953x.c
- @@ -82,12 +82,6 @@ static const struct i2c_device_id pca953x_id[] = {
- };
- MODULE_DEVICE_TABLE(i2c, pca953x_id);
-
- -static const struct acpi_device_id pca953x_acpi_ids[] = {
- - { "INT3491", 16 | PCA953X_TYPE | PCA_INT | PCA_PCAL, },
- - { }
- -};
- -MODULE_DEVICE_TABLE(acpi, pca953x_acpi_ids);
- -
- #define MAX_BANK 5
- #define BANK_SZ 8
-
- @@ -119,6 +113,35 @@ static inline struct pca953x_chip *to_pca(struct gpio_chip *gc)
- return container_of(gc, struct pca953x_chip, gpio_chip);
- }
-
- +struct pca953x_info {
- + kernel_ulong_t driver_data;
- + void (*setup)(struct pca953x_chip *chip);
- +};
- +
- +static void pca953x_setup_int3491(struct pca953x_chip *chip)
- +{
- + struct acpi_device *adev = ACPI_COMPANION(&chip->client->dev);
- + unsigned int uid;
- +
- + if (kstrtouint(acpi_device_uid(adev), 0, &uid) || !uid--)
- + return;
- +
- + chip->gpio_start = 8 /* sch_gpio */ +
- + 8 /* gpio-dwapb */ +
- + 16 /* pca9535 */ * uid;
- +}
- +
- +static const struct pca953x_info pca953x_info_int3491 = {
- + .driver_data = 16 | PCA953X_TYPE | PCA_INT | PCA_PCAL,
- + .setup = pca953x_setup_int3491,
- +};
- +
- +static const struct acpi_device_id pca953x_acpi_ids[] = {
- + { "INT3491", (kernel_ulong_t)&pca953x_info_int3491 },
- + { }
- +};
- +MODULE_DEVICE_TABLE(acpi, pca953x_acpi_ids);
- +
- static int pca953x_read_single(struct pca953x_chip *chip, int reg, u32 *val,
- int off)
- {
- @@ -731,12 +754,19 @@ static int pca953x_probe(struct i2c_client *client,
- chip->driver_data = id->driver_data;
- } else {
- const struct acpi_device_id *id;
- + const struct pca953x_info *info;
-
- id = acpi_match_device(pca953x_acpi_ids, &client->dev);
- if (!id)
- return -ENODEV;
-
- - chip->driver_data = id->driver_data;
- + info = (struct pca953x_info *)id->driver_data;
- + if (!info)
- + return -ENODEV;
- +
- + chip->driver_data = info->driver_data;
- + if (info->setup)
- + info->setup(chip);
- }
-
- chip->chip_type = PCA_CHIP_TYPE(chip->driver_data);
- --
- 2.16.4
|