aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnrico Granata <egranata@chromium.org>2018-10-09 13:56:46 -0400
committerBenson Leung <bleung@chromium.org>2018-10-10 00:44:44 -0400
commitda1cf5a1cf124fc0a0b50c4ec78d5e97ee68bae2 (patch)
treedb6bdfa1b38fb5e9a4cb515050fd07a115d5534e
parent2c42dd6e0e3b0f5949924c8251a9d34ab373d2e0 (diff)
platform/chrome: Add a new interrupt path for cros_ec_lpc
This commit allows cros_ec_lpc to register a direct IRQ instead of relying on the ACPI notification chain to receive MKBP events. This change is done in the interest of allowing reduced jitter in the communication path between the CrOS EC and the host for receiving sensor data. Signed-off-by: Enrico Granata <egranata@chromium.org> Signed-off-by: Benson Leung <bleung@chromium.org>
-rw-r--r--drivers/platform/chrome/cros_ec_lpc.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/platform/chrome/cros_ec_lpc.c b/drivers/platform/chrome/cros_ec_lpc.c
index 7ec8789bf161..e1b75775cd4a 100644
--- a/drivers/platform/chrome/cros_ec_lpc.c
+++ b/drivers/platform/chrome/cros_ec_lpc.c
@@ -25,6 +25,7 @@
25#include <linux/dmi.h> 25#include <linux/dmi.h>
26#include <linux/delay.h> 26#include <linux/delay.h>
27#include <linux/io.h> 27#include <linux/io.h>
28#include <linux/interrupt.h>
28#include <linux/mfd/cros_ec.h> 29#include <linux/mfd/cros_ec.h>
29#include <linux/mfd/cros_ec_commands.h> 30#include <linux/mfd/cros_ec_commands.h>
30#include <linux/module.h> 31#include <linux/module.h>
@@ -249,7 +250,7 @@ static int cros_ec_lpc_probe(struct platform_device *pdev)
249 acpi_status status; 250 acpi_status status;
250 struct cros_ec_device *ec_dev; 251 struct cros_ec_device *ec_dev;
251 u8 buf[2]; 252 u8 buf[2];
252 int ret; 253 int irq, ret;
253 254
254 if (!devm_request_region(dev, EC_LPC_ADDR_MEMMAP, EC_MEMMAP_SIZE, 255 if (!devm_request_region(dev, EC_LPC_ADDR_MEMMAP, EC_MEMMAP_SIZE,
255 dev_name(dev))) { 256 dev_name(dev))) {
@@ -288,6 +289,18 @@ static int cros_ec_lpc_probe(struct platform_device *pdev)
288 sizeof(struct ec_response_get_protocol_info); 289 sizeof(struct ec_response_get_protocol_info);
289 ec_dev->dout_size = sizeof(struct ec_host_request); 290 ec_dev->dout_size = sizeof(struct ec_host_request);
290 291
292 /*
293 * Some boards do not have an IRQ allotted for cros_ec_lpc,
294 * which makes ENXIO an expected (and safe) scenario.
295 */
296 irq = platform_get_irq(pdev, 0);
297 if (irq > 0)
298 ec_dev->irq = irq;
299 else if (irq != -ENXIO) {
300 dev_err(dev, "couldn't retrieve IRQ number (%d)\n", irq);
301 return irq;
302 }
303
291 ret = cros_ec_register(ec_dev); 304 ret = cros_ec_register(ec_dev);
292 if (ret) { 305 if (ret) {
293 dev_err(dev, "couldn't register ec_dev (%d)\n", ret); 306 dev_err(dev, "couldn't register ec_dev (%d)\n", ret);