pinctrl: uniphier: support per-pin input enable for new SoCs
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 24 Mar 2016 13:32:45 +0000 (22:32 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 31 Mar 2016 15:56:07 +0000 (00:56 +0900)
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 prepares the core part for that.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
drivers/pinctrl/uniphier/pinctrl-uniphier-core.c
drivers/pinctrl/uniphier/pinctrl-uniphier.h

index bb7a088..b8e26d9 100644 (file)
@@ -44,7 +44,23 @@ static const char *uniphier_pinmux_get_function_name(struct udevice *dev,
        return priv->socdata->functions[selector];
 }
 
-static void uniphier_pinconf_input_enable(struct udevice *dev, unsigned pin)
+static void uniphier_pinconf_input_enable_perpin(struct udevice *dev,
+                                                unsigned pin)
+{
+       struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
+       unsigned reg;
+       u32 mask, tmp;
+
+       reg = UNIPHIER_PINCTRL_IECTRL + pin / 32 * 4;
+       mask = BIT(pin % 32);
+
+       tmp = readl(priv->base + reg);
+       tmp |= mask;
+       writel(tmp, priv->base + reg);
+}
+
+static void uniphier_pinconf_input_enable_legacy(struct udevice *dev,
+                                                unsigned pin)
 {
        struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
        int pins_count = priv->socdata->pins_count;
@@ -64,6 +80,16 @@ static void uniphier_pinconf_input_enable(struct udevice *dev, unsigned pin)
        }
 }
 
+static void uniphier_pinconf_input_enable(struct udevice *dev, unsigned pin)
+{
+       struct uniphier_pinctrl_priv *priv = dev_get_priv(dev);
+
+       if (priv->socdata->caps & UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL)
+               uniphier_pinconf_input_enable_perpin(dev, pin);
+       else
+               uniphier_pinconf_input_enable_legacy(dev, pin);
+}
+
 static void uniphier_pinmux_set_one(struct udevice *dev, unsigned pin,
                                    unsigned muxval)
 {
index d582317..2b43848 100644 (file)
@@ -70,6 +70,7 @@ struct uniphier_pinctrl_socdata {
        const char * const *functions;
        int functions_count;
        unsigned caps;
+#define UNIPHIER_PINCTRL_CAPS_PERPIN_IECTRL    BIT(1)
 #define UNIPHIER_PINCTRL_CAPS_DBGMUX_SEPARATE  BIT(0)
 };