OSDN Git Service

pinctrl: move strict option to pinmux_ops
authorLinus Walleij <linus.walleij@linaro.org>
Wed, 6 May 2015 12:19:13 +0000 (14:19 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 6 May 2015 12:45:19 +0000 (14:45 +0200)
While the pinmux_ops are ideally just a vtable for pin mux
calls, the "strict" setting belongs so intuitively with the
pin multiplexing that we should move it here anyway. Putting
it in the top pinctrl_desc makes no sense.

Cc: Sonic Zhang <sonic.zhang@analog.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Documentation/pinctrl.txt
drivers/pinctrl/pinctrl-adi2.c
drivers/pinctrl/pinmux.c
include/linux/pinctrl/pinctrl.h
include/linux/pinctrl/pinmux.h

index d6b2bed..4976389 100644 (file)
@@ -73,7 +73,6 @@ static struct pinctrl_desc foo_desc = {
        .pins = foo_pins,
        .npins = ARRAY_SIZE(foo_pins),
        .owner = THIS_MODULE,
-       .strict = true,
 };
 
 int __init foo_probe(void)
@@ -715,6 +714,7 @@ static struct pinmux_ops foo_pmxops = {
        .get_function_name = foo_get_fname,
        .get_function_groups = foo_get_groups,
        .set_mux = foo_set_mux,
+       .strict = true,
 };
 
 /* Pinmux operations are handled by some pin controller */
index fbd4926..49df903 100644 (file)
@@ -703,6 +703,7 @@ static struct pinmux_ops adi_pinmux_ops = {
        .get_function_name = adi_pinmux_get_func_name,
        .get_function_groups = adi_pinmux_get_groups,
        .gpio_request_enable = adi_pinmux_request_gpio,
+       .strict = true,
 };
 
 
@@ -710,7 +711,6 @@ static struct pinctrl_desc adi_pinmux_desc = {
        .name = DRIVER_NAME,
        .pctlops = &adi_pctrl_ops,
        .pmxops = &adi_pinmux_ops,
-       .strict = true,
        .owner = THIS_MODULE,
 };
 
index 2546fa7..c58c168 100644 (file)
@@ -107,7 +107,7 @@ static int pin_request(struct pinctrl_dev *pctldev,
                                desc->name, desc->gpio_owner, owner);
                        goto out;
                }
-               if (pctldev->desc->strict && desc->mux_usecount &&
+               if (ops->strict && desc->mux_usecount &&
                    strcmp(desc->mux_owner, owner)) {
                        dev_err(pctldev->dev,
                                "pin %s already requested by %s; cannot claim for %s\n",
@@ -123,7 +123,7 @@ static int pin_request(struct pinctrl_dev *pctldev,
                                desc->name, desc->mux_owner, owner);
                        goto out;
                }
-               if (pctldev->desc->strict && desc->gpio_owner) {
+               if (ops->strict && desc->gpio_owner) {
                        dev_err(pctldev->dev,
                                "pin %s already requested by %s; cannot claim for %s\n",
                                desc->name, desc->gpio_owner, owner);
index fc6b034..66e4697 100644 (file)
@@ -114,8 +114,6 @@ struct pinctrl_ops {
  *     of the pins field above
  * @pctlops: pin control operation vtable, to support global concepts like
  *     grouping of pins, this is optional.
- * @strict: check both gpio_owner and mux_owner strictly before approving
-       the pin request
  * @pmxops: pinmux operations vtable, if you support pinmuxing in your driver
  * @confops: pin config operations vtable, if you support pin configuration in
  *     your driver
@@ -134,7 +132,6 @@ struct pinctrl_desc {
        const struct pinctrl_ops *pctlops;
        const struct pinmux_ops *pmxops;
        const struct pinconf_ops *confops;
-       bool strict;
        struct module *owner;
 #ifdef CONFIG_GENERIC_PINCONF
        unsigned int num_custom_params;
index 511bda9..d3740fa 100644 (file)
@@ -56,6 +56,9 @@ struct pinctrl_dev;
  *     depending on whether the GPIO is configured as input or output,
  *     a direction selector function may be implemented as a backing
  *     to the GPIO controllers that need pin muxing.
+ * @strict: do not allow simultaneous use of the same pin for GPIO and another
+ *     function. Check both gpio_owner and mux_owner strictly before approving
+ *     the pin request.
  */
 struct pinmux_ops {
        int (*request) (struct pinctrl_dev *pctldev, unsigned offset);
@@ -79,6 +82,7 @@ struct pinmux_ops {
                                   struct pinctrl_gpio_range *range,
                                   unsigned offset,
                                   bool input);
+       bool strict;
 };
 
 #endif /* CONFIG_PINMUX */