xref: /openbmc/linux/drivers/thermal/tegra/soctherm.c (revision 68198dca)
1 /*
2  * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
3  *
4  * Author:
5  *	Mikko Perttunen <mperttunen@nvidia.com>
6  *
7  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17 
18 #include <linux/debugfs.h>
19 #include <linux/bitops.h>
20 #include <linux/clk.h>
21 #include <linux/delay.h>
22 #include <linux/err.h>
23 #include <linux/interrupt.h>
24 #include <linux/io.h>
25 #include <linux/module.h>
26 #include <linux/of.h>
27 #include <linux/platform_device.h>
28 #include <linux/reset.h>
29 #include <linux/thermal.h>
30 
31 #include <dt-bindings/thermal/tegra124-soctherm.h>
32 
33 #include "../thermal_core.h"
34 #include "soctherm.h"
35 
36 #define SENSOR_CONFIG0				0
37 #define SENSOR_CONFIG0_STOP			BIT(0)
38 #define SENSOR_CONFIG0_CPTR_OVER		BIT(2)
39 #define SENSOR_CONFIG0_OVER			BIT(3)
40 #define SENSOR_CONFIG0_TCALC_OVER		BIT(4)
41 #define SENSOR_CONFIG0_TALL_MASK		(0xfffff << 8)
42 #define SENSOR_CONFIG0_TALL_SHIFT		8
43 
44 #define SENSOR_CONFIG1				4
45 #define SENSOR_CONFIG1_TSAMPLE_MASK		0x3ff
46 #define SENSOR_CONFIG1_TSAMPLE_SHIFT		0
47 #define SENSOR_CONFIG1_TIDDQ_EN_MASK		(0x3f << 15)
48 #define SENSOR_CONFIG1_TIDDQ_EN_SHIFT		15
49 #define SENSOR_CONFIG1_TEN_COUNT_MASK		(0x3f << 24)
50 #define SENSOR_CONFIG1_TEN_COUNT_SHIFT		24
51 #define SENSOR_CONFIG1_TEMP_ENABLE		BIT(31)
52 
53 /*
54  * SENSOR_CONFIG2 is defined in soctherm.h
55  * because, it will be used by tegra_soctherm_fuse.c
56  */
57 
58 #define SENSOR_STATUS0				0xc
59 #define SENSOR_STATUS0_VALID_MASK		BIT(31)
60 #define SENSOR_STATUS0_CAPTURE_MASK		0xffff
61 
62 #define SENSOR_STATUS1				0x10
63 #define SENSOR_STATUS1_TEMP_VALID_MASK		BIT(31)
64 #define SENSOR_STATUS1_TEMP_MASK		0xffff
65 
66 #define READBACK_VALUE_MASK			0xff00
67 #define READBACK_VALUE_SHIFT			8
68 #define READBACK_ADD_HALF			BIT(7)
69 #define READBACK_NEGATE				BIT(0)
70 
71 /*
72  * THERMCTL_LEVEL0_GROUP_CPU is defined in soctherm.h
73  * because it will be used by tegraxxx_soctherm.c
74  */
75 #define THERMCTL_LVL0_CPU0_EN_MASK		BIT(8)
76 #define THERMCTL_LVL0_CPU0_CPU_THROT_MASK	(0x3 << 5)
77 #define THERMCTL_LVL0_CPU0_CPU_THROT_LIGHT	0x1
78 #define THERMCTL_LVL0_CPU0_CPU_THROT_HEAVY	0x2
79 #define THERMCTL_LVL0_CPU0_GPU_THROT_MASK	(0x3 << 3)
80 #define THERMCTL_LVL0_CPU0_GPU_THROT_LIGHT	0x1
81 #define THERMCTL_LVL0_CPU0_GPU_THROT_HEAVY	0x2
82 #define THERMCTL_LVL0_CPU0_MEM_THROT_MASK	BIT(2)
83 #define THERMCTL_LVL0_CPU0_STATUS_MASK		0x3
84 
85 #define THERMCTL_LVL0_UP_STATS			0x10
86 #define THERMCTL_LVL0_DN_STATS			0x14
87 
88 #define THERMCTL_STATS_CTL			0x94
89 #define STATS_CTL_CLR_DN			0x8
90 #define STATS_CTL_EN_DN				0x4
91 #define STATS_CTL_CLR_UP			0x2
92 #define STATS_CTL_EN_UP				0x1
93 
94 #define THROT_GLOBAL_CFG			0x400
95 #define THROT_GLOBAL_ENB_MASK			BIT(0)
96 
97 #define CPU_PSKIP_STATUS			0x418
98 #define XPU_PSKIP_STATUS_M_MASK			(0xff << 12)
99 #define XPU_PSKIP_STATUS_N_MASK			(0xff << 4)
100 #define XPU_PSKIP_STATUS_SW_OVERRIDE_MASK	BIT(1)
101 #define XPU_PSKIP_STATUS_ENABLED_MASK		BIT(0)
102 
103 #define THROT_PRIORITY_LOCK			0x424
104 #define THROT_PRIORITY_LOCK_PRIORITY_MASK	0xff
105 
106 #define THROT_STATUS				0x428
107 #define THROT_STATUS_BREACH_MASK		BIT(12)
108 #define THROT_STATUS_STATE_MASK			(0xff << 4)
109 #define THROT_STATUS_ENABLED_MASK		BIT(0)
110 
111 #define THROT_PSKIP_CTRL_LITE_CPU		0x430
112 #define THROT_PSKIP_CTRL_ENABLE_MASK            BIT(31)
113 #define THROT_PSKIP_CTRL_DIVIDEND_MASK          (0xff << 8)
114 #define THROT_PSKIP_CTRL_DIVISOR_MASK           0xff
115 #define THROT_PSKIP_CTRL_VECT_GPU_MASK          (0x7 << 16)
116 #define THROT_PSKIP_CTRL_VECT_CPU_MASK          (0x7 << 8)
117 #define THROT_PSKIP_CTRL_VECT2_CPU_MASK         0x7
118 
119 #define THROT_VECT_NONE				0x0 /* 3'b000 */
120 #define THROT_VECT_LOW				0x1 /* 3'b001 */
121 #define THROT_VECT_MED				0x3 /* 3'b011 */
122 #define THROT_VECT_HIGH				0x7 /* 3'b111 */
123 
124 #define THROT_PSKIP_RAMP_LITE_CPU		0x434
125 #define THROT_PSKIP_RAMP_SEQ_BYPASS_MODE_MASK	BIT(31)
126 #define THROT_PSKIP_RAMP_DURATION_MASK		(0xffff << 8)
127 #define THROT_PSKIP_RAMP_STEP_MASK		0xff
128 
129 #define THROT_PRIORITY_LITE			0x444
130 #define THROT_PRIORITY_LITE_PRIO_MASK		0xff
131 
132 #define THROT_DELAY_LITE			0x448
133 #define THROT_DELAY_LITE_DELAY_MASK		0xff
134 
135 /* car register offsets needed for enabling HW throttling */
136 #define CAR_SUPER_CCLKG_DIVIDER			0x36c
137 #define CDIVG_USE_THERM_CONTROLS_MASK		BIT(30)
138 
139 /* ccroc register offsets needed for enabling HW throttling for Tegra132 */
140 #define CCROC_SUPER_CCLKG_DIVIDER		0x024
141 
142 #define CCROC_GLOBAL_CFG			0x148
143 
144 #define CCROC_THROT_PSKIP_RAMP_CPU		0x150
145 #define CCROC_THROT_PSKIP_RAMP_SEQ_BYPASS_MODE_MASK	BIT(31)
146 #define CCROC_THROT_PSKIP_RAMP_DURATION_MASK	(0xffff << 8)
147 #define CCROC_THROT_PSKIP_RAMP_STEP_MASK	0xff
148 
149 #define CCROC_THROT_PSKIP_CTRL_CPU		0x154
150 #define CCROC_THROT_PSKIP_CTRL_ENB_MASK		BIT(31)
151 #define CCROC_THROT_PSKIP_CTRL_DIVIDEND_MASK	(0xff << 8)
152 #define CCROC_THROT_PSKIP_CTRL_DIVISOR_MASK	0xff
153 
154 /* get val from register(r) mask bits(m) */
155 #define REG_GET_MASK(r, m)	(((r) & (m)) >> (ffs(m) - 1))
156 /* set val(v) to mask bits(m) of register(r) */
157 #define REG_SET_MASK(r, m, v)	(((r) & ~(m)) | \
158 				 (((v) & (m >> (ffs(m) - 1))) << (ffs(m) - 1)))
159 
160 /* get dividend from the depth */
161 #define THROT_DEPTH_DIVIDEND(depth)	((256 * (100 - (depth)) / 100) - 1)
162 
163 /* get THROT_PSKIP_xxx offset per LIGHT/HEAVY throt and CPU/GPU dev */
164 #define THROT_OFFSET			0x30
165 #define THROT_PSKIP_CTRL(throt, dev)	(THROT_PSKIP_CTRL_LITE_CPU + \
166 					(THROT_OFFSET * throt) + (8 * dev))
167 #define THROT_PSKIP_RAMP(throt, dev)	(THROT_PSKIP_RAMP_LITE_CPU + \
168 					(THROT_OFFSET * throt) + (8 * dev))
169 
170 /* get THROT_xxx_CTRL offset per LIGHT/HEAVY throt */
171 #define THROT_PRIORITY_CTRL(throt)	(THROT_PRIORITY_LITE + \
172 					(THROT_OFFSET * throt))
173 #define THROT_DELAY_CTRL(throt)		(THROT_DELAY_LITE + \
174 					(THROT_OFFSET * throt))
175 
176 /* get CCROC_THROT_PSKIP_xxx offset per HIGH/MED/LOW vect*/
177 #define CCROC_THROT_OFFSET			0x0c
178 #define CCROC_THROT_PSKIP_CTRL_CPU_REG(vect)    (CCROC_THROT_PSKIP_CTRL_CPU + \
179 						(CCROC_THROT_OFFSET * vect))
180 #define CCROC_THROT_PSKIP_RAMP_CPU_REG(vect)    (CCROC_THROT_PSKIP_RAMP_CPU + \
181 						(CCROC_THROT_OFFSET * vect))
182 
183 /* get THERMCTL_LEVELx offset per CPU/GPU/MEM/TSENSE rg and LEVEL0~3 lv */
184 #define THERMCTL_LVL_REGS_SIZE		0x20
185 #define THERMCTL_LVL_REG(rg, lv)	((rg) + ((lv) * THERMCTL_LVL_REGS_SIZE))
186 
187 static const int min_low_temp = -127000;
188 static const int max_high_temp = 127000;
189 
190 enum soctherm_throttle_id {
191 	THROTTLE_LIGHT = 0,
192 	THROTTLE_HEAVY,
193 	THROTTLE_SIZE,
194 };
195 
196 enum soctherm_throttle_dev_id {
197 	THROTTLE_DEV_CPU = 0,
198 	THROTTLE_DEV_GPU,
199 	THROTTLE_DEV_SIZE,
200 };
201 
202 static const char *const throt_names[] = {
203 	[THROTTLE_LIGHT] = "light",
204 	[THROTTLE_HEAVY] = "heavy",
205 };
206 
207 struct tegra_soctherm;
208 struct tegra_thermctl_zone {
209 	void __iomem *reg;
210 	struct device *dev;
211 	struct tegra_soctherm *ts;
212 	struct thermal_zone_device *tz;
213 	const struct tegra_tsensor_group *sg;
214 };
215 
216 struct soctherm_throt_cfg {
217 	const char *name;
218 	unsigned int id;
219 	u8 priority;
220 	u8 cpu_throt_level;
221 	u32 cpu_throt_depth;
222 	struct thermal_cooling_device *cdev;
223 	bool init;
224 };
225 
226 struct tegra_soctherm {
227 	struct reset_control *reset;
228 	struct clk *clock_tsensor;
229 	struct clk *clock_soctherm;
230 	void __iomem *regs;
231 	void __iomem *clk_regs;
232 	void __iomem *ccroc_regs;
233 
234 	u32 *calib;
235 	struct thermal_zone_device **thermctl_tzs;
236 	struct tegra_soctherm_soc *soc;
237 
238 	struct soctherm_throt_cfg throt_cfgs[THROTTLE_SIZE];
239 
240 	struct dentry *debugfs_dir;
241 };
242 
243 /**
244  * clk_writel() - writes a value to a CAR register
245  * @ts: pointer to a struct tegra_soctherm
246  * @v: the value to write
247  * @reg: the register offset
248  *
249  * Writes @v to @reg.  No return value.
250  */
251 static inline void clk_writel(struct tegra_soctherm *ts, u32 value, u32 reg)
252 {
253 	writel(value, (ts->clk_regs + reg));
254 }
255 
256 /**
257  * clk_readl() - reads specified register from CAR IP block
258  * @ts: pointer to a struct tegra_soctherm
259  * @reg: register address to be read
260  *
261  * Return: the value of the register
262  */
263 static inline u32 clk_readl(struct tegra_soctherm *ts, u32 reg)
264 {
265 	return readl(ts->clk_regs + reg);
266 }
267 
268 /**
269  * ccroc_writel() - writes a value to a CCROC register
270  * @ts: pointer to a struct tegra_soctherm
271  * @v: the value to write
272  * @reg: the register offset
273  *
274  * Writes @v to @reg.  No return value.
275  */
276 static inline void ccroc_writel(struct tegra_soctherm *ts, u32 value, u32 reg)
277 {
278 	writel(value, (ts->ccroc_regs + reg));
279 }
280 
281 /**
282  * ccroc_readl() - reads specified register from CCROC IP block
283  * @ts: pointer to a struct tegra_soctherm
284  * @reg: register address to be read
285  *
286  * Return: the value of the register
287  */
288 static inline u32 ccroc_readl(struct tegra_soctherm *ts, u32 reg)
289 {
290 	return readl(ts->ccroc_regs + reg);
291 }
292 
293 static void enable_tsensor(struct tegra_soctherm *tegra, unsigned int i)
294 {
295 	const struct tegra_tsensor *sensor = &tegra->soc->tsensors[i];
296 	void __iomem *base = tegra->regs + sensor->base;
297 	unsigned int val;
298 
299 	val = sensor->config->tall << SENSOR_CONFIG0_TALL_SHIFT;
300 	writel(val, base + SENSOR_CONFIG0);
301 
302 	val  = (sensor->config->tsample - 1) << SENSOR_CONFIG1_TSAMPLE_SHIFT;
303 	val |= sensor->config->tiddq_en << SENSOR_CONFIG1_TIDDQ_EN_SHIFT;
304 	val |= sensor->config->ten_count << SENSOR_CONFIG1_TEN_COUNT_SHIFT;
305 	val |= SENSOR_CONFIG1_TEMP_ENABLE;
306 	writel(val, base + SENSOR_CONFIG1);
307 
308 	writel(tegra->calib[i], base + SENSOR_CONFIG2);
309 }
310 
311 /*
312  * Translate from soctherm readback format to millicelsius.
313  * The soctherm readback format in bits is as follows:
314  *   TTTTTTTT H______N
315  * where T's contain the temperature in Celsius,
316  * H denotes an addition of 0.5 Celsius and N denotes negation
317  * of the final value.
318  */
319 static int translate_temp(u16 val)
320 {
321 	int t;
322 
323 	t = ((val & READBACK_VALUE_MASK) >> READBACK_VALUE_SHIFT) * 1000;
324 	if (val & READBACK_ADD_HALF)
325 		t += 500;
326 	if (val & READBACK_NEGATE)
327 		t *= -1;
328 
329 	return t;
330 }
331 
332 static int tegra_thermctl_get_temp(void *data, int *out_temp)
333 {
334 	struct tegra_thermctl_zone *zone = data;
335 	u32 val;
336 
337 	val = readl(zone->reg);
338 	val = REG_GET_MASK(val, zone->sg->sensor_temp_mask);
339 	*out_temp = translate_temp(val);
340 
341 	return 0;
342 }
343 
344 static int
345 thermtrip_program(struct device *dev, const struct tegra_tsensor_group *sg,
346 		  int trip_temp);
347 static int
348 throttrip_program(struct device *dev, const struct tegra_tsensor_group *sg,
349 		  struct soctherm_throt_cfg *stc, int trip_temp);
350 static struct soctherm_throt_cfg *
351 find_throttle_cfg_by_name(struct tegra_soctherm *ts, const char *name);
352 
353 static int tegra_thermctl_set_trip_temp(void *data, int trip, int temp)
354 {
355 	struct tegra_thermctl_zone *zone = data;
356 	struct thermal_zone_device *tz = zone->tz;
357 	struct tegra_soctherm *ts = zone->ts;
358 	const struct tegra_tsensor_group *sg = zone->sg;
359 	struct device *dev = zone->dev;
360 	enum thermal_trip_type type;
361 	int ret;
362 
363 	if (!tz)
364 		return -EINVAL;
365 
366 	ret = tz->ops->get_trip_type(tz, trip, &type);
367 	if (ret)
368 		return ret;
369 
370 	if (type == THERMAL_TRIP_CRITICAL) {
371 		return thermtrip_program(dev, sg, temp);
372 	} else if (type == THERMAL_TRIP_HOT) {
373 		int i;
374 
375 		for (i = 0; i < THROTTLE_SIZE; i++) {
376 			struct thermal_cooling_device *cdev;
377 			struct soctherm_throt_cfg *stc;
378 
379 			if (!ts->throt_cfgs[i].init)
380 				continue;
381 
382 			cdev = ts->throt_cfgs[i].cdev;
383 			if (get_thermal_instance(tz, cdev, trip))
384 				stc = find_throttle_cfg_by_name(ts, cdev->type);
385 			else
386 				continue;
387 
388 			return throttrip_program(dev, sg, stc, temp);
389 		}
390 	}
391 
392 	return 0;
393 }
394 
395 static const struct thermal_zone_of_device_ops tegra_of_thermal_ops = {
396 	.get_temp = tegra_thermctl_get_temp,
397 	.set_trip_temp = tegra_thermctl_set_trip_temp,
398 };
399 
400 /**
401  * enforce_temp_range() - check and enforce temperature range [min, max]
402  * @trip_temp: the trip temperature to check
403  *
404  * Checks and enforces the permitted temperature range that SOC_THERM
405  * HW can support This is
406  * done while taking care of precision.
407  *
408  * Return: The precision adjusted capped temperature in millicelsius.
409  */
410 static int enforce_temp_range(struct device *dev, int trip_temp)
411 {
412 	int temp;
413 
414 	temp = clamp_val(trip_temp, min_low_temp, max_high_temp);
415 	if (temp != trip_temp)
416 		dev_info(dev, "soctherm: trip temperature %d forced to %d\n",
417 			 trip_temp, temp);
418 	return temp;
419 }
420 
421 /**
422  * thermtrip_program() - Configures the hardware to shut down the
423  * system if a given sensor group reaches a given temperature
424  * @dev: ptr to the struct device for the SOC_THERM IP block
425  * @sg: pointer to the sensor group to set the thermtrip temperature for
426  * @trip_temp: the temperature in millicelsius to trigger the thermal trip at
427  *
428  * Sets the thermal trip threshold of the given sensor group to be the
429  * @trip_temp.  If this threshold is crossed, the hardware will shut
430  * down.
431  *
432  * Note that, although @trip_temp is specified in millicelsius, the
433  * hardware is programmed in degrees Celsius.
434  *
435  * Return: 0 upon success, or %-EINVAL upon failure.
436  */
437 static int thermtrip_program(struct device *dev,
438 			     const struct tegra_tsensor_group *sg,
439 			     int trip_temp)
440 {
441 	struct tegra_soctherm *ts = dev_get_drvdata(dev);
442 	int temp;
443 	u32 r;
444 
445 	if (!sg || !sg->thermtrip_threshold_mask)
446 		return -EINVAL;
447 
448 	temp = enforce_temp_range(dev, trip_temp) / ts->soc->thresh_grain;
449 
450 	r = readl(ts->regs + THERMCTL_THERMTRIP_CTL);
451 	r = REG_SET_MASK(r, sg->thermtrip_threshold_mask, temp);
452 	r = REG_SET_MASK(r, sg->thermtrip_enable_mask, 1);
453 	r = REG_SET_MASK(r, sg->thermtrip_any_en_mask, 0);
454 	writel(r, ts->regs + THERMCTL_THERMTRIP_CTL);
455 
456 	return 0;
457 }
458 
459 /**
460  * throttrip_program() - Configures the hardware to throttle the
461  * pulse if a given sensor group reaches a given temperature
462  * @dev: ptr to the struct device for the SOC_THERM IP block
463  * @sg: pointer to the sensor group to set the thermtrip temperature for
464  * @stc: pointer to the throttle need to be triggered
465  * @trip_temp: the temperature in millicelsius to trigger the thermal trip at
466  *
467  * Sets the thermal trip threshold and throttle event of the given sensor
468  * group. If this threshold is crossed, the hardware will trigger the
469  * throttle.
470  *
471  * Note that, although @trip_temp is specified in millicelsius, the
472  * hardware is programmed in degrees Celsius.
473  *
474  * Return: 0 upon success, or %-EINVAL upon failure.
475  */
476 static int throttrip_program(struct device *dev,
477 			     const struct tegra_tsensor_group *sg,
478 			     struct soctherm_throt_cfg *stc,
479 			     int trip_temp)
480 {
481 	struct tegra_soctherm *ts = dev_get_drvdata(dev);
482 	int temp, cpu_throt, gpu_throt;
483 	unsigned int throt;
484 	u32 r, reg_off;
485 
486 	if (!sg || !stc || !stc->init)
487 		return -EINVAL;
488 
489 	temp = enforce_temp_range(dev, trip_temp) / ts->soc->thresh_grain;
490 
491 	/* Hardcode LIGHT on LEVEL1 and HEAVY on LEVEL2 */
492 	throt = stc->id;
493 	reg_off = THERMCTL_LVL_REG(sg->thermctl_lvl0_offset, throt + 1);
494 
495 	if (throt == THROTTLE_LIGHT) {
496 		cpu_throt = THERMCTL_LVL0_CPU0_CPU_THROT_LIGHT;
497 		gpu_throt = THERMCTL_LVL0_CPU0_GPU_THROT_LIGHT;
498 	} else {
499 		cpu_throt = THERMCTL_LVL0_CPU0_CPU_THROT_HEAVY;
500 		gpu_throt = THERMCTL_LVL0_CPU0_GPU_THROT_HEAVY;
501 		if (throt != THROTTLE_HEAVY)
502 			dev_warn(dev,
503 				 "invalid throt id %d - assuming HEAVY",
504 				 throt);
505 	}
506 
507 	r = readl(ts->regs + reg_off);
508 	r = REG_SET_MASK(r, sg->thermctl_lvl0_up_thresh_mask, temp);
509 	r = REG_SET_MASK(r, sg->thermctl_lvl0_dn_thresh_mask, temp);
510 	r = REG_SET_MASK(r, THERMCTL_LVL0_CPU0_CPU_THROT_MASK, cpu_throt);
511 	r = REG_SET_MASK(r, THERMCTL_LVL0_CPU0_GPU_THROT_MASK, gpu_throt);
512 	r = REG_SET_MASK(r, THERMCTL_LVL0_CPU0_EN_MASK, 1);
513 	writel(r, ts->regs + reg_off);
514 
515 	return 0;
516 }
517 
518 static struct soctherm_throt_cfg *
519 find_throttle_cfg_by_name(struct tegra_soctherm *ts, const char *name)
520 {
521 	unsigned int i;
522 
523 	for (i = 0; ts->throt_cfgs[i].name; i++)
524 		if (!strcmp(ts->throt_cfgs[i].name, name))
525 			return &ts->throt_cfgs[i];
526 
527 	return NULL;
528 }
529 
530 static int get_hot_temp(struct thermal_zone_device *tz, int *trip, int *temp)
531 {
532 	int ntrips, i, ret;
533 	enum thermal_trip_type type;
534 
535 	ntrips = of_thermal_get_ntrips(tz);
536 	if (ntrips <= 0)
537 		return -EINVAL;
538 
539 	for (i = 0; i < ntrips; i++) {
540 		ret = tz->ops->get_trip_type(tz, i, &type);
541 		if (ret)
542 			return -EINVAL;
543 		if (type == THERMAL_TRIP_HOT) {
544 			ret = tz->ops->get_trip_temp(tz, i, temp);
545 			if (!ret)
546 				*trip = i;
547 
548 			return ret;
549 		}
550 	}
551 
552 	return -EINVAL;
553 }
554 
555 /**
556  * tegra_soctherm_set_hwtrips() - set HW trip point from DT data
557  * @dev: struct device * of the SOC_THERM instance
558  *
559  * Configure the SOC_THERM HW trip points, setting "THERMTRIP"
560  * "THROTTLE" trip points , using "critical" or "hot" type trip_temp
561  * from thermal zone.
562  * After they have been configured, THERMTRIP or THROTTLE will take
563  * action when the configured SoC thermal sensor group reaches a
564  * certain temperature.
565  *
566  * Return: 0 upon success, or a negative error code on failure.
567  * "Success" does not mean that trips was enabled; it could also
568  * mean that no node was found in DT.
569  * THERMTRIP has been enabled successfully when a message similar to
570  * this one appears on the serial console:
571  * "thermtrip: will shut down when sensor group XXX reaches YYYYYY mC"
572  * THROTTLE has been enabled successfully when a message similar to
573  * this one appears on the serial console:
574  * ""throttrip: will throttle when sensor group XXX reaches YYYYYY mC"
575  */
576 static int tegra_soctherm_set_hwtrips(struct device *dev,
577 				      const struct tegra_tsensor_group *sg,
578 				      struct thermal_zone_device *tz)
579 {
580 	struct tegra_soctherm *ts = dev_get_drvdata(dev);
581 	struct soctherm_throt_cfg *stc;
582 	int i, trip, temperature;
583 	int ret;
584 
585 	ret = tz->ops->get_crit_temp(tz, &temperature);
586 	if (ret) {
587 		dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
588 			 sg->name);
589 		goto set_throttle;
590 	}
591 
592 	ret = thermtrip_program(dev, sg, temperature);
593 	if (ret) {
594 		dev_err(dev, "thermtrip: %s: error during enable\n",
595 			sg->name);
596 		return ret;
597 	}
598 
599 	dev_info(dev,
600 		 "thermtrip: will shut down when %s reaches %d mC\n",
601 		 sg->name, temperature);
602 
603 set_throttle:
604 	ret = get_hot_temp(tz, &trip, &temperature);
605 	if (ret) {
606 		dev_warn(dev, "throttrip: %s: missing hot temperature\n",
607 			 sg->name);
608 		return 0;
609 	}
610 
611 	for (i = 0; i < THROTTLE_SIZE; i++) {
612 		struct thermal_cooling_device *cdev;
613 
614 		if (!ts->throt_cfgs[i].init)
615 			continue;
616 
617 		cdev = ts->throt_cfgs[i].cdev;
618 		if (get_thermal_instance(tz, cdev, trip))
619 			stc = find_throttle_cfg_by_name(ts, cdev->type);
620 		else
621 			continue;
622 
623 		ret = throttrip_program(dev, sg, stc, temperature);
624 		if (ret) {
625 			dev_err(dev, "throttrip: %s: error during enable\n",
626 				sg->name);
627 			return ret;
628 		}
629 
630 		dev_info(dev,
631 			 "throttrip: will throttle when %s reaches %d mC\n",
632 			 sg->name, temperature);
633 		break;
634 	}
635 
636 	if (i == THROTTLE_SIZE)
637 		dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
638 			 sg->name);
639 
640 	return 0;
641 }
642 
643 #ifdef CONFIG_DEBUG_FS
644 static int regs_show(struct seq_file *s, void *data)
645 {
646 	struct platform_device *pdev = s->private;
647 	struct tegra_soctherm *ts = platform_get_drvdata(pdev);
648 	const struct tegra_tsensor *tsensors = ts->soc->tsensors;
649 	const struct tegra_tsensor_group **ttgs = ts->soc->ttgs;
650 	u32 r, state;
651 	int i, level;
652 
653 	seq_puts(s, "-----TSENSE (convert HW)-----\n");
654 
655 	for (i = 0; i < ts->soc->num_tsensors; i++) {
656 		r = readl(ts->regs + tsensors[i].base + SENSOR_CONFIG1);
657 		state = REG_GET_MASK(r, SENSOR_CONFIG1_TEMP_ENABLE);
658 
659 		seq_printf(s, "%s: ", tsensors[i].name);
660 		seq_printf(s, "En(%d) ", state);
661 
662 		if (!state) {
663 			seq_puts(s, "\n");
664 			continue;
665 		}
666 
667 		state = REG_GET_MASK(r, SENSOR_CONFIG1_TIDDQ_EN_MASK);
668 		seq_printf(s, "tiddq(%d) ", state);
669 		state = REG_GET_MASK(r, SENSOR_CONFIG1_TEN_COUNT_MASK);
670 		seq_printf(s, "ten_count(%d) ", state);
671 		state = REG_GET_MASK(r, SENSOR_CONFIG1_TSAMPLE_MASK);
672 		seq_printf(s, "tsample(%d) ", state + 1);
673 
674 		r = readl(ts->regs + tsensors[i].base + SENSOR_STATUS1);
675 		state = REG_GET_MASK(r, SENSOR_STATUS1_TEMP_VALID_MASK);
676 		seq_printf(s, "Temp(%d/", state);
677 		state = REG_GET_MASK(r, SENSOR_STATUS1_TEMP_MASK);
678 		seq_printf(s, "%d) ", translate_temp(state));
679 
680 		r = readl(ts->regs + tsensors[i].base + SENSOR_STATUS0);
681 		state = REG_GET_MASK(r, SENSOR_STATUS0_VALID_MASK);
682 		seq_printf(s, "Capture(%d/", state);
683 		state = REG_GET_MASK(r, SENSOR_STATUS0_CAPTURE_MASK);
684 		seq_printf(s, "%d) ", state);
685 
686 		r = readl(ts->regs + tsensors[i].base + SENSOR_CONFIG0);
687 		state = REG_GET_MASK(r, SENSOR_CONFIG0_STOP);
688 		seq_printf(s, "Stop(%d) ", state);
689 		state = REG_GET_MASK(r, SENSOR_CONFIG0_TALL_MASK);
690 		seq_printf(s, "Tall(%d) ", state);
691 		state = REG_GET_MASK(r, SENSOR_CONFIG0_TCALC_OVER);
692 		seq_printf(s, "Over(%d/", state);
693 		state = REG_GET_MASK(r, SENSOR_CONFIG0_OVER);
694 		seq_printf(s, "%d/", state);
695 		state = REG_GET_MASK(r, SENSOR_CONFIG0_CPTR_OVER);
696 		seq_printf(s, "%d) ", state);
697 
698 		r = readl(ts->regs + tsensors[i].base + SENSOR_CONFIG2);
699 		state = REG_GET_MASK(r, SENSOR_CONFIG2_THERMA_MASK);
700 		seq_printf(s, "Therm_A/B(%d/", state);
701 		state = REG_GET_MASK(r, SENSOR_CONFIG2_THERMB_MASK);
702 		seq_printf(s, "%d)\n", (s16)state);
703 	}
704 
705 	r = readl(ts->regs + SENSOR_PDIV);
706 	seq_printf(s, "PDIV: 0x%x\n", r);
707 
708 	r = readl(ts->regs + SENSOR_HOTSPOT_OFF);
709 	seq_printf(s, "HOTSPOT: 0x%x\n", r);
710 
711 	seq_puts(s, "\n");
712 	seq_puts(s, "-----SOC_THERM-----\n");
713 
714 	r = readl(ts->regs + SENSOR_TEMP1);
715 	state = REG_GET_MASK(r, SENSOR_TEMP1_CPU_TEMP_MASK);
716 	seq_printf(s, "Temperatures: CPU(%d) ", translate_temp(state));
717 	state = REG_GET_MASK(r, SENSOR_TEMP1_GPU_TEMP_MASK);
718 	seq_printf(s, " GPU(%d) ", translate_temp(state));
719 	r = readl(ts->regs + SENSOR_TEMP2);
720 	state = REG_GET_MASK(r, SENSOR_TEMP2_PLLX_TEMP_MASK);
721 	seq_printf(s, " PLLX(%d) ", translate_temp(state));
722 	state = REG_GET_MASK(r, SENSOR_TEMP2_MEM_TEMP_MASK);
723 	seq_printf(s, " MEM(%d)\n", translate_temp(state));
724 
725 	for (i = 0; i < ts->soc->num_ttgs; i++) {
726 		seq_printf(s, "%s:\n", ttgs[i]->name);
727 		for (level = 0; level < 4; level++) {
728 			s32 v;
729 			u32 mask;
730 			u16 off = ttgs[i]->thermctl_lvl0_offset;
731 
732 			r = readl(ts->regs + THERMCTL_LVL_REG(off, level));
733 
734 			mask = ttgs[i]->thermctl_lvl0_up_thresh_mask;
735 			state = REG_GET_MASK(r, mask);
736 			v = sign_extend32(state, ts->soc->bptt - 1);
737 			v *= ts->soc->thresh_grain;
738 			seq_printf(s, "   %d: Up/Dn(%d /", level, v);
739 
740 			mask = ttgs[i]->thermctl_lvl0_dn_thresh_mask;
741 			state = REG_GET_MASK(r, mask);
742 			v = sign_extend32(state, ts->soc->bptt - 1);
743 			v *= ts->soc->thresh_grain;
744 			seq_printf(s, "%d ) ", v);
745 
746 			mask = THERMCTL_LVL0_CPU0_EN_MASK;
747 			state = REG_GET_MASK(r, mask);
748 			seq_printf(s, "En(%d) ", state);
749 
750 			mask = THERMCTL_LVL0_CPU0_CPU_THROT_MASK;
751 			state = REG_GET_MASK(r, mask);
752 			seq_puts(s, "CPU Throt");
753 			if (!state)
754 				seq_printf(s, "(%s) ", "none");
755 			else if (state == THERMCTL_LVL0_CPU0_CPU_THROT_LIGHT)
756 				seq_printf(s, "(%s) ", "L");
757 			else if (state == THERMCTL_LVL0_CPU0_CPU_THROT_HEAVY)
758 				seq_printf(s, "(%s) ", "H");
759 			else
760 				seq_printf(s, "(%s) ", "H+L");
761 
762 			mask = THERMCTL_LVL0_CPU0_GPU_THROT_MASK;
763 			state = REG_GET_MASK(r, mask);
764 			seq_puts(s, "GPU Throt");
765 			if (!state)
766 				seq_printf(s, "(%s) ", "none");
767 			else if (state == THERMCTL_LVL0_CPU0_GPU_THROT_LIGHT)
768 				seq_printf(s, "(%s) ", "L");
769 			else if (state == THERMCTL_LVL0_CPU0_GPU_THROT_HEAVY)
770 				seq_printf(s, "(%s) ", "H");
771 			else
772 				seq_printf(s, "(%s) ", "H+L");
773 
774 			mask = THERMCTL_LVL0_CPU0_STATUS_MASK;
775 			state = REG_GET_MASK(r, mask);
776 			seq_printf(s, "Status(%s)\n",
777 				   state == 0 ? "LO" :
778 				   state == 1 ? "In" :
779 				   state == 2 ? "Res" : "HI");
780 		}
781 	}
782 
783 	r = readl(ts->regs + THERMCTL_STATS_CTL);
784 	seq_printf(s, "STATS: Up(%s) Dn(%s)\n",
785 		   r & STATS_CTL_EN_UP ? "En" : "--",
786 		   r & STATS_CTL_EN_DN ? "En" : "--");
787 
788 	for (level = 0; level < 4; level++) {
789 		u16 off;
790 
791 		off = THERMCTL_LVL0_UP_STATS;
792 		r = readl(ts->regs + THERMCTL_LVL_REG(off, level));
793 		seq_printf(s, "  Level_%d Up(%d) ", level, r);
794 
795 		off = THERMCTL_LVL0_DN_STATS;
796 		r = readl(ts->regs + THERMCTL_LVL_REG(off, level));
797 		seq_printf(s, "Dn(%d)\n", r);
798 	}
799 
800 	r = readl(ts->regs + THERMCTL_THERMTRIP_CTL);
801 	state = REG_GET_MASK(r, ttgs[0]->thermtrip_any_en_mask);
802 	seq_printf(s, "Thermtrip Any En(%d)\n", state);
803 	for (i = 0; i < ts->soc->num_ttgs; i++) {
804 		state = REG_GET_MASK(r, ttgs[i]->thermtrip_enable_mask);
805 		seq_printf(s, "     %s En(%d) ", ttgs[i]->name, state);
806 		state = REG_GET_MASK(r, ttgs[i]->thermtrip_threshold_mask);
807 		state *= ts->soc->thresh_grain;
808 		seq_printf(s, "Thresh(%d)\n", state);
809 	}
810 
811 	r = readl(ts->regs + THROT_GLOBAL_CFG);
812 	seq_puts(s, "\n");
813 	seq_printf(s, "GLOBAL THROTTLE CONFIG: 0x%08x\n", r);
814 
815 	seq_puts(s, "---------------------------------------------------\n");
816 	r = readl(ts->regs + THROT_STATUS);
817 	state = REG_GET_MASK(r, THROT_STATUS_BREACH_MASK);
818 	seq_printf(s, "THROT STATUS: breach(%d) ", state);
819 	state = REG_GET_MASK(r, THROT_STATUS_STATE_MASK);
820 	seq_printf(s, "state(%d) ", state);
821 	state = REG_GET_MASK(r, THROT_STATUS_ENABLED_MASK);
822 	seq_printf(s, "enabled(%d)\n", state);
823 
824 	r = readl(ts->regs + CPU_PSKIP_STATUS);
825 	if (ts->soc->use_ccroc) {
826 		state = REG_GET_MASK(r, XPU_PSKIP_STATUS_ENABLED_MASK);
827 		seq_printf(s, "CPU PSKIP STATUS: enabled(%d)\n", state);
828 	} else {
829 		state = REG_GET_MASK(r, XPU_PSKIP_STATUS_M_MASK);
830 		seq_printf(s, "CPU PSKIP STATUS: M(%d) ", state);
831 		state = REG_GET_MASK(r, XPU_PSKIP_STATUS_N_MASK);
832 		seq_printf(s, "N(%d) ", state);
833 		state = REG_GET_MASK(r, XPU_PSKIP_STATUS_ENABLED_MASK);
834 		seq_printf(s, "enabled(%d)\n", state);
835 	}
836 
837 	return 0;
838 }
839 
840 static int regs_open(struct inode *inode, struct file *file)
841 {
842 	return single_open(file, regs_show, inode->i_private);
843 }
844 
845 static const struct file_operations regs_fops = {
846 	.open		= regs_open,
847 	.read		= seq_read,
848 	.llseek		= seq_lseek,
849 	.release	= single_release,
850 };
851 
852 static void soctherm_debug_init(struct platform_device *pdev)
853 {
854 	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
855 	struct dentry *root, *file;
856 
857 	root = debugfs_create_dir("soctherm", NULL);
858 	if (!root) {
859 		dev_err(&pdev->dev, "failed to create debugfs directory\n");
860 		return;
861 	}
862 
863 	tegra->debugfs_dir = root;
864 
865 	file = debugfs_create_file("reg_contents", 0644, root,
866 				   pdev, &regs_fops);
867 	if (!file) {
868 		dev_err(&pdev->dev, "failed to create debugfs file\n");
869 		debugfs_remove_recursive(tegra->debugfs_dir);
870 		tegra->debugfs_dir = NULL;
871 	}
872 }
873 #else
874 static inline void soctherm_debug_init(struct platform_device *pdev) {}
875 #endif
876 
877 static int soctherm_clk_enable(struct platform_device *pdev, bool enable)
878 {
879 	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
880 	int err;
881 
882 	if (!tegra->clock_soctherm || !tegra->clock_tsensor)
883 		return -EINVAL;
884 
885 	reset_control_assert(tegra->reset);
886 
887 	if (enable) {
888 		err = clk_prepare_enable(tegra->clock_soctherm);
889 		if (err) {
890 			reset_control_deassert(tegra->reset);
891 			return err;
892 		}
893 
894 		err = clk_prepare_enable(tegra->clock_tsensor);
895 		if (err) {
896 			clk_disable_unprepare(tegra->clock_soctherm);
897 			reset_control_deassert(tegra->reset);
898 			return err;
899 		}
900 	} else {
901 		clk_disable_unprepare(tegra->clock_tsensor);
902 		clk_disable_unprepare(tegra->clock_soctherm);
903 	}
904 
905 	reset_control_deassert(tegra->reset);
906 
907 	return 0;
908 }
909 
910 static int throt_get_cdev_max_state(struct thermal_cooling_device *cdev,
911 				    unsigned long *max_state)
912 {
913 	*max_state = 1;
914 	return 0;
915 }
916 
917 static int throt_get_cdev_cur_state(struct thermal_cooling_device *cdev,
918 				    unsigned long *cur_state)
919 {
920 	struct tegra_soctherm *ts = cdev->devdata;
921 	u32 r;
922 
923 	r = readl(ts->regs + THROT_STATUS);
924 	if (REG_GET_MASK(r, THROT_STATUS_STATE_MASK))
925 		*cur_state = 1;
926 	else
927 		*cur_state = 0;
928 
929 	return 0;
930 }
931 
932 static int throt_set_cdev_state(struct thermal_cooling_device *cdev,
933 				unsigned long cur_state)
934 {
935 	return 0;
936 }
937 
938 static struct thermal_cooling_device_ops throt_cooling_ops = {
939 	.get_max_state = throt_get_cdev_max_state,
940 	.get_cur_state = throt_get_cdev_cur_state,
941 	.set_cur_state = throt_set_cdev_state,
942 };
943 
944 /**
945  * soctherm_init_hw_throt_cdev() - Parse the HW throttle configurations
946  * and register them as cooling devices.
947  */
948 static void soctherm_init_hw_throt_cdev(struct platform_device *pdev)
949 {
950 	struct device *dev = &pdev->dev;
951 	struct tegra_soctherm *ts = dev_get_drvdata(dev);
952 	struct device_node *np_stc, *np_stcc;
953 	const char *name;
954 	u32 val;
955 	int i, r;
956 
957 	for (i = 0; i < THROTTLE_SIZE; i++) {
958 		ts->throt_cfgs[i].name = throt_names[i];
959 		ts->throt_cfgs[i].id = i;
960 		ts->throt_cfgs[i].init = false;
961 	}
962 
963 	np_stc = of_get_child_by_name(dev->of_node, "throttle-cfgs");
964 	if (!np_stc) {
965 		dev_info(dev,
966 			 "throttle-cfg: no throttle-cfgs - not enabling\n");
967 		return;
968 	}
969 
970 	for_each_child_of_node(np_stc, np_stcc) {
971 		struct soctherm_throt_cfg *stc;
972 		struct thermal_cooling_device *tcd;
973 
974 		name = np_stcc->name;
975 		stc = find_throttle_cfg_by_name(ts, name);
976 		if (!stc) {
977 			dev_err(dev,
978 				"throttle-cfg: could not find %s\n", name);
979 			continue;
980 		}
981 
982 		r = of_property_read_u32(np_stcc, "nvidia,priority", &val);
983 		if (r) {
984 			dev_info(dev,
985 				 "throttle-cfg: %s: missing priority\n", name);
986 			continue;
987 		}
988 		stc->priority = val;
989 
990 		if (ts->soc->use_ccroc) {
991 			r = of_property_read_u32(np_stcc,
992 						 "nvidia,cpu-throt-level",
993 						 &val);
994 			if (r) {
995 				dev_info(dev,
996 					 "throttle-cfg: %s: missing cpu-throt-level\n",
997 					 name);
998 				continue;
999 			}
1000 			stc->cpu_throt_level = val;
1001 		} else {
1002 			r = of_property_read_u32(np_stcc,
1003 						 "nvidia,cpu-throt-percent",
1004 						 &val);
1005 			if (r) {
1006 				dev_info(dev,
1007 					 "throttle-cfg: %s: missing cpu-throt-percent\n",
1008 					 name);
1009 				continue;
1010 			}
1011 			stc->cpu_throt_depth = val;
1012 		}
1013 
1014 		tcd = thermal_of_cooling_device_register(np_stcc,
1015 							 (char *)name, ts,
1016 							 &throt_cooling_ops);
1017 		of_node_put(np_stcc);
1018 		if (IS_ERR_OR_NULL(tcd)) {
1019 			dev_err(dev,
1020 				"throttle-cfg: %s: failed to register cooling device\n",
1021 				name);
1022 			continue;
1023 		}
1024 
1025 		stc->cdev = tcd;
1026 		stc->init = true;
1027 	}
1028 
1029 	of_node_put(np_stc);
1030 }
1031 
1032 /**
1033  * throttlectl_cpu_level_cfg() - programs CCROC NV_THERM level config
1034  * @level: describing the level LOW/MED/HIGH of throttling
1035  *
1036  * It's necessary to set up the CPU-local CCROC NV_THERM instance with
1037  * the M/N values desired for each level. This function does this.
1038  *
1039  * This function pre-programs the CCROC NV_THERM levels in terms of
1040  * pre-configured "Low", "Medium" or "Heavy" throttle levels which are
1041  * mapped to THROT_LEVEL_LOW, THROT_LEVEL_MED and THROT_LEVEL_HVY.
1042  */
1043 static void throttlectl_cpu_level_cfg(struct tegra_soctherm *ts, int level)
1044 {
1045 	u8 depth, dividend;
1046 	u32 r;
1047 
1048 	switch (level) {
1049 	case TEGRA_SOCTHERM_THROT_LEVEL_LOW:
1050 		depth = 50;
1051 		break;
1052 	case TEGRA_SOCTHERM_THROT_LEVEL_MED:
1053 		depth = 75;
1054 		break;
1055 	case TEGRA_SOCTHERM_THROT_LEVEL_HIGH:
1056 		depth = 80;
1057 		break;
1058 	case TEGRA_SOCTHERM_THROT_LEVEL_NONE:
1059 		return;
1060 	default:
1061 		return;
1062 	}
1063 
1064 	dividend = THROT_DEPTH_DIVIDEND(depth);
1065 
1066 	/* setup PSKIP in ccroc nv_therm registers */
1067 	r = ccroc_readl(ts, CCROC_THROT_PSKIP_RAMP_CPU_REG(level));
1068 	r = REG_SET_MASK(r, CCROC_THROT_PSKIP_RAMP_DURATION_MASK, 0xff);
1069 	r = REG_SET_MASK(r, CCROC_THROT_PSKIP_RAMP_STEP_MASK, 0xf);
1070 	ccroc_writel(ts, r, CCROC_THROT_PSKIP_RAMP_CPU_REG(level));
1071 
1072 	r = ccroc_readl(ts, CCROC_THROT_PSKIP_CTRL_CPU_REG(level));
1073 	r = REG_SET_MASK(r, CCROC_THROT_PSKIP_CTRL_ENB_MASK, 1);
1074 	r = REG_SET_MASK(r, CCROC_THROT_PSKIP_CTRL_DIVIDEND_MASK, dividend);
1075 	r = REG_SET_MASK(r, CCROC_THROT_PSKIP_CTRL_DIVISOR_MASK, 0xff);
1076 	ccroc_writel(ts, r, CCROC_THROT_PSKIP_CTRL_CPU_REG(level));
1077 }
1078 
1079 /**
1080  * throttlectl_cpu_level_select() - program CPU pulse skipper config
1081  * @throt: the LIGHT/HEAVY of throttle event id
1082  *
1083  * Pulse skippers are used to throttle clock frequencies.  This
1084  * function programs the pulse skippers based on @throt and platform
1085  * data.  This function is used on SoCs which have CPU-local pulse
1086  * skipper control, such as T13x. It programs soctherm's interface to
1087  * Denver:CCROC NV_THERM in terms of Low, Medium and HIGH throttling
1088  * vectors. PSKIP_BYPASS mode is set as required per HW spec.
1089  */
1090 static void throttlectl_cpu_level_select(struct tegra_soctherm *ts,
1091 					 enum soctherm_throttle_id throt)
1092 {
1093 	u32 r, throt_vect;
1094 
1095 	/* Denver:CCROC NV_THERM interface N:3 Mapping */
1096 	switch (ts->throt_cfgs[throt].cpu_throt_level) {
1097 	case TEGRA_SOCTHERM_THROT_LEVEL_LOW:
1098 		throt_vect = THROT_VECT_LOW;
1099 		break;
1100 	case TEGRA_SOCTHERM_THROT_LEVEL_MED:
1101 		throt_vect = THROT_VECT_MED;
1102 		break;
1103 	case TEGRA_SOCTHERM_THROT_LEVEL_HIGH:
1104 		throt_vect = THROT_VECT_HIGH;
1105 		break;
1106 	default:
1107 		throt_vect = THROT_VECT_NONE;
1108 		break;
1109 	}
1110 
1111 	r = readl(ts->regs + THROT_PSKIP_CTRL(throt, THROTTLE_DEV_CPU));
1112 	r = REG_SET_MASK(r, THROT_PSKIP_CTRL_ENABLE_MASK, 1);
1113 	r = REG_SET_MASK(r, THROT_PSKIP_CTRL_VECT_CPU_MASK, throt_vect);
1114 	r = REG_SET_MASK(r, THROT_PSKIP_CTRL_VECT2_CPU_MASK, throt_vect);
1115 	writel(r, ts->regs + THROT_PSKIP_CTRL(throt, THROTTLE_DEV_CPU));
1116 
1117 	/* bypass sequencer in soc_therm as it is programmed in ccroc */
1118 	r = REG_SET_MASK(0, THROT_PSKIP_RAMP_SEQ_BYPASS_MODE_MASK, 1);
1119 	writel(r, ts->regs + THROT_PSKIP_RAMP(throt, THROTTLE_DEV_CPU));
1120 }
1121 
1122 /**
1123  * throttlectl_cpu_mn() - program CPU pulse skipper configuration
1124  * @throt: the LIGHT/HEAVY of throttle event id
1125  *
1126  * Pulse skippers are used to throttle clock frequencies.  This
1127  * function programs the pulse skippers based on @throt and platform
1128  * data.  This function is used for CPUs that have "remote" pulse
1129  * skipper control, e.g., the CPU pulse skipper is controlled by the
1130  * SOC_THERM IP block.  (SOC_THERM is located outside the CPU
1131  * complex.)
1132  */
1133 static void throttlectl_cpu_mn(struct tegra_soctherm *ts,
1134 			       enum soctherm_throttle_id throt)
1135 {
1136 	u32 r;
1137 	int depth;
1138 	u8 dividend;
1139 
1140 	depth = ts->throt_cfgs[throt].cpu_throt_depth;
1141 	dividend = THROT_DEPTH_DIVIDEND(depth);
1142 
1143 	r = readl(ts->regs + THROT_PSKIP_CTRL(throt, THROTTLE_DEV_CPU));
1144 	r = REG_SET_MASK(r, THROT_PSKIP_CTRL_ENABLE_MASK, 1);
1145 	r = REG_SET_MASK(r, THROT_PSKIP_CTRL_DIVIDEND_MASK, dividend);
1146 	r = REG_SET_MASK(r, THROT_PSKIP_CTRL_DIVISOR_MASK, 0xff);
1147 	writel(r, ts->regs + THROT_PSKIP_CTRL(throt, THROTTLE_DEV_CPU));
1148 
1149 	r = readl(ts->regs + THROT_PSKIP_RAMP(throt, THROTTLE_DEV_CPU));
1150 	r = REG_SET_MASK(r, THROT_PSKIP_RAMP_DURATION_MASK, 0xff);
1151 	r = REG_SET_MASK(r, THROT_PSKIP_RAMP_STEP_MASK, 0xf);
1152 	writel(r, ts->regs + THROT_PSKIP_RAMP(throt, THROTTLE_DEV_CPU));
1153 }
1154 
1155 /**
1156  * soctherm_throttle_program() - programs pulse skippers' configuration
1157  * @throt: the LIGHT/HEAVY of the throttle event id.
1158  *
1159  * Pulse skippers are used to throttle clock frequencies.
1160  * This function programs the pulse skippers.
1161  */
1162 static void soctherm_throttle_program(struct tegra_soctherm *ts,
1163 				      enum soctherm_throttle_id throt)
1164 {
1165 	u32 r;
1166 	struct soctherm_throt_cfg stc = ts->throt_cfgs[throt];
1167 
1168 	if (!stc.init)
1169 		return;
1170 
1171 	/* Setup PSKIP parameters */
1172 	if (ts->soc->use_ccroc)
1173 		throttlectl_cpu_level_select(ts, throt);
1174 	else
1175 		throttlectl_cpu_mn(ts, throt);
1176 
1177 	r = REG_SET_MASK(0, THROT_PRIORITY_LITE_PRIO_MASK, stc.priority);
1178 	writel(r, ts->regs + THROT_PRIORITY_CTRL(throt));
1179 
1180 	r = REG_SET_MASK(0, THROT_DELAY_LITE_DELAY_MASK, 0);
1181 	writel(r, ts->regs + THROT_DELAY_CTRL(throt));
1182 
1183 	r = readl(ts->regs + THROT_PRIORITY_LOCK);
1184 	r = REG_GET_MASK(r, THROT_PRIORITY_LOCK_PRIORITY_MASK);
1185 	if (r >= stc.priority)
1186 		return;
1187 	r = REG_SET_MASK(0, THROT_PRIORITY_LOCK_PRIORITY_MASK,
1188 			 stc.priority);
1189 	writel(r, ts->regs + THROT_PRIORITY_LOCK);
1190 }
1191 
1192 static void tegra_soctherm_throttle(struct device *dev)
1193 {
1194 	struct tegra_soctherm *ts = dev_get_drvdata(dev);
1195 	u32 v;
1196 	int i;
1197 
1198 	/* configure LOW, MED and HIGH levels for CCROC NV_THERM */
1199 	if (ts->soc->use_ccroc) {
1200 		throttlectl_cpu_level_cfg(ts, TEGRA_SOCTHERM_THROT_LEVEL_LOW);
1201 		throttlectl_cpu_level_cfg(ts, TEGRA_SOCTHERM_THROT_LEVEL_MED);
1202 		throttlectl_cpu_level_cfg(ts, TEGRA_SOCTHERM_THROT_LEVEL_HIGH);
1203 	}
1204 
1205 	/* Thermal HW throttle programming */
1206 	for (i = 0; i < THROTTLE_SIZE; i++)
1207 		soctherm_throttle_program(ts, i);
1208 
1209 	v = REG_SET_MASK(0, THROT_GLOBAL_ENB_MASK, 1);
1210 	if (ts->soc->use_ccroc) {
1211 		ccroc_writel(ts, v, CCROC_GLOBAL_CFG);
1212 
1213 		v = ccroc_readl(ts, CCROC_SUPER_CCLKG_DIVIDER);
1214 		v = REG_SET_MASK(v, CDIVG_USE_THERM_CONTROLS_MASK, 1);
1215 		ccroc_writel(ts, v, CCROC_SUPER_CCLKG_DIVIDER);
1216 	} else {
1217 		writel(v, ts->regs + THROT_GLOBAL_CFG);
1218 
1219 		v = clk_readl(ts, CAR_SUPER_CCLKG_DIVIDER);
1220 		v = REG_SET_MASK(v, CDIVG_USE_THERM_CONTROLS_MASK, 1);
1221 		clk_writel(ts, v, CAR_SUPER_CCLKG_DIVIDER);
1222 	}
1223 
1224 	/* initialize stats collection */
1225 	v = STATS_CTL_CLR_DN | STATS_CTL_EN_DN |
1226 	    STATS_CTL_CLR_UP | STATS_CTL_EN_UP;
1227 	writel(v, ts->regs + THERMCTL_STATS_CTL);
1228 }
1229 
1230 static void soctherm_init(struct platform_device *pdev)
1231 {
1232 	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
1233 	const struct tegra_tsensor_group **ttgs = tegra->soc->ttgs;
1234 	int i;
1235 	u32 pdiv, hotspot;
1236 
1237 	/* Initialize raw sensors */
1238 	for (i = 0; i < tegra->soc->num_tsensors; ++i)
1239 		enable_tsensor(tegra, i);
1240 
1241 	/* program pdiv and hotspot offsets per THERM */
1242 	pdiv = readl(tegra->regs + SENSOR_PDIV);
1243 	hotspot = readl(tegra->regs + SENSOR_HOTSPOT_OFF);
1244 	for (i = 0; i < tegra->soc->num_ttgs; ++i) {
1245 		pdiv = REG_SET_MASK(pdiv, ttgs[i]->pdiv_mask,
1246 				    ttgs[i]->pdiv);
1247 		/* hotspot offset from PLLX, doesn't need to configure PLLX */
1248 		if (ttgs[i]->id == TEGRA124_SOCTHERM_SENSOR_PLLX)
1249 			continue;
1250 		hotspot =  REG_SET_MASK(hotspot,
1251 					ttgs[i]->pllx_hotspot_mask,
1252 					ttgs[i]->pllx_hotspot_diff);
1253 	}
1254 	writel(pdiv, tegra->regs + SENSOR_PDIV);
1255 	writel(hotspot, tegra->regs + SENSOR_HOTSPOT_OFF);
1256 
1257 	/* Configure hw throttle */
1258 	tegra_soctherm_throttle(&pdev->dev);
1259 }
1260 
1261 static const struct of_device_id tegra_soctherm_of_match[] = {
1262 #ifdef CONFIG_ARCH_TEGRA_124_SOC
1263 	{
1264 		.compatible = "nvidia,tegra124-soctherm",
1265 		.data = &tegra124_soctherm,
1266 	},
1267 #endif
1268 #ifdef CONFIG_ARCH_TEGRA_132_SOC
1269 	{
1270 		.compatible = "nvidia,tegra132-soctherm",
1271 		.data = &tegra132_soctherm,
1272 	},
1273 #endif
1274 #ifdef CONFIG_ARCH_TEGRA_210_SOC
1275 	{
1276 		.compatible = "nvidia,tegra210-soctherm",
1277 		.data = &tegra210_soctherm,
1278 	},
1279 #endif
1280 	{ },
1281 };
1282 MODULE_DEVICE_TABLE(of, tegra_soctherm_of_match);
1283 
1284 static int tegra_soctherm_probe(struct platform_device *pdev)
1285 {
1286 	const struct of_device_id *match;
1287 	struct tegra_soctherm *tegra;
1288 	struct thermal_zone_device *z;
1289 	struct tsensor_shared_calib shared_calib;
1290 	struct resource *res;
1291 	struct tegra_soctherm_soc *soc;
1292 	unsigned int i;
1293 	int err;
1294 
1295 	match = of_match_node(tegra_soctherm_of_match, pdev->dev.of_node);
1296 	if (!match)
1297 		return -ENODEV;
1298 
1299 	soc = (struct tegra_soctherm_soc *)match->data;
1300 	if (soc->num_ttgs > TEGRA124_SOCTHERM_SENSOR_NUM)
1301 		return -EINVAL;
1302 
1303 	tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL);
1304 	if (!tegra)
1305 		return -ENOMEM;
1306 
1307 	dev_set_drvdata(&pdev->dev, tegra);
1308 
1309 	tegra->soc = soc;
1310 
1311 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1312 					   "soctherm-reg");
1313 	tegra->regs = devm_ioremap_resource(&pdev->dev, res);
1314 	if (IS_ERR(tegra->regs)) {
1315 		dev_err(&pdev->dev, "can't get soctherm registers");
1316 		return PTR_ERR(tegra->regs);
1317 	}
1318 
1319 	if (!tegra->soc->use_ccroc) {
1320 		res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1321 						   "car-reg");
1322 		tegra->clk_regs = devm_ioremap_resource(&pdev->dev, res);
1323 		if (IS_ERR(tegra->clk_regs)) {
1324 			dev_err(&pdev->dev, "can't get car clk registers");
1325 			return PTR_ERR(tegra->clk_regs);
1326 		}
1327 	} else {
1328 		res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1329 						   "ccroc-reg");
1330 		tegra->ccroc_regs = devm_ioremap_resource(&pdev->dev, res);
1331 		if (IS_ERR(tegra->ccroc_regs)) {
1332 			dev_err(&pdev->dev, "can't get ccroc registers");
1333 			return PTR_ERR(tegra->ccroc_regs);
1334 		}
1335 	}
1336 
1337 	tegra->reset = devm_reset_control_get(&pdev->dev, "soctherm");
1338 	if (IS_ERR(tegra->reset)) {
1339 		dev_err(&pdev->dev, "can't get soctherm reset\n");
1340 		return PTR_ERR(tegra->reset);
1341 	}
1342 
1343 	tegra->clock_tsensor = devm_clk_get(&pdev->dev, "tsensor");
1344 	if (IS_ERR(tegra->clock_tsensor)) {
1345 		dev_err(&pdev->dev, "can't get tsensor clock\n");
1346 		return PTR_ERR(tegra->clock_tsensor);
1347 	}
1348 
1349 	tegra->clock_soctherm = devm_clk_get(&pdev->dev, "soctherm");
1350 	if (IS_ERR(tegra->clock_soctherm)) {
1351 		dev_err(&pdev->dev, "can't get soctherm clock\n");
1352 		return PTR_ERR(tegra->clock_soctherm);
1353 	}
1354 
1355 	tegra->calib = devm_kzalloc(&pdev->dev,
1356 				    sizeof(u32) * soc->num_tsensors,
1357 				    GFP_KERNEL);
1358 	if (!tegra->calib)
1359 		return -ENOMEM;
1360 
1361 	/* calculate shared calibration data */
1362 	err = tegra_calc_shared_calib(soc->tfuse, &shared_calib);
1363 	if (err)
1364 		return err;
1365 
1366 	/* calculate tsensor calibaration data */
1367 	for (i = 0; i < soc->num_tsensors; ++i) {
1368 		err = tegra_calc_tsensor_calib(&soc->tsensors[i],
1369 					       &shared_calib,
1370 					       &tegra->calib[i]);
1371 		if (err)
1372 			return err;
1373 	}
1374 
1375 	tegra->thermctl_tzs = devm_kzalloc(&pdev->dev,
1376 					   sizeof(*z) * soc->num_ttgs,
1377 					   GFP_KERNEL);
1378 	if (!tegra->thermctl_tzs)
1379 		return -ENOMEM;
1380 
1381 	err = soctherm_clk_enable(pdev, true);
1382 	if (err)
1383 		return err;
1384 
1385 	soctherm_init_hw_throt_cdev(pdev);
1386 
1387 	soctherm_init(pdev);
1388 
1389 	for (i = 0; i < soc->num_ttgs; ++i) {
1390 		struct tegra_thermctl_zone *zone =
1391 			devm_kzalloc(&pdev->dev, sizeof(*zone), GFP_KERNEL);
1392 		if (!zone) {
1393 			err = -ENOMEM;
1394 			goto disable_clocks;
1395 		}
1396 
1397 		zone->reg = tegra->regs + soc->ttgs[i]->sensor_temp_offset;
1398 		zone->dev = &pdev->dev;
1399 		zone->sg = soc->ttgs[i];
1400 		zone->ts = tegra;
1401 
1402 		z = devm_thermal_zone_of_sensor_register(&pdev->dev,
1403 							 soc->ttgs[i]->id, zone,
1404 							 &tegra_of_thermal_ops);
1405 		if (IS_ERR(z)) {
1406 			err = PTR_ERR(z);
1407 			dev_err(&pdev->dev, "failed to register sensor: %d\n",
1408 				err);
1409 			goto disable_clocks;
1410 		}
1411 
1412 		zone->tz = z;
1413 		tegra->thermctl_tzs[soc->ttgs[i]->id] = z;
1414 
1415 		/* Configure hw trip points */
1416 		err = tegra_soctherm_set_hwtrips(&pdev->dev, soc->ttgs[i], z);
1417 		if (err)
1418 			goto disable_clocks;
1419 	}
1420 
1421 	soctherm_debug_init(pdev);
1422 
1423 	return 0;
1424 
1425 disable_clocks:
1426 	soctherm_clk_enable(pdev, false);
1427 
1428 	return err;
1429 }
1430 
1431 static int tegra_soctherm_remove(struct platform_device *pdev)
1432 {
1433 	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
1434 
1435 	debugfs_remove_recursive(tegra->debugfs_dir);
1436 
1437 	soctherm_clk_enable(pdev, false);
1438 
1439 	return 0;
1440 }
1441 
1442 static int __maybe_unused soctherm_suspend(struct device *dev)
1443 {
1444 	struct platform_device *pdev = to_platform_device(dev);
1445 
1446 	soctherm_clk_enable(pdev, false);
1447 
1448 	return 0;
1449 }
1450 
1451 static int __maybe_unused soctherm_resume(struct device *dev)
1452 {
1453 	struct platform_device *pdev = to_platform_device(dev);
1454 	struct tegra_soctherm *tegra = platform_get_drvdata(pdev);
1455 	struct tegra_soctherm_soc *soc = tegra->soc;
1456 	int err, i;
1457 
1458 	err = soctherm_clk_enable(pdev, true);
1459 	if (err) {
1460 		dev_err(&pdev->dev,
1461 			"Resume failed: enable clocks failed\n");
1462 		return err;
1463 	}
1464 
1465 	soctherm_init(pdev);
1466 
1467 	for (i = 0; i < soc->num_ttgs; ++i) {
1468 		struct thermal_zone_device *tz;
1469 
1470 		tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
1471 		err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
1472 		if (err) {
1473 			dev_err(&pdev->dev,
1474 				"Resume failed: set hwtrips failed\n");
1475 			return err;
1476 		}
1477 	}
1478 
1479 	return 0;
1480 }
1481 
1482 static SIMPLE_DEV_PM_OPS(tegra_soctherm_pm, soctherm_suspend, soctherm_resume);
1483 
1484 static struct platform_driver tegra_soctherm_driver = {
1485 	.probe = tegra_soctherm_probe,
1486 	.remove = tegra_soctherm_remove,
1487 	.driver = {
1488 		.name = "tegra_soctherm",
1489 		.pm = &tegra_soctherm_pm,
1490 		.of_match_table = tegra_soctherm_of_match,
1491 	},
1492 };
1493 module_platform_driver(tegra_soctherm_driver);
1494 
1495 MODULE_AUTHOR("Mikko Perttunen <mperttunen@nvidia.com>");
1496 MODULE_DESCRIPTION("NVIDIA Tegra SOCTHERM thermal management driver");
1497 MODULE_LICENSE("GPL v2");
1498