1 // SPDX-License-Identifier: GPL-2.0
2 // LPC interface for ChromeOS Embedded Controller
4 // Copyright (C) 2012-2015 Google, Inc
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
14 #include <linux/acpi.h>
15 #include <linux/dmi.h>
16 #include <linux/delay.h>
18 #include <linux/interrupt.h>
19 #include <linux/module.h>
20 #include <linux/platform_data/cros_ec_commands.h>
21 #include <linux/platform_data/cros_ec_proto.h>
22 #include <linux/platform_device.h>
23 #include <linux/printk.h>
24 #include <linux/suspend.h>
27 #include "cros_ec_lpc_mec.h"
29 #define DRV_NAME "cros_ec_lpcs"
30 #define ACPI_DRV_NAME "GOOG0004"
32 /* True if ACPI device is present */
33 static bool cros_ec_lpc_acpi_device_found
;
36 * struct lpc_driver_ops - LPC driver operations
37 * @read: Copy length bytes from EC address offset into buffer dest. Returns
38 * the 8-bit checksum of all bytes read.
39 * @write: Copy length bytes from buffer msg into EC address offset. Returns
40 * the 8-bit checksum of all bytes written.
42 struct lpc_driver_ops
{
43 u8 (*read
)(unsigned int offset
, unsigned int length
, u8
*dest
);
44 u8 (*write
)(unsigned int offset
, unsigned int length
, const u8
*msg
);
47 static struct lpc_driver_ops cros_ec_lpc_ops
= { };
50 * A generic instance of the read function of struct lpc_driver_ops, used for
53 static u8
cros_ec_lpc_read_bytes(unsigned int offset
, unsigned int length
,
59 for (i
= 0; i
< length
; ++i
) {
60 dest
[i
] = inb(offset
+ i
);
64 /* Return checksum of all bytes read */
69 * A generic instance of the write function of struct lpc_driver_ops, used for
72 static u8
cros_ec_lpc_write_bytes(unsigned int offset
, unsigned int length
,
78 for (i
= 0; i
< length
; ++i
) {
79 outb(msg
[i
], offset
+ i
);
83 /* Return checksum of all bytes written */
88 * An instance of the read function of struct lpc_driver_ops, used for the
89 * MEC variant of LPC EC.
91 static u8
cros_ec_lpc_mec_read_bytes(unsigned int offset
, unsigned int length
,
94 int in_range
= cros_ec_lpc_mec_in_range(offset
, length
);
100 cros_ec_lpc_io_bytes_mec(MEC_IO_READ
,
101 offset
- EC_HOST_CMD_REGION0
,
103 cros_ec_lpc_read_bytes(offset
, length
, dest
);
107 * An instance of the write function of struct lpc_driver_ops, used for the
108 * MEC variant of LPC EC.
110 static u8
cros_ec_lpc_mec_write_bytes(unsigned int offset
, unsigned int length
,
113 int in_range
= cros_ec_lpc_mec_in_range(offset
, length
);
119 cros_ec_lpc_io_bytes_mec(MEC_IO_WRITE
,
120 offset
- EC_HOST_CMD_REGION0
,
122 cros_ec_lpc_write_bytes(offset
, length
, msg
);
125 static int ec_response_timed_out(void)
127 unsigned long one_second
= jiffies
+ HZ
;
130 usleep_range(200, 300);
132 if (!(cros_ec_lpc_ops
.read(EC_LPC_ADDR_HOST_CMD
, 1, &data
) &
133 EC_LPC_STATUS_BUSY_MASK
))
135 usleep_range(100, 200);
136 } while (time_before(jiffies
, one_second
));
141 static int cros_ec_pkt_xfer_lpc(struct cros_ec_device
*ec
,
142 struct cros_ec_command
*msg
)
144 struct ec_host_response response
;
149 ret
= cros_ec_prepare_tx(ec
, msg
);
152 cros_ec_lpc_ops
.write(EC_LPC_ADDR_HOST_PACKET
, ret
, ec
->dout
);
155 sum
= EC_COMMAND_PROTOCOL_3
;
156 cros_ec_lpc_ops
.write(EC_LPC_ADDR_HOST_CMD
, 1, &sum
);
158 if (ec_response_timed_out()) {
159 dev_warn(ec
->dev
, "EC responsed timed out\n");
165 msg
->result
= cros_ec_lpc_ops
.read(EC_LPC_ADDR_HOST_DATA
, 1, &sum
);
166 ret
= cros_ec_check_result(ec
, msg
);
170 /* Read back response */
171 dout
= (u8
*)&response
;
172 sum
= cros_ec_lpc_ops
.read(EC_LPC_ADDR_HOST_PACKET
, sizeof(response
),
175 msg
->result
= response
.result
;
177 if (response
.data_len
> msg
->insize
) {
179 "packet too long (%d bytes, expected %d)",
180 response
.data_len
, msg
->insize
);
185 /* Read response and process checksum */
186 sum
+= cros_ec_lpc_ops
.read(EC_LPC_ADDR_HOST_PACKET
+
187 sizeof(response
), response
.data_len
,
192 "bad packet checksum %02x\n",
198 /* Return actual amount of data received */
199 ret
= response
.data_len
;
204 static int cros_ec_cmd_xfer_lpc(struct cros_ec_device
*ec
,
205 struct cros_ec_command
*msg
)
207 struct ec_lpc_host_args args
;
211 if (msg
->outsize
> EC_PROTO2_MAX_PARAM_SIZE
||
212 msg
->insize
> EC_PROTO2_MAX_PARAM_SIZE
) {
214 "invalid buffer sizes (out %d, in %d)\n",
215 msg
->outsize
, msg
->insize
);
219 /* Now actually send the command to the EC and get the result */
220 args
.flags
= EC_HOST_ARGS_FLAG_FROM_HOST
;
221 args
.command_version
= msg
->version
;
222 args
.data_size
= msg
->outsize
;
224 /* Initialize checksum */
225 sum
= msg
->command
+ args
.flags
+ args
.command_version
+ args
.data_size
;
227 /* Copy data and update checksum */
228 sum
+= cros_ec_lpc_ops
.write(EC_LPC_ADDR_HOST_PARAM
, msg
->outsize
,
231 /* Finalize checksum and write args */
233 cros_ec_lpc_ops
.write(EC_LPC_ADDR_HOST_ARGS
, sizeof(args
),
238 cros_ec_lpc_ops
.write(EC_LPC_ADDR_HOST_CMD
, 1, &sum
);
240 if (ec_response_timed_out()) {
241 dev_warn(ec
->dev
, "EC responsed timed out\n");
247 msg
->result
= cros_ec_lpc_ops
.read(EC_LPC_ADDR_HOST_DATA
, 1, &sum
);
248 ret
= cros_ec_check_result(ec
, msg
);
253 cros_ec_lpc_ops
.read(EC_LPC_ADDR_HOST_ARGS
, sizeof(args
), (u8
*)&args
);
255 if (args
.data_size
> msg
->insize
) {
257 "packet too long (%d bytes, expected %d)",
258 args
.data_size
, msg
->insize
);
263 /* Start calculating response checksum */
264 sum
= msg
->command
+ args
.flags
+ args
.command_version
+ args
.data_size
;
266 /* Read response and update checksum */
267 sum
+= cros_ec_lpc_ops
.read(EC_LPC_ADDR_HOST_PARAM
, args
.data_size
,
270 /* Verify checksum */
271 if (args
.checksum
!= sum
) {
273 "bad packet checksum, expected %02x, got %02x\n",
279 /* Return actual amount of data received */
280 ret
= args
.data_size
;
285 /* Returns num bytes read, or negative on error. Doesn't need locking. */
286 static int cros_ec_lpc_readmem(struct cros_ec_device
*ec
, unsigned int offset
,
287 unsigned int bytes
, void *dest
)
293 if (offset
>= EC_MEMMAP_SIZE
- bytes
)
298 cros_ec_lpc_ops
.read(EC_LPC_ADDR_MEMMAP
+ offset
, bytes
, s
);
303 for (; i
< EC_MEMMAP_SIZE
; i
++, s
++) {
304 cros_ec_lpc_ops
.read(EC_LPC_ADDR_MEMMAP
+ i
, 1, s
);
313 static void cros_ec_lpc_acpi_notify(acpi_handle device
, u32 value
, void *data
)
315 struct cros_ec_device
*ec_dev
= data
;
316 bool ec_has_more_events
;
319 ec_dev
->last_event_time
= cros_ec_get_time_ns();
321 if (ec_dev
->mkbp_event_supported
)
323 ret
= cros_ec_get_next_event(ec_dev
, NULL
,
324 &ec_has_more_events
);
326 blocking_notifier_call_chain(
327 &ec_dev
->event_notifier
, 0,
329 } while (ec_has_more_events
);
331 if (value
== ACPI_NOTIFY_DEVICE_WAKE
)
335 static int cros_ec_lpc_probe(struct platform_device
*pdev
)
337 struct device
*dev
= &pdev
->dev
;
338 struct acpi_device
*adev
;
340 struct cros_ec_device
*ec_dev
;
344 if (!devm_request_region(dev
, EC_LPC_ADDR_MEMMAP
, EC_MEMMAP_SIZE
,
346 dev_err(dev
, "couldn't reserve memmap region\n");
351 * Read the mapped ID twice, the first one is assuming the
352 * EC is a Microchip Embedded Controller (MEC) variant, if the
353 * protocol fails, fallback to the non MEC variant and try to
356 cros_ec_lpc_ops
.read
= cros_ec_lpc_mec_read_bytes
;
357 cros_ec_lpc_ops
.write
= cros_ec_lpc_mec_write_bytes
;
358 cros_ec_lpc_ops
.read(EC_LPC_ADDR_MEMMAP
+ EC_MEMMAP_ID
, 2, buf
);
359 if (buf
[0] != 'E' || buf
[1] != 'C') {
360 /* Re-assign read/write operations for the non MEC variant */
361 cros_ec_lpc_ops
.read
= cros_ec_lpc_read_bytes
;
362 cros_ec_lpc_ops
.write
= cros_ec_lpc_write_bytes
;
363 cros_ec_lpc_ops
.read(EC_LPC_ADDR_MEMMAP
+ EC_MEMMAP_ID
, 2,
365 if (buf
[0] != 'E' || buf
[1] != 'C') {
366 dev_err(dev
, "EC ID not detected\n");
371 if (!devm_request_region(dev
, EC_HOST_CMD_REGION0
,
372 EC_HOST_CMD_REGION_SIZE
, dev_name(dev
))) {
373 dev_err(dev
, "couldn't reserve region0\n");
376 if (!devm_request_region(dev
, EC_HOST_CMD_REGION1
,
377 EC_HOST_CMD_REGION_SIZE
, dev_name(dev
))) {
378 dev_err(dev
, "couldn't reserve region1\n");
382 ec_dev
= devm_kzalloc(dev
, sizeof(*ec_dev
), GFP_KERNEL
);
386 platform_set_drvdata(pdev
, ec_dev
);
388 ec_dev
->phys_name
= dev_name(dev
);
389 ec_dev
->cmd_xfer
= cros_ec_cmd_xfer_lpc
;
390 ec_dev
->pkt_xfer
= cros_ec_pkt_xfer_lpc
;
391 ec_dev
->cmd_readmem
= cros_ec_lpc_readmem
;
392 ec_dev
->din_size
= sizeof(struct ec_host_response
) +
393 sizeof(struct ec_response_get_protocol_info
);
394 ec_dev
->dout_size
= sizeof(struct ec_host_request
);
397 * Some boards do not have an IRQ allotted for cros_ec_lpc,
398 * which makes ENXIO an expected (and safe) scenario.
400 irq
= platform_get_irq_optional(pdev
, 0);
403 else if (irq
!= -ENXIO
) {
404 dev_err(dev
, "couldn't retrieve IRQ number (%d)\n", irq
);
408 ret
= cros_ec_register(ec_dev
);
410 dev_err(dev
, "couldn't register ec_dev (%d)\n", ret
);
415 * Connect a notify handler to process MKBP messages if we have a
416 * companion ACPI device.
418 adev
= ACPI_COMPANION(dev
);
420 status
= acpi_install_notify_handler(adev
->handle
,
422 cros_ec_lpc_acpi_notify
,
424 if (ACPI_FAILURE(status
))
425 dev_warn(dev
, "Failed to register notifier %08x\n",
432 static int cros_ec_lpc_remove(struct platform_device
*pdev
)
434 struct cros_ec_device
*ec_dev
= platform_get_drvdata(pdev
);
435 struct acpi_device
*adev
;
437 adev
= ACPI_COMPANION(&pdev
->dev
);
439 acpi_remove_notify_handler(adev
->handle
, ACPI_ALL_NOTIFY
,
440 cros_ec_lpc_acpi_notify
);
442 return cros_ec_unregister(ec_dev
);
445 static const struct acpi_device_id cros_ec_lpc_acpi_device_ids
[] = {
446 { ACPI_DRV_NAME
, 0 },
449 MODULE_DEVICE_TABLE(acpi
, cros_ec_lpc_acpi_device_ids
);
451 static const struct dmi_system_id cros_ec_lpc_dmi_table
[] __initconst
= {
454 * Today all Chromebooks/boxes ship with Google_* as version and
455 * coreboot as bios vendor. No other systems with this
456 * combination are known to date.
459 DMI_MATCH(DMI_BIOS_VENDOR
, "coreboot"),
460 DMI_MATCH(DMI_BIOS_VERSION
, "Google_"),
465 * If the box is running custom coreboot firmware then the
466 * DMI BIOS version string will not be matched by "Google_",
467 * but the system vendor string will still be matched by
471 DMI_MATCH(DMI_BIOS_VENDOR
, "coreboot"),
472 DMI_MATCH(DMI_SYS_VENDOR
, "GOOGLE"),
476 /* x86-link, the Chromebook Pixel. */
478 DMI_MATCH(DMI_SYS_VENDOR
, "GOOGLE"),
479 DMI_MATCH(DMI_PRODUCT_NAME
, "Link"),
483 /* x86-samus, the Chromebook Pixel 2. */
485 DMI_MATCH(DMI_SYS_VENDOR
, "GOOGLE"),
486 DMI_MATCH(DMI_PRODUCT_NAME
, "Samus"),
490 /* x86-peppy, the Acer C720 Chromebook. */
492 DMI_MATCH(DMI_SYS_VENDOR
, "Acer"),
493 DMI_MATCH(DMI_PRODUCT_NAME
, "Peppy"),
497 /* x86-glimmer, the Lenovo Thinkpad Yoga 11e. */
499 DMI_MATCH(DMI_SYS_VENDOR
, "GOOGLE"),
500 DMI_MATCH(DMI_PRODUCT_NAME
, "Glimmer"),
505 MODULE_DEVICE_TABLE(dmi
, cros_ec_lpc_dmi_table
);
507 #ifdef CONFIG_PM_SLEEP
508 static int cros_ec_lpc_suspend(struct device
*dev
)
510 struct cros_ec_device
*ec_dev
= dev_get_drvdata(dev
);
512 return cros_ec_suspend(ec_dev
);
515 static int cros_ec_lpc_resume(struct device
*dev
)
517 struct cros_ec_device
*ec_dev
= dev_get_drvdata(dev
);
519 return cros_ec_resume(ec_dev
);
523 static const struct dev_pm_ops cros_ec_lpc_pm_ops
= {
524 SET_LATE_SYSTEM_SLEEP_PM_OPS(cros_ec_lpc_suspend
, cros_ec_lpc_resume
)
527 static struct platform_driver cros_ec_lpc_driver
= {
530 .acpi_match_table
= cros_ec_lpc_acpi_device_ids
,
531 .pm
= &cros_ec_lpc_pm_ops
,
533 .probe
= cros_ec_lpc_probe
,
534 .remove
= cros_ec_lpc_remove
,
537 static struct platform_device cros_ec_lpc_device
= {
541 static acpi_status
cros_ec_lpc_parse_device(acpi_handle handle
, u32 level
,
542 void *context
, void **retval
)
544 *(bool *)context
= true;
545 return AE_CTRL_TERMINATE
;
548 static int __init
cros_ec_lpc_init(void)
553 status
= acpi_get_devices(ACPI_DRV_NAME
, cros_ec_lpc_parse_device
,
554 &cros_ec_lpc_acpi_device_found
, NULL
);
555 if (ACPI_FAILURE(status
))
556 pr_warn(DRV_NAME
": Looking for %s failed\n", ACPI_DRV_NAME
);
558 if (!cros_ec_lpc_acpi_device_found
&&
559 !dmi_check_system(cros_ec_lpc_dmi_table
)) {
560 pr_err(DRV_NAME
": unsupported system.\n");
564 cros_ec_lpc_mec_init(EC_HOST_CMD_REGION0
,
565 EC_LPC_ADDR_MEMMAP
+ EC_MEMMAP_SIZE
);
567 /* Register the driver */
568 ret
= platform_driver_register(&cros_ec_lpc_driver
);
570 pr_err(DRV_NAME
": can't register driver: %d\n", ret
);
571 cros_ec_lpc_mec_destroy();
575 if (!cros_ec_lpc_acpi_device_found
) {
576 /* Register the device, and it'll get hooked up automatically */
577 ret
= platform_device_register(&cros_ec_lpc_device
);
579 pr_err(DRV_NAME
": can't register device: %d\n", ret
);
580 platform_driver_unregister(&cros_ec_lpc_driver
);
581 cros_ec_lpc_mec_destroy();
588 static void __exit
cros_ec_lpc_exit(void)
590 if (!cros_ec_lpc_acpi_device_found
)
591 platform_device_unregister(&cros_ec_lpc_device
);
592 platform_driver_unregister(&cros_ec_lpc_driver
);
593 cros_ec_lpc_mec_destroy();
596 module_init(cros_ec_lpc_init
);
597 module_exit(cros_ec_lpc_exit
);
599 MODULE_LICENSE("GPL");
600 MODULE_DESCRIPTION("ChromeOS EC LPC driver");