pinctrl: add some error checking for user interfaces
authorDong Aisheng <dong.aisheng@linaro.org>
Tue, 10 Apr 2012 04:41:34 +0000 (12:41 +0800)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 18 Apr 2012 11:53:11 +0000 (13:53 +0200)
This patch can avoid kernel oops in case the mux or config
function is not supported by driver.

Acked-by: Stephen Warren <swarren@wwwdotorg.org>
Signed-off-by: Dong Aisheng <dong.aisheng@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinconf.c
drivers/pinctrl/pinmux.c

index eb3a14f4b8661ebb9aa313c82871df87e5731679..384dcc166e4489bd28c2837dc5718369fbc2b1b4 100644 (file)
@@ -448,8 +448,12 @@ static void pinconf_dump_pin(struct pinctrl_dev *pctldev,
 static int pinconf_pins_show(struct seq_file *s, void *what)
 {
        struct pinctrl_dev *pctldev = s->private;
+       const struct pinconf_ops *ops = pctldev->desc->confops;
        unsigned i, pin;
 
+       if (!ops || !ops->pin_config_get)
+               return 0;
+
        seq_puts(s, "Pin config settings per pin\n");
        seq_puts(s, "Format: pin (name): pinmux setting array\n");
 
index 8849830e51901ae3ac0a194d49eeb2bcdb198329..c494c37bf167d2e6f8ffea19b5ae9d1037790166 100644 (file)
@@ -323,6 +323,11 @@ int pinmux_map_to_setting(struct pinctrl_map const *map,
        const unsigned *pins;
        unsigned num_pins;
 
+       if (!pmxops) {
+               dev_err(pctldev->dev, "does not support mux function\n");
+               return -EINVAL;
+       }
+
        setting->data.mux.func =
                pinmux_func_name_to_selector(pctldev, map->data.mux.function);
        if (setting->data.mux.func < 0)
@@ -481,11 +486,14 @@ static int pinmux_functions_show(struct seq_file *s, void *what)
 {
        struct pinctrl_dev *pctldev = s->private;
        const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
-       unsigned nfuncs = pmxops->get_functions_count(pctldev);
+       unsigned nfuncs;
        unsigned func_selector = 0;
 
-       mutex_lock(&pinctrl_mutex);
+       if (!pmxops)
+               return 0;
 
+       mutex_lock(&pinctrl_mutex);
+       nfuncs = pmxops->get_functions_count(pctldev);
        while (func_selector < nfuncs) {
                const char *func = pmxops->get_function_name(pctldev,
                                                          func_selector);
@@ -520,6 +528,9 @@ static int pinmux_pins_show(struct seq_file *s, void *what)
        const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
        unsigned i, pin;
 
+       if (!pmxops)
+               return 0;
+
        seq_puts(s, "Pinmux settings per pin\n");
        seq_puts(s, "Format: pin (name): mux_owner gpio_owner hog?\n");