[PATCH 04/11] pinctrl: scmi: report an off setting as not set
From: Clément Le Goffic
Date: Fri Oct 30 2026 - 12:02:02 EST
A get of a setting that is on or off, the flags and the pulls, returned
0 as a value, so every one of them showed as set on every pin. Return
-EINVAL when the platform answers 0, which is how pinconf reports a
setting that is not active.
Fixes: eb524cb651b7 ("pinctrl: Implementation of the generic scmi-pinctrl driver")
Signed-off-by: Clément Le Goffic <clegoffic@xxxxxxxxxxxx>
---
drivers/pinctrl/pinctrl-scmi.c | 48 ++++++++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 7 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-scmi.c b/drivers/pinctrl/pinctrl-scmi.c
index f74ef0952ba9..355ad26cb215 100644
--- a/drivers/pinctrl/pinctrl-scmi.c
+++ b/drivers/pinctrl/pinctrl-scmi.c
@@ -153,13 +153,41 @@ static int pinctrl_scmi_map_pinconf_type(enum pin_config_param param,
return 0;
}
-static u32 pinctrl_scmi_map_pinconf_arg_get(enum pin_config_param param,
- u32 value)
+static bool pinctrl_scmi_pinconf_inactive_flag(enum pin_config_param param,
+ u32 value)
{
- if (param == PIN_CONFIG_DRIVE_STRENGTH)
- return value / MILLI;
+ if (value)
+ return false;
- return value;
+ switch (param) {
+ case PIN_CONFIG_BIAS_BUS_HOLD:
+ case PIN_CONFIG_BIAS_DISABLE:
+ case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
+ case PIN_CONFIG_BIAS_PULL_DOWN:
+ case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
+ case PIN_CONFIG_BIAS_PULL_UP:
+ case PIN_CONFIG_DRIVE_OPEN_DRAIN:
+ case PIN_CONFIG_DRIVE_OPEN_SOURCE:
+ case PIN_CONFIG_DRIVE_PUSH_PULL:
+ case PIN_CONFIG_INPUT_ENABLE:
+ case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
+ case PIN_CONFIG_OUTPUT_ENABLE:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static int pinctrl_scmi_map_pinconf_arg_get(enum pin_config_param param,
+ u32 *value)
+{
+ if (pinctrl_scmi_pinconf_inactive_flag(param, *value))
+ return -EINVAL;
+
+ if (param == PIN_CONFIG_DRIVE_STRENGTH)
+ *value /= MILLI;
+
+ return 0;
}
static int pinctrl_scmi_map_pinconf_type_get(enum pin_config_param param,
@@ -232,7 +260,10 @@ static int pinctrl_scmi_pinconf_get(struct pinctrl_dev *pctldev,
if (ret)
return ret;
- config_value = pinctrl_scmi_map_pinconf_arg_get(config_type, config_value);
+ ret = pinctrl_scmi_map_pinconf_arg_get(config_type, &config_value);
+ if (ret)
+ return ret;
+
*config = pinconf_to_config_packed(config_type, config_value);
return 0;
@@ -390,7 +421,10 @@ static int pinctrl_scmi_pinconf_group_get(struct pinctrl_dev *pctldev,
if (ret)
return ret;
- config_value = pinctrl_scmi_map_pinconf_arg_get(config_type, config_value);
+ ret = pinctrl_scmi_map_pinconf_arg_get(config_type, &config_value);
+ if (ret)
+ return ret;
+
*config = pinconf_to_config_packed(config_type, config_value);
return 0;
--
2.56.0