aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/sunxi
diff options
context:
space:
mode:
authorMaxime Ripard <maxime.ripard@free-electrons.com>2014-04-26 16:28:54 -0400
committerMaxime Ripard <maxime.ripard@free-electrons.com>2014-05-04 20:57:18 -0400
commitdc9691066fa7de51178de5ac3e06b3681557a7b4 (patch)
tree5ecbae5cf4632b76b97eb6988c374c6e2970cea5 /drivers/pinctrl/sunxi
parent340ba6c4973184e2a9a7c51b295230fec17d1109 (diff)
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')
-rw-r--r--drivers/pinctrl/sunxi/pinctrl-sun6i-a31-r.c23
-rw-r--r--drivers/pinctrl/sunxi/pinctrl-sunxi.c16
2 files changed, 23 insertions, 16 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 @@
17#include <linux/of.h> 17#include <linux/of.h>
18#include <linux/of_device.h> 18#include <linux/of_device.h>
19#include <linux/pinctrl/pinctrl.h> 19#include <linux/pinctrl/pinctrl.h>
20#include <linux/reset.h>
20 21
21#include "pinctrl-sunxi.h" 22#include "pinctrl-sunxi.h"
22 23
@@ -96,8 +97,26 @@ static const struct sunxi_pinctrl_desc sun6i_a31_r_pinctrl_data = {
96 97
97static int sun6i_a31_r_pinctrl_probe(struct platform_device *pdev) 98static int sun6i_a31_r_pinctrl_probe(struct platform_device *pdev)
98{ 99{
99 return sunxi_pinctrl_init(pdev, 100 struct reset_control *rstc;
100 &sun6i_a31_r_pinctrl_data); 101 int ret;
102
103 rstc = devm_reset_control_get(&pdev->dev, NULL);
104 if (IS_ERR(rstc)) {
105 dev_err(&pdev->dev, "Reset controller missing\n");
106 return PTR_ERR(rstc);
107 }
108
109 ret = reset_control_deassert(rstc);
110 if (ret)
111 return ret;
112
113 ret = sunxi_pinctrl_init(pdev,
114 &sun6i_a31_r_pinctrl_data);
115
116 if (ret)
117 reset_control_assert(rstc);
118
119 return ret;
101} 120}
102 121
103static struct of_device_id sun6i_a31_r_pinctrl_match[] = { 122static struct of_device_id sun6i_a31_r_pinctrl_match[] = {
diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
index 2c3fb92b8972..f6522b54ece9 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c
+++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
@@ -26,7 +26,6 @@
26#include <linux/pinctrl/pinconf-generic.h> 26#include <linux/pinctrl/pinconf-generic.h>
27#include <linux/pinctrl/pinmux.h> 27#include <linux/pinctrl/pinmux.h>
28#include <linux/platform_device.h> 28#include <linux/platform_device.h>
29#include <linux/reset.h>
30#include <linux/slab.h> 29#include <linux/slab.h>
31 30
32#include "../core.h" 31#include "../core.h"
@@ -781,7 +780,6 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
781 struct device_node *node = pdev->dev.of_node; 780 struct device_node *node = pdev->dev.of_node;
782 struct pinctrl_pin_desc *pins; 781 struct pinctrl_pin_desc *pins;
783 struct sunxi_pinctrl *pctl; 782 struct sunxi_pinctrl *pctl;
784 struct reset_control *rstc;
785 struct resource *res; 783 struct resource *res;
786 int i, ret, last_pin; 784 int i, ret, last_pin;
787 struct clk *clk; 785 struct clk *clk;
@@ -875,17 +873,10 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
875 if (ret) 873 if (ret)
876 goto gpiochip_error; 874 goto gpiochip_error;
877 875
878 rstc = devm_reset_control_get_optional(&pdev->dev, NULL);
879 if (!IS_ERR(rstc)) {
880 ret = reset_control_deassert(rstc);
881 if (ret)
882 goto clk_error;
883 }
884
885 pctl->irq = irq_of_parse_and_map(node, 0); 876 pctl->irq = irq_of_parse_and_map(node, 0);
886 if (!pctl->irq) { 877 if (!pctl->irq) {
887 ret = -EINVAL; 878 ret = -EINVAL;
888 goto rstc_error; 879 goto clk_error;
889 } 880 }
890 881
891 pctl->domain = irq_domain_add_linear(node, SUNXI_IRQ_NUMBER, 882 pctl->domain = irq_domain_add_linear(node, SUNXI_IRQ_NUMBER,
@@ -893,7 +884,7 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
893 if (!pctl->domain) { 884 if (!pctl->domain) {
894 dev_err(&pdev->dev, "Couldn't register IRQ domain\n"); 885 dev_err(&pdev->dev, "Couldn't register IRQ domain\n");
895 ret = -ENOMEM; 886 ret = -ENOMEM;
896 goto rstc_error; 887 goto clk_error;
897 } 888 }
898 889
899 for (i = 0; i < SUNXI_IRQ_NUMBER; i++) { 890 for (i = 0; i < SUNXI_IRQ_NUMBER; i++) {
@@ -911,9 +902,6 @@ int sunxi_pinctrl_init(struct platform_device *pdev,
911 902
912 return 0; 903 return 0;
913 904
914rstc_error:
915 if (!IS_ERR(rstc))
916 reset_control_assert(rstc);
917clk_error: 905clk_error:
918 clk_disable_unprepare(clk); 906 clk_disable_unprepare(clk);
919gpiochip_error: 907gpiochip_error: