15c9d6ac2SWei Ni // SPDX-License-Identifier: GPL-2.0 28204104fSWei Ni /* 35c9d6ac2SWei Ni * Copyright (c) 2014-2018, NVIDIA CORPORATION. All rights reserved. 48204104fSWei Ni * 58204104fSWei Ni * This software is licensed under the terms of the GNU General Public 68204104fSWei Ni * License version 2, as published by the Free Software Foundation, and 78204104fSWei Ni * may be copied, distributed, and modified under those terms. 88204104fSWei Ni * 98204104fSWei Ni * This program is distributed in the hope that it will be useful, 108204104fSWei Ni * but WITHOUT ANY WARRANTY; without even the implied warranty of 118204104fSWei Ni * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 128204104fSWei Ni * GNU General Public License for more details. 138204104fSWei Ni * 148204104fSWei Ni */ 158204104fSWei Ni 168204104fSWei Ni #include <linux/module.h> 178204104fSWei Ni #include <linux/platform_device.h> 188204104fSWei Ni #include <soc/tegra/fuse.h> 198204104fSWei Ni 208204104fSWei Ni #include <dt-bindings/thermal/tegra124-soctherm.h> 218204104fSWei Ni 228204104fSWei Ni #include "soctherm.h" 238204104fSWei Ni 242a895871SWei Ni #define TEGRA210_THERMTRIP_ANY_EN_MASK (0x1 << 31) 252a895871SWei Ni #define TEGRA210_THERMTRIP_MEM_EN_MASK (0x1 << 30) 262a895871SWei Ni #define TEGRA210_THERMTRIP_GPU_EN_MASK (0x1 << 29) 272a895871SWei Ni #define TEGRA210_THERMTRIP_CPU_EN_MASK (0x1 << 28) 282a895871SWei Ni #define TEGRA210_THERMTRIP_TSENSE_EN_MASK (0x1 << 27) 292a895871SWei Ni #define TEGRA210_THERMTRIP_GPUMEM_THRESH_MASK (0x1ff << 18) 302a895871SWei Ni #define TEGRA210_THERMTRIP_CPU_THRESH_MASK (0x1ff << 9) 312a895871SWei Ni #define TEGRA210_THERMTRIP_TSENSE_THRESH_MASK 0x1ff 322a895871SWei Ni 33ce0dbf04SWei Ni #define TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK (0x1ff << 18) 34ce0dbf04SWei Ni #define TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK (0x1ff << 9) 35ce0dbf04SWei Ni 362a895871SWei Ni #define TEGRA210_THRESH_GRAIN 500 37ce0dbf04SWei Ni #define TEGRA210_BPTT 9 382a895871SWei Ni 398204104fSWei Ni static const struct tegra_tsensor_configuration tegra210_tsensor_config = { 408204104fSWei Ni .tall = 16300, 418204104fSWei Ni .tiddq_en = 1, 428204104fSWei Ni .ten_count = 1, 438204104fSWei Ni .tsample = 120, 448204104fSWei Ni .tsample_ate = 480, 458204104fSWei Ni }; 468204104fSWei Ni 478204104fSWei Ni static const struct tegra_tsensor_group tegra210_tsensor_group_cpu = { 488204104fSWei Ni .id = TEGRA124_SOCTHERM_SENSOR_CPU, 498204104fSWei Ni .name = "cpu", 508204104fSWei Ni .sensor_temp_offset = SENSOR_TEMP1, 518204104fSWei Ni .sensor_temp_mask = SENSOR_TEMP1_CPU_TEMP_MASK, 528204104fSWei Ni .pdiv = 8, 538204104fSWei Ni .pdiv_ate = 8, 548204104fSWei Ni .pdiv_mask = SENSOR_PDIV_CPU_MASK, 558204104fSWei Ni .pllx_hotspot_diff = 10, 568204104fSWei Ni .pllx_hotspot_mask = SENSOR_HOTSPOT_CPU_MASK, 572a895871SWei Ni .thermtrip_any_en_mask = TEGRA210_THERMTRIP_ANY_EN_MASK, 582a895871SWei Ni .thermtrip_enable_mask = TEGRA210_THERMTRIP_CPU_EN_MASK, 592a895871SWei Ni .thermtrip_threshold_mask = TEGRA210_THERMTRIP_CPU_THRESH_MASK, 605c9d6ac2SWei Ni .thermctl_isr_mask = THERM_IRQ_CPU_MASK, 61ce0dbf04SWei Ni .thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_CPU, 62ce0dbf04SWei Ni .thermctl_lvl0_up_thresh_mask = TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK, 63ce0dbf04SWei Ni .thermctl_lvl0_dn_thresh_mask = TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK, 648204104fSWei Ni }; 658204104fSWei Ni 668204104fSWei Ni static const struct tegra_tsensor_group tegra210_tsensor_group_gpu = { 678204104fSWei Ni .id = TEGRA124_SOCTHERM_SENSOR_GPU, 688204104fSWei Ni .name = "gpu", 698204104fSWei Ni .sensor_temp_offset = SENSOR_TEMP1, 708204104fSWei Ni .sensor_temp_mask = SENSOR_TEMP1_GPU_TEMP_MASK, 718204104fSWei Ni .pdiv = 8, 728204104fSWei Ni .pdiv_ate = 8, 738204104fSWei Ni .pdiv_mask = SENSOR_PDIV_GPU_MASK, 748204104fSWei Ni .pllx_hotspot_diff = 5, 758204104fSWei Ni .pllx_hotspot_mask = SENSOR_HOTSPOT_GPU_MASK, 762a895871SWei Ni .thermtrip_any_en_mask = TEGRA210_THERMTRIP_ANY_EN_MASK, 772a895871SWei Ni .thermtrip_enable_mask = TEGRA210_THERMTRIP_GPU_EN_MASK, 782a895871SWei Ni .thermtrip_threshold_mask = TEGRA210_THERMTRIP_GPUMEM_THRESH_MASK, 795c9d6ac2SWei Ni .thermctl_isr_mask = THERM_IRQ_GPU_MASK, 80ce0dbf04SWei Ni .thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_GPU, 81ce0dbf04SWei Ni .thermctl_lvl0_up_thresh_mask = TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK, 82ce0dbf04SWei Ni .thermctl_lvl0_dn_thresh_mask = TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK, 838204104fSWei Ni }; 848204104fSWei Ni 858204104fSWei Ni static const struct tegra_tsensor_group tegra210_tsensor_group_pll = { 868204104fSWei Ni .id = TEGRA124_SOCTHERM_SENSOR_PLLX, 878204104fSWei Ni .name = "pll", 888204104fSWei Ni .sensor_temp_offset = SENSOR_TEMP2, 898204104fSWei Ni .sensor_temp_mask = SENSOR_TEMP2_PLLX_TEMP_MASK, 908204104fSWei Ni .pdiv = 8, 918204104fSWei Ni .pdiv_ate = 8, 928204104fSWei Ni .pdiv_mask = SENSOR_PDIV_PLLX_MASK, 932a895871SWei Ni .thermtrip_any_en_mask = TEGRA210_THERMTRIP_ANY_EN_MASK, 942a895871SWei Ni .thermtrip_enable_mask = TEGRA210_THERMTRIP_TSENSE_EN_MASK, 952a895871SWei Ni .thermtrip_threshold_mask = TEGRA210_THERMTRIP_TSENSE_THRESH_MASK, 965c9d6ac2SWei Ni .thermctl_isr_mask = THERM_IRQ_TSENSE_MASK, 97ce0dbf04SWei Ni .thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_TSENSE, 98ce0dbf04SWei Ni .thermctl_lvl0_up_thresh_mask = TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK, 99ce0dbf04SWei Ni .thermctl_lvl0_dn_thresh_mask = TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK, 1008204104fSWei Ni }; 1018204104fSWei Ni 1028204104fSWei Ni static const struct tegra_tsensor_group tegra210_tsensor_group_mem = { 1038204104fSWei Ni .id = TEGRA124_SOCTHERM_SENSOR_MEM, 1048204104fSWei Ni .name = "mem", 1058204104fSWei Ni .sensor_temp_offset = SENSOR_TEMP2, 1068204104fSWei Ni .sensor_temp_mask = SENSOR_TEMP2_MEM_TEMP_MASK, 1078204104fSWei Ni .pdiv = 8, 1088204104fSWei Ni .pdiv_ate = 8, 1098204104fSWei Ni .pdiv_mask = SENSOR_PDIV_MEM_MASK, 1108204104fSWei Ni .pllx_hotspot_diff = 0, 1118204104fSWei Ni .pllx_hotspot_mask = SENSOR_HOTSPOT_MEM_MASK, 1122a895871SWei Ni .thermtrip_any_en_mask = TEGRA210_THERMTRIP_ANY_EN_MASK, 1132a895871SWei Ni .thermtrip_enable_mask = TEGRA210_THERMTRIP_MEM_EN_MASK, 1142a895871SWei Ni .thermtrip_threshold_mask = TEGRA210_THERMTRIP_GPUMEM_THRESH_MASK, 1155c9d6ac2SWei Ni .thermctl_isr_mask = THERM_IRQ_MEM_MASK, 116ce0dbf04SWei Ni .thermctl_lvl0_offset = THERMCTL_LEVEL0_GROUP_MEM, 117ce0dbf04SWei Ni .thermctl_lvl0_up_thresh_mask = TEGRA210_THERMCTL_LVL0_UP_THRESH_MASK, 118ce0dbf04SWei Ni .thermctl_lvl0_dn_thresh_mask = TEGRA210_THERMCTL_LVL0_DN_THRESH_MASK, 1198204104fSWei Ni }; 1208204104fSWei Ni 1218204104fSWei Ni static const struct tegra_tsensor_group *tegra210_tsensor_groups[] = { 1228204104fSWei Ni &tegra210_tsensor_group_cpu, 1238204104fSWei Ni &tegra210_tsensor_group_gpu, 1248204104fSWei Ni &tegra210_tsensor_group_pll, 1258204104fSWei Ni &tegra210_tsensor_group_mem, 1268204104fSWei Ni }; 1278204104fSWei Ni 1288204104fSWei Ni static const struct tegra_tsensor tegra210_tsensors[] = { 1298204104fSWei Ni { 1308204104fSWei Ni .name = "cpu0", 1318204104fSWei Ni .base = 0xc0, 1328204104fSWei Ni .config = &tegra210_tsensor_config, 1338204104fSWei Ni .calib_fuse_offset = 0x098, 1348204104fSWei Ni .fuse_corr_alpha = 1085000, 1358204104fSWei Ni .fuse_corr_beta = 3244200, 1368204104fSWei Ni .group = &tegra210_tsensor_group_cpu, 1378204104fSWei Ni }, { 1388204104fSWei Ni .name = "cpu1", 1398204104fSWei Ni .base = 0xe0, 1408204104fSWei Ni .config = &tegra210_tsensor_config, 1418204104fSWei Ni .calib_fuse_offset = 0x084, 1428204104fSWei Ni .fuse_corr_alpha = 1126200, 1438204104fSWei Ni .fuse_corr_beta = -67500, 1448204104fSWei Ni .group = &tegra210_tsensor_group_cpu, 1458204104fSWei Ni }, { 1468204104fSWei Ni .name = "cpu2", 1478204104fSWei Ni .base = 0x100, 1488204104fSWei Ni .config = &tegra210_tsensor_config, 1498204104fSWei Ni .calib_fuse_offset = 0x088, 1508204104fSWei Ni .fuse_corr_alpha = 1098400, 1518204104fSWei Ni .fuse_corr_beta = 2251100, 1528204104fSWei Ni .group = &tegra210_tsensor_group_cpu, 1538204104fSWei Ni }, { 1548204104fSWei Ni .name = "cpu3", 1558204104fSWei Ni .base = 0x120, 1568204104fSWei Ni .config = &tegra210_tsensor_config, 1578204104fSWei Ni .calib_fuse_offset = 0x12c, 1588204104fSWei Ni .fuse_corr_alpha = 1108000, 1598204104fSWei Ni .fuse_corr_beta = 602700, 1608204104fSWei Ni .group = &tegra210_tsensor_group_cpu, 1618204104fSWei Ni }, { 1628204104fSWei Ni .name = "mem0", 1638204104fSWei Ni .base = 0x140, 1648204104fSWei Ni .config = &tegra210_tsensor_config, 1658204104fSWei Ni .calib_fuse_offset = 0x158, 1668204104fSWei Ni .fuse_corr_alpha = 1069200, 1678204104fSWei Ni .fuse_corr_beta = 3549900, 1688204104fSWei Ni .group = &tegra210_tsensor_group_mem, 1698204104fSWei Ni }, { 1708204104fSWei Ni .name = "mem1", 1718204104fSWei Ni .base = 0x160, 1728204104fSWei Ni .config = &tegra210_tsensor_config, 1738204104fSWei Ni .calib_fuse_offset = 0x15c, 1748204104fSWei Ni .fuse_corr_alpha = 1173700, 1758204104fSWei Ni .fuse_corr_beta = -6263600, 1768204104fSWei Ni .group = &tegra210_tsensor_group_mem, 1778204104fSWei Ni }, { 1788204104fSWei Ni .name = "gpu", 1798204104fSWei Ni .base = 0x180, 1808204104fSWei Ni .config = &tegra210_tsensor_config, 1818204104fSWei Ni .calib_fuse_offset = 0x154, 1828204104fSWei Ni .fuse_corr_alpha = 1074300, 1838204104fSWei Ni .fuse_corr_beta = 2734900, 1848204104fSWei Ni .group = &tegra210_tsensor_group_gpu, 1858204104fSWei Ni }, { 1868204104fSWei Ni .name = "pllx", 1878204104fSWei Ni .base = 0x1a0, 1888204104fSWei Ni .config = &tegra210_tsensor_config, 1898204104fSWei Ni .calib_fuse_offset = 0x160, 1908204104fSWei Ni .fuse_corr_alpha = 1039700, 1918204104fSWei Ni .fuse_corr_beta = 6829100, 1928204104fSWei Ni .group = &tegra210_tsensor_group_pll, 1938204104fSWei Ni }, 1948204104fSWei Ni }; 1958204104fSWei Ni 1968204104fSWei Ni /* 1978204104fSWei Ni * Mask/shift bits in FUSE_TSENSOR_COMMON and 1988204104fSWei Ni * FUSE_TSENSOR_COMMON, which are described in 1998204104fSWei Ni * tegra_soctherm_fuse.c 2008204104fSWei Ni */ 2018204104fSWei Ni static const struct tegra_soctherm_fuse tegra210_soctherm_fuse = { 2028204104fSWei Ni .fuse_base_cp_mask = 0x3ff << 11, 2038204104fSWei Ni .fuse_base_cp_shift = 11, 2048204104fSWei Ni .fuse_base_ft_mask = 0x7ff << 21, 2058204104fSWei Ni .fuse_base_ft_shift = 21, 2068204104fSWei Ni .fuse_shift_ft_mask = 0x1f << 6, 2078204104fSWei Ni .fuse_shift_ft_shift = 6, 2088204104fSWei Ni .fuse_spare_realignment = 0, 2098204104fSWei Ni }; 2108204104fSWei Ni 211*2380a792SYueHaibing static struct tsensor_group_thermtrips tegra210_tsensor_thermtrips[] = { 2122510aa56SWei Ni {.id = TEGRA124_SOCTHERM_SENSOR_NUM}, 2132510aa56SWei Ni {.id = TEGRA124_SOCTHERM_SENSOR_NUM}, 2142510aa56SWei Ni {.id = TEGRA124_SOCTHERM_SENSOR_NUM}, 2152510aa56SWei Ni {.id = TEGRA124_SOCTHERM_SENSOR_NUM}, 2162510aa56SWei Ni }; 2172510aa56SWei Ni 2188204104fSWei Ni const struct tegra_soctherm_soc tegra210_soctherm = { 2198204104fSWei Ni .tsensors = tegra210_tsensors, 2208204104fSWei Ni .num_tsensors = ARRAY_SIZE(tegra210_tsensors), 2218204104fSWei Ni .ttgs = tegra210_tsensor_groups, 2228204104fSWei Ni .num_ttgs = ARRAY_SIZE(tegra210_tsensor_groups), 2238204104fSWei Ni .tfuse = &tegra210_soctherm_fuse, 2242a895871SWei Ni .thresh_grain = TEGRA210_THRESH_GRAIN, 225ce0dbf04SWei Ni .bptt = TEGRA210_BPTT, 226ce0dbf04SWei Ni .use_ccroc = false, 2272510aa56SWei Ni .thermtrips = tegra210_tsensor_thermtrips, 2288204104fSWei Ni }; 229