9
9
#include <linux/io.h>
10
10
#include <linux/of.h>
11
11
#include <linux/of_address.h>
12
+ #include <linux/regmap.h>
13
+ #include <linux/sizes.h>
12
14
#include <linux/thermal.h>
13
15
14
16
#include "thermal_core.h"
24
26
#define TMU_VER1 0x1
25
27
#define TMU_VER2 0x2
26
28
27
- /*
28
- * QorIQ TMU Registers
29
- */
30
- struct qoriq_tmu_site_regs {
31
- u32 tritsr ; /* Immediate Temperature Site Register */
32
- u32 tratsr ; /* Average Temperature Site Register */
33
- u8 res0 [0x8 ];
34
- };
29
+ #define REGS_TMR 0x000 /* Mode Register */
30
+ #define TMR_DISABLE 0x0
31
+ #define TMR_ME 0x80000000
32
+ #define TMR_ALPF 0x0c000000
35
33
36
- struct qoriq_tmu_regs_v1 {
37
- u32 tmr ; /* Mode Register */
38
- u32 tsr ; /* Status Register */
39
- u32 tmtmir ; /* Temperature measurement interval Register */
40
- u8 res0 [0x14 ];
41
- u32 tier ; /* Interrupt Enable Register */
42
- u32 tidr ; /* Interrupt Detect Register */
43
- u32 tiscr ; /* Interrupt Site Capture Register */
44
- u32 ticscr ; /* Interrupt Critical Site Capture Register */
45
- u8 res1 [0x10 ];
46
- u32 tmhtcrh ; /* High Temperature Capture Register */
47
- u32 tmhtcrl ; /* Low Temperature Capture Register */
48
- u8 res2 [0x8 ];
49
- u32 tmhtitr ; /* High Temperature Immediate Threshold */
50
- u32 tmhtatr ; /* High Temperature Average Threshold */
51
- u32 tmhtactr ; /* High Temperature Average Crit Threshold */
52
- u8 res3 [0x24 ];
53
- u32 ttcfgr ; /* Temperature Configuration Register */
54
- u32 tscfgr ; /* Sensor Configuration Register */
55
- u8 res4 [0x78 ];
56
- struct qoriq_tmu_site_regs site [SITES_MAX ];
57
- u8 res5 [0x9f8 ];
58
- u32 ipbrr0 ; /* IP Block Revision Register 0 */
59
- u32 ipbrr1 ; /* IP Block Revision Register 1 */
60
- u8 res6 [0x310 ];
61
- u32 ttrcr [4 ]; /* Temperature Range Control Register */
62
- };
34
+ #define REGS_TMTMIR 0x008 /* Temperature measurement interval Register */
35
+ #define TMTMIR_DEFAULT 0x0000000f
63
36
64
- struct qoriq_tmu_regs_v2 {
65
- u32 tmr ; /* Mode Register */
66
- u32 tsr ; /* Status Register */
67
- u32 tmsr ; /* monitor site register */
68
- u32 tmtmir ; /* Temperature measurement interval Register */
69
- u8 res0 [0x10 ];
70
- u32 tier ; /* Interrupt Enable Register */
71
- u32 tidr ; /* Interrupt Detect Register */
72
- u8 res1 [0x8 ];
73
- u32 tiiscr ; /* interrupt immediate site capture register */
74
- u32 tiascr ; /* interrupt average site capture register */
75
- u32 ticscr ; /* Interrupt Critical Site Capture Register */
76
- u32 res2 ;
77
- u32 tmhtcr ; /* monitor high temperature capture register */
78
- u32 tmltcr ; /* monitor low temperature capture register */
79
- u32 tmrtrcr ; /* monitor rising temperature rate capture register */
80
- u32 tmftrcr ; /* monitor falling temperature rate capture register */
81
- u32 tmhtitr ; /* High Temperature Immediate Threshold */
82
- u32 tmhtatr ; /* High Temperature Average Threshold */
83
- u32 tmhtactr ; /* High Temperature Average Crit Threshold */
84
- u32 res3 ;
85
- u32 tmltitr ; /* monitor low temperature immediate threshold */
86
- u32 tmltatr ; /* monitor low temperature average threshold register */
87
- u32 tmltactr ; /* monitor low temperature average critical threshold */
88
- u32 res4 ;
89
- u32 tmrtrctr ; /* monitor rising temperature rate critical threshold */
90
- u32 tmftrctr ; /* monitor falling temperature rate critical threshold*/
91
- u8 res5 [0x8 ];
92
- u32 ttcfgr ; /* Temperature Configuration Register */
93
- u32 tscfgr ; /* Sensor Configuration Register */
94
- u8 res6 [0x78 ];
95
- struct qoriq_tmu_site_regs site [SITES_MAX ];
96
- u8 res7 [0x9f8 ];
97
- u32 ipbrr0 ; /* IP Block Revision Register 0 */
98
- u32 ipbrr1 ; /* IP Block Revision Register 1 */
99
- u8 res8 [0x300 ];
100
- u32 teumr0 ;
101
- u32 teumr1 ;
102
- u32 teumr2 ;
103
- u32 res9 ;
104
- u32 ttrcr [4 ]; /* Temperature Range Control Register */
105
- };
37
+ #define REGS_V2_TMSR 0x008 /* monitor site register */
38
+
39
+ #define REGS_V2_TMTMIR 0x00c /* Temperature measurement interval Register */
40
+
41
+ #define REGS_TIER 0x020 /* Interrupt Enable Register */
42
+ #define TIER_DISABLE 0x0
43
+
44
+
45
+ #define REGS_TTCFGR 0x080 /* Temperature Configuration Register */
46
+ #define REGS_TSCFGR 0x084 /* Sensor Configuration Register */
47
+
48
+ #define REGS_TRITSR (n ) (0x100 + 16 * (n)) /* Immediate Temperature
49
+ * Site Register
50
+ */
51
+ #define REGS_TTRnCR (n ) (0xf10 + 4 * (n)) /* Temperature Range n
52
+ * Control Register
53
+ */
54
+ #define REGS_IPBRR (n ) (0xbf8 + 4 * (n)) /* IP Block Revision
55
+ * Register n
56
+ */
57
+ #define REGS_V2_TEUMR (n ) (0xf00 + 4 * (n))
106
58
107
59
/*
108
60
* Thermal zone data
@@ -113,10 +65,8 @@ struct qoriq_sensor {
113
65
114
66
struct qoriq_tmu_data {
115
67
int ver ;
116
- struct qoriq_tmu_regs_v1 __iomem * regs ;
117
- struct qoriq_tmu_regs_v2 __iomem * regs_v2 ;
68
+ struct regmap * regmap ;
118
69
struct clk * clk ;
119
- bool little_endian ;
120
70
struct qoriq_sensor sensor [SITES_MAX ];
121
71
};
122
72
@@ -125,29 +75,13 @@ static struct qoriq_tmu_data *qoriq_sensor_to_data(struct qoriq_sensor *s)
125
75
return container_of (s , struct qoriq_tmu_data , sensor [s -> id ]);
126
76
}
127
77
128
- static void tmu_write (struct qoriq_tmu_data * p , u32 val , void __iomem * addr )
129
- {
130
- if (p -> little_endian )
131
- iowrite32 (val , addr );
132
- else
133
- iowrite32be (val , addr );
134
- }
135
-
136
- static u32 tmu_read (struct qoriq_tmu_data * p , void __iomem * addr )
137
- {
138
- if (p -> little_endian )
139
- return ioread32 (addr );
140
- else
141
- return ioread32be (addr );
142
- }
143
-
144
78
static int tmu_get_temp (void * p , int * temp )
145
79
{
146
80
struct qoriq_sensor * qsensor = p ;
147
81
struct qoriq_tmu_data * qdata = qoriq_sensor_to_data (qsensor );
148
82
u32 val ;
149
83
150
- val = tmu_read (qdata , & qdata -> regs -> site [ qsensor -> id ]. tritsr );
84
+ regmap_read (qdata -> regmap , REGS_TRITSR ( qsensor -> id ), & val );
151
85
* temp = (val & 0xff ) * 1000 ;
152
86
153
87
return 0 ;
@@ -189,12 +123,12 @@ static int qoriq_tmu_register_tmu_zone(struct device *dev,
189
123
/* Enable monitoring */
190
124
if (sites != 0 ) {
191
125
if (qdata -> ver == TMU_VER1 ) {
192
- tmu_write (qdata , sites | TMR_ME | TMR_ALPF ,
193
- & qdata -> regs -> tmr );
126
+ regmap_write (qdata -> regmap , REGS_TMR ,
127
+ sites | TMR_ME | TMR_ALPF );
194
128
} else {
195
- tmu_write (qdata , sites , & qdata -> regs_v2 -> tmsr );
196
- tmu_write (qdata , TMR_ME | TMR_ALPF_V2 ,
197
- & qdata -> regs_v2 -> tmr );
129
+ regmap_write (qdata -> regmap , REGS_V2_TMSR , sites );
130
+ regmap_write (qdata -> regmap , REGS_TMR ,
131
+ TMR_ME | TMR_ALPF_V2 );
198
132
}
199
133
}
200
134
@@ -223,7 +157,7 @@ static int qoriq_tmu_calibration(struct device *dev,
223
157
224
158
/* Init temperature range registers */
225
159
for (i = 0 ; i < len ; i ++ )
226
- tmu_write (data , range [ i ], & data -> regs -> ttrcr [i ]);
160
+ regmap_write (data -> regmap , REGS_TTRnCR ( i ), range [i ]);
227
161
228
162
calibration = of_get_property (np , "fsl,tmu-calibration" , & len );
229
163
if (calibration == NULL || len % 8 ) {
@@ -233,9 +167,9 @@ static int qoriq_tmu_calibration(struct device *dev,
233
167
234
168
for (i = 0 ; i < len ; i += 8 , calibration += 2 ) {
235
169
val = of_read_number (calibration , 1 );
236
- tmu_write (data , val , & data -> regs -> ttcfgr );
170
+ regmap_write (data -> regmap , REGS_TTCFGR , val );
237
171
val = of_read_number (calibration + 1 , 1 );
238
- tmu_write (data , val , & data -> regs -> tscfgr );
172
+ regmap_write (data -> regmap , REGS_TSCFGR , val );
239
173
}
240
174
241
175
return 0 ;
@@ -244,39 +178,78 @@ static int qoriq_tmu_calibration(struct device *dev,
244
178
static void qoriq_tmu_init_device (struct qoriq_tmu_data * data )
245
179
{
246
180
/* Disable interrupt, using polling instead */
247
- tmu_write (data , TIER_DISABLE , & data -> regs -> tier );
181
+ regmap_write (data -> regmap , REGS_TIER , TIER_DISABLE );
248
182
249
183
/* Set update_interval */
184
+
250
185
if (data -> ver == TMU_VER1 ) {
251
- tmu_write (data , TMTMIR_DEFAULT , & data -> regs -> tmtmir );
186
+ regmap_write (data -> regmap , REGS_TMTMIR , TMTMIR_DEFAULT );
252
187
} else {
253
- tmu_write (data , TMTMIR_DEFAULT , & data -> regs_v2 -> tmtmir );
254
- tmu_write (data , TEUMR0_V2 , & data -> regs_v2 -> teumr0 );
188
+ regmap_write (data -> regmap , REGS_V2_TMTMIR , TMTMIR_DEFAULT );
189
+ regmap_write (data -> regmap , REGS_V2_TEUMR ( 0 ), TEUMR0_V2 );
255
190
}
256
191
257
192
/* Disable monitoring */
258
- tmu_write (data , TMR_DISABLE , & data -> regs -> tmr );
193
+ regmap_write (data -> regmap , REGS_TMR , TMR_DISABLE );
259
194
}
260
195
196
+ static const struct regmap_range qoriq_yes_ranges [] = {
197
+ regmap_reg_range (REGS_TMR , REGS_TSCFGR ),
198
+ regmap_reg_range (REGS_TTRnCR (0 ), REGS_TTRnCR (3 )),
199
+ regmap_reg_range (REGS_V2_TEUMR (0 ), REGS_V2_TEUMR (2 )),
200
+ regmap_reg_range (REGS_IPBRR (0 ), REGS_IPBRR (1 )),
201
+ /* Read only registers below */
202
+ regmap_reg_range (REGS_TRITSR (0 ), REGS_TRITSR (15 )),
203
+ };
204
+
205
+ static const struct regmap_access_table qoriq_wr_table = {
206
+ .yes_ranges = qoriq_yes_ranges ,
207
+ .n_yes_ranges = ARRAY_SIZE (qoriq_yes_ranges ) - 1 ,
208
+ };
209
+
210
+ static const struct regmap_access_table qoriq_rd_table = {
211
+ .yes_ranges = qoriq_yes_ranges ,
212
+ .n_yes_ranges = ARRAY_SIZE (qoriq_yes_ranges ),
213
+ };
214
+
261
215
static int qoriq_tmu_probe (struct platform_device * pdev )
262
216
{
263
217
int ret ;
264
218
u32 ver ;
265
219
struct qoriq_tmu_data * data ;
266
220
struct device_node * np = pdev -> dev .of_node ;
267
221
struct device * dev = & pdev -> dev ;
222
+ const bool little_endian = of_property_read_bool (np , "little-endian" );
223
+ const enum regmap_endian format_endian =
224
+ little_endian ? REGMAP_ENDIAN_LITTLE : REGMAP_ENDIAN_BIG ;
225
+ const struct regmap_config regmap_config = {
226
+ .reg_bits = 32 ,
227
+ .val_bits = 32 ,
228
+ .reg_stride = 4 ,
229
+ .rd_table = & qoriq_rd_table ,
230
+ .wr_table = & qoriq_wr_table ,
231
+ .val_format_endian = format_endian ,
232
+ .max_register = SZ_4K ,
233
+ };
234
+ void __iomem * base ;
268
235
269
236
data = devm_kzalloc (dev , sizeof (struct qoriq_tmu_data ),
270
237
GFP_KERNEL );
271
238
if (!data )
272
239
return - ENOMEM ;
273
240
274
- data -> little_endian = of_property_read_bool (np , "little-endian" );
275
-
276
- data -> regs = devm_platform_ioremap_resource (pdev , 0 );
277
- if (IS_ERR (data -> regs )) {
241
+ base = devm_platform_ioremap_resource (pdev , 0 );
242
+ ret = PTR_ERR_OR_ZERO (base );
243
+ if (ret ) {
278
244
dev_err (dev , "Failed to get memory region\n" );
279
- return PTR_ERR (data -> regs );
245
+ return ret ;
246
+ }
247
+
248
+ data -> regmap = devm_regmap_init_mmio (dev , base , & regmap_config );
249
+ ret = PTR_ERR_OR_ZERO (data -> regmap );
250
+ if (ret ) {
251
+ dev_err (dev , "Failed to init regmap (%d)\n" , ret );
252
+ return ret ;
280
253
}
281
254
282
255
data -> clk = devm_clk_get_optional (dev , NULL );
@@ -290,10 +263,12 @@ static int qoriq_tmu_probe(struct platform_device *pdev)
290
263
}
291
264
292
265
/* version register offset at: 0xbf8 on both v1 and v2 */
293
- ver = tmu_read (data , & data -> regs -> ipbrr0 );
266
+ ret = regmap_read (data -> regmap , REGS_IPBRR (0 ), & ver );
267
+ if (ret ) {
268
+ dev_err (& pdev -> dev , "Failed to read IP block version\n" );
269
+ return ret ;
270
+ }
294
271
data -> ver = (ver >> 8 ) & 0xff ;
295
- if (data -> ver == TMU_VER2 )
296
- data -> regs_v2 = (void __iomem * )data -> regs ;
297
272
298
273
qoriq_tmu_init_device (data ); /* TMU initialization */
299
274
@@ -323,7 +298,7 @@ static int qoriq_tmu_remove(struct platform_device *pdev)
323
298
struct qoriq_tmu_data * data = platform_get_drvdata (pdev );
324
299
325
300
/* Disable monitoring */
326
- tmu_write (data , TMR_DISABLE , & data -> regs -> tmr );
301
+ regmap_write (data -> regmap , REGS_TMR , TMR_DISABLE );
327
302
328
303
clk_disable_unprepare (data -> clk );
329
304
@@ -332,13 +307,12 @@ static int qoriq_tmu_remove(struct platform_device *pdev)
332
307
333
308
static int __maybe_unused qoriq_tmu_suspend (struct device * dev )
334
309
{
335
- u32 tmr ;
336
310
struct qoriq_tmu_data * data = dev_get_drvdata (dev );
311
+ int ret ;
337
312
338
- /* Disable monitoring */
339
- tmr = tmu_read (data , & data -> regs -> tmr );
340
- tmr &= ~TMR_ME ;
341
- tmu_write (data , tmr , & data -> regs -> tmr );
313
+ ret = regmap_update_bits (data -> regmap , REGS_TMR , TMR_ME , 0 );
314
+ if (ret )
315
+ return ret ;
342
316
343
317
clk_disable_unprepare (data -> clk );
344
318
@@ -347,7 +321,6 @@ static int __maybe_unused qoriq_tmu_suspend(struct device *dev)
347
321
348
322
static int __maybe_unused qoriq_tmu_resume (struct device * dev )
349
323
{
350
- u32 tmr ;
351
324
int ret ;
352
325
struct qoriq_tmu_data * data = dev_get_drvdata (dev );
353
326
@@ -356,11 +329,7 @@ static int __maybe_unused qoriq_tmu_resume(struct device *dev)
356
329
return ret ;
357
330
358
331
/* Enable monitoring */
359
- tmr = tmu_read (data , & data -> regs -> tmr );
360
- tmr |= TMR_ME ;
361
- tmu_write (data , tmr , & data -> regs -> tmr );
362
-
363
- return 0 ;
332
+ return regmap_update_bits (data -> regmap , REGS_TMR , TMR_ME , TMR_ME );
364
333
}
365
334
366
335
static SIMPLE_DEV_PM_OPS (qoriq_tmu_pm_ops ,
0 commit comments