pinctrl: uniphier: support per-pin input enable for new SoCs
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Tue, 31 May 2016 08:05:17 +0000 (17:05 +0900)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 31 May 2016 10:49:48 +0000 (12:49 +0200)
Upcoming new pinctrl drivers for PH1-LD11 and PH-LD20 support input
signal gating for each pin.  (While, existing ones only support it
per pin-group.)  This commit updates the core part for that.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/uniphier/pinctrl-uniphier-core.c
drivers/pinctrl/uniphier/pinctrl-uniphier.h

index ca2562ac11808c70c43b7ca81038356720087281..d774a8e9c6a1a6114906396d5ff834e01e2e29fc 100644 (file)
@@ -433,22 +433,24 @@ static int uniphier_conf_pin_input_enable(struct pinctrl_dev *pctldev,
 {
        struct uniphier_pinctrl_priv *priv = pinctrl_dev_get_drvdata(pctldev);
        unsigned int iectrl = uniphier_pin_get_iectrl(desc->drv_data);
+       unsigned int reg, mask;
 
-       if (enable == 0) {
-               /*
-                * Multiple pins share one input enable, so per-pin disabling
-                * is impossible.
-                */
-               dev_err(pctldev->dev, "unable to disable input\n");
+       /*
+        * Multiple pins share one input enable, per-pin disabling is
+        * impossible.
+        */
+       if (!(priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL) &&
+           !enable)
                return -EINVAL;
-       }
 
+       /* UNIPHIER_PIN_IECTRL_NONE means the pin is always input-enabled */
        if (iectrl == UNIPHIER_PIN_IECTRL_NONE)
-               /* This pin is always input-enabled. nothing to do. */
-               return 0;
+               return enable ? 0 : -EINVAL;
+
+       reg = UNIPHIER_PINCTRL_IECTRL + iectrl / 32 * 4;
+       mask = BIT(iectrl % 32);
 
-       return regmap_update_bits(priv->regmap, UNIPHIER_PINCTRL_IECTRL,
-                                 BIT(iectrl), BIT(iectrl));
+       return regmap_update_bits(priv->regmap, reg, mask, enable ? mask : 0);
 }
 
 static int uniphier_conf_pin_config_set(struct pinctrl_dev *pctldev,
index 3fd50206c3107b926fb746ece426caaa1c7c5762..9941a4ceb5c55d8ceec2fa07eeac83be744ad142 100644 (file)
@@ -166,6 +166,7 @@ struct uniphier_pinctrl_socdata {
        const struct uniphier_pinmux_function *functions;
        int functions_count;
        unsigned int caps;
+#define UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL    BIT(1)
 #define UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE  BIT(0)
 };