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

Commit 33e1ad60 authored by Martin Schiller's avatar Martin Schiller Committed by Greg Kroah-Hartman
Browse files

pinctrl: xway: fix gpio-hog related boot issues



[ Upstream commit 9b4924da4711674e62d97d4f5360446cc78337af ]

This patch is based on commit a86caa9ba5d7 ("pinctrl: msm: fix gpio-hog
related boot issues").

It fixes the issue that the gpio ranges needs to be defined before
gpiochip_add().

Therefore, we also have to swap the order of registering the pinctrl
driver and registering the gpio chip.

You also have to add the "gpio-ranges" property to the pinctrl device
node to get it finally working.

Signed-off-by: default avatarMartin Schiller <ms@dev.tdt.de>
Acked-by: default avatarJohn Crispin <john@phrozen.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent db9bab54
Loading
Loading
Loading
Loading
+27 −12
Original line number Diff line number Diff line
@@ -1748,14 +1748,6 @@ static int pinmux_xway_probe(struct platform_device *pdev)
	}
	xway_pctrl_desc.pins = xway_info.pads;

	/* register the gpio chip */
	xway_chip.parent = &pdev->dev;
	ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL);
	if (ret) {
		dev_err(&pdev->dev, "Failed to register gpio chip\n");
		return ret;
	}

	/* setup the data needed by pinctrl */
	xway_pctrl_desc.name	= dev_name(&pdev->dev);
	xway_pctrl_desc.npins	= xway_chip.ngpio;
@@ -1777,10 +1769,33 @@ static int pinmux_xway_probe(struct platform_device *pdev)
		return ret;
	}

	/* register the gpio chip */
	xway_chip.parent = &pdev->dev;
	xway_chip.owner = THIS_MODULE;
	xway_chip.of_node = pdev->dev.of_node;
	ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL);
	if (ret) {
		dev_err(&pdev->dev, "Failed to register gpio chip\n");
		return ret;
	}

	/*
	 * For DeviceTree-supported systems, the gpio core checks the
	 * pinctrl's device node for the "gpio-ranges" property.
	 * If it is present, it takes care of adding the pin ranges
	 * for the driver. In this case the driver can skip ahead.
	 *
	 * In order to remain compatible with older, existing DeviceTree
	 * files which don't set the "gpio-ranges" property or systems that
	 * utilize ACPI the driver has to call gpiochip_add_pin_range().
	 */
	if (!of_property_read_bool(pdev->dev.of_node, "gpio-ranges")) {
		/* finish with registering the gpio range in pinctrl */
		xway_gpio_range.npins = xway_chip.ngpio;
		xway_gpio_range.base = xway_chip.base;
		pinctrl_add_gpio_range(xway_info.pctrl, &xway_gpio_range);
	}

	dev_info(&pdev->dev, "Init done\n");
	return 0;
}