Skip to content

Commit

Permalink
pinctrl: qcom: sdm845: Provide ACPI support
Browse files Browse the repository at this point in the history
This patch provides basic support for booting with ACPI instead
of the currently supported Device Tree.  When doing so there are a
couple of differences which we need to taken into consideration.

Firstly, the SDM850 ACPI tables omit information pertaining to the
4 reserved GPIOs on the platform.  If Linux attempts to touch/
initialise any of these lines, the firmware will restart the
platform.

Secondly, when booting with ACPI, it is expected that the firmware
will set-up things like; Regulators, Clocks, Pin Functions, etc in
their ideal configuration.  Thus, the possible Pin Functions
available to this platform are not advertised when providing the
higher GPIOD/Pinctrl APIs with pin information.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Lee Jones authored and Linus Walleij committed Jun 12, 2019
1 parent 4c0efbf commit a229105
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
2 changes: 1 addition & 1 deletion drivers/pinctrl/qcom/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ config PINCTRL_SDM660

config PINCTRL_SDM845
tristate "Qualcomm Technologies Inc SDM845 pin controller driver"
depends on GPIOLIB && OF
depends on GPIOLIB && (OF || ACPI)
select PINCTRL_MSM
help
This is the pinctrl, pinmux, pinconf and gpiolib driver for the
Expand Down
36 changes: 35 additions & 1 deletion drivers/pinctrl/qcom/pinctrl-sdm845.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
*/

#include <linux/acpi.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
Expand Down Expand Up @@ -1277,6 +1278,10 @@ static const struct msm_pingroup sdm845_groups[] = {
UFS_RESET(ufs_reset, 0x99f000),
};

static const int sdm845_acpi_reserved_gpios[] = {
0, 1, 2, 3, 81, 82, 83, 84, -1
};

static const struct msm_pinctrl_soc_data sdm845_pinctrl = {
.pins = sdm845_pins,
.npins = ARRAY_SIZE(sdm845_pins),
Expand All @@ -1287,11 +1292,39 @@ static const struct msm_pinctrl_soc_data sdm845_pinctrl = {
.ngpios = 150,
};

static const struct msm_pinctrl_soc_data sdm845_acpi_pinctrl = {
.pins = sdm845_pins,
.npins = ARRAY_SIZE(sdm845_pins),
.groups = sdm845_groups,
.ngroups = ARRAY_SIZE(sdm845_groups),
.reserved_gpios = sdm845_acpi_reserved_gpios,
.ngpios = 150,
};

static int sdm845_pinctrl_probe(struct platform_device *pdev)
{
return msm_pinctrl_probe(pdev, &sdm845_pinctrl);
int ret;

if (pdev->dev.of_node) {
ret = msm_pinctrl_probe(pdev, &sdm845_pinctrl);
} else if (has_acpi_companion(&pdev->dev)) {
ret = msm_pinctrl_probe(pdev, &sdm845_acpi_pinctrl);
} else {
dev_err(&pdev->dev, "DT and ACPI disabled\n");
return -EINVAL;
}

return ret;
}

#if CONFIG_ACPI
static const struct acpi_device_id sdm845_pinctrl_acpi_match[] = {
{ "QCOM0217"},
{ },
};
MODULE_DEVICE_TABLE(acpi, sdm845_pinctrl_acpi_match);
#endif

static const struct of_device_id sdm845_pinctrl_of_match[] = {
{ .compatible = "qcom,sdm845-pinctrl", },
{ },
Expand All @@ -1302,6 +1335,7 @@ static struct platform_driver sdm845_pinctrl_driver = {
.name = "sdm845-pinctrl",
.pm = &msm_pinctrl_dev_pm_ops,
.of_match_table = sdm845_pinctrl_of_match,
.acpi_match_table = ACPI_PTR(sdm845_pinctrl_acpi_match),
},
.probe = sdm845_pinctrl_probe,
.remove = msm_pinctrl_remove,
Expand Down

0 comments on commit a229105

Please sign in to comment.