diff options
| author | Mika Westerberg <mika.westerberg@linux.intel.com> | 2014-06-17 17:02:00 -0400 |
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2014-07-10 12:34:48 -0400 |
| commit | da3b0ab75aadab63d1ffd5563100c9386e444dad (patch) | |
| tree | 8eac06c74569bb137d8855e5cdb580029dd47aa7 /drivers | |
| parent | cd3de83f147601356395b57a8673e9c5ff1e59d1 (diff) | |
platform/chrome: chromeos_laptop - Add support for Acer C720
Acer C720 has touchpad and light sensor connected to a separate I2C buses.
Since the designware I2C host controller driver has two instances on this
particular machine we need a way to match the correct instance. Add support
for this and then register both C720 touchpad and light sensor.
This code is based on following patch from Benson Leung:
https://patchwork.kernel.org/patch/3074411/
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Tested-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Benson Leung <bleung@chromium.org>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/platform/chrome/chromeos_laptop.c | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c index 7f1a2e2711bd..a241e5fa6c83 100644 --- a/drivers/platform/chrome/chromeos_laptop.c +++ b/drivers/platform/chrome/chromeos_laptop.c | |||
| @@ -45,6 +45,8 @@ static const char *i2c_adapter_names[] = { | |||
| 45 | "SMBus I801 adapter", | 45 | "SMBus I801 adapter", |
| 46 | "i915 gmbus vga", | 46 | "i915 gmbus vga", |
| 47 | "i915 gmbus panel", | 47 | "i915 gmbus panel", |
| 48 | "i2c-designware-pci", | ||
| 49 | "i2c-designware-pci", | ||
| 48 | }; | 50 | }; |
| 49 | 51 | ||
| 50 | /* Keep this enum consistent with i2c_adapter_names */ | 52 | /* Keep this enum consistent with i2c_adapter_names */ |
| @@ -52,6 +54,8 @@ enum i2c_adapter_type { | |||
| 52 | I2C_ADAPTER_SMBUS = 0, | 54 | I2C_ADAPTER_SMBUS = 0, |
| 53 | I2C_ADAPTER_VGADDC, | 55 | I2C_ADAPTER_VGADDC, |
| 54 | I2C_ADAPTER_PANEL, | 56 | I2C_ADAPTER_PANEL, |
| 57 | I2C_ADAPTER_DESIGNWARE_0, | ||
| 58 | I2C_ADAPTER_DESIGNWARE_1, | ||
| 55 | }; | 59 | }; |
| 56 | 60 | ||
| 57 | struct i2c_peripheral { | 61 | struct i2c_peripheral { |
| @@ -172,29 +176,42 @@ static struct i2c_client *__add_probed_i2c_device( | |||
| 172 | return client; | 176 | return client; |
| 173 | } | 177 | } |
| 174 | 178 | ||
| 179 | struct i2c_lookup { | ||
| 180 | const char *name; | ||
| 181 | int instance; | ||
| 182 | int n; | ||
| 183 | }; | ||
| 184 | |||
| 175 | static int __find_i2c_adap(struct device *dev, void *data) | 185 | static int __find_i2c_adap(struct device *dev, void *data) |
| 176 | { | 186 | { |
| 177 | const char *name = data; | 187 | struct i2c_lookup *lookup = data; |
| 178 | static const char *prefix = "i2c-"; | 188 | static const char *prefix = "i2c-"; |
| 179 | struct i2c_adapter *adapter; | 189 | struct i2c_adapter *adapter; |
| 180 | if (strncmp(dev_name(dev), prefix, strlen(prefix)) != 0) | 190 | if (strncmp(dev_name(dev), prefix, strlen(prefix)) != 0) |
| 181 | return 0; | 191 | return 0; |
| 182 | adapter = to_i2c_adapter(dev); | 192 | adapter = to_i2c_adapter(dev); |
| 183 | return (strncmp(adapter->name, name, strlen(name)) == 0); | 193 | if (strncmp(adapter->name, lookup->name, strlen(lookup->name)) == 0 && |
| 194 | lookup->n++ == lookup->instance) | ||
| 195 | return 1; | ||
| 196 | return 0; | ||
| 184 | } | 197 | } |
| 185 | 198 | ||
| 186 | static int find_i2c_adapter_num(enum i2c_adapter_type type) | 199 | static int find_i2c_adapter_num(enum i2c_adapter_type type) |
| 187 | { | 200 | { |
| 188 | struct device *dev = NULL; | 201 | struct device *dev = NULL; |
| 189 | struct i2c_adapter *adapter; | 202 | struct i2c_adapter *adapter; |
| 190 | const char *name = i2c_adapter_names[type]; | 203 | struct i2c_lookup lookup; |
| 204 | |||
| 205 | memset(&lookup, 0, sizeof(lookup)); | ||
| 206 | lookup.name = i2c_adapter_names[type]; | ||
| 207 | lookup.instance = (type == I2C_ADAPTER_DESIGNWARE_1) ? 1 : 0; | ||
| 208 | |||
| 191 | /* find the adapter by name */ | 209 | /* find the adapter by name */ |
| 192 | dev = bus_find_device(&i2c_bus_type, NULL, (void *)name, | 210 | dev = bus_find_device(&i2c_bus_type, NULL, &lookup, __find_i2c_adap); |
| 193 | __find_i2c_adap); | ||
| 194 | if (!dev) { | 211 | if (!dev) { |
| 195 | /* Adapters may appear later. Deferred probing will retry */ | 212 | /* Adapters may appear later. Deferred probing will retry */ |
| 196 | pr_notice("%s: i2c adapter %s not found on system.\n", __func__, | 213 | pr_notice("%s: i2c adapter %s not found on system.\n", __func__, |
| 197 | name); | 214 | lookup.name); |
| 198 | return -ENODEV; | 215 | return -ENODEV; |
| 199 | } | 216 | } |
| 200 | adapter = to_i2c_adapter(dev); | 217 | adapter = to_i2c_adapter(dev); |
| @@ -377,6 +394,15 @@ static struct chromeos_laptop acer_ac700 = { | |||
| 377 | }, | 394 | }, |
| 378 | }; | 395 | }; |
| 379 | 396 | ||
| 397 | static struct chromeos_laptop acer_c720 = { | ||
| 398 | .i2c_peripherals = { | ||
| 399 | /* Touchpad. */ | ||
| 400 | { .add = setup_cyapa_tp, I2C_ADAPTER_DESIGNWARE_0 }, | ||
| 401 | /* Light Sensor. */ | ||
| 402 | { .add = setup_isl29018_als, I2C_ADAPTER_DESIGNWARE_1 }, | ||
| 403 | }, | ||
| 404 | }; | ||
| 405 | |||
| 380 | static struct chromeos_laptop hp_pavilion_14_chromebook = { | 406 | static struct chromeos_laptop hp_pavilion_14_chromebook = { |
| 381 | .i2c_peripherals = { | 407 | .i2c_peripherals = { |
| 382 | /* Touchpad. */ | 408 | /* Touchpad. */ |
| @@ -434,6 +460,13 @@ static struct dmi_system_id chromeos_laptop_dmi_table[] __initdata = { | |||
| 434 | _CBDD(acer_ac700), | 460 | _CBDD(acer_ac700), |
| 435 | }, | 461 | }, |
| 436 | { | 462 | { |
| 463 | .ident = "Acer C720", | ||
| 464 | .matches = { | ||
| 465 | DMI_MATCH(DMI_PRODUCT_NAME, "Peppy"), | ||
| 466 | }, | ||
| 467 | _CBDD(acer_c720), | ||
| 468 | }, | ||
| 469 | { | ||
| 437 | .ident = "HP Pavilion 14 Chromebook", | 470 | .ident = "HP Pavilion 14 Chromebook", |
| 438 | .matches = { | 471 | .matches = { |
| 439 | DMI_MATCH(DMI_PRODUCT_NAME, "Butterfly"), | 472 | DMI_MATCH(DMI_PRODUCT_NAME, "Butterfly"), |
