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

Commit 35c5d7fd authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Linus Walleij
Browse files

gpiolib: use platform GPIO mappings as fallback



For platforms that use device tree or ACPI as the standard way to look
GPIOs up, allow the platform-defined GPIO mappings to be used as a
fallback. This may be useful for platforms that need extra GPIOs mappings
not defined by the firmware.

Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 56a39aac
Loading
Loading
Loading
Loading
+13 −3
Original line number Original line Diff line number Diff line
@@ -2418,7 +2418,7 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
					       const char *con_id,
					       const char *con_id,
					       unsigned int idx)
					       unsigned int idx)
{
{
	struct gpio_desc *desc;
	struct gpio_desc *desc = NULL;
	int status;
	int status;
	enum gpio_lookup_flags flags = 0;
	enum gpio_lookup_flags flags = 0;


@@ -2431,9 +2431,19 @@ struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
	} else if (IS_ENABLED(CONFIG_ACPI) && dev && ACPI_HANDLE(dev)) {
	} else if (IS_ENABLED(CONFIG_ACPI) && dev && ACPI_HANDLE(dev)) {
		dev_dbg(dev, "using ACPI for GPIO lookup\n");
		dev_dbg(dev, "using ACPI for GPIO lookup\n");
		desc = acpi_find_gpio(dev, con_id, idx, &flags);
		desc = acpi_find_gpio(dev, con_id, idx, &flags);
	} else {
	}

	/*
	 * Either we are not using DT or ACPI, or their lookup did not return
	 * a result. In that case, use platform lookup as a fallback.
	 */
	if (!desc || IS_ERR(desc)) {
		struct gpio_desc *pdesc;
		dev_dbg(dev, "using lookup tables for GPIO lookup");
		dev_dbg(dev, "using lookup tables for GPIO lookup");
		desc = gpiod_find(dev, con_id, idx, &flags);
		pdesc = gpiod_find(dev, con_id, idx, &flags);
		/* If used as fallback, do not replace the previous error */
		if (!IS_ERR(pdesc) || !desc)
			desc = pdesc;
	}
	}


	if (IS_ERR(desc)) {
	if (IS_ERR(desc)) {