17
17
18
18
#include <linux/mfd/syscon.h>
19
19
#include <linux/mod_devicetable.h>
20
+ #include <linux/of_device.h>
20
21
#include <linux/platform_device.h>
21
22
#include <linux/reset-controller.h>
22
23
#include <linux/regmap.h>
23
24
#include <dt-bindings/reset/imx7-reset.h>
24
25
26
+ struct imx7_src_signal {
27
+ unsigned int offset , bit ;
28
+ };
29
+
30
+ struct imx7_src_variant {
31
+ const struct imx7_src_signal * signals ;
32
+ unsigned int signals_num ;
33
+ struct reset_control_ops ops ;
34
+ };
35
+
25
36
struct imx7_src {
26
37
struct reset_controller_dev rcdev ;
27
38
struct regmap * regmap ;
39
+ const struct imx7_src_signal * signals ;
28
40
};
29
41
30
42
enum imx7_src_registers {
@@ -39,9 +51,14 @@ enum imx7_src_registers {
39
51
SRC_DDRC_RCR = 0x1000 ,
40
52
};
41
53
42
- struct imx7_src_signal {
43
- unsigned int offset , bit ;
44
- };
54
+ static int imx7_reset_update (struct imx7_src * imx7src ,
55
+ unsigned long id , unsigned int value )
56
+ {
57
+ const struct imx7_src_signal * signal = & imx7src -> signals [id ];
58
+
59
+ return regmap_update_bits (imx7src -> regmap ,
60
+ signal -> offset , signal -> bit , value );
61
+ }
45
62
46
63
static const struct imx7_src_signal imx7_src_signals [IMX7_RESET_NUM ] = {
47
64
[IMX7_RESET_A7_CORE_POR_RESET0 ] = { SRC_A7RCR0 , BIT (0 ) },
@@ -81,8 +98,8 @@ static int imx7_reset_set(struct reset_controller_dev *rcdev,
81
98
unsigned long id , bool assert )
82
99
{
83
100
struct imx7_src * imx7src = to_imx7_src (rcdev );
84
- const struct imx7_src_signal * signal = & imx7_src_signals [id ];
85
- unsigned int value = assert ? signal -> bit : 0 ;
101
+ const unsigned int bit = imx7src -> signals [id ]. bit ;
102
+ unsigned int value = assert ? bit : 0 ;
86
103
87
104
switch (id ) {
88
105
case IMX7_RESET_PCIEPHY :
@@ -95,12 +112,11 @@ static int imx7_reset_set(struct reset_controller_dev *rcdev,
95
112
break ;
96
113
97
114
case IMX7_RESET_PCIE_CTRL_APPS_EN :
98
- value = ( assert ) ? 0 : signal -> bit ;
115
+ value = assert ? 0 : bit ;
99
116
break ;
100
117
}
101
118
102
- return regmap_update_bits (imx7src -> regmap ,
103
- signal -> offset , signal -> bit , value );
119
+ return imx7_reset_update (imx7src , id , value );
104
120
}
105
121
106
122
static int imx7_reset_assert (struct reset_controller_dev * rcdev ,
@@ -115,21 +131,27 @@ static int imx7_reset_deassert(struct reset_controller_dev *rcdev,
115
131
return imx7_reset_set (rcdev , id , false);
116
132
}
117
133
118
- static const struct reset_control_ops imx7_reset_ops = {
119
- .assert = imx7_reset_assert ,
120
- .deassert = imx7_reset_deassert ,
134
+ static const struct imx7_src_variant variant_imx7 = {
135
+ .signals = imx7_src_signals ,
136
+ .signals_num = ARRAY_SIZE (imx7_src_signals ),
137
+ .ops = {
138
+ .assert = imx7_reset_assert ,
139
+ .deassert = imx7_reset_deassert ,
140
+ },
121
141
};
122
142
123
143
static int imx7_reset_probe (struct platform_device * pdev )
124
144
{
125
145
struct imx7_src * imx7src ;
126
146
struct device * dev = & pdev -> dev ;
127
147
struct regmap_config config = { .name = "src" };
148
+ const struct imx7_src_variant * variant = of_device_get_match_data (dev );
128
149
129
150
imx7src = devm_kzalloc (dev , sizeof (* imx7src ), GFP_KERNEL );
130
151
if (!imx7src )
131
152
return - ENOMEM ;
132
153
154
+ imx7src -> signals = variant -> signals ;
133
155
imx7src -> regmap = syscon_node_to_regmap (dev -> of_node );
134
156
if (IS_ERR (imx7src -> regmap )) {
135
157
dev_err (dev , "Unable to get imx7-src regmap" );
@@ -138,15 +160,15 @@ static int imx7_reset_probe(struct platform_device *pdev)
138
160
regmap_attach_dev (dev , imx7src -> regmap , & config );
139
161
140
162
imx7src -> rcdev .owner = THIS_MODULE ;
141
- imx7src -> rcdev .nr_resets = IMX7_RESET_NUM ;
142
- imx7src -> rcdev .ops = & imx7_reset_ops ;
163
+ imx7src -> rcdev .nr_resets = variant -> signals_num ;
164
+ imx7src -> rcdev .ops = & variant -> ops ;
143
165
imx7src -> rcdev .of_node = dev -> of_node ;
144
166
145
167
return devm_reset_controller_register (dev , & imx7src -> rcdev );
146
168
}
147
169
148
170
static const struct of_device_id imx7_reset_dt_ids [] = {
149
- { .compatible = "fsl,imx7d-src" , },
171
+ { .compatible = "fsl,imx7d-src" , . data = & variant_imx7 },
150
172
{ /* sentinel */ },
151
173
};
152
174
0 commit comments