pinctrl: allows not to define the get_group_pins operation
authorAntoine Ténart <antoine.tenart@free-electrons.com>
Thu, 10 Apr 2014 13:07:50 +0000 (15:07 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Tue, 22 Apr 2014 12:47:02 +0000 (14:47 +0200)
When using a group only pinctrl driver, which does not have any
information on the pins it is useless to define a get_group_pins
always returning an empty list of pins.

When not using get_group_pin[1], a driver must implement it so
pins = NULL and num_pins = 0. This patch makes it the default
behaviour if not defined in the pinctrl driver when used in
pinmux enable and disable funtions and in pinctrl_groups_show.

It also adds a check in pinctrl_get_group_pins and return -EINVAL if
not defined. This function is called in the gpiolib when adding when
pingroup range. It cannot be used if no group is defined, so this seams
reasonable.

[1] get_group_pin(struct pinctrl_dev *pctldev,
  unsigned selector,
  const unsigned **pins,
  unsigned *num_pins);

Signed-off-by: Antoine Ténart <antoine.tenart@free-electrons.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/core.c
drivers/pinctrl/pinmux.c

index c0fe6091566a4766cffbe515ed796fe7e2a3bee5..e09474ecde2346bd900d8f9d05ba3c26c63f9aa9 100644 (file)
@@ -468,6 +468,9 @@ int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group,
        const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
        int gs;
 
+       if (!pctlops->get_group_pins)
+               return -EINVAL;
+
        gs = pinctrl_get_group_selector(pctldev, pin_group);
        if (gs < 0)
                return gs;
@@ -1362,15 +1365,16 @@ static int pinctrl_groups_show(struct seq_file *s, void *what)
 
        seq_puts(s, "registered pin groups:\n");
        while (selector < ngroups) {
-               const unsigned *pins;
-               unsigned num_pins;
+               const unsigned *pins = NULL;
+               unsigned num_pins = 0;
                const char *gname = ops->get_group_name(pctldev, selector);
                const char *pname;
-               int ret;
+               int ret = 0;
                int i;
 
-               ret = ops->get_group_pins(pctldev, selector,
-                                         &pins, &num_pins);
+               if (ops->get_group_pins)
+                       ret = ops->get_group_pins(pctldev, selector,
+                                                 &pins, &num_pins);
                if (ret)
                        seq_printf(s, "%s [ERROR GETTING PINS]\n",
                                   gname);
@@ -1694,8 +1698,7 @@ static int pinctrl_check_ops(struct pinctrl_dev *pctldev)
 
        if (!ops ||
            !ops->get_groups_count ||
-           !ops->get_group_name ||
-           !ops->get_group_pins)
+           !ops->get_group_name)
                return -EINVAL;
 
        if (ops->dt_node_to_map && !ops->dt_free_map)
index 9248ce4efed4d446fefb3cc736b82ffe7c796a28..051e8592990e9c9824563f8af789af05b1a5fdbf 100644 (file)
@@ -391,14 +391,16 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)
        struct pinctrl_dev *pctldev = setting->pctldev;
        const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
        const struct pinmux_ops *ops = pctldev->desc->pmxops;
-       int ret;
-       const unsigned *pins;
-       unsigned num_pins;
+       int ret = 0;
+       const unsigned *pins = NULL;
+       unsigned num_pins = 0;
        int i;
        struct pin_desc *desc;
 
-       ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
-                                     &pins, &num_pins);
+       if (pctlops->get_group_pins)
+               ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
+                                             &pins, &num_pins);
+
        if (ret) {
                const char *gname;
 
@@ -470,14 +472,15 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)
        struct pinctrl_dev *pctldev = setting->pctldev;
        const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
        const struct pinmux_ops *ops = pctldev->desc->pmxops;
-       int ret;
-       const unsigned *pins;
-       unsigned num_pins;
+       int ret = 0;
+       const unsigned *pins = NULL;
+       unsigned num_pins = 0;
        int i;
        struct pin_desc *desc;
 
-       ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
-                                     &pins, &num_pins);
+       if (pctlops->get_group_pins)
+               ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
+                                             &pins, &num_pins);
        if (ret) {
                const char *gname;