@@ -487,8 +487,10 @@ static int sh_pfc_gpio_request_enable(struct udevice *dev,
idx = sh_pfc_get_pin_index(pfc, pin->pin);
cfg = &pmx->configs[idx];
- if (cfg->type != PINMUX_TYPE_NONE)
+ if (cfg->type != PINMUX_TYPE_NONE) {
+ dev_err(pfc->dev, "Pin already used\n");
return -EBUSY;
+ }
ret = sh_pfc_config_mux(pfc, pin->enum_id, PINMUX_TYPE_GPIO);
if (ret)
@@ -537,11 +539,20 @@ static int sh_pfc_pinctrl_pin_set(struct udevice *dev, unsigned pin_selector,
const struct sh_pfc_pin *pin = &priv->pfc.info->pins[pin_selector];
int idx = sh_pfc_get_pin_index(pfc, pin->pin);
struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
+ int ret;
- if (cfg->type != PINMUX_TYPE_NONE)
+ if (cfg->type != PINMUX_TYPE_NONE) {
+ dev_err(pfc->dev, "Pin already used\n");
return -EBUSY;
+ }
+
+ ret = sh_pfc_config_mux(pfc, pin->enum_id, PINMUX_TYPE_FUNCTION);
+ if (ret)
+ return ret;
- return sh_pfc_config_mux(pfc, pin->enum_id, PINMUX_TYPE_FUNCTION);
+ cfg->type = PINMUX_TYPE_FUNCTION;
+
+ return 0;
}
static int sh_pfc_pinctrl_group_set(struct udevice *dev, unsigned group_selector,
@@ -551,14 +562,17 @@ static int sh_pfc_pinctrl_group_set(struct udevice *dev, unsigned group_selector
struct sh_pfc_pinctrl *pmx = &priv->pmx;
struct sh_pfc *pfc = &priv->pfc;
const struct sh_pfc_pin_group *grp = &priv->pfc.info->groups[group_selector];
+ struct sh_pfc_pin_config *cfg;
unsigned int i;
int ret = 0;
+ int idx;
for (i = 0; i < grp->nr_pins; ++i) {
- int idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
- struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
+ idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
+ cfg = &pmx->configs[idx];
if (cfg->type != PINMUX_TYPE_NONE) {
+ dev_err(pfc->dev, "Pin already used\n");
ret = -EBUSY;
goto done;
}
@@ -568,6 +582,10 @@ static int sh_pfc_pinctrl_group_set(struct udevice *dev, unsigned group_selector
ret = sh_pfc_config_mux(pfc, grp->mux[i], PINMUX_TYPE_FUNCTION);
if (ret < 0)
break;
+
+ idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
+ cfg = &pmx->configs[idx];
+ cfg->type = PINMUX_TYPE_FUNCTION;
}
done: