Skip to content

Commit 6de27b4

Browse files
laura-naodlezcano
authored andcommitted
thermal/drivers/mediatek/lvts_thermal: Add MT8196 support
Add LVTS driver support for MT8196. Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Tested-by: Frank Wunderlich <frank-w@public-files.de> Signed-off-by: Laura Nao <laura.nao@collabora.com> Link: https://patch.msgid.link/20251125-mt8196-lvts-v4-v5-7-6db7eb903fb7@collabora.com Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
1 parent b5468be commit 6de27b4

1 file changed

Lines changed: 165 additions & 0 deletions

File tree

drivers/thermal/mediatek/lvts_thermal.c

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@
9292
#define LVTS_COEFF_B_MT8195 250460
9393
#define LVTS_COEFF_A_MT7988 -204650
9494
#define LVTS_COEFF_B_MT7988 204650
95+
#define LVTS_COEFF_A_MT8196 391460
96+
#define LVTS_COEFF_B_MT8196 -391460
97+
98+
#define LVTS_MSR_OFFSET_MT8196 -984
9599

96100
#define LVTS_MSR_READ_TIMEOUT_US 400
97101
#define LVTS_MSR_READ_WAIT_US (LVTS_MSR_READ_TIMEOUT_US / 2)
@@ -100,6 +104,7 @@
100104

101105
#define LVTS_MAX_CAL_OFFSETS 3
102106
#define LVTS_NUM_CAL_OFFSETS_MT7988 3
107+
#define LVTS_NUM_CAL_OFFSETS_MT8196 2
103108

104109
static int golden_temp = LVTS_GOLDEN_TEMP_DEFAULT;
105110
static int golden_temp_offset;
@@ -784,6 +789,39 @@ static int lvts_decode_sensor_calibration(const struct lvts_sensor_data *sensor,
784789
* <-----ap--tc#3-----> <-----sensor#7-----> <-----sensor#8----->
785790
* 0x40 | 0x41 | 0x42 | 0x43 | 0x44 | 0x45 | 0x46 | 0x47 | 0x48
786791
*
792+
* MT8196 :
793+
* Stream index map for MCU Domain mt8196 :
794+
*
795+
* <-sensor#1--> <-sensor#0--> <-sensor#3--> <-sensor#2-->
796+
* 0x04 | 0x05 | 0x06 | 0x07 | 0x08 | 0x09 | 0x0A | 0x0B
797+
*
798+
* <-sensor#5--> <-sensor#4--> <-sensor#7--> <-sensor#6-->
799+
* 0x0C | 0x0D | 0x0E | 0x0F | 0x10 | 0x11 | 0x12 | 0x13
800+
*
801+
* <-sensor#9--> <-sensor#8--> <-sensor#11-> <-sensor#10->
802+
* 0x14 | 0x15 | 0x16 | 0x17 | 0x18 | 0x19 | 0x1A | 0X1B
803+
*
804+
* <-sensor#13-> <-sensor#12-> <-sensor#15-> <-sensor#14->
805+
* 0x1C | 0x1D | 0x1E | 0x1F | 0x20 | 0x21 | 0x22 | 0x23
806+
*
807+
* Stream index map for APU Domain mt8196 :
808+
*
809+
* <-sensor#1--> <-sensor#0--> <-sensor#3--> <-sensor#2-->
810+
* 0x24 | 0x25 | 0x26 | 0x27 | 0x28 | 0x29 | 0x2A | 0x2B
811+
*
812+
* Stream index map for GPU Domain mt8196 :
813+
*
814+
* <-sensor#1--> <-sensor#0-->
815+
* 0x2C | 0x2D | 0x2E | 0x2F
816+
*
817+
* Stream index map for AP Domain mt8196 :
818+
*
819+
* <-sensor#1--> <-sensor#0--> <-sensor#3--> <-sensor#2-->
820+
* 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37
821+
*
822+
* <-sensor#5--> <-sensor#4--> <-sensor#6--> <-sensor#7-->
823+
* 0x38 | 0x39 | 0x3A | 0x3B | 0x3C | 0x3D | 0x3E | 0x3F
824+
*
787825
* Note: In some cases, values don't strictly follow a little endian ordering.
788826
* The data description gives byte offsets constituting each calibration value
789827
* for each sensor.
@@ -1849,11 +1887,112 @@ static const struct lvts_ctrl_data mt8195_lvts_ap_data_ctrl[] = {
18491887
}
18501888
};
18511889

