aboutsummaryrefslogtreecommitdiff
path: root/drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c
diff options
context:
space:
mode:
authorGravatar Maxime Ripard <maxime.ripard@free-electrons.com> 2014-04-26 22:28:54 +0200
committerGravatar Maxime Ripard <maxime.ripard@free-electrons.com> 2014-05-04 19:57:18 -0500
commitdc9691066fa7de51178de5ac3e06b3681557a7b4 (patch)
tree5ecbae5cf4632b76b97eb6988c374c6e2970cea5 /drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c
parentpinctrl: sunxi: Introduce per-driver Kconfig options (diff)
downloadlinux-dc9691066fa7de51178de5ac3e06b3681557a7b4.tar.gz
linux-dc9691066fa7de51178de5ac3e06b3681557a7b4.tar.bz2
linux-dc9691066fa7de51178de5ac3e06b3681557a7b4.zip
pinctrl: sunxi: Move the reset handling functions out of the core
The way that reset is handled right now is that it is made optional for every pinctrl driver, while actually, it isn't used at all for the main pin controllers so far, and while it's mandatory for the A31's secondary pin controller. Move the reset functions out of the core and in the driver, where they can be made mandatory. Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Diffstat (limited to 'drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c')
-rw-r--r--drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c b/drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c
index b896f7ba606e..8fcba48e0a42 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c
+++ b/drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c
@@ -17,6 +17,7 @@
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/pinctrl/pinctrl.h>
+#include <linux/reset.h>
#include "pinctrl-sunxi.h"
@@ -96,8 +97,26 @@ static const struct sunxi_pinctrl_desc sun6i_a31_r_pinctrl_data = {
static int sun6i_a31_r_pinctrl_probe(struct platform_device *pdev)
{
- return sunxi_pinctrl_init(pdev,
- &sun6i_a31_r_pinctrl_data);
+ struct reset_control *rstc;
+ int ret;
+
+ rstc = devm_reset_control_get(&pdev->dev, NULL);
+ if (IS_ERR(rstc)) {
+ dev_err(&pdev->dev, "Reset controller missing\n");
+ return PTR_ERR(rstc);
+ }
+
+ ret = reset_control_deassert(rstc);
+ if (ret)
+ return ret;
+
+ ret = sunxi_pinctrl_init(pdev,
+ &sun6i_a31_r_pinctrl_data);
+
+ if (ret)
+ reset_control_assert(rstc);
+
+ return ret;
}
static struct of_device_id sun6i_a31_r_pinctrl_match[] = {