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

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
Loading
Loading
Loading
Loading
+99 −65
Original line number Diff line number Diff line
@@ -100,6 +100,7 @@ static int golden_temp_offset;

struct lvts_sensor_data {
	int dt_id;
	u8 cal_offsets[3];
};

struct lvts_ctrl_data {
@@ -665,8 +666,9 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
 * <-----ap--tc#3-----> <-----sensor#7-----> <-----sensor#8----->
 *  0x40 | 0x41 | 0x42 | 0x43 | 0x44 | 0x45 | 0x46 | 0x47 | 0x48
 *
 * The data description gives the offset of the calibration data in
 * this bytes stream for each sensor.
 * Note: In some cases, values don't strictly follow a little endian ordering.
 * 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,
					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
{
	int i;

	for (i = 0; i < lvts_ctrl_data->num_lvts_sensor; i++)
		memcpy(&lvts_ctrl->calibration[i],
		       efuse_calibration + lvts_ctrl_data->cal_offset[i], 3);
	for (i = 0; i < lvts_ctrl_data->num_lvts_sensor; i++) {
		const struct lvts_sensor_data *sensor =
					&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;
}
@@ -1299,23 +1307,29 @@ static void lvts_remove(struct platform_device *pdev)

static const struct lvts_ctrl_data mt7988_lvts_ap_data_ctrl[] = {
	{
		.cal_offset = { 0x00, 0x04, 0x08, 0x0c },
		.lvts_sensor = {
			{ .dt_id = MT7988_CPU_0 },
			{ .dt_id = MT7988_CPU_1 },
			{ .dt_id = MT7988_ETH2P5G_0 },
			{ .dt_id = MT7988_ETH2P5G_1 }
			{ .dt_id = MT7988_CPU_0,
			  .cal_offsets = { 0x00, 0x01, 0x02 } },
			{ .dt_id = MT7988_CPU_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,
		.offset = 0x0,
	},
	{
		.cal_offset = { 0x14, 0x18, 0x1c, 0x20 },
		.lvts_sensor = {
			{ .dt_id = MT7988_TOPS_0},
			{ .dt_id = MT7988_TOPS_1},
			{ .dt_id = MT7988_ETHWARP_0},
			{ .dt_id = MT7988_ETHWARP_1}
			{ .dt_id = MT7988_TOPS_0,
			   .cal_offsets = { 0x14, 0x15, 0x16 } },
			{ .dt_id = MT7988_TOPS_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,
		.offset = 0x100,
@@ -1356,32 +1370,37 @@ static int lvts_resume(struct device *dev)

static const struct lvts_ctrl_data mt8192_lvts_mcu_data_ctrl[] = {
	{
		.cal_offset = { 0x04, 0x08 },
		.lvts_sensor = {
			{ .dt_id = MT8192_MCU_BIG_CPU0 },
			{ .dt_id = MT8192_MCU_BIG_CPU1 }
			{ .dt_id = MT8192_MCU_BIG_CPU0,
			  .cal_offsets = { 0x04, 0x05, 0x06 } },
			{ .dt_id = MT8192_MCU_BIG_CPU1,
			  .cal_offsets = { 0x08, 0x09, 0x0a } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x0,
		.mode = LVTS_MSR_FILTERED_MODE,
	},
	{
		.cal_offset = { 0x0c, 0x10 },
		.lvts_sensor = {
			{ .dt_id = MT8192_MCU_BIG_CPU2 },
			{ .dt_id = MT8192_MCU_BIG_CPU3 }
			{ .dt_id = MT8192_MCU_BIG_CPU2,
			  .cal_offsets = { 0x0c, 0x0d, 0x0e } },
			{ .dt_id = MT8192_MCU_BIG_CPU3,
			  .cal_offsets = { 0x10, 0x11, 0x12 } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x100,
		.mode = LVTS_MSR_FILTERED_MODE,
	},
	{
		.cal_offset = { 0x14, 0x18, 0x1c, 0x20 },
		.lvts_sensor = {
			{ .dt_id = MT8192_MCU_LITTLE_CPU0 },
			{ .dt_id = MT8192_MCU_LITTLE_CPU1 },
			{ .dt_id = MT8192_MCU_LITTLE_CPU2 },
			{ .dt_id = MT8192_MCU_LITTLE_CPU3 }
			{ .dt_id = MT8192_MCU_LITTLE_CPU0,
			  .cal_offsets = { 0x14, 0x15, 0x16 } },
			{ .dt_id = MT8192_MCU_LITTLE_CPU1,
			  .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,
		.offset = 0x200,
@@ -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[] = {
	{
		.cal_offset = { 0x24, 0x28 },
		.lvts_sensor = {
			{ .dt_id = MT8192_AP_VPU0 },
			{ .dt_id = MT8192_AP_VPU1 }
			{ .dt_id = MT8192_AP_VPU0,
			  .cal_offsets = { 0x24, 0x25, 0x26 } },
			{ .dt_id = MT8192_AP_VPU1,
			  .cal_offsets = { 0x28, 0x29, 0x2a } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x0,
	},
	{
		.cal_offset = { 0x2c, 0x30 },
		.lvts_sensor = {
			{ .dt_id = MT8192_AP_GPU0 },
			{ .dt_id = MT8192_AP_GPU1 }
			{ .dt_id = MT8192_AP_GPU0,
			  .cal_offsets = { 0x2c, 0x2d, 0x2e } },
			{ .dt_id = MT8192_AP_GPU1,
			  .cal_offsets = { 0x30, 0x31, 0x32 } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x100,
	},
	{
		.cal_offset = { 0x34, 0x38 },
		.lvts_sensor = {
			{ .dt_id = MT8192_AP_INFRA },
			{ .dt_id = MT8192_AP_CAM },
			{ .dt_id = MT8192_AP_INFRA,
			  .cal_offsets = { 0x34, 0x35, 0x36 } },
			{ .dt_id = MT8192_AP_CAM,
			  .cal_offsets = { 0x38, 0x39, 0x3a } },
		},
		.num_lvts_sensor = 2,
		.offset = 0x200,
	},
	{
		.cal_offset = { 0x3c, 0x40, 0x44 },
		.lvts_sensor = {
			{ .dt_id = MT8192_AP_MD0 },
			{ .dt_id = MT8192_AP_MD1 },
			{ .dt_id = MT8192_AP_MD2 }
			{ .dt_id = MT8192_AP_MD0,
			  .cal_offsets = { 0x3c, 0x3d, 0x3e } },
			{ .dt_id = MT8192_AP_MD1,
			  .cal_offsets = { 0x40, 0x41, 0x42 } },
			{ .dt_id = MT8192_AP_MD2,
			  .cal_offsets = { 0x44, 0x45, 0x46 } }
		},
		.num_lvts_sensor = 3,
		.offset = 0x300,
@@ -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[] = {
	{
		.cal_offset = { 0x04, 0x07 },
		.lvts_sensor = {
			{ .dt_id = MT8195_MCU_BIG_CPU0 },
			{ .dt_id = MT8195_MCU_BIG_CPU1 }
			{ .dt_id = MT8195_MCU_BIG_CPU0,
			  .cal_offsets = { 0x04, 0x05, 0x06 } },
			{ .dt_id = MT8195_MCU_BIG_CPU1,
			  .cal_offsets = { 0x07, 0x08, 0x09 } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x0,
	},
	{
		.cal_offset = { 0x0d, 0x10 },
		.lvts_sensor = {
			{ .dt_id = MT8195_MCU_BIG_CPU2 },
			{ .dt_id = MT8195_MCU_BIG_CPU3 }
			{ .dt_id = MT8195_MCU_BIG_CPU2,
			  .cal_offsets = { 0x0d, 0x0e, 0x0f } },
			{ .dt_id = MT8195_MCU_BIG_CPU3,
			  .cal_offsets = { 0x10, 0x11, 0x12 } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x100,
	},
	{
		.cal_offset = { 0x16, 0x19, 0x1c, 0x1f },
		.lvts_sensor = {
			{ .dt_id = MT8195_MCU_LITTLE_CPU0 },
			{ .dt_id = MT8195_MCU_LITTLE_CPU1 },
			{ .dt_id = MT8195_MCU_LITTLE_CPU2 },
			{ .dt_id = MT8195_MCU_LITTLE_CPU3 }
			{ .dt_id = MT8195_MCU_LITTLE_CPU0,
			  .cal_offsets = { 0x16, 0x17, 0x18 } },
			{ .dt_id = MT8195_MCU_LITTLE_CPU1,
			  .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,
		.offset = 0x200,
@@ -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[] = {
	{
		.cal_offset = { 0x25, 0x28 },
		.lvts_sensor = {
			{ .dt_id = MT8195_AP_VPU0 },
			{ .dt_id = MT8195_AP_VPU1 }
			{ .dt_id = MT8195_AP_VPU0,
			  .cal_offsets = { 0x25, 0x26, 0x27 } },
			{ .dt_id = MT8195_AP_VPU1,
			  .cal_offsets = { 0x28, 0x29, 0x2a } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x0,
	},
	{
		.cal_offset = { 0x2e, 0x31 },
		.lvts_sensor = {
			{ .dt_id = MT8195_AP_GPU0 },
			{ .dt_id = MT8195_AP_GPU1 }
			{ .dt_id = MT8195_AP_GPU0,
			  .cal_offsets = { 0x2e, 0x2f, 0x30 } },
			{ .dt_id = MT8195_AP_GPU1,
			  .cal_offsets = { 0x31, 0x32, 0x33 } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x100,
	},
	{
		.cal_offset = { 0x37, 0x3a, 0x3d },
		.lvts_sensor = {
			{ .dt_id = MT8195_AP_VDEC },
			{ .dt_id = MT8195_AP_IMG },
			{ .dt_id = MT8195_AP_INFRA },
			{ .dt_id = MT8195_AP_VDEC,
			  .cal_offsets = { 0x37, 0x38, 0x39 } },
			{ .dt_id = MT8195_AP_IMG,
			  .cal_offsets = { 0x3a, 0x3b, 0x3c } },
			{ .dt_id = MT8195_AP_INFRA,
			  .cal_offsets = { 0x3d, 0x3e, 0x3f } }
		},
		.num_lvts_sensor = 3,
		.offset = 0x200,
	},
	{
		.cal_offset = { 0x43, 0x46 },
		.lvts_sensor = {
			{ .dt_id = MT8195_AP_CAM0 },
			{ .dt_id = MT8195_AP_CAM1 }
			{ .dt_id = MT8195_AP_CAM0,
			  .cal_offsets = { 0x43, 0x44, 0x45 } },
			{ .dt_id = MT8195_AP_CAM1,
			  .cal_offsets = { 0x46, 0x47, 0x48 } }
		},
		.num_lvts_sensor = 2,
		.offset = 0x300,