From 5c7f4e29d71ebe56d4ee0e123a0f0a2584ab61d8 Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Fri, 16 Mar 2012 14:54:25 -0600 Subject: [PATCH] --- yaml --- r: 302327 b: refs/heads/master c: d26bc49fa401be2b71838b6a4b387196cd12a534 h: refs/heads/master i: 302325: 53bd39aef10d5353b1efceae6dc954acab64eb7d 302323: 1f6c01569491ecbe2a87ea4084c5f6cc367c9e57 302319: 9974518cb084cd47947eaf323235d4a6b9914173 v: v3 --- [refs] | 2 +- trunk/drivers/pinctrl/core.c | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 55c7e47136c2..051e252f632f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 22f099d0fcb33073a1f1f10402a16b28602e20f2 +refs/heads/master: d26bc49fa401be2b71838b6a4b387196cd12a534 diff --git a/trunk/drivers/pinctrl/core.c b/trunk/drivers/pinctrl/core.c index ec3b8cc188af..df6296c5f47b 100644 --- a/trunk/drivers/pinctrl/core.c +++ b/trunk/drivers/pinctrl/core.c @@ -908,10 +908,6 @@ static int pinctrl_groups_show(struct seq_file *s, void *what) const struct pinctrl_ops *ops = pctldev->desc->pctlops; unsigned selector = 0; - /* No grouping */ - if (!ops) - return 0; - mutex_lock(&pinctrl_mutex); seq_puts(s, "registered pin groups:\n"); @@ -1225,6 +1221,19 @@ static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev) #endif +static int pinctrl_check_ops(struct pinctrl_dev *pctldev) +{ + const struct pinctrl_ops *ops = pctldev->desc->pctlops; + + if (!ops || + !ops->list_groups || + !ops->get_group_name || + !ops->get_group_pins) + return -EINVAL; + + return 0; +} + /** * pinctrl_register() - register a pin controller device * @pctldesc: descriptor for this pin controller @@ -1256,6 +1265,14 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, INIT_LIST_HEAD(&pctldev->gpio_ranges); pctldev->dev = dev; + /* check core ops for sanity */ + ret = pinctrl_check_ops(pctldev); + if (ret) { + pr_err("%s pinctrl ops lacks necessary functions\n", + pctldesc->name); + goto out_err; + } + /* If we're implementing pinmuxing, check the ops for sanity */ if (pctldesc->pmxops) { ret = pinmux_check_ops(pctldev);