pinctrl: intel: Make it possible to specify mode per pin in a group
authorMika Westerberg <mika.westerberg@linux.intel.com>
Tue, 6 Jun 2017 13:18:18 +0000 (16:18 +0300)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 9 Jun 2017 11:02:50 +0000 (13:02 +0200)
On some SoCs not all pins in a group use the same mode when a certain
function is muxed out of them. This makes it possible to specify mode per
pin as an array instead in addition to single integer.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/intel/pinctrl-intel.c
drivers/pinctrl/intel/pinctrl-intel.h

index 78c4849..6dc1096 100644 (file)
@@ -398,7 +398,11 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned function,
                value = readl(padcfg0);
 
                value &= ~PADCFG0_PMODE_MASK;
-               value |= grp->mode << PADCFG0_PMODE_SHIFT;
+
+               if (grp->modes)
+                       value |= grp->modes[i] << PADCFG0_PMODE_SHIFT;
+               else
+                       value |= grp->mode << PADCFG0_PMODE_SHIFT;
 
                writel(value, padcfg0);
        }
index b251a9e..7fdb077 100644 (file)
@@ -22,13 +22,16 @@ struct device;
  * @name: Name of the groups
  * @pins: All pins in this group
  * @npins: Number of pins in this groups
- * @mode: Native mode in which the group is muxed out @pins
+ * @mode: Native mode in which the group is muxed out @pins. Used if @modes
+ *        is %NULL.
+ * @modes: If not %NULL this will hold mode for each pin in @pins
  */
 struct intel_pingroup {
        const char *name;
        const unsigned *pins;
        size_t npins;
        unsigned short mode;
+       const unsigned *modes;
 };
 
 /**
@@ -112,12 +115,23 @@ struct intel_community {
 #define PINCTRL_FEATURE_DEBOUNCE       BIT(0)
 #define PINCTRL_FEATURE_1K_PD          BIT(1)
 
-#define PIN_GROUP(n, p, m)                     \
-       {                                       \
-               .name = (n),                    \
-               .pins = (p),                    \
-               .npins = ARRAY_SIZE((p)),       \
-               .mode = (m),                    \
+/**
+ * PIN_GROUP - Declare a pin group
+ * @n: Name of the group
+ * @p: An array of pins this group consists
+ * @m: Mode which the pins are put when this group is active. Can be either
+ *     a single integer or an array of integers in which case mode is per
+ *     pin.
+ */
+#define PIN_GROUP(n, p, m)                                     \
+       {                                                       \
+               .name = (n),                                    \
+               .pins = (p),                                    \
+               .npins = ARRAY_SIZE((p)),                       \
+               .mode = __builtin_choose_expr(                  \
+                       __builtin_constant_p((m)), (m), 0),     \
+               .modes = __builtin_choose_expr(                 \
+                       __builtin_constant_p((m)), NULL, (m)),  \
        }
 
 #define FUNCTION(n, g)                         \