Merge tag 'platform-drivers-x86-v4.20-1' of git://git.infradead.org/linux-platform...
[sfrench/cifs-2.6.git] / drivers / platform / chrome / cros_ec_lpc.c
index 31c8b8c49e458f5be62b9aec0dbedd436785f84c..e1b75775cd4a12867b1b3b4566140605564c7085 100644 (file)
 #include <linux/dmi.h>
 #include <linux/delay.h>
 #include <linux/io.h>
+#include <linux/interrupt.h>
 #include <linux/mfd/cros_ec.h>
 #include <linux/mfd/cros_ec_commands.h>
-#include <linux/mfd/cros_ec_lpc_reg.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/printk.h>
 #include <linux/suspend.h>
 
+#include "cros_ec_lpc_reg.h"
+
 #define DRV_NAME "cros_ec_lpcs"
 #define ACPI_DRV_NAME "GOOG0004"
 
@@ -248,7 +250,7 @@ static int cros_ec_lpc_probe(struct platform_device *pdev)
        acpi_status status;
        struct cros_ec_device *ec_dev;
        u8 buf[2];
-       int ret;
+       int irq, ret;
 
        if (!devm_request_region(dev, EC_LPC_ADDR_MEMMAP, EC_MEMMAP_SIZE,
                                 dev_name(dev))) {
@@ -287,6 +289,18 @@ static int cros_ec_lpc_probe(struct platform_device *pdev)
                           sizeof(struct ec_response_get_protocol_info);
        ec_dev->dout_size = sizeof(struct ec_host_request);
 
+       /*
+        * Some boards do not have an IRQ allotted for cros_ec_lpc,
+        * which makes ENXIO an expected (and safe) scenario.
+        */
+       irq = platform_get_irq(pdev, 0);
+       if (irq > 0)
+               ec_dev->irq = irq;
+       else if (irq != -ENXIO) {
+               dev_err(dev, "couldn't retrieve IRQ number (%d)\n", irq);
+               return irq;
+       }
+
        ret = cros_ec_register(ec_dev);
        if (ret) {
                dev_err(dev, "couldn't register ec_dev (%d)\n", ret);