|
@@ -552,9 +552,8 @@ static int uniphier_pmx_set_one_mux(struct pinctrl_dev *pctldev, unsigned pin,
|
|
unsigned muxval)
|
|
unsigned muxval)
|
|
{
|
|
{
|
|
struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
|
|
struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
|
|
- unsigned mux_bits = priv->socdata->mux_bits;
|
|
|
|
- unsigned reg_stride = priv->socdata->reg_stride;
|
|
|
|
- unsigned reg, reg_end, shift, mask;
|
|
|
|
|
|
+ unsigned int mux_bits, reg_stride, reg, reg_end, shift, mask;
|
|
|
|
+ bool load_pinctrl;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
/* some pins need input-enabling */
|
|
/* some pins need input-enabling */
|
|
@@ -563,6 +562,26 @@ static int uniphier_pmx_set_one_mux(struct pinctrl_dev *pctldev, unsigned pin,
|
|
if (ret)
|
|
if (ret)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
|
|
+ if (priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE) {
|
|
|
|
+ /*
|
|
|
|
+ * Mode reg_offset bit_position
|
|
|
|
+ * Normal 4 * n shift+3:shift
|
|
|
|
+ * Debug 4 * n shift+7:shift+4
|
|
|
|
+ */
|
|
|
|
+ mux_bits = 4;
|
|
|
|
+ reg_stride = 8;
|
|
|
|
+ load_pinctrl = true;
|
|
|
|
+ } else {
|
|
|
|
+ /*
|
|
|
|
+ * Mode reg_offset bit_position
|
|
|
|
+ * Normal 8 * n shift+3:shift
|
|
|
|
+ * Debug 8 * n + 4 shift+3:shift
|
|
|
|
+ */
|
|
|
|
+ mux_bits = 8;
|
|
|
|
+ reg_stride = 4;
|
|
|
|
+ load_pinctrl = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
reg = UNIPHIER_PINCTRL_PINMUX_BASE + pin * mux_bits / 32 * reg_stride;
|
|
reg = UNIPHIER_PINCTRL_PINMUX_BASE + pin * mux_bits / 32 * reg_stride;
|
|
reg_end = reg + reg_stride;
|
|
reg_end = reg + reg_stride;
|
|
shift = pin * mux_bits % 32;
|
|
shift = pin * mux_bits % 32;
|
|
@@ -580,7 +599,7 @@ static int uniphier_pmx_set_one_mux(struct pinctrl_dev *pctldev, unsigned pin,
|
|
muxval >>= mux_bits;
|
|
muxval >>= mux_bits;
|
|
}
|
|
}
|
|
|
|
|
|
- if (priv->socdata->load_pinctrl) {
|
|
|
|
|
|
+ if (load_pinctrl) {
|
|
ret = regmap_write(priv->regmap,
|
|
ret = regmap_write(priv->regmap,
|
|
UNIPHIER_PINCTRL_LOAD_PINMUX, 1);
|
|
UNIPHIER_PINCTRL_LOAD_PINMUX, 1);
|
|
if (ret)
|
|
if (ret)
|
|
@@ -658,12 +677,8 @@ int uniphier_pinctrl_probe(struct platform_device *pdev,
|
|
|
|
|
|
if (!socdata ||
|
|
if (!socdata ||
|
|
!socdata->pins || !socdata->npins ||
|
|
!socdata->pins || !socdata->npins ||
|
|
- !socdata->groups ||
|
|
|
|
- !socdata->groups_count ||
|
|
|
|
- !socdata->functions ||
|
|
|
|
- !socdata->functions_count ||
|
|
|
|
- !socdata->mux_bits ||
|
|
|
|
- !socdata->reg_stride) {
|
|
|
|
|
|
+ !socdata->groups || !socdata->groups_count ||
|
|
|
|
+ !socdata->functions || !socdata->functions_count) {
|
|
dev_err(dev, "pinctrl socdata lacks necessary members\n");
|
|
dev_err(dev, "pinctrl socdata lacks necessary members\n");
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
}
|
|
}
|