gpio: Add ACPI support for XLP GPIO controller
authorKamlakant Patel <kamlakant.patel@broadcom.com>
Sun, 5 Jun 2016 08:30:44 +0000 (14:00 +0530)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 8 Jun 2016 08:54:13 +0000 (10:54 +0200)
Add ACPI support for GPIO controller on Broadcom Vulcan ARM64.
ACPI ID for this device is BRCM9006.

Signed-off-by: Kamlakant Patel <kamlakant.patel@broadcom.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-xlp.c

index 6acf8aa3b02d9d70e9c2e419e3a79344a13abb60..4620d050e5a8e06db39bbe69457d6d9c9b5390d1 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/irqchip/chained_irq.h>
+#include <linux/acpi.h>
 
 /*
  * XLP GPIO has multiple 32 bit registers for each feature where each register
@@ -299,7 +300,6 @@ static int xlp_gpio_probe(struct platform_device *pdev)
        struct gpio_chip *gc;
        struct resource *iores;
        struct xlp_gpio_priv *priv;
-       const struct of_device_id *of_id;
        void __iomem *gpio_base;
        int irq_base, irq, err;
        int ngpio;
@@ -321,13 +321,26 @@ static int xlp_gpio_probe(struct platform_device *pdev)
        if (irq < 0)
                return irq;
 
-       of_id = of_match_device(xlp_gpio_of_ids, &pdev->dev);
-       if (!of_id) {
-               dev_err(&pdev->dev, "Failed to get soc type!\n");
-               return -ENODEV;
-       }
+       if (pdev->dev.of_node) {
+               const struct of_device_id *of_id;
 
-       soc_type = (uintptr_t) of_id->data;
+               of_id = of_match_device(xlp_gpio_of_ids, &pdev->dev);
+               if (!of_id) {
+                       dev_err(&pdev->dev, "Unable to match OF ID\n");
+                       return -ENODEV;
+               }
+               soc_type = (uintptr_t) of_id->data;
+       } else {
+               const struct acpi_device_id *acpi_id;
+
+               acpi_id = acpi_match_device(pdev->dev.driver->acpi_match_table,
+                                               &pdev->dev);
+               if (!acpi_id || !acpi_id->driver_data) {
+                       dev_err(&pdev->dev, "Unable to match ACPI ID\n");
+                       return -ENODEV;
+               }
+               soc_type = (uintptr_t) acpi_id->driver_data;
+       }
 
        switch (soc_type) {
        case XLP_GPIO_VARIANT_XLP832:
@@ -425,10 +438,19 @@ out_free_desc:
        return err;
 }
 
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id xlp_gpio_acpi_match[] = {
+       { "BRCM9006", GPIO_VARIANT_VULCAN },
+       {},
+};
+MODULE_DEVICE_TABLE(acpi, xlp_gpio_acpi_match);
+#endif
+
 static struct platform_driver xlp_gpio_driver = {
        .driver         = {
                .name   = "xlp-gpio",
                .of_match_table = xlp_gpio_of_ids,
+               .acpi_match_table = ACPI_PTR(xlp_gpio_acpi_match),
        },
        .probe          = xlp_gpio_probe,
 };