1890+
static const struct lvts_ctrl_data mt8196_lvts_mcu_data_ctrl[] = {
1891+
{
1892+
.lvts_sensor = {
1893+
{ .dt_id = MT8196_MCU_MEDIUM_CPU6_0,
1894+
.cal_offsets = { 0x06, 0x07 } },
1895+
{ .dt_id = MT8196_MCU_MEDIUM_CPU6_1,
1896+
.cal_offsets = { 0x04, 0x05 } },
1897+
{ .dt_id = MT8196_MCU_DSU2,
1898+
.cal_offsets = { 0x0A, 0x0B } },
1899+
{ .dt_id = MT8196_MCU_DSU3,
1900+
.cal_offsets = { 0x08, 0x09 } }
1901+
},
1902+
VALID_SENSOR_MAP(1, 1, 1, 1),
1903+
.offset = 0x0,
1904+
.mode = LVTS_MSR_ATP_MODE,
1905+
},
1906+
{
1907+
.lvts_sensor = {
1908+
{ .dt_id = MT8196_MCU_LITTLE_CPU3,
1909+
.cal_offsets = { 0x0E, 0x0F } },
1910+
{ .dt_id = MT8196_MCU_LITTLE_CPU0,
1911+
.cal_offsets = { 0x0C, 0x0D } },
1912+
{ .dt_id = MT8196_MCU_LITTLE_CPU1,
1913+
.cal_offsets = { 0x12, 0x13 } },
1914+
{ .dt_id = MT8196_MCU_LITTLE_CPU2,
1915+
.cal_offsets = { 0x10, 0x11 } }
1916+
},
1917+
VALID_SENSOR_MAP(1, 1, 1, 1),
1918+
.offset = 0x100,
1919+
.mode = LVTS_MSR_ATP_MODE,
1920+
},
1921+
{
1922+
.lvts_sensor = {
1923+
{ .dt_id = MT8196_MCU_MEDIUM_CPU4_0,
1924+
.cal_offsets = { 0x16, 0x17 } },
1925+
{ .dt_id = MT8196_MCU_MEDIUM_CPU4_1,
1926+
.cal_offsets = { 0x14, 0x15 } },
1927+
{ .dt_id = MT8196_MCU_MEDIUM_CPU5_0,
1928+
.cal_offsets = { 0x1A, 0x1B } },
1929+
{ .dt_id = MT8196_MCU_MEDIUM_CPU5_1,
1930+
.cal_offsets = { 0x18, 0x19 } }
1931+
},
1932+
VALID_SENSOR_MAP(1, 1, 1, 1),
1933+
.offset = 0x200,
1934+
.mode = LVTS_MSR_ATP_MODE,
1935+
},
1936+
{
1937+
.lvts_sensor = {
1938+
{ .dt_id = MT8196_MCU_DSU0,
1939+
.cal_offsets = { 0x1E, 0x1F } },
1940+
{ .dt_id = MT8196_MCU_DSU1,
1941+
.cal_offsets = { 0x1C, 0x1D } },
1942+
{ .dt_id = MT8196_MCU_BIG_CPU7_0,
1943+
.cal_offsets = { 0x22, 0x23 } },
1944+
{ .dt_id = MT8196_MCU_BIG_CPU7_1,
1945+
.cal_offsets = { 0x20, 0x21 } }
1946+
},
1947+
VALID_SENSOR_MAP(1, 1, 1, 1),
1948+
.offset = 0x300,
1949+
.mode = LVTS_MSR_ATP_MODE,
1950+
}
1951+
};
1952+
1953+
static const struct lvts_ctrl_data mt8196_lvts_ap_data_ctrl[] = {
1954+
{
1955+
.lvts_sensor = {
1956+
{ .dt_id = MT8196_AP_TOP0,
1957+
.cal_offsets = { 0x32, 0x33 } },
1958+
{ .dt_id = MT8196_AP_TOP1,
1959+
.cal_offsets = { 0x30, 0x31 } },
1960+
{ .dt_id = MT8196_AP_TOP2,
1961+
.cal_offsets = { 0x36, 0x37 } },
1962+
{ .dt_id = MT8196_AP_TOP3,
1963+
.cal_offsets = { 0x34, 0x35 } }
1964+
},
1965+
VALID_SENSOR_MAP(1, 1, 1, 1),
1966+
.offset = 0x0,
1967+
.mode = LVTS_MSR_ATP_MODE,
1968+
},
1969+
{
1970+
.lvts_sensor = {
1971+
{ .dt_id = MT8196_AP_BOT0,
1972+
.cal_offsets = { 0x3A, 0x3B } },
1973+
{ .dt_id = MT8196_AP_BOT1,
1974+
.cal_offsets = { 0x38, 0x39 } },
1975+
{ .dt_id = MT8196_AP_BOT2,
1976+
.cal_offsets = { 0x3E, 0x3F } },
1977+
{ .dt_id = MT8196_AP_BOT3,
1978+
.cal_offsets = { 0x3C, 0x3D } }
1979+
},
1980+
VALID_SENSOR_MAP(1, 1, 1, 1),
1981+
.offset = 0x100,
1982+
.mode = LVTS_MSR_ATP_MODE,
1983+
}
1984+
};
1985+
18521986
static const struct lvts_platform_ops lvts_platform_ops_mt7988 = {
18531987
.lvts_raw_to_temp = lvts_raw_to_temp_mt7988,
18541988
.lvts_temp_to_raw = lvts_temp_to_raw_mt7988,
18551989
};
18561990

