Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit baa1b920 authored by Kamlakant Patel's avatar Kamlakant Patel Committed by Linus Walleij
Browse files

gpio: Add ACPI support for XLP GPIO controller



Add ACPI support for GPIO controller on Broadcom Vulcan ARM64.
ACPI ID for this device is BRCM9006.

Signed-off-by: default avatarKamlakant Patel <kamlakant.patel@broadcom.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 1630a062
Loading
Loading
Loading
Loading
+29 −7
Original line number Diff line number Diff line
@@ -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;

	if (pdev->dev.of_node) {
		const struct of_device_id *of_id;

		of_id = of_match_device(xlp_gpio_of_ids, &pdev->dev);
		if (!of_id) {
		dev_err(&pdev->dev, "Failed to get soc type!\n");
			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 @@ static int xlp_gpio_probe(struct platform_device *pdev)
	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,
};