aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-08-10 14:13:58 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-08-10 14:13:58 -0400
commit58d08e3b2c2033354b91467da33deffa06360c28 (patch)
tree7d0660f627e55038181d6427f26adbec1fb00dba /drivers/platform
parent64e3bbc7ef7029669c7fb23408864c60f147f7b9 (diff)
parent5502486a2077e4280c618b82e8a77ed35932956f (diff)
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/olof/chrome-platform
Pull chrome platform updates from Olof Johansson: "Updates to the Chromebook/box platform drivers: - a bugfix to pstore registration that makes it also work on non-Google systems - addition of new shipped Chromebooks (later models have more probing through ACPI so the need for these updates will be less over time). - A couple of minor coding style updates" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/olof/chrome-platform: platform/chrome: chromeos_laptop - Add a limit for deferred retries platform/chrome: Add support for the acer c720p touchscreen. platform/chrome: pstore: fix dmi table to match all chrome systems platform/chrome: coding style fixes platform/chrome: chromeos_laptop - Add Toshiba CB35 Touch platform/chrome: chromeos_laptop - Add Dell Chromebook 11 touch platform/chrome: chromeos_laptop - Add HP Chromebook 14 platform/chrome: chromeos_laptop - Add support for Acer C720
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/chrome/chromeos_laptop.c140
-rw-r--r--drivers/platform/chrome/chromeos_pstore.c14
2 files changed, 132 insertions, 22 deletions
diff --git a/drivers/platform/chrome/chromeos_laptop.c b/drivers/platform/chrome/chromeos_laptop.c
index 67b316b2a2bd..d866db80b4fd 100644
--- a/drivers/platform/chrome/chromeos_laptop.c
+++ b/drivers/platform/chrome/chromeos_laptop.c
@@ -37,6 +37,8 @@
37#define ISL_ALS_I2C_ADDR 0x44 37#define ISL_ALS_I2C_ADDR 0x44
38#define TAOS_ALS_I2C_ADDR 0x29 38#define TAOS_ALS_I2C_ADDR 0x29
39 39
40#define MAX_I2C_DEVICE_DEFERRALS 5
41
40static struct i2c_client *als; 42static struct i2c_client *als;
41static struct i2c_client *tp; 43static struct i2c_client *tp;
42static struct i2c_client *ts; 44static struct i2c_client *ts;
@@ -45,6 +47,8 @@ static const char *i2c_adapter_names[] = {
45 "SMBus I801 adapter", 47 "SMBus I801 adapter",
46 "i915 gmbus vga", 48 "i915 gmbus vga",
47 "i915 gmbus panel", 49 "i915 gmbus panel",
50 "i2c-designware-pci",
51 "i2c-designware-pci",
48}; 52};
49 53
50/* Keep this enum consistent with i2c_adapter_names */ 54/* Keep this enum consistent with i2c_adapter_names */
@@ -52,11 +56,21 @@ enum i2c_adapter_type {
52 I2C_ADAPTER_SMBUS = 0, 56 I2C_ADAPTER_SMBUS = 0,
53 I2C_ADAPTER_VGADDC, 57 I2C_ADAPTER_VGADDC,
54 I2C_ADAPTER_PANEL, 58 I2C_ADAPTER_PANEL,
59 I2C_ADAPTER_DESIGNWARE_0,
60 I2C_ADAPTER_DESIGNWARE_1,
61};
62
63enum i2c_peripheral_state {
64 UNPROBED = 0,
65 PROBED,
66 TIMEDOUT,
55}; 67};
56 68
57struct i2c_peripheral { 69struct i2c_peripheral {
58 int (*add)(enum i2c_adapter_type type); 70 int (*add)(enum i2c_adapter_type type);
59 enum i2c_adapter_type type; 71 enum i2c_adapter_type type;
72 enum i2c_peripheral_state state;
73 int tries;
60}; 74};
61 75
62#define MAX_I2C_PERIPHERALS 3 76#define MAX_I2C_PERIPHERALS 3
@@ -158,8 +172,8 @@ static struct i2c_client *__add_probed_i2c_device(
158 /* add the i2c device */ 172 /* add the i2c device */
159 client = i2c_new_probed_device(adapter, info, addrs, NULL); 173 client = i2c_new_probed_device(adapter, info, addrs, NULL);
160 if (!client) 174 if (!client)
161 pr_err("%s failed to register device %d-%02x\n", 175 pr_notice("%s failed to register device %d-%02x\n",
162 __func__, bus, info->addr); 176 __func__, bus, info->addr);
163 else 177 else
164 pr_debug("%s added i2c device %d-%02x\n", 178 pr_debug("%s added i2c device %d-%02x\n",
165 __func__, bus, info->addr); 179 __func__, bus, info->addr);
@@ -168,29 +182,43 @@ static struct i2c_client *__add_probed_i2c_device(
168 return client; 182 return client;
169} 183}
170 184
185struct i2c_lookup {
186 const char *name;
187 int instance;
188 int n;
189};
190
171static int __find_i2c_adap(struct device *dev, void *data) 191static int __find_i2c_adap(struct device *dev, void *data)
172{ 192{
173 const char *name = data; 193 struct i2c_lookup *lookup = data;
174 static const char *prefix = "i2c-"; 194 static const char *prefix = "i2c-";
175 struct i2c_adapter *adapter; 195 struct i2c_adapter *adapter;
196
176 if (strncmp(dev_name(dev), prefix, strlen(prefix)) != 0) 197 if (strncmp(dev_name(dev), prefix, strlen(prefix)) != 0)
177 return 0; 198 return 0;
178 adapter = to_i2c_adapter(dev); 199 adapter = to_i2c_adapter(dev);
179 return (strncmp(adapter->name, name, strlen(name)) == 0); 200 if (strncmp(adapter->name, lookup->name, strlen(lookup->name)) == 0 &&
201 lookup->n++ == lookup->instance)
202 return 1;
203 return 0;
180} 204}
181 205
182static int find_i2c_adapter_num(enum i2c_adapter_type type) 206static int find_i2c_adapter_num(enum i2c_adapter_type type)
183{ 207{
184 struct device *dev = NULL; 208 struct device *dev = NULL;
185 struct i2c_adapter *adapter; 209 struct i2c_adapter *adapter;
186 const char *name = i2c_adapter_names[type]; 210 struct i2c_lookup lookup;
211
212 memset(&lookup, 0, sizeof(lookup));
213 lookup.name = i2c_adapter_names[type];
214 lookup.instance = (type == I2C_ADAPTER_DESIGNWARE_1) ? 1 : 0;
215
187 /* find the adapter by name */ 216 /* find the adapter by name */
188 dev = bus_find_device(&i2c_bus_type, NULL, (void *)name, 217 dev = bus_find_device(&i2c_bus_type, NULL, &lookup, __find_i2c_adap);
189 __find_i2c_adap);
190 if (!dev) { 218 if (!dev) {
191 /* Adapters may appear later. Deferred probing will retry */ 219 /* Adapters may appear later. Deferred probing will retry */
192 pr_notice("%s: i2c adapter %s not found on system.\n", __func__, 220 pr_notice("%s: i2c adapter %s not found on system.\n", __func__,
193 name); 221 lookup.name);
194 return -ENODEV; 222 return -ENODEV;
195 } 223 }
196 adapter = to_i2c_adapter(dev); 224 adapter = to_i2c_adapter(dev);
@@ -227,6 +255,7 @@ static struct i2c_client *add_i2c_device(const char *name,
227 struct i2c_board_info *info) 255 struct i2c_board_info *info)
228{ 256{
229 const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END }; 257 const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END };
258
230 return __add_probed_i2c_device(name, 259 return __add_probed_i2c_device(name,
231 find_i2c_adapter_num(type), 260 find_i2c_adapter_num(type),
232 info, 261 info,
@@ -324,9 +353,36 @@ static int chromeos_laptop_probe(struct platform_device *pdev)
324 if (i2c_dev->add == NULL) 353 if (i2c_dev->add == NULL)
325 break; 354 break;
326 355
327 /* Add the device. Set -EPROBE_DEFER on any failure */ 356 if (i2c_dev->state == TIMEDOUT || i2c_dev->state == PROBED)
328 if (i2c_dev->add(i2c_dev->type)) 357 continue;
358
359 /*
360 * Check that the i2c adapter is present.
361 * -EPROBE_DEFER if missing as the adapter may appear much
362 * later.
363 */
364 if (find_i2c_adapter_num(i2c_dev->type) == -ENODEV) {
329 ret = -EPROBE_DEFER; 365 ret = -EPROBE_DEFER;
366 continue;
367 }
368
369 /* Add the device. */
370 if (i2c_dev->add(i2c_dev->type) == -EAGAIN) {
371 /*
372 * Set -EPROBE_DEFER a limited num of times
373 * if device is not successfully added.
374 */
375 if (++i2c_dev->tries < MAX_I2C_DEVICE_DEFERRALS) {
376 ret = -EPROBE_DEFER;
377 } else {
378 /* Ran out of tries. */
379 pr_notice("%s: Ran out of tries for device.\n",
380 __func__);
381 i2c_dev->state = TIMEDOUT;
382 }
383 } else {
384 i2c_dev->state = PROBED;
385 }
330 } 386 }
331 387
332 return ret; 388 return ret;
@@ -359,6 +415,27 @@ static struct chromeos_laptop chromebook_pixel = {
359 }, 415 },
360}; 416};
361 417
418static struct chromeos_laptop hp_chromebook_14 = {
419 .i2c_peripherals = {
420 /* Touchpad. */
421 { .add = setup_cyapa_tp, I2C_ADAPTER_DESIGNWARE_0 },
422 },
423};
424
425static struct chromeos_laptop dell_chromebook_11 = {
426 .i2c_peripherals = {
427 /* Touchpad. */
428 { .add = setup_cyapa_tp, I2C_ADAPTER_DESIGNWARE_0 },
429 },
430};
431
432static struct chromeos_laptop toshiba_cb35 = {
433 .i2c_peripherals = {
434 /* Touchpad. */
435 { .add = setup_cyapa_tp, I2C_ADAPTER_DESIGNWARE_0 },
436 },
437};
438
362static struct chromeos_laptop acer_c7_chromebook = { 439static struct chromeos_laptop acer_c7_chromebook = {
363 .i2c_peripherals = { 440 .i2c_peripherals = {
364 /* Touchpad. */ 441 /* Touchpad. */
@@ -373,6 +450,17 @@ static struct chromeos_laptop acer_ac700 = {
373 }, 450 },
374}; 451};
375 452
453static struct chromeos_laptop acer_c720 = {
454 .i2c_peripherals = {
455 /* Touchscreen. */
456 { .add = setup_atmel_1664s_ts, I2C_ADAPTER_DESIGNWARE_1 },
457 /* Touchpad. */
458 { .add = setup_cyapa_tp, I2C_ADAPTER_DESIGNWARE_0 },
459 /* Light Sensor. */
460 { .add = setup_isl29018_als, I2C_ADAPTER_DESIGNWARE_1 },
461 },
462};
463
376static struct chromeos_laptop hp_pavilion_14_chromebook = { 464static struct chromeos_laptop hp_pavilion_14_chromebook = {
377 .i2c_peripherals = { 465 .i2c_peripherals = {
378 /* Touchpad. */ 466 /* Touchpad. */
@@ -416,6 +504,30 @@ static struct dmi_system_id chromeos_laptop_dmi_table[] __initdata = {
416 _CBDD(chromebook_pixel), 504 _CBDD(chromebook_pixel),
417 }, 505 },
418 { 506 {
507 .ident = "Wolf",
508 .matches = {
509 DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
510 DMI_MATCH(DMI_PRODUCT_NAME, "Wolf"),
511 },
512 _CBDD(dell_chromebook_11),
513 },
514 {
515 .ident = "HP Chromebook 14",
516 .matches = {
517 DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
518 DMI_MATCH(DMI_PRODUCT_NAME, "Falco"),
519 },
520 _CBDD(hp_chromebook_14),
521 },
522 {
523 .ident = "Toshiba CB35",
524 .matches = {
525 DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
526 DMI_MATCH(DMI_PRODUCT_NAME, "Leon"),
527 },
528 _CBDD(toshiba_cb35),
529 },
530 {
419 .ident = "Acer C7 Chromebook", 531 .ident = "Acer C7 Chromebook",
420 .matches = { 532 .matches = {
421 DMI_MATCH(DMI_PRODUCT_NAME, "Parrot"), 533 DMI_MATCH(DMI_PRODUCT_NAME, "Parrot"),
@@ -430,6 +542,13 @@ static struct dmi_system_id chromeos_laptop_dmi_table[] __initdata = {
430 _CBDD(acer_ac700), 542 _CBDD(acer_ac700),
431 }, 543 },
432 { 544 {
545 .ident = "Acer C720",
546 .matches = {
547 DMI_MATCH(DMI_PRODUCT_NAME, "Peppy"),
548 },
549 _CBDD(acer_c720),
550 },
551 {
433 .ident = "HP Pavilion 14 Chromebook", 552 .ident = "HP Pavilion 14 Chromebook",
434 .matches = { 553 .matches = {
435 DMI_MATCH(DMI_PRODUCT_NAME, "Butterfly"), 554 DMI_MATCH(DMI_PRODUCT_NAME, "Butterfly"),
@@ -460,6 +579,7 @@ static struct platform_driver cros_platform_driver = {
460static int __init chromeos_laptop_init(void) 579static int __init chromeos_laptop_init(void)
461{ 580{
462 int ret; 581 int ret;
582
463 if (!dmi_check_system(chromeos_laptop_dmi_table)) { 583 if (!dmi_check_system(chromeos_laptop_dmi_table)) {
464 pr_debug("%s unsupported system.\n", __func__); 584 pr_debug("%s unsupported system.\n", __func__);
465 return -ENODEV; 585 return -ENODEV;
diff --git a/drivers/platform/chrome/chromeos_pstore.c b/drivers/platform/chrome/chromeos_pstore.c
index e0e0e65cf442..34749200e4ab 100644
--- a/drivers/platform/chrome/chromeos_pstore.c
+++ b/drivers/platform/chrome/chromeos_pstore.c
@@ -16,23 +16,13 @@
16static struct dmi_system_id chromeos_pstore_dmi_table[] __initdata = { 16static struct dmi_system_id chromeos_pstore_dmi_table[] __initdata = {
17 { 17 {
18 /* 18 /*
19 * Today all Chromebooks/boxes ship with GOOGLE as vendor and 19 * Today all Chromebooks/boxes ship with Google_* as version and
20 * coreboot as bios vendor. No other systems with this 20 * coreboot as bios vendor. No other systems with this
21 * combination are known to date. 21 * combination are known to date.
22 */ 22 */
23 .matches = { 23 .matches = {
24 DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
25 DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
26 },
27 },
28 {
29 /*
30 * The first Samsung Chromebox and Chromebook Series 5 550 use
31 * coreboot but with Samsung as the system vendor.
32 */
33 .matches = {
34 DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG"),
35 DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"), 24 DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
25 DMI_MATCH(DMI_BIOS_VERSION, "Google_"),
36 }, 26 },
37 }, 27 },
38 { 28 {