]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pinctrl: scmi: Add SCMI_PIN_INPUT_VALUE
authorDan Carpenter <dan.carpenter@linaro.org>
Mon, 23 Mar 2026 19:01:15 +0000 (22:01 +0300)
committerLinus Walleij <linusw@kernel.org>
Tue, 24 Mar 2026 12:50:30 +0000 (13:50 +0100)
The PIN_CONFIG_LEVEL parameter represents the value of the pin, whether
reading or writing to the pin.  In SCMI, the parameter is represented by
two different values SCMI_PIN_OUTPUT_VALUE for writing to a pin and
SCMI_PIN_INPUT_VALUE for reading.  The current code translates
PIN_CONFIG_LEVEL as SCMI_PIN_OUTPUT_VALUE (writing).

Add a function to translate it to either INPUT or OUTPUT depending on
whether it is called from a _get or _set() operation.

Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Acked-by: Sudeep Holla <sudeep.holla@kernel.org>
Signed-off-by: Linus Walleij <linusw@kernel.org>
drivers/pinctrl/pinctrl-scmi.c

index f4f296e07be57f241845c1df9682cfd4a0aa3c4c..5d347e6b2e4c10805efbb7ed0dfe99a05fa40f2e 100644 (file)
@@ -251,9 +251,6 @@ static int pinctrl_scmi_map_pinconf_type(enum pin_config_param param,
        case PIN_CONFIG_MODE_LOW_POWER:
                *type = SCMI_PIN_LOW_POWER_MODE;
                break;
-       case PIN_CONFIG_LEVEL:
-               *type = SCMI_PIN_OUTPUT_VALUE;
-               break;
        case PIN_CONFIG_OUTPUT_ENABLE:
                *type = SCMI_PIN_OUTPUT_MODE;
                break;
@@ -276,6 +273,28 @@ static int pinctrl_scmi_map_pinconf_type(enum pin_config_param param,
        return 0;
 }
 
+static int pinctrl_scmi_map_pinconf_type_get(enum pin_config_param param,
+                                            enum scmi_pinctrl_conf_type *type)
+{
+       if (param == PIN_CONFIG_LEVEL) {
+               *type = SCMI_PIN_INPUT_VALUE;
+               return 0;
+       }
+
+       return pinctrl_scmi_map_pinconf_type(param, type);
+}
+
+static int pinctrl_scmi_map_pinconf_type_set(enum pin_config_param param,
+                                            enum scmi_pinctrl_conf_type *type)
+{
+       if (param == PIN_CONFIG_LEVEL) {
+               *type = SCMI_PIN_OUTPUT_VALUE;
+               return 0;
+       }
+
+       return pinctrl_scmi_map_pinconf_type(param, type);
+}
+
 static int pinctrl_scmi_pinconf_get(struct pinctrl_dev *pctldev,
                                    unsigned int pin, unsigned long *config)
 {
@@ -290,7 +309,7 @@ static int pinctrl_scmi_pinconf_get(struct pinctrl_dev *pctldev,
 
        config_type = pinconf_to_config_param(*config);
 
-       ret = pinctrl_scmi_map_pinconf_type(config_type, &type);
+       ret = pinctrl_scmi_map_pinconf_type_get(config_type, &type);
        if (ret)
                return ret;
 
@@ -363,7 +382,7 @@ static int pinctrl_scmi_pinconf_set(struct pinctrl_dev *pctldev,
 
        for (i = 0; i < num_configs; i++) {
                param = pinconf_to_config_param(configs[i]);
-               ret = pinctrl_scmi_map_pinconf_type(param, &p_config_type[i]);
+               ret = pinctrl_scmi_map_pinconf_type_set(param, &p_config_type[i]);
                if (ret) {
                        dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
                        goto free_config;
@@ -405,7 +424,7 @@ static int pinctrl_scmi_pinconf_group_set(struct pinctrl_dev *pctldev,
 
        for (i = 0; i < num_configs; i++) {
                param = pinconf_to_config_param(configs[i]);
-               ret = pinctrl_scmi_map_pinconf_type(param, &p_config_type[i]);
+               ret = pinctrl_scmi_map_pinconf_type_set(param, &p_config_type[i]);
                if (ret) {
                        dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
                        goto free_config;
@@ -440,7 +459,7 @@ static int pinctrl_scmi_pinconf_group_get(struct pinctrl_dev *pctldev,
                return -EINVAL;
 
        config_type = pinconf_to_config_param(*config);
-       ret = pinctrl_scmi_map_pinconf_type(config_type, &type);
+       ret = pinctrl_scmi_map_pinconf_type_get(config_type, &type);
        if (ret) {
                dev_err(pmx->dev, "Error map pinconf_type %d\n", ret);
                return ret;