Lines Matching +full:thermal +full:- +full:sensor
1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <linux/clk-provider.h>
15 #include <linux/nvmem-consumer.h>
19 #include <linux/thermal.h>
20 #include <dt-bindings/thermal/mediatek,lvts-thermal.h>
83 #define LVTS_COEFF_A -250460
206 lvts_td->dom_dentry = debugfs_create_dir(dev_name(dev), NULL); in lvts_debugfs_init()
207 if (IS_ERR(lvts_td->dom_dentry)) in lvts_debugfs_init()
210 for (i = 0; i < lvts_td->num_lvts_ctrl; i++) { in lvts_debugfs_init()
212 lvts_ctrl = &lvts_td->lvts_ctrl[i]; in lvts_debugfs_init()
215 dentry = debugfs_create_dir(name, lvts_td->dom_dentry); in lvts_debugfs_init()
223 regset->base = lvts_ctrl->base; in lvts_debugfs_init()
224 regset->regs = lvts_regs; in lvts_debugfs_init()
225 regset->nregs = ARRAY_SIZE(lvts_regs); in lvts_debugfs_init()
235 debugfs_remove_recursive(lvts_td->dom_dentry); in lvts_debugfs_exit()
262 u32 raw_temp = ((s64)(coeff_b - temperature)) << 14; in lvts_temp_to_raw()
264 raw_temp = div_s64(raw_temp, -LVTS_COEFF_A); in lvts_temp_to_raw()
272 void __iomem *msr = lvts_sensor->msr; in lvts_get_temp()
279 * LVTS_MSR[0-3] / LVTS_IMMD[0-3] in lvts_get_temp()
283 * 32-17: Unused in lvts_get_temp()
285 * 15-0 : Raw temperature in lvts_get_temp()
291 * As the thermal zone temperature will read before the in lvts_get_temp()
292 * hardware sensor is fully initialized, we have to check the in lvts_get_temp()
294 * measurement register. The thermal controller will set the in lvts_get_temp()
302 return -EAGAIN; in lvts_get_temp()
320 value = readl(LVTS_MONINT(lvts_ctrl->base)); in lvts_update_irq_mask()
323 if (lvts_ctrl->sensors[i].high_thresh == lvts_ctrl->high_thresh in lvts_update_irq_mask()
324 && lvts_ctrl->sensors[i].low_thresh == lvts_ctrl->low_thresh) in lvts_update_irq_mask()
330 writel(value, LVTS_MONINT(lvts_ctrl->base)); in lvts_update_irq_mask()
337 if (high > lvts_ctrl->high_thresh) in lvts_should_update_thresh()
340 for (i = 0; i < lvts_ctrl->num_lvts_sensor; i++) in lvts_should_update_thresh()
341 if (lvts_ctrl->sensors[i].high_thresh == lvts_ctrl->high_thresh in lvts_should_update_thresh()
342 && lvts_ctrl->sensors[i].low_thresh == lvts_ctrl->low_thresh) in lvts_should_update_thresh()
351 …struct lvts_ctrl *lvts_ctrl = container_of(lvts_sensor, struct lvts_ctrl, sensors[lvts_sensor->id]… in lvts_set_trips()
352 void __iomem *base = lvts_sensor->base; in lvts_set_trips()
353 u32 raw_low = lvts_temp_to_raw(low != -INT_MAX ? low : LVTS_MINIMUM_THRESHOLD); in lvts_set_trips()
357 lvts_sensor->low_thresh = low; in lvts_set_trips()
358 lvts_sensor->high_thresh = high; in lvts_set_trips()
362 lvts_ctrl->high_thresh = high; in lvts_set_trips()
363 lvts_ctrl->low_thresh = low; in lvts_set_trips()
377 * 14-0 : Raw temperature for threshold in lvts_set_trips()
390 * 14-0 : Raw temperature for threshold in lvts_set_trips()
421 * 28 : Interrupt using filter on sensor 3 in lvts_ctrl_irq_handler()
423 * 27 : Interrupt using immediate on sensor 3 in lvts_ctrl_irq_handler()
424 * 26 : Interrupt normal to hot on sensor 3 in lvts_ctrl_irq_handler()
425 * 25 : Interrupt high offset on sensor 3 in lvts_ctrl_irq_handler()
426 * 24 : Interrupt low offset on sensor 3 in lvts_ctrl_irq_handler()
428 * 23 : Interrupt hot threshold on sensor 3 in lvts_ctrl_irq_handler()
429 * 22 : Interrupt cold threshold on sensor 3 in lvts_ctrl_irq_handler()
430 * 21 : Interrupt using filter on sensor 2 in lvts_ctrl_irq_handler()
431 * 20 : Interrupt using filter on sensor 1 in lvts_ctrl_irq_handler()
433 * 19 : Interrupt using filter on sensor 0 in lvts_ctrl_irq_handler()
434 * 18 : Interrupt using immediate on sensor 2 in lvts_ctrl_irq_handler()
435 * 17 : Interrupt using immediate on sensor 1 in lvts_ctrl_irq_handler()
436 * 16 : Interrupt using immediate on sensor 0 in lvts_ctrl_irq_handler()
439 * 14 : Interrupt normal to hot on sensor 2 in lvts_ctrl_irq_handler()
440 * 13 : Interrupt high offset interrupt on sensor 2 in lvts_ctrl_irq_handler()
441 * 12 : Interrupt low offset interrupt on sensor 2 in lvts_ctrl_irq_handler()
443 * 11 : Interrupt hot threshold on sensor 2 in lvts_ctrl_irq_handler()
444 * 10 : Interrupt cold threshold on sensor 2 in lvts_ctrl_irq_handler()
445 * 9 : Interrupt normal to hot on sensor 1 in lvts_ctrl_irq_handler()
446 * 8 : Interrupt high offset interrupt on sensor 1 in lvts_ctrl_irq_handler()
448 * 7 : Interrupt low offset interrupt on sensor 1 in lvts_ctrl_irq_handler()
449 * 6 : Interrupt hot threshold on sensor 1 in lvts_ctrl_irq_handler()
450 * 5 : Interrupt cold threshold on sensor 1 in lvts_ctrl_irq_handler()
451 * 4 : Interrupt normal to hot on sensor 0 in lvts_ctrl_irq_handler()
453 * 3 : Interrupt high offset interrupt on sensor 0 in lvts_ctrl_irq_handler()
454 * 2 : Interrupt low offset interrupt on sensor 0 in lvts_ctrl_irq_handler()
455 * 1 : Interrupt hot threshold on sensor 0 in lvts_ctrl_irq_handler()
456 * 0 : Interrupt cold threshold on sensor 0 in lvts_ctrl_irq_handler()
458 * We are interested in the sensor(s) responsible of the in lvts_ctrl_irq_handler()
459 * interrupt event. We update the thermal framework with the in lvts_ctrl_irq_handler()
460 * thermal zone associated with the sensor. The framework will in lvts_ctrl_irq_handler()
462 * are only interested in which sensor raised the interrupt. in lvts_ctrl_irq_handler()
464 * sensor 3 interrupt: 0001 1111 1100 0000 0000 0000 0000 0000 in lvts_ctrl_irq_handler()
466 * sensor 2 interrupt: 0000 0000 0010 0100 0111 1100 0000 0000 in lvts_ctrl_irq_handler()
468 * sensor 1 interrupt: 0000 0000 0001 0010 0000 0011 1110 0000 in lvts_ctrl_irq_handler()
470 * sensor 0 interrupt: 0000 0000 0000 1001 0000 0000 0001 1111 in lvts_ctrl_irq_handler()
473 value = readl(LVTS_MONINTSTS(lvts_ctrl->base)); in lvts_ctrl_irq_handler()
479 * corresponding to the sensor id eg. index=0, mask for in lvts_ctrl_irq_handler()
487 thermal_zone_device_update(lvts_ctrl->sensors[i].tz, in lvts_ctrl_irq_handler()
495 writel(value, LVTS_MONINTSTS(lvts_ctrl->base)); in lvts_ctrl_irq_handler()
506 * Each thermal domain has a couple of interrupts, one for hardware
507 * reset and another one for all the thermal events happening on the
510 * The interrupt is configured for thermal events when crossing the
520 for (i = 0; i < lvts_td->num_lvts_ctrl; i++) { in lvts_irq_handler()
522 aux = lvts_ctrl_irq_handler(&lvts_td->lvts_ctrl[i]); in lvts_irq_handler()
540 struct lvts_sensor *lvts_sensor = lvts_ctrl->sensors; in lvts_sensor_init()
542 LVTS_MSR0(lvts_ctrl->base), in lvts_sensor_init()
543 LVTS_MSR1(lvts_ctrl->base), in lvts_sensor_init()
544 LVTS_MSR2(lvts_ctrl->base), in lvts_sensor_init()
545 LVTS_MSR3(lvts_ctrl->base) in lvts_sensor_init()
549 LVTS_IMMD0(lvts_ctrl->base), in lvts_sensor_init()
550 LVTS_IMMD1(lvts_ctrl->base), in lvts_sensor_init()
551 LVTS_IMMD2(lvts_ctrl->base), in lvts_sensor_init()
552 LVTS_IMMD3(lvts_ctrl->base) in lvts_sensor_init()
557 for (i = 0; i < lvts_ctrl_data->num_lvts_sensor; i++) { in lvts_sensor_init()
559 int dt_id = lvts_ctrl_data->lvts_sensor[i].dt_id; in lvts_sensor_init()
563 * sensor. Let's set arbitrally the id from the index. in lvts_sensor_init()
568 * The thermal zone registration will set the trip in lvts_sensor_init()
569 * point interrupt in the thermal controller in lvts_sensor_init()
572 * thermal zone creation after the controller is in lvts_sensor_init()
574 * node id from the data in the sensor structure in lvts_sensor_init()
579 * We assign the base address of the thermal in lvts_sensor_init()
581 * accessible from the different thermal framework ops in lvts_sensor_init()
582 * as we pass the lvts_sensor pointer as thermal zone in lvts_sensor_init()
585 lvts_sensor[i].base = lvts_ctrl->base; in lvts_sensor_init()
588 * Each sensor has its own register address to read from. in lvts_sensor_init()
590 lvts_sensor[i].msr = lvts_ctrl_data->mode == LVTS_MSR_IMMEDIATE_MODE ? in lvts_sensor_init()
597 lvts_ctrl->num_lvts_sensor = lvts_ctrl_data->num_lvts_sensor; in lvts_sensor_init()
603 * The efuse blob values follows the sensor enumeration per thermal
608 * <-----mcu-tc#0-----> <-----sensor#0-----> <-----sensor#1----->
611 * <-----mcu-tc#1-----> <-----sensor#2-----> <-----sensor#3----->
614 …* <-----mcu-tc#2-----> <-----sensor#4-----> <-----sensor#5-----> <-----sensor#6-----> <-----sensor…
619 * <-----ap--tc#0-----> <-----sensor#0-----> <-----sensor#1----->
622 * <-----ap--tc#1-----> <-----sensor#2-----> <-----sensor#3----->
625 * <-----ap--tc#2-----> <-----sensor#4-----> <-----sensor#5-----> <-----sensor#6----->
628 * <-----ap--tc#3-----> <-----sensor#7-----> <-----sensor#8----->
632 * this bytes stream for each sensor.
640 for (i = 0; i < lvts_ctrl_data->num_lvts_sensor; i++) in lvts_calibration_init()
641 memcpy(&lvts_ctrl->calibration[i], in lvts_calibration_init()
642 efuse_calibration + lvts_ctrl_data->cal_offset[i], 2); in lvts_calibration_init()
661 of_property_for_each_string(np, "nvmem-cell-names", prop, cell_name) { in lvts_calibration_read()
680 lvts_td->calib = devm_krealloc(dev, lvts_td->calib, in lvts_calibration_read()
681 lvts_td->calib_len + len, GFP_KERNEL); in lvts_calibration_read()
682 if (!lvts_td->calib) in lvts_calibration_read()
683 return -ENOMEM; in lvts_calibration_read()
685 memcpy(lvts_td->calib + lvts_td->calib_len, efuse, len); in lvts_calibration_read()
687 lvts_td->calib_len += len; in lvts_calibration_read()
712 size_t size = sizeof(*lvts_td->lvts_ctrl) * lvts_data->num_lvts_ctrl; in lvts_ctrl_init()
727 ret = lvts_golden_temp_init(dev, (u32 *)lvts_td->calib); in lvts_ctrl_init()
733 return -ENOMEM; in lvts_ctrl_init()
735 for (i = 0; i < lvts_data->num_lvts_ctrl; i++) { in lvts_ctrl_init()
737 lvts_ctrl[i].base = lvts_td->base + lvts_data->lvts_ctrl[i].offset; in lvts_ctrl_init()
740 &lvts_data->lvts_ctrl[i]); in lvts_ctrl_init()
745 &lvts_data->lvts_ctrl[i], in lvts_ctrl_init()
746 lvts_td->calib); in lvts_ctrl_init()
754 lvts_ctrl[i].mode = lvts_data->lvts_ctrl[i].mode; in lvts_ctrl_init()
761 lvts_temp_to_raw(lvts_data->lvts_ctrl[i].hw_tshut_temp); in lvts_ctrl_init()
770 devm_kfree(dev, lvts_td->calib); in lvts_ctrl_init()
772 lvts_td->lvts_ctrl = lvts_ctrl; in lvts_ctrl_init()
773 lvts_td->num_lvts_ctrl = lvts_data->num_lvts_ctrl; in lvts_ctrl_init()
792 writel(cmds[i], LVTS_CONFIG(lvts_ctrl->base)); in lvts_write_config()
800 * LVTS_PROTCTL : Thermal Protection Sensor Selection in lvts_irq_init()
804 * 19-18 : Sensor to base the protection on in lvts_irq_init()
805 * 17-16 : Strategy: in lvts_irq_init()
808 * 10 : Selected sensor with bits 19-18 in lvts_irq_init()
811 writel(BIT(16), LVTS_PROTCTL(lvts_ctrl->base)); in lvts_irq_init()
820 * 14-0: Raw temperature threshold in lvts_irq_init()
822 * writel(0x0, LVTS_PROTTA(lvts_ctrl->base)); in lvts_irq_init()
823 * writel(0x0, LVTS_PROTTB(lvts_ctrl->base)); in lvts_irq_init()
825 writel(lvts_ctrl->hw_tshut_raw_temp, LVTS_PROTTC(lvts_ctrl->base)); in lvts_irq_init()
833 writel(LVTS_MONINT_CONF, LVTS_MONINT(lvts_ctrl->base)); in lvts_irq_init()
850 * Enable or disable the clocks of a specified thermal controller
861 writel(enable, LVTS_CLKEN(lvts_ctrl->base)); in lvts_ctrl_set_enable()
873 * LVTS_ID : Get ID and status of the thermal controller in lvts_ctrl_connect()
877 * 0-5 : thermal controller id in lvts_ctrl_connect()
878 * 7 : thermal controller connection is valid in lvts_ctrl_connect()
880 id = readl(LVTS_ID(lvts_ctrl->base)); in lvts_ctrl_connect()
882 return -EIO; in lvts_ctrl_connect()
908 LVTS_EDATA00(lvts_ctrl->base), in lvts_ctrl_calibrate()
909 LVTS_EDATA01(lvts_ctrl->base), in lvts_ctrl_calibrate()
910 LVTS_EDATA02(lvts_ctrl->base), in lvts_ctrl_calibrate()
911 LVTS_EDATA03(lvts_ctrl->base) in lvts_ctrl_calibrate()
915 * LVTS_EDATA0X : Efuse calibration reference value for sensor X in lvts_ctrl_calibrate()
919 * 20-0 : Efuse value for normalization data in lvts_ctrl_calibrate()
922 writel(lvts_ctrl->calibration[i], lvts_edata[i]); in lvts_ctrl_calibrate()
936 * 31-24: ADC Sense 3 in lvts_ctrl_configure()
937 * 23-16: ADC Sense 2 in lvts_ctrl_configure()
938 * 15-8 : ADC Sense 1 in lvts_ctrl_configure()
939 * 7-0 : ADC Sense 0 in lvts_ctrl_configure()
942 writel(value, LVTS_TSSEL(lvts_ctrl->base)); in lvts_ctrl_configure()
951 * LVTS_MSRCTL0 : Sensor filtering strategy in lvts_ctrl_configure()
964 * 0-2 : Sensor0 filter in lvts_ctrl_configure()
965 * 3-5 : Sensor1 filter in lvts_ctrl_configure()
966 * 6-8 : Sensor2 filter in lvts_ctrl_configure()
967 * 9-11 : Sensor3 filter in lvts_ctrl_configure()
971 writel(value, LVTS_MSRCTL0(lvts_ctrl->base)); in lvts_ctrl_configure()
976 * The clock source of LVTS thermal controller is 26MHz. in lvts_ctrl_configure()
985 * - Filter interval delay is a delay between two samples of in lvts_ctrl_configure()
986 * the same sensor. in lvts_ctrl_configure()
988 * - Sensor interval delay is a delay between two samples of in lvts_ctrl_configure()
991 * - Group interval delay is a delay between different rounds. in lvts_ctrl_configure()
994 * If Period unit = C, filter delay = 1, sensor delay = 2, group delay = 1, in lvts_ctrl_configure()
995 * and two sensors, TS1 and TS2, are in a LVTS thermal controller in lvts_ctrl_configure()
999 * Sensor interval delay = 2 * Period unit = 236.298us in lvts_ctrl_configure()
1003 * <--> Filter interval delay in lvts_ctrl_configure()
1004 * <--> Sensor interval delay in lvts_ctrl_configure()
1005 * <--> Group interval delay in lvts_ctrl_configure()
1007 * 29 - 20 : Group interval in lvts_ctrl_configure()
1008 * 16 - 13 : Send a single interrupt when crossing the hot threshold (1) in lvts_ctrl_configure()
1010 * 9 - 0 : Period unit in lvts_ctrl_configure()
1014 writel(value, LVTS_MONCTL1(lvts_ctrl->base)); in lvts_ctrl_configure()
1017 * LVTS_MONCTL2 : Filtering and sensor interval in lvts_ctrl_configure()
1021 * 25-16 : Interval unit in PERIOD_UNIT between sample on in lvts_ctrl_configure()
1022 * the same sensor, filter interval in lvts_ctrl_configure()
1023 * 9-0 : Interval unit in PERIOD_UNIT between each sensor in lvts_ctrl_configure()
1027 writel(value, LVTS_MONCTL2(lvts_ctrl->base)); in lvts_ctrl_configure()
1034 struct lvts_sensor *lvts_sensors = lvts_ctrl->sensors; in lvts_ctrl_start()
1039 * Bitmaps to enable each sensor on immediate and filtered modes, as in lvts_ctrl_start()
1045 u32 *sensor_bitmap = lvts_ctrl->mode == LVTS_MSR_IMMEDIATE_MODE ? in lvts_ctrl_start()
1048 for (i = 0; i < lvts_ctrl->num_lvts_sensor; i++) { in lvts_ctrl_start()
1056 * This thermal zone is not described in the in lvts_ctrl_start()
1058 * thermal OF code POV, we just continue. in lvts_ctrl_start()
1060 if (PTR_ERR(tz) == -ENODEV) in lvts_ctrl_start()
1069 * The thermal zone pointer will be needed in the in lvts_ctrl_start()
1070 * interrupt handler, we store it in the sensor in lvts_ctrl_start()
1071 * structure. The thermal domain structure will be in lvts_ctrl_start()
1074 * belonging to the thermal domain. in lvts_ctrl_start()
1079 * This sensor was correctly associated with a thermal in lvts_ctrl_start()
1080 * zone, let's set the corresponding bit in the sensor in lvts_ctrl_start()
1082 * the hardware thermal controller. in lvts_ctrl_start()
1088 * The initialization of the thermal zones give us in lvts_ctrl_start()
1089 * which sensor point to enable. If any thermal zone in lvts_ctrl_start()
1091 * enabled here in the sensor map. in lvts_ctrl_start()
1093 if (lvts_ctrl->mode == LVTS_MSR_IMMEDIATE_MODE) { in lvts_ctrl_start()
1107 writel(sensor_map, LVTS_MSRCTL1(lvts_ctrl->base)); in lvts_ctrl_start()
1112 * 0-3: Enable sensing point 0-3 in lvts_ctrl_start()
1114 writel(sensor_map | BIT(9), LVTS_MONCTL0(lvts_ctrl->base)); in lvts_ctrl_start()
1130 ret = lvts_domain_reset(dev, lvts_td->reset); in lvts_domain_init()
1136 for (i = 0; i < lvts_td->num_lvts_ctrl; i++) { in lvts_domain_init()
1138 lvts_ctrl = &lvts_td->lvts_ctrl[i]; in lvts_domain_init()
1143 * - Enable the clock in lvts_domain_init()
1144 * - Connect to the LVTS in lvts_domain_init()
1145 * - Initialize the LVTS in lvts_domain_init()
1146 * - Prepare the calibration data in lvts_domain_init()
1147 * - Select monitored sensors in lvts_domain_init()
1150 * - Start measurement in lvts_domain_init()
1196 struct device *dev = &pdev->dev; in lvts_probe()
1202 return -ENOMEM; in lvts_probe()
1206 lvts_td->clk = devm_clk_get_enabled(dev, NULL); in lvts_probe()
1207 if (IS_ERR(lvts_td->clk)) in lvts_probe()
1208 return dev_err_probe(dev, PTR_ERR(lvts_td->clk), "Failed to retrieve clock\n"); in lvts_probe()
1212 return dev_err_probe(dev, (-ENXIO), "No IO resource\n"); in lvts_probe()
1214 lvts_td->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in lvts_probe()
1215 if (IS_ERR(lvts_td->base)) in lvts_probe()
1216 return dev_err_probe(dev, PTR_ERR(lvts_td->base), "Failed to map io resource\n"); in lvts_probe()
1218 lvts_td->reset = devm_reset_control_get_by_index(dev, 0); in lvts_probe()
1219 if (IS_ERR(lvts_td->reset)) in lvts_probe()
1220 return dev_err_probe(dev, PTR_ERR(lvts_td->reset), "Failed to get reset control\n"); in lvts_probe()
1251 for (i = 0; i < lvts_td->num_lvts_ctrl; i++) in lvts_remove()
1252 lvts_ctrl_set_enable(&lvts_td->lvts_ctrl[i], false); in lvts_remove()
1349 { .compatible = "mediatek,mt8195-lvts-mcu", .data = &mt8195_lvts_mcu_data },
1350 { .compatible = "mediatek,mt8195-lvts-ap", .data = &mt8195_lvts_ap_data },
1359 .name = "mtk-lvts-thermal",
1366 MODULE_DESCRIPTION("MediaTek LVTS Thermal Driver");