Commit 5b3367e2 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Daniel Lezcano

thermal/drivers/mediatek/lvts_thermal: Use offsets for every calibration byte

Current code assumes calibration values are always stored contiguously
in host endian order. A future patch will prove this wrong.

Let's specify the offset for each calibration byte instead.
Signed-off-by: default avatarNicolas Pitre <npitre@baylibre.com>
Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
Link: https://lore.kernel.org/r/20240402032729.2736685-5-nico@fluxnic.net
parent 554bca31
...@@ -100,6 +100,7 @@ static int golden_temp_offset; ...@@ -100,6 +100,7 @@ static int golden_temp_offset;
struct lvts_sensor_data { struct lvts_sensor_data {
int dt_id; int dt_id;
u8 cal_offsets[3];
}; };
struct lvts_ctrl_data { struct lvts_ctrl_data {
...@@ -665,8 +666,9 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl, ...@@ -665,8 +666,9 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
* <-----ap--tc#3-----> <-----sensor#7-----> <-----sensor#8-----> * <-----ap--tc#3-----> <-----sensor#7-----> <-----sensor#8----->
* 0x40 | 0x41 | 0x42 | 0x43 | 0x44 | 0x45 | 0x46 | 0x47 | 0x48 * 0x40 | 0x41 | 0x42 | 0x43 | 0x44 | 0x45 | 0x46 | 0x47 | 0x48
* *
* The data description gives the offset of the calibration data in * Note: In some cases, values don't strictly follow a little endian ordering.
* this bytes stream for each sensor. * The data description gives byte offsets constituting each calibration value
* for each sensor.
*/ */
static int lvts_calibration_init(struct device *dev, struct lvts_ctrl *lvts_ctrl, static int lvts_calibration_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
const struct lvts_ctrl_data *lvts_ctrl_data, const struct lvts_ctrl_data *lvts_ctrl_data,
...@@ -674,9 +676,15 @@ static int lvts_calibration_init(struct device *dev, struct lvts_ctrl *lvts_ctrl ...@@ -674,9 +676,15 @@ static int lvts_calibration_init(struct device *dev, struct lvts_ctrl *lvts_ctrl
{ {
int i; int i;
for (i = 0; i < lvts_ctrl_data->num_lvts_sensor; i++) for (i = 0; i < lvts_ctrl_data->num_lvts_sensor; i++) {
memcpy(&lvts_ctrl->calibration[i], const struct lvts_sensor_data *sensor =
efuse_calibration + lvts_ctrl_data->cal_offset[i], 3); &lvts_ctrl_data->lvts_sensor[i];
lvts_ctrl->calibration[i] =
(efuse_calibration[sensor->cal_offsets[0]] << 0) +
(efuse_calibration[sensor->cal_offsets[1]] << 8) +
(efuse_calibration[sensor->cal_offsets[2]] << 16);
}
return 0; return 0;
} }
...@@ -1299,23 +1307,29 @@ static void lvts_remove(struct platform_device *pdev) ...@@ -1299,23 +1307,29 @@ static void lvts_remove(struct platform_device *pdev)
static const struct lvts_ctrl_data mt7988_lvts_ap_data_ctrl[] = { static const struct lvts_ctrl_data mt7988_lvts_ap_data_ctrl[] = {
{ {
.cal_offset = { 0x00, 0x04, 0x08, 0x0c },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT7988_CPU_0 }, { .dt_id = MT7988_CPU_0,
{ .dt_id = MT7988_CPU_1 }, .cal_offsets = { 0x00, 0x01, 0x02 } },
{ .dt_id = MT7988_ETH2P5G_0 }, { .dt_id = MT7988_CPU_1,
{ .dt_id = MT7988_ETH2P5G_1 } .cal_offsets = { 0x04, 0x05, 0x06 } },
{ .dt_id = MT7988_ETH2P5G_0,
.cal_offsets = { 0x08, 0x09, 0x0a } },
{ .dt_id = MT7988_ETH2P5G_1,
.cal_offsets = { 0x0c, 0x0d, 0x0e } }
}, },
.num_lvts_sensor = 4, .num_lvts_sensor = 4,
.offset = 0x0, .offset = 0x0,
}, },
{ {
.cal_offset = { 0x14, 0x18, 0x1c, 0x20 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT7988_TOPS_0}, { .dt_id = MT7988_TOPS_0,
{ .dt_id = MT7988_TOPS_1}, .cal_offsets = { 0x14, 0x15, 0x16 } },
{ .dt_id = MT7988_ETHWARP_0}, { .dt_id = MT7988_TOPS_1,
{ .dt_id = MT7988_ETHWARP_1} .cal_offsets = { 0x18, 0x19, 0x1a } },
{ .dt_id = MT7988_ETHWARP_0,
.cal_offsets = { 0x1c, 0x1d, 0x1e } },
{ .dt_id = MT7988_ETHWARP_1,
.cal_offsets = { 0x20, 0x21, 0x22 } }
}, },
.num_lvts_sensor = 4, .num_lvts_sensor = 4,
.offset = 0x100, .offset = 0x100,
...@@ -1356,32 +1370,37 @@ static int lvts_resume(struct device *dev) ...@@ -1356,32 +1370,37 @@ static int lvts_resume(struct device *dev)
static const struct lvts_ctrl_data mt8192_lvts_mcu_data_ctrl[] = { static const struct lvts_ctrl_data mt8192_lvts_mcu_data_ctrl[] = {
{ {
.cal_offset = { 0x04, 0x08 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8192_MCU_BIG_CPU0 }, { .dt_id = MT8192_MCU_BIG_CPU0,
{ .dt_id = MT8192_MCU_BIG_CPU1 } .cal_offsets = { 0x04, 0x05, 0x06 } },
{ .dt_id = MT8192_MCU_BIG_CPU1,
.cal_offsets = { 0x08, 0x09, 0x0a } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x0, .offset = 0x0,
.mode = LVTS_MSR_FILTERED_MODE, .mode = LVTS_MSR_FILTERED_MODE,
}, },
{ {
.cal_offset = { 0x0c, 0x10 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8192_MCU_BIG_CPU2 }, { .dt_id = MT8192_MCU_BIG_CPU2,
{ .dt_id = MT8192_MCU_BIG_CPU3 } .cal_offsets = { 0x0c, 0x0d, 0x0e } },
{ .dt_id = MT8192_MCU_BIG_CPU3,
.cal_offsets = { 0x10, 0x11, 0x12 } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x100, .offset = 0x100,
.mode = LVTS_MSR_FILTERED_MODE, .mode = LVTS_MSR_FILTERED_MODE,
}, },
{ {
.cal_offset = { 0x14, 0x18, 0x1c, 0x20 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8192_MCU_LITTLE_CPU0 }, { .dt_id = MT8192_MCU_LITTLE_CPU0,
{ .dt_id = MT8192_MCU_LITTLE_CPU1 }, .cal_offsets = { 0x14, 0x15, 0x16 } },
{ .dt_id = MT8192_MCU_LITTLE_CPU2 }, { .dt_id = MT8192_MCU_LITTLE_CPU1,
{ .dt_id = MT8192_MCU_LITTLE_CPU3 } .cal_offsets = { 0x18, 0x19, 0x1a } },
{ .dt_id = MT8192_MCU_LITTLE_CPU2,
.cal_offsets = { 0x1c, 0x1d, 0x1e } },
{ .dt_id = MT8192_MCU_LITTLE_CPU3,
.cal_offsets = { 0x20, 0x21, 0x22 } }
}, },
.num_lvts_sensor = 4, .num_lvts_sensor = 4,
.offset = 0x200, .offset = 0x200,
...@@ -1391,38 +1410,43 @@ static const struct lvts_ctrl_data mt8192_lvts_mcu_data_ctrl[] = { ...@@ -1391,38 +1410,43 @@ static const struct lvts_ctrl_data mt8192_lvts_mcu_data_ctrl[] = {
static const struct lvts_ctrl_data mt8192_lvts_ap_data_ctrl[] = { static const struct lvts_ctrl_data mt8192_lvts_ap_data_ctrl[] = {
{ {
.cal_offset = { 0x24, 0x28 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8192_AP_VPU0 }, { .dt_id = MT8192_AP_VPU0,
{ .dt_id = MT8192_AP_VPU1 } .cal_offsets = { 0x24, 0x25, 0x26 } },
{ .dt_id = MT8192_AP_VPU1,
.cal_offsets = { 0x28, 0x29, 0x2a } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x0, .offset = 0x0,
}, },
{ {
.cal_offset = { 0x2c, 0x30 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8192_AP_GPU0 }, { .dt_id = MT8192_AP_GPU0,
{ .dt_id = MT8192_AP_GPU1 } .cal_offsets = { 0x2c, 0x2d, 0x2e } },
{ .dt_id = MT8192_AP_GPU1,
.cal_offsets = { 0x30, 0x31, 0x32 } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x100, .offset = 0x100,
}, },
{ {
.cal_offset = { 0x34, 0x38 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8192_AP_INFRA }, { .dt_id = MT8192_AP_INFRA,
{ .dt_id = MT8192_AP_CAM }, .cal_offsets = { 0x34, 0x35, 0x36 } },
{ .dt_id = MT8192_AP_CAM,
.cal_offsets = { 0x38, 0x39, 0x3a } },
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x200, .offset = 0x200,
}, },
{ {
.cal_offset = { 0x3c, 0x40, 0x44 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8192_AP_MD0 }, { .dt_id = MT8192_AP_MD0,
{ .dt_id = MT8192_AP_MD1 }, .cal_offsets = { 0x3c, 0x3d, 0x3e } },
{ .dt_id = MT8192_AP_MD2 } { .dt_id = MT8192_AP_MD1,
.cal_offsets = { 0x40, 0x41, 0x42 } },
{ .dt_id = MT8192_AP_MD2,
.cal_offsets = { 0x44, 0x45, 0x46 } }
}, },
.num_lvts_sensor = 3, .num_lvts_sensor = 3,
.offset = 0x300, .offset = 0x300,
...@@ -1431,30 +1455,35 @@ static const struct lvts_ctrl_data mt8192_lvts_ap_data_ctrl[] = { ...@@ -1431,30 +1455,35 @@ static const struct lvts_ctrl_data mt8192_lvts_ap_data_ctrl[] = {
static const struct lvts_ctrl_data mt8195_lvts_mcu_data_ctrl[] = { static const struct lvts_ctrl_data mt8195_lvts_mcu_data_ctrl[] = {
{ {
.cal_offset = { 0x04, 0x07 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8195_MCU_BIG_CPU0 }, { .dt_id = MT8195_MCU_BIG_CPU0,
{ .dt_id = MT8195_MCU_BIG_CPU1 } .cal_offsets = { 0x04, 0x05, 0x06 } },
{ .dt_id = MT8195_MCU_BIG_CPU1,
.cal_offsets = { 0x07, 0x08, 0x09 } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x0, .offset = 0x0,
}, },
{ {
.cal_offset = { 0x0d, 0x10 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8195_MCU_BIG_CPU2 }, { .dt_id = MT8195_MCU_BIG_CPU2,
{ .dt_id = MT8195_MCU_BIG_CPU3 } .cal_offsets = { 0x0d, 0x0e, 0x0f } },
{ .dt_id = MT8195_MCU_BIG_CPU3,
.cal_offsets = { 0x10, 0x11, 0x12 } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x100, .offset = 0x100,
}, },
{ {
.cal_offset = { 0x16, 0x19, 0x1c, 0x1f },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8195_MCU_LITTLE_CPU0 }, { .dt_id = MT8195_MCU_LITTLE_CPU0,
{ .dt_id = MT8195_MCU_LITTLE_CPU1 }, .cal_offsets = { 0x16, 0x17, 0x18 } },
{ .dt_id = MT8195_MCU_LITTLE_CPU2 }, { .dt_id = MT8195_MCU_LITTLE_CPU1,
{ .dt_id = MT8195_MCU_LITTLE_CPU3 } .cal_offsets = { 0x19, 0x1a, 0x1b } },
{ .dt_id = MT8195_MCU_LITTLE_CPU2,
.cal_offsets = { 0x1c, 0x1d, 0x1e } },
{ .dt_id = MT8195_MCU_LITTLE_CPU3,
.cal_offsets = { 0x1f, 0x20, 0x21 } }
}, },
.num_lvts_sensor = 4, .num_lvts_sensor = 4,
.offset = 0x200, .offset = 0x200,
...@@ -1463,38 +1492,43 @@ static const struct lvts_ctrl_data mt8195_lvts_mcu_data_ctrl[] = { ...@@ -1463,38 +1492,43 @@ static const struct lvts_ctrl_data mt8195_lvts_mcu_data_ctrl[] = {
static const struct lvts_ctrl_data mt8195_lvts_ap_data_ctrl[] = { static const struct lvts_ctrl_data mt8195_lvts_ap_data_ctrl[] = {
{ {
.cal_offset = { 0x25, 0x28 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8195_AP_VPU0 }, { .dt_id = MT8195_AP_VPU0,
{ .dt_id = MT8195_AP_VPU1 } .cal_offsets = { 0x25, 0x26, 0x27 } },
{ .dt_id = MT8195_AP_VPU1,
.cal_offsets = { 0x28, 0x29, 0x2a } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x0, .offset = 0x0,
}, },
{ {
.cal_offset = { 0x2e, 0x31 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8195_AP_GPU0 }, { .dt_id = MT8195_AP_GPU0,
{ .dt_id = MT8195_AP_GPU1 } .cal_offsets = { 0x2e, 0x2f, 0x30 } },
{ .dt_id = MT8195_AP_GPU1,
.cal_offsets = { 0x31, 0x32, 0x33 } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x100, .offset = 0x100,
}, },
{ {
.cal_offset = { 0x37, 0x3a, 0x3d },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8195_AP_VDEC }, { .dt_id = MT8195_AP_VDEC,
{ .dt_id = MT8195_AP_IMG }, .cal_offsets = { 0x37, 0x38, 0x39 } },
{ .dt_id = MT8195_AP_INFRA }, { .dt_id = MT8195_AP_IMG,
.cal_offsets = { 0x3a, 0x3b, 0x3c } },
{ .dt_id = MT8195_AP_INFRA,
.cal_offsets = { 0x3d, 0x3e, 0x3f } }
}, },
.num_lvts_sensor = 3, .num_lvts_sensor = 3,
.offset = 0x200, .offset = 0x200,
}, },
{ {
.cal_offset = { 0x43, 0x46 },
.lvts_sensor = { .lvts_sensor = {
{ .dt_id = MT8195_AP_CAM0 }, { .dt_id = MT8195_AP_CAM0,
{ .dt_id = MT8195_AP_CAM1 } .cal_offsets = { 0x43, 0x44, 0x45 } },
{ .dt_id = MT8195_AP_CAM1,
.cal_offsets = { 0x46, 0x47, 0x48 } }
}, },
.num_lvts_sensor = 2, .num_lvts_sensor = 2,
.offset = 0x300, .offset = 0x300,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment