]> Git Repo - linux.git/blob - drivers/platform/chrome/cros_ec_lpc.c
Merge tag 's390-6.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux.git] / drivers / platform / chrome / cros_ec_lpc.c
1 // SPDX-License-Identifier: GPL-2.0
2 // LPC interface for ChromeOS Embedded Controller
3 //
4 // Copyright (C) 2012-2015 Google, Inc
5 //
6 // This driver uses the ChromeOS EC byte-level message-based protocol for
7 // communicating the keyboard state (which keys are pressed) from a keyboard EC
8 // to the AP over some bus (such as i2c, lpc, spi).  The EC does debouncing,
9 // but everything else (including deghosting) is done here.  The main
10 // motivation for this is to keep the EC firmware as simple as possible, since
11 // it cannot be easily upgraded and EC flash/IRAM space is relatively
12 // expensive.
13
14 #include <linux/acpi.h>
15 #include <linux/dmi.h>
16 #include <linux/delay.h>
17 #include <linux/io.h>
18 #include <linux/interrupt.h>
19 #include <linux/kobject.h>
20 #include <linux/module.h>
21 #include <linux/platform_data/cros_ec_commands.h>
22 #include <linux/platform_data/cros_ec_proto.h>
23 #include <linux/platform_device.h>
24 #include <linux/printk.h>
25 #include <linux/reboot.h>
26 #include <linux/suspend.h>
27
28 #include "cros_ec.h"
29 #include "cros_ec_lpc_mec.h"
30
31 #define DRV_NAME "cros_ec_lpcs"
32 #define ACPI_DRV_NAME "GOOG0004"
33
34 /* True if ACPI device is present */
35 static bool cros_ec_lpc_acpi_device_found;
36
37 /*
38  * Indicates that lpc_driver_data.quirk_mmio_memory_base should
39  * be used as the base port for EC mapped memory.
40  */
41 #define CROS_EC_LPC_QUIRK_REMAP_MEMORY              BIT(0)
42
43 /**
44  * struct lpc_driver_data - driver data attached to a DMI device ID to indicate
45  *                          hardware quirks.
46  * @quirks: a bitfield composed of quirks from CROS_EC_LPC_QUIRK_*
47  * @quirk_mmio_memory_base: The first I/O port addressing EC mapped memory (used
48  *                          when quirk ...REMAP_MEMORY is set.)
49  */
50 struct lpc_driver_data {
51         u32 quirks;
52         u16 quirk_mmio_memory_base;
53 };
54
55 /**
56  * struct cros_ec_lpc - LPC device-specific data
57  * @mmio_memory_base: The first I/O port addressing EC mapped memory.
58  */
59 struct cros_ec_lpc {
60         u16 mmio_memory_base;
61 };
62
63 /**
64  * struct lpc_driver_ops - LPC driver operations
65  * @read: Copy length bytes from EC address offset into buffer dest. Returns
66  *        the 8-bit checksum of all bytes read.
67  * @write: Copy length bytes from buffer msg into EC address offset. Returns
68  *         the 8-bit checksum of all bytes written.
69  */
70 struct lpc_driver_ops {
71         u8 (*read)(unsigned int offset, unsigned int length, u8 *dest);
72         u8 (*write)(unsigned int offset, unsigned int length, const u8 *msg);
73 };
74
75 static struct lpc_driver_ops cros_ec_lpc_ops = { };
76
77 /*
78  * A generic instance of the read function of struct lpc_driver_ops, used for
79  * the LPC EC.
80  */
81 static u8 cros_ec_lpc_read_bytes(unsigned int offset, unsigned int length,
82                                  u8 *dest)
83 {
84         int sum = 0;
85         int i;
86
87         for (i = 0; i < length; ++i) {
88                 dest[i] = inb(offset + i);
89                 sum += dest[i];
90         }
91
92         /* Return checksum of all bytes read */
93         return sum;
94 }
95
96 /*
97  * A generic instance of the write function of struct lpc_driver_ops, used for
98  * the LPC EC.
99  */
100 static u8 cros_ec_lpc_write_bytes(unsigned int offset, unsigned int length,
101                                   const u8 *msg)
102 {
103         int sum = 0;
104         int i;
105
106         for (i = 0; i < length; ++i) {
107                 outb(msg[i], offset + i);
108                 sum += msg[i];
109         }
110
111         /* Return checksum of all bytes written */
112         return sum;
113 }
114
115 /*
116  * An instance of the read function of struct lpc_driver_ops, used for the
117  * MEC variant of LPC EC.
118  */
119 static u8 cros_ec_lpc_mec_read_bytes(unsigned int offset, unsigned int length,
120                                      u8 *dest)
121 {
122         int in_range = cros_ec_lpc_mec_in_range(offset, length);
123
124         if (in_range < 0)
125                 return 0;
126
127         return in_range ?
128                 cros_ec_lpc_io_bytes_mec(MEC_IO_READ,
129                                          offset - EC_HOST_CMD_REGION0,
130                                          length, dest) :
131                 cros_ec_lpc_read_bytes(offset, length, dest);
132 }
133
134 /*
135  * An instance of the write function of struct lpc_driver_ops, used for the
136  * MEC variant of LPC EC.
137  */
138 static u8 cros_ec_lpc_mec_write_bytes(unsigned int offset, unsigned int length,
139                                       const u8 *msg)
140 {
141         int in_range = cros_ec_lpc_mec_in_range(offset, length);
142
143         if (in_range < 0)
144                 return 0;
145
146         return in_range ?
147                 cros_ec_lpc_io_bytes_mec(MEC_IO_WRITE,
148                                          offset - EC_HOST_CMD_REGION0,
149                                          length, (u8 *)msg) :
150                 cros_ec_lpc_write_bytes(offset, length, msg);
151 }
152
153 static int ec_response_timed_out(void)
154 {
155         unsigned long one_second = jiffies + HZ;
156         u8 data;
157
158         usleep_range(200, 300);
159         do {
160                 if (!(cros_ec_lpc_ops.read(EC_LPC_ADDR_HOST_CMD, 1, &data) &
161                     EC_LPC_STATUS_BUSY_MASK))
162                         return 0;
163                 usleep_range(100, 200);
164         } while (time_before(jiffies, one_second));
165
166         return 1;
167 }
168
169 static int cros_ec_pkt_xfer_lpc(struct cros_ec_device *ec,
170                                 struct cros_ec_command *msg)
171 {
172         struct ec_host_response response;
173         u8 sum;
174         int ret = 0;
175         u8 *dout;
176
177         ret = cros_ec_prepare_tx(ec, msg);
178         if (ret < 0)
179                 goto done;
180
181         /* Write buffer */
182         cros_ec_lpc_ops.write(EC_LPC_ADDR_HOST_PACKET, ret, ec->dout);
183
184         /* Here we go */
185         sum = EC_COMMAND_PROTOCOL_3;
186         cros_ec_lpc_ops.write(EC_LPC_ADDR_HOST_CMD, 1, &sum);
187
188         if (ec_response_timed_out()) {
189                 dev_warn(ec->dev, "EC response timed out\n");
190                 ret = -EIO;
191                 goto done;
192         }
193
194         /* Check result */
195         msg->result = cros_ec_lpc_ops.read(EC_LPC_ADDR_HOST_DATA, 1, &sum);
196         ret = cros_ec_check_result(ec, msg);
197         if (ret)
198                 goto done;
199
200         /* Read back response */
201         dout = (u8 *)&response;
202         sum = cros_ec_lpc_ops.read(EC_LPC_ADDR_HOST_PACKET, sizeof(response),
203                                    dout);
204
205         msg->result = response.result;
206
207         if (response.data_len > msg->insize) {
208                 dev_err(ec->dev,
209                         "packet too long (%d bytes, expected %d)",
210                         response.data_len, msg->insize);
211                 ret = -EMSGSIZE;
212                 goto done;
213         }
214
215         /* Read response and process checksum */
216         sum += cros_ec_lpc_ops.read(EC_LPC_ADDR_HOST_PACKET +
217                                     sizeof(response), response.data_len,
218                                     msg->data);
219
220         if (sum) {
221                 dev_err(ec->dev,
222                         "bad packet checksum %02x\n",
223                         response.checksum);
224                 ret = -EBADMSG;
225                 goto done;
226         }
227
228         /* Return actual amount of data received */
229         ret = response.data_len;
230 done:
231         return ret;
232 }
233
234 static int cros_ec_cmd_xfer_lpc(struct cros_ec_device *ec,
235                                 struct cros_ec_command *msg)
236 {
237         struct ec_lpc_host_args args;
238         u8 sum;
239         int ret = 0;
240
241         if (msg->outsize > EC_PROTO2_MAX_PARAM_SIZE ||
242             msg->insize > EC_PROTO2_MAX_PARAM_SIZE) {
243                 dev_err(ec->dev,
244                         "invalid buffer sizes (out %d, in %d)\n",
245                         msg->outsize, msg->insize);
246                 return -EINVAL;
247         }
248
249         /* Now actually send the command to the EC and get the result */
250         args.flags = EC_HOST_ARGS_FLAG_FROM_HOST;
251         args.command_version = msg->version;
252         args.data_size = msg->outsize;
253
254         /* Initialize checksum */
255         sum = msg->command + args.flags + args.command_version + args.data_size;
256
257         /* Copy data and update checksum */
258         sum += cros_ec_lpc_ops.write(EC_LPC_ADDR_HOST_PARAM, msg->outsize,
259                                      msg->data);
260
261         /* Finalize checksum and write args */
262         args.checksum = sum;
263         cros_ec_lpc_ops.write(EC_LPC_ADDR_HOST_ARGS, sizeof(args),
264                               (u8 *)&args);
265
266         /* Here we go */
267         sum = msg->command;
268         cros_ec_lpc_ops.write(EC_LPC_ADDR_HOST_CMD, 1, &sum);
269
270         if (ec_response_timed_out()) {
271                 dev_warn(ec->dev, "EC response timed out\n");
272                 ret = -EIO;
273                 goto done;
274         }
275
276         /* Check result */
277         msg->result = cros_ec_lpc_ops.read(EC_LPC_ADDR_HOST_DATA, 1, &sum);
278         ret = cros_ec_check_result(ec, msg);
279         if (ret)
280                 goto done;
281
282         /* Read back args */
283         cros_ec_lpc_ops.read(EC_LPC_ADDR_HOST_ARGS, sizeof(args), (u8 *)&args);
284
285         if (args.data_size > msg->insize) {
286                 dev_err(ec->dev,
287                         "packet too long (%d bytes, expected %d)",
288                         args.data_size, msg->insize);
289                 ret = -ENOSPC;
290                 goto done;
291         }
292
293         /* Start calculating response checksum */
294         sum = msg->command + args.flags + args.command_version + args.data_size;
295
296         /* Read response and update checksum */
297         sum += cros_ec_lpc_ops.read(EC_LPC_ADDR_HOST_PARAM, args.data_size,
298                                     msg->data);
299
300         /* Verify checksum */
301         if (args.checksum != sum) {
302                 dev_err(ec->dev,
303                         "bad packet checksum, expected %02x, got %02x\n",
304                         args.checksum, sum);
305                 ret = -EBADMSG;
306                 goto done;
307         }
308
309         /* Return actual amount of data received */
310         ret = args.data_size;
311 done:
312         return ret;
313 }
314
315 /* Returns num bytes read, or negative on error. Doesn't need locking. */
316 static int cros_ec_lpc_readmem(struct cros_ec_device *ec, unsigned int offset,
317                                unsigned int bytes, void *dest)
318 {
319         struct cros_ec_lpc *ec_lpc = ec->priv;
320         int i = offset;
321         char *s = dest;
322         int cnt = 0;
323
324         if (offset >= EC_MEMMAP_SIZE - bytes)
325                 return -EINVAL;
326
327         /* fixed length */
328         if (bytes) {
329                 cros_ec_lpc_ops.read(ec_lpc->mmio_memory_base + offset, bytes, s);
330                 return bytes;
331         }
332
333         /* string */
334         for (; i < EC_MEMMAP_SIZE; i++, s++) {
335                 cros_ec_lpc_ops.read(ec_lpc->mmio_memory_base + i, 1, s);
336                 cnt++;
337                 if (!*s)
338                         break;
339         }
340
341         return cnt;
342 }
343
344 static void cros_ec_lpc_acpi_notify(acpi_handle device, u32 value, void *data)
345 {
346         static const char *env[] = { "ERROR=PANIC", NULL };
347         struct cros_ec_device *ec_dev = data;
348         bool ec_has_more_events;
349         int ret;
350
351         ec_dev->last_event_time = cros_ec_get_time_ns();
352
353         if (value == ACPI_NOTIFY_CROS_EC_PANIC) {
354                 dev_emerg(ec_dev->dev, "CrOS EC Panic Reported. Shutdown is imminent!");
355                 blocking_notifier_call_chain(&ec_dev->panic_notifier, 0, ec_dev);
356                 kobject_uevent_env(&ec_dev->dev->kobj, KOBJ_CHANGE, (char **)env);
357                 /* Begin orderly shutdown. EC will force reset after a short period. */
358                 hw_protection_shutdown("CrOS EC Panic", -1);
359                 /* Do not query for other events after a panic is reported */
360                 return;
361         }
362
363         if (ec_dev->mkbp_event_supported)
364                 do {
365                         ret = cros_ec_get_next_event(ec_dev, NULL,
366                                                      &ec_has_more_events);
367                         if (ret > 0)
368                                 blocking_notifier_call_chain(
369                                                 &ec_dev->event_notifier, 0,
370                                                 ec_dev);
371                 } while (ec_has_more_events);
372
373         if (value == ACPI_NOTIFY_DEVICE_WAKE)
374                 pm_system_wakeup();
375 }
376
377 static int cros_ec_lpc_probe(struct platform_device *pdev)
378 {
379         struct device *dev = &pdev->dev;
380         struct acpi_device *adev;
381         acpi_status status;
382         struct cros_ec_device *ec_dev;
383         struct cros_ec_lpc *ec_lpc;
384         struct lpc_driver_data *driver_data;
385         u8 buf[2] = {};
386         int irq, ret;
387         u32 quirks;
388
389         ec_lpc = devm_kzalloc(dev, sizeof(*ec_lpc), GFP_KERNEL);
390         if (!ec_lpc)
391                 return -ENOMEM;
392
393         ec_lpc->mmio_memory_base = EC_LPC_ADDR_MEMMAP;
394
395         driver_data = platform_get_drvdata(pdev);
396         if (driver_data) {
397                 quirks = driver_data->quirks;
398
399                 if (quirks)
400                         dev_info(dev, "loaded with quirks %8.08x\n", quirks);
401
402                 if (quirks & CROS_EC_LPC_QUIRK_REMAP_MEMORY)
403                         ec_lpc->mmio_memory_base = driver_data->quirk_mmio_memory_base;
404         }
405
406         /*
407          * The Framework Laptop (and possibly other non-ChromeOS devices)
408          * only exposes the eight I/O ports that are required for the Microchip EC.
409          * Requesting a larger reservation will fail.
410          */
411         if (!devm_request_region(dev, EC_HOST_CMD_REGION0,
412                                  EC_HOST_CMD_MEC_REGION_SIZE, dev_name(dev))) {
413                 dev_err(dev, "couldn't reserve MEC region\n");
414                 return -EBUSY;
415         }
416
417         cros_ec_lpc_mec_init(EC_HOST_CMD_REGION0,
418                              EC_LPC_ADDR_MEMMAP + EC_MEMMAP_SIZE);
419
420         /*
421          * Read the mapped ID twice, the first one is assuming the
422          * EC is a Microchip Embedded Controller (MEC) variant, if the
423          * protocol fails, fallback to the non MEC variant and try to
424          * read again the ID.
425          */
426         cros_ec_lpc_ops.read = cros_ec_lpc_mec_read_bytes;
427         cros_ec_lpc_ops.write = cros_ec_lpc_mec_write_bytes;
428         cros_ec_lpc_ops.read(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_ID, 2, buf);
429         if (buf[0] != 'E' || buf[1] != 'C') {
430                 if (!devm_request_region(dev, ec_lpc->mmio_memory_base, EC_MEMMAP_SIZE,
431                                          dev_name(dev))) {
432                         dev_err(dev, "couldn't reserve memmap region\n");
433                         return -EBUSY;
434                 }
435
436                 /* Re-assign read/write operations for the non MEC variant */
437                 cros_ec_lpc_ops.read = cros_ec_lpc_read_bytes;
438                 cros_ec_lpc_ops.write = cros_ec_lpc_write_bytes;
439                 cros_ec_lpc_ops.read(ec_lpc->mmio_memory_base + EC_MEMMAP_ID, 2,
440                                      buf);
441                 if (buf[0] != 'E' || buf[1] != 'C') {
442                         dev_err(dev, "EC ID not detected\n");
443                         return -ENODEV;
444                 }
445
446                 /* Reserve the remaining I/O ports required by the non-MEC protocol. */
447                 if (!devm_request_region(dev, EC_HOST_CMD_REGION0 + EC_HOST_CMD_MEC_REGION_SIZE,
448                                          EC_HOST_CMD_REGION_SIZE - EC_HOST_CMD_MEC_REGION_SIZE,
449                                          dev_name(dev))) {
450                         dev_err(dev, "couldn't reserve remainder of region0\n");
451                         return -EBUSY;
452                 }
453                 if (!devm_request_region(dev, EC_HOST_CMD_REGION1,
454                                          EC_HOST_CMD_REGION_SIZE, dev_name(dev))) {
455                         dev_err(dev, "couldn't reserve region1\n");
456                         return -EBUSY;
457                 }
458         }
459
460         ec_dev = devm_kzalloc(dev, sizeof(*ec_dev), GFP_KERNEL);
461         if (!ec_dev)
462                 return -ENOMEM;
463
464         platform_set_drvdata(pdev, ec_dev);
465         ec_dev->dev = dev;
466         ec_dev->phys_name = dev_name(dev);
467         ec_dev->cmd_xfer = cros_ec_cmd_xfer_lpc;
468         ec_dev->pkt_xfer = cros_ec_pkt_xfer_lpc;
469         ec_dev->cmd_readmem = cros_ec_lpc_readmem;
470         ec_dev->din_size = sizeof(struct ec_host_response) +
471                            sizeof(struct ec_response_get_protocol_info);
472         ec_dev->dout_size = sizeof(struct ec_host_request);
473         ec_dev->priv = ec_lpc;
474
475         /*
476          * Some boards do not have an IRQ allotted for cros_ec_lpc,
477          * which makes ENXIO an expected (and safe) scenario.
478          */
479         irq = platform_get_irq_optional(pdev, 0);
480         if (irq > 0)
481                 ec_dev->irq = irq;
482         else if (irq != -ENXIO) {
483                 dev_err(dev, "couldn't retrieve IRQ number (%d)\n", irq);
484                 return irq;
485         }
486
487         ret = cros_ec_register(ec_dev);
488         if (ret) {
489                 dev_err(dev, "couldn't register ec_dev (%d)\n", ret);
490                 return ret;
491         }
492
493         /*
494          * Connect a notify handler to process MKBP messages if we have a
495          * companion ACPI device.
496          */
497         adev = ACPI_COMPANION(dev);
498         if (adev) {
499                 status = acpi_install_notify_handler(adev->handle,
500                                                      ACPI_ALL_NOTIFY,
501                                                      cros_ec_lpc_acpi_notify,
502                                                      ec_dev);
503                 if (ACPI_FAILURE(status))
504                         dev_warn(dev, "Failed to register notifier %08x\n",
505                                  status);
506         }
507
508         return 0;
509 }
510
511 static void cros_ec_lpc_remove(struct platform_device *pdev)
512 {
513         struct cros_ec_device *ec_dev = platform_get_drvdata(pdev);
514         struct acpi_device *adev;
515
516         adev = ACPI_COMPANION(&pdev->dev);
517         if (adev)
518                 acpi_remove_notify_handler(adev->handle, ACPI_ALL_NOTIFY,
519                                            cros_ec_lpc_acpi_notify);
520
521         cros_ec_unregister(ec_dev);
522 }
523
524 static const struct acpi_device_id cros_ec_lpc_acpi_device_ids[] = {
525         { ACPI_DRV_NAME, 0 },
526         { }
527 };
528 MODULE_DEVICE_TABLE(acpi, cros_ec_lpc_acpi_device_ids);
529
530 static const struct lpc_driver_data framework_laptop_amd_lpc_driver_data __initconst = {
531         .quirks = CROS_EC_LPC_QUIRK_REMAP_MEMORY,
532         .quirk_mmio_memory_base = 0xE00,
533 };
534
535 static const struct dmi_system_id cros_ec_lpc_dmi_table[] __initconst = {
536         {
537                 /*
538                  * Today all Chromebooks/boxes ship with Google_* as version and
539                  * coreboot as bios vendor. No other systems with this
540                  * combination are known to date.
541                  */
542                 .matches = {
543                         DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
544                         DMI_MATCH(DMI_BIOS_VERSION, "Google_"),
545                 },
546         },
547         {
548                 /*
549                  * If the box is running custom coreboot firmware then the
550                  * DMI BIOS version string will not be matched by "Google_",
551                  * but the system vendor string will still be matched by
552                  * "GOOGLE".
553                  */
554                 .matches = {
555                         DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
556                         DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
557                 },
558         },
559         {
560                 /* x86-link, the Chromebook Pixel. */
561                 .matches = {
562                         DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
563                         DMI_MATCH(DMI_PRODUCT_NAME, "Link"),
564                 },
565         },
566         {
567                 /* x86-samus, the Chromebook Pixel 2. */
568                 .matches = {
569                         DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
570                         DMI_MATCH(DMI_PRODUCT_NAME, "Samus"),
571                 },
572         },
573         {
574                 /* x86-peppy, the Acer C720 Chromebook. */
575                 .matches = {
576                         DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
577                         DMI_MATCH(DMI_PRODUCT_NAME, "Peppy"),
578                 },
579         },
580         {
581                 /* x86-glimmer, the Lenovo Thinkpad Yoga 11e. */
582                 .matches = {
583                         DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
584                         DMI_MATCH(DMI_PRODUCT_NAME, "Glimmer"),
585                 },
586         },
587         /* A small number of non-Chromebook/box machines also use the ChromeOS EC */
588         {
589                 /* the Framework Laptop 13 (AMD Ryzen) and 16 (AMD Ryzen) */
590                 .matches = {
591                         DMI_MATCH(DMI_SYS_VENDOR, "Framework"),
592                         DMI_MATCH(DMI_PRODUCT_NAME, "AMD Ryzen"),
593                         DMI_MATCH(DMI_PRODUCT_FAMILY, "Laptop"),
594                 },
595                 .driver_data = (void *)&framework_laptop_amd_lpc_driver_data,
596         },
597         {
598                 /* the Framework Laptop (Intel 11th, 12th, 13th Generation) */
599                 .matches = {
600                         DMI_MATCH(DMI_SYS_VENDOR, "Framework"),
601                         DMI_MATCH(DMI_PRODUCT_NAME, "Laptop"),
602                 },
603         },
604         { /* sentinel */ }
605 };
606 MODULE_DEVICE_TABLE(dmi, cros_ec_lpc_dmi_table);
607
608 #ifdef CONFIG_PM_SLEEP
609 static int cros_ec_lpc_prepare(struct device *dev)
610 {
611         struct cros_ec_device *ec_dev = dev_get_drvdata(dev);
612         return cros_ec_suspend_prepare(ec_dev);
613 }
614
615 static void cros_ec_lpc_complete(struct device *dev)
616 {
617         struct cros_ec_device *ec_dev = dev_get_drvdata(dev);
618         cros_ec_resume_complete(ec_dev);
619 }
620
621 static int cros_ec_lpc_suspend_late(struct device *dev)
622 {
623         struct cros_ec_device *ec_dev = dev_get_drvdata(dev);
624
625         return cros_ec_suspend_late(ec_dev);
626 }
627
628 static int cros_ec_lpc_resume_early(struct device *dev)
629 {
630         struct cros_ec_device *ec_dev = dev_get_drvdata(dev);
631
632         return cros_ec_resume_early(ec_dev);
633 }
634 #endif
635
636 static const struct dev_pm_ops cros_ec_lpc_pm_ops = {
637 #ifdef CONFIG_PM_SLEEP
638         .prepare = cros_ec_lpc_prepare,
639         .complete = cros_ec_lpc_complete,
640 #endif
641         SET_LATE_SYSTEM_SLEEP_PM_OPS(cros_ec_lpc_suspend_late, cros_ec_lpc_resume_early)
642 };
643
644 static struct platform_driver cros_ec_lpc_driver = {
645         .driver = {
646                 .name = DRV_NAME,
647                 .acpi_match_table = cros_ec_lpc_acpi_device_ids,
648                 .pm = &cros_ec_lpc_pm_ops,
649                 /*
650                  * ACPI child devices may probe before us, and they racily
651                  * check our drvdata pointer. Force synchronous probe until
652                  * those races are resolved.
653                  */
654                 .probe_type = PROBE_FORCE_SYNCHRONOUS,
655         },
656         .probe = cros_ec_lpc_probe,
657         .remove_new = cros_ec_lpc_remove,
658 };
659
660 static struct platform_device cros_ec_lpc_device = {
661         .name = DRV_NAME
662 };
663
664 static acpi_status cros_ec_lpc_parse_device(acpi_handle handle, u32 level,
665                                             void *context, void **retval)
666 {
667         *(bool *)context = true;
668         return AE_CTRL_TERMINATE;
669 }
670
671 static int __init cros_ec_lpc_init(void)
672 {
673         int ret;
674         acpi_status status;
675         const struct dmi_system_id *dmi_match;
676
677         status = acpi_get_devices(ACPI_DRV_NAME, cros_ec_lpc_parse_device,
678                                   &cros_ec_lpc_acpi_device_found, NULL);
679         if (ACPI_FAILURE(status))
680                 pr_warn(DRV_NAME ": Looking for %s failed\n", ACPI_DRV_NAME);
681
682         dmi_match = dmi_first_match(cros_ec_lpc_dmi_table);
683
684         if (!cros_ec_lpc_acpi_device_found && !dmi_match) {
685                 pr_err(DRV_NAME ": unsupported system.\n");
686                 return -ENODEV;
687         }
688
689         /* Register the driver */
690         ret = platform_driver_register(&cros_ec_lpc_driver);
691         if (ret) {
692                 pr_err(DRV_NAME ": can't register driver: %d\n", ret);
693                 return ret;
694         }
695
696         if (!cros_ec_lpc_acpi_device_found) {
697                 /* Pass the DMI match's driver data down to the platform device */
698                 platform_set_drvdata(&cros_ec_lpc_device, dmi_match->driver_data);
699
700                 /* Register the device, and it'll get hooked up automatically */
701                 ret = platform_device_register(&cros_ec_lpc_device);
702                 if (ret) {
703                         pr_err(DRV_NAME ": can't register device: %d\n", ret);
704                         platform_driver_unregister(&cros_ec_lpc_driver);
705                 }
706         }
707
708         return ret;
709 }
710
711 static void __exit cros_ec_lpc_exit(void)
712 {
713         if (!cros_ec_lpc_acpi_device_found)
714                 platform_device_unregister(&cros_ec_lpc_device);
715         platform_driver_unregister(&cros_ec_lpc_driver);
716 }
717
718 module_init(cros_ec_lpc_init);
719 module_exit(cros_ec_lpc_exit);
720
721 MODULE_LICENSE("GPL");
722 MODULE_DESCRIPTION("ChromeOS EC LPC driver");
This page took 0.084537 seconds and 4 git commands to generate.