39
39
#define A375_HW_RESETn BIT(8)
40
40
#define A380_HW_RESET BIT(8)
41
41
42
+ /* Legacy bindings */
43
+ #define LEGACY_CONTROL_MEM_LEN 0x4
44
+
45
+ /* Current bindings with the 2 control registers under the same memory area */
46
+ #define LEGACY_CONTROL1_OFFSET 0x0
47
+ #define CONTROL0_OFFSET 0x0
48
+ #define CONTROL1_OFFSET 0x4
49
+
42
50
struct armada_thermal_data ;
43
51
44
52
/* Marvell EBU Thermal Sensor Dev Structure */
45
53
struct armada_thermal_priv {
46
54
void __iomem * sensor ;
47
- void __iomem * control ;
55
+ void __iomem * control0 ;
56
+ void __iomem * control1 ;
48
57
struct armada_thermal_data * data ;
49
58
};
50
59
@@ -66,27 +75,28 @@ struct armada_thermal_data {
66
75
unsigned int temp_shift ;
67
76
unsigned int temp_mask ;
68
77
u32 is_valid_bit ;
78
+ bool needs_control0 ;
69
79
};
70
80
71
81
static void armadaxp_init_sensor (struct platform_device * pdev ,
72
82
struct armada_thermal_priv * priv )
73
83
{
74
- unsigned long reg ;
84
+ u32 reg ;
75
85
76
- reg = readl_relaxed (priv -> control );
86
+ reg = readl_relaxed (priv -> control1 );
77
87
reg |= PMU_TDC0_OTF_CAL_MASK ;
78
- writel (reg , priv -> control );
88
+ writel (reg , priv -> control1 );
79
89
80
90
/* Reference calibration value */
81
91
reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ;
82
92
reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS );
83
- writel (reg , priv -> control );
93
+ writel (reg , priv -> control1 );
84
94
85
95
/* Reset the sensor */
86
- reg = readl_relaxed (priv -> control );
87
- writel ((reg | PMU_TDC0_SW_RST_MASK ), priv -> control );
96
+ reg = readl_relaxed (priv -> control1 );
97
+ writel ((reg | PMU_TDC0_SW_RST_MASK ), priv -> control1 );
88
98
89
- writel (reg , priv -> control );
99
+ writel (reg , priv -> control1 );
90
100
91
101
/* Enable the sensor */
92
102
reg = readl_relaxed (priv -> sensor );
@@ -97,50 +107,50 @@ static void armadaxp_init_sensor(struct platform_device *pdev,
97
107
static void armada370_init_sensor (struct platform_device * pdev ,
98
108
struct armada_thermal_priv * priv )
99
109
{
100
- unsigned long reg ;
110
+ u32 reg ;
101
111
102
- reg = readl_relaxed (priv -> control );
112
+ reg = readl_relaxed (priv -> control1 );
103
113
reg |= PMU_TDC0_OTF_CAL_MASK ;
104
- writel (reg , priv -> control );
114
+ writel (reg , priv -> control1 );
105
115
106
116
/* Reference calibration value */
107
117
reg &= ~PMU_TDC0_REF_CAL_CNT_MASK ;
108
118
reg |= (0xf1 << PMU_TDC0_REF_CAL_CNT_OFFS );
109
- writel (reg , priv -> control );
119
+ writel (reg , priv -> control1 );
110
120
111
121
reg &= ~PMU_TDC0_START_CAL_MASK ;
112
- writel (reg , priv -> control );
122
+ writel (reg , priv -> control1 );
113
123
114
124
msleep (10 );
115
125
}
116
126
117
127
static void armada375_init_sensor (struct platform_device * pdev ,
118
128
struct armada_thermal_priv * priv )
119
129
{
120
- unsigned long reg ;
130
+ u32 reg ;
121
131
122
- reg = readl (priv -> control + 4 );
132
+ reg = readl (priv -> control1 );
123
133
reg &= ~(A375_UNIT_CONTROL_MASK << A375_UNIT_CONTROL_SHIFT );
124
134
reg &= ~A375_READOUT_INVERT ;
125
135
reg &= ~A375_HW_RESETn ;
126
136
127
- writel (reg , priv -> control + 4 );
137
+ writel (reg , priv -> control1 );
128
138
msleep (20 );
129
139
130
140
reg |= A375_HW_RESETn ;
131
- writel (reg , priv -> control + 4 );
141
+ writel (reg , priv -> control1 );
132
142
msleep (50 );
133
143
}
134
144
135
145
static void armada380_init_sensor (struct platform_device * pdev ,
136
146
struct armada_thermal_priv * priv )
137
147
{
138
- unsigned long reg = readl_relaxed (priv -> control );
148
+ u32 reg = readl_relaxed (priv -> control1 );
139
149
140
150
/* Reset hardware once */
141
151
if (!(reg & A380_HW_RESET )) {
142
152
reg |= A380_HW_RESET ;
143
- writel (reg , priv -> control );
153
+ writel (reg , priv -> control1 );
144
154
msleep (10 );
145
155
}
146
156
}
@@ -214,6 +224,7 @@ static const struct armada_thermal_data armada375_data = {
214
224
.coef_b = 3171900000UL ,
215
225
.coef_m = 10000000UL ,
216
226
.coef_div = 13616 ,
227
+ .needs_control0 = true,
217
228
};
218
229
219
230
static const struct armada_thermal_data armada380_data = {
@@ -253,6 +264,7 @@ MODULE_DEVICE_TABLE(of, armada_thermal_id_table);
253
264
254
265
static int armada_thermal_probe (struct platform_device * pdev )
255
266
{
267
+ void __iomem * control = NULL ;
256
268
struct thermal_zone_device * thermal ;
257
269
const struct of_device_id * match ;
258
270
struct armada_thermal_priv * priv ;
@@ -272,11 +284,31 @@ static int armada_thermal_probe(struct platform_device *pdev)
272
284
return PTR_ERR (priv -> sensor );
273
285
274
286
res = platform_get_resource (pdev , IORESOURCE_MEM , 1 );
275
- priv -> control = devm_ioremap_resource (& pdev -> dev , res );
276
- if (IS_ERR (priv -> control ))
277
- return PTR_ERR (priv -> control );
287
+ control = devm_ioremap_resource (& pdev -> dev , res );
288
+ if (IS_ERR (control ))
289
+ return PTR_ERR (control );
278
290
279
291
priv -> data = (struct armada_thermal_data * )match -> data ;
292
+
293
+ /*
294
+ * Legacy DT bindings only described "control1" register (also referred
295
+ * as "control MSB" on old documentation). New bindings cover
296
+ * "control0/control LSB" and "control1/control MSB" registers within
297
+ * the same resource, which is then of size 8 instead of 4.
298
+ */
299
+ if (resource_size (res ) == LEGACY_CONTROL_MEM_LEN ) {
300
+ /* ->control0 unavailable in this configuration */
301
+ if (priv -> data -> needs_control0 ) {
302
+ dev_err (& pdev -> dev , "No access to control0 register\n" );
303
+ return - EINVAL ;
304
+ }
305
+
306
+ priv -> control1 = control + LEGACY_CONTROL1_OFFSET ;
307
+ } else {
308
+ priv -> control0 = control + CONTROL0_OFFSET ;
309
+ priv -> control1 = control + CONTROL1_OFFSET ;
310
+ }
311
+
280
312
priv -> data -> init_sensor (pdev , priv );
281
313
282
314
thermal = thermal_zone_device_register ("armada_thermal" , 0 , 0 ,
0 commit comments