1991+
static const struct lvts_platform_ops lvts_platform_ops_mt8196 = {
1992+
.lvts_raw_to_temp = lvts_raw_to_temp_mt7988,
1993+
.lvts_temp_to_raw = lvts_temp_to_raw_mt8196,
1994+
};
1995+
18571996
static const struct lvts_data mt7988_lvts_ap_data = {
18581997
.lvts_ctrl = mt7988_lvts_ap_data_ctrl,
18591998
.conn_cmd = mt7988_conn_cmds,
@@ -1973,6 +2112,30 @@ static const struct lvts_data mt8195_lvts_ap_data = {
19732112
.ops = &lvts_platform_ops_mt7988,
19742113
};
19752114

2115+
static const struct lvts_data mt8196_lvts_mcu_data = {
2116+
.lvts_ctrl = mt8196_lvts_mcu_data_ctrl,
2117+
.num_lvts_ctrl = ARRAY_SIZE(mt8196_lvts_mcu_data_ctrl),
2118+
.temp_factor = LVTS_COEFF_A_MT8196,
2119+
.temp_offset = LVTS_COEFF_B_MT8196,
2120+
.gt_calib_bit_offset = 0,
2121+
.def_calibration = 14437,
2122+
.num_cal_offsets = LVTS_NUM_CAL_OFFSETS_MT8196,
2123+
.msr_offset = LVTS_MSR_OFFSET_MT8196,
2124+
.ops = &lvts_platform_ops_mt8196,
2125+
};
2126+
2127+
static const struct lvts_data mt8196_lvts_ap_data = {
2128+
.lvts_ctrl = mt8196_lvts_ap_data_ctrl,
2129+
.num_lvts_ctrl = ARRAY_SIZE(mt8196_lvts_ap_data_ctrl),
2130+
.temp_factor = LVTS_COEFF_A_MT8196,
2131+
.temp_offset = LVTS_COEFF_B_MT8196,
2132+
.gt_calib_bit_offset = 0,
2133+
.def_calibration = 14437,
2134+
.num_cal_offsets = LVTS_NUM_CAL_OFFSETS_MT8196,
2135+
.msr_offset = LVTS_MSR_OFFSET_MT8196,
2136+
.ops = &lvts_platform_ops_mt8196,
2137+
};
2138+
19762139
static const struct of_device_id lvts_of_match[] = {
19772140
{ .compatible = "mediatek,mt7988-lvts-ap", .data = &mt7988_lvts_ap_data },
19782141
{ .compatible = "mediatek,mt8186-lvts", .data = &mt8186_lvts_data },
@@ -1982,6 +2145,8 @@ static const struct of_device_id lvts_of_match[] = {
19822145
{ .compatible = "mediatek,mt8192-lvts-ap", .data = &mt8192_lvts_ap_data },
19832146
{ .compatible = "mediatek,mt8195-lvts-mcu", .data = &mt8195_lvts_mcu_data },
19842147
{ .compatible = "mediatek,mt8195-lvts-ap", .data = &mt8195_lvts_ap_data },
2148+
{ .compatible = "mediatek,mt8196-lvts-mcu", .data = &mt8196_lvts_mcu_data },
2149+
{ .compatible = "mediatek,mt8196-lvts-ap", .data = &mt8196_lvts_ap_data },
19852150
{},
19862151
};
19872152
MODULE_DEVICE_TABLE(of, lvts_of_match);

0 commit comments

Comments
 (0)