Commit 9ea2647b authored by Dan Carpenter's avatar Dan Carpenter Committed by Linus Walleij
Browse files

pinctrl: scmi: Add SCMI_PIN_INPUT_VALUE



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: default avatarDan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: default avatarLinus Walleij <linusw@kernel.org>
Acked-by: default avatarSudeep Holla <sudeep.holla@kernel.org>
Signed-off-by: default avatarLinus Walleij <linusw@kernel.org>
parent 96b76f7b
Loading
Loading
Loading
Loading
+26 −7
Original line number Diff line number Diff line
@@ -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;