[PATCH v3 2/3] pinctrl: qcom: add support for complementary reserved gpios
From: Richard Acayan
Date: Mon Sep 19 2022 - 22:16:59 EST
The driver-provided list of reserved gpios normally overrides any valid
ranges provided by the firmware (device tree and ACPI). When the driver
defines dummy pingroups by itself, it should mark these as invalid but
should not prevent the firmware from specifying more reserved gpios. Let
pinctrl drivers indicate that the reserved gpios list complements instead
of overrides other lists from firmware.
Signed-off-by: Richard Acayan <mailingradian@xxxxxxxxx>
---
drivers/pinctrl/qcom/pinctrl-msm.c | 3 ++-
drivers/pinctrl/qcom/pinctrl-msm.h | 4 ++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c
index a2abfe987ab1..7bd50df3930e 100644
--- a/drivers/pinctrl/qcom/pinctrl-msm.c
+++ b/drivers/pinctrl/qcom/pinctrl-msm.c
@@ -689,7 +689,8 @@ static int msm_gpio_init_valid_mask(struct gpio_chip *gc,
/* Driver provided reserved list overrides DT and ACPI */
if (reserved) {
- bitmap_fill(valid_mask, ngpios);
+ if (!pctrl->soc->complement_fw_reserved_gpios)
+ bitmap_fill(valid_mask, ngpios);
for (i = 0; reserved[i] >= 0; i++) {
if (i >= ngpios || reserved[i] >= ngpios) {
dev_err(pctrl->dev, "invalid list of reserved GPIOs\n");
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.h b/drivers/pinctrl/qcom/pinctrl-msm.h
index dd0d949f7a9e..c13a02b0005c 100644
--- a/drivers/pinctrl/qcom/pinctrl-msm.h
+++ b/drivers/pinctrl/qcom/pinctrl-msm.h
@@ -128,6 +128,9 @@ struct msm_gpio_wakeirq_map {
* function number for eGPIO and any time we see that function
* number used we'll treat it as a request to mux away from
* our TLMM towards another owner.
+ * @complement_fw_reserved_gpios: If true, the reserved gpios list from the
+ * driver will not override the reserved gpios
+ * list from the firmware.
*/
struct msm_pinctrl_soc_data {
const struct pinctrl_pin_desc *pins;
@@ -146,6 +149,7 @@ struct msm_pinctrl_soc_data {
bool wakeirq_dual_edge_errata;
unsigned int gpio_func;
unsigned int egpio_func;
+ bool complement_fw_reserved_gpios;
};
extern const struct dev_pm_ops msm_pinctrl_dev_pm_ops;
--
2.37.3