| From 69b260be465249c3eec50b7e7aef099ed87ef420 Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Sun, 21 Apr 2013 20:21:57 +0200 |
| Subject: sh-pfc: Add support for SoC-specific initialization |
| |
| Add two optional init and exit SoC operations and call them from the |
| core at probe and remove time. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Acked-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| (cherry picked from commit 0c151062f32c9db819c2ca3081d6f98194d61e78) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/pinctrl/sh-pfc/core.c | 16 +++++++++++++++- |
| drivers/pinctrl/sh-pfc/core.h | 1 + |
| drivers/pinctrl/sh-pfc/sh_pfc.h | 2 ++ |
| 3 files changed, 18 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c |
| index 4540ce38..3b2fd43f 100644 |
| --- a/drivers/pinctrl/sh-pfc/core.c |
| +++ b/drivers/pinctrl/sh-pfc/core.c |
| @@ -372,6 +372,12 @@ static int sh_pfc_probe(struct platform_device *pdev) |
| |
| spin_lock_init(&pfc->lock); |
| |
| + if (info->ops && info->ops->init) { |
| + ret = info->ops->init(pfc); |
| + if (ret < 0) |
| + return ret; |
| + } |
| + |
| pinctrl_provide_dummies(); |
| |
| /* |
| @@ -379,7 +385,7 @@ static int sh_pfc_probe(struct platform_device *pdev) |
| */ |
| ret = sh_pfc_register_pinctrl(pfc); |
| if (unlikely(ret != 0)) |
| - return ret; |
| + goto error; |
| |
| #ifdef CONFIG_GPIO_SH_PFC |
| /* |
| @@ -401,6 +407,11 @@ static int sh_pfc_probe(struct platform_device *pdev) |
| dev_info(pfc->dev, "%s support registered\n", info->name); |
| |
| return 0; |
| + |
| +error: |
| + if (info->ops && info->ops->exit) |
| + info->ops->exit(pfc); |
| + return ret; |
| } |
| |
| static int sh_pfc_remove(struct platform_device *pdev) |
| @@ -412,6 +423,9 @@ static int sh_pfc_remove(struct platform_device *pdev) |
| #endif |
| sh_pfc_unregister_pinctrl(pfc); |
| |
| + if (pfc->info->ops && pfc->info->ops->exit) |
| + pfc->info->ops->exit(pfc); |
| + |
| platform_set_drvdata(pdev, NULL); |
| |
| return 0; |
| diff --git a/drivers/pinctrl/sh-pfc/core.h b/drivers/pinctrl/sh-pfc/core.h |
| index e847afbe..f02ba1dd 100644 |
| --- a/drivers/pinctrl/sh-pfc/core.h |
| +++ b/drivers/pinctrl/sh-pfc/core.h |
| @@ -28,6 +28,7 @@ struct sh_pfc_pinctrl; |
| struct sh_pfc { |
| struct device *dev; |
| const struct sh_pfc_soc_info *info; |
| + void *soc_data; |
| spinlock_t lock; |
| |
| unsigned int num_windows; |
| diff --git a/drivers/pinctrl/sh-pfc/sh_pfc.h b/drivers/pinctrl/sh-pfc/sh_pfc.h |
| index b1707612..830ae1ff 100644 |
| --- a/drivers/pinctrl/sh-pfc/sh_pfc.h |
| +++ b/drivers/pinctrl/sh-pfc/sh_pfc.h |
| @@ -129,6 +129,8 @@ struct pinmux_range { |
| struct sh_pfc; |
| |
| struct sh_pfc_soc_operations { |
| + int (*init)(struct sh_pfc *pfc); |
| + void (*exit)(struct sh_pfc *pfc); |
| unsigned int (*get_bias)(struct sh_pfc *pfc, unsigned int pin); |
| void (*set_bias)(struct sh_pfc *pfc, unsigned int pin, |
| unsigned int bias); |
| -- |
| 1.8.4.3.gca3854a |
| |