Loading drivers/thermal/msm-tsens.c +3 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,9 @@ static const struct of_device_id tsens_table[] = { { .compatible = "qcom,qcs405-tsens", .data = &data_tsens14xx_405, }, { .compatible = "qcom,mdm9607-tsens", .data = &data_tsens14xx_9607, }, {} }; MODULE_DEVICE_TABLE(of, tsens_table); Loading drivers/thermal/tsens.h +17 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,17 @@ #define TSENS_MAX_SENSORS 16 #define TSENS_NUM_SENSORS_8937 11 #define TSENS_NUM_SENSORS_405 10 #define TSENS_NUM_SENSORS_9607 5 #define TSENS_SROT_OFFSET_8937 0x4 #define TSENS_SROT_OFFSET_405 0x4 #define TSENS_SROT_OFFSET_9607 0x0 #define TSENS_SN_STATUS_ADDR_8937 0x44 #define TSENS_TRDY_ADDR_8937 0x84 #define TSENS_SN_STATUS_ADDR_405 0x44 #define TSENS_TRDY_ADDR_405 0x84 #define TSENS_SN_STATUS_ADDR_9607 0x30 #define TSENS_TRDY_ADDR_9607 0x5c #define TSENS_CONTROLLER_ID(n) (n) #define TSENS_CTRL_ADDR(n) (n) #define TSENS_TM_SN_STATUS(n) ((n) + 0xa0) Loading Loading @@ -184,6 +195,9 @@ struct tsens_data { bool valid_status_check; u32 ver_major; u32 ver_minor; const u32 tsens_srot_offset; const u32 tsens_sn_offset; const u32 tsens_trdy_offset; }; struct tsens_mtc_sysfs { Loading Loading @@ -218,10 +232,12 @@ struct tsens_device { }; extern const struct tsens_data data_tsens2xxx, data_tsens23xx, data_tsens24xx; extern const struct tsens_data data_tsens14xx, data_tsens14xx_405; extern const struct tsens_data data_tsens14xx, data_tsens14xx_405, data_tsens14xx_9607; extern struct list_head tsens_device_list; extern int calibrate_8937(struct tsens_device *tmdev); extern int calibrate_405(struct tsens_device *tmdev); extern int calibrate_9607(struct tsens_device *tmdev); #endif /* __QCOM_TSENS_H__ */ drivers/thermal/tsens1xxx.c +41 −8 Original line number Diff line number Diff line /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -41,10 +41,11 @@ #define TSENS_TRDY_MASK BIT(0) #define TSENS_SN_STATUS_ADDR(n) ((n) + 0x44) #define TSENS_SN_STATUS_ADDR(n) (n) #define TSENS_SN_STATUS_VALID BIT(14) #define TSENS_SN_STATUS_VALID_MASK 0x4000 #define TSENS_TRDY_ADDR(n) ((n) + 0x84) #define TSENS_TRDY_ADDR(n) (n) #define TSENS_CTRL_ADDR(n) (n) #define TSENS_EN BIT(0) Loading Loading @@ -103,8 +104,10 @@ static int tsens1xxx_get_temp(struct tsens_sensor *sensor, int *temp) tmdev = sensor->tmdev; trdy_addr = TSENS_TRDY_ADDR(tmdev->tsens_tm_addr); sensor_addr = TSENS_SN_STATUS_ADDR(tmdev->tsens_tm_addr); trdy_addr = TSENS_TRDY_ADDR(tmdev->tsens_tm_addr + tmdev->ctrl_data->tsens_trdy_offset); sensor_addr = TSENS_SN_STATUS_ADDR(tmdev->tsens_tm_addr + tmdev->ctrl_data->tsens_sn_offset); code = readl_relaxed(sensor_addr + (sensor->hw_id << TSENS_STATUS_ADDR_OFFSET)); Loading Loading @@ -324,7 +327,8 @@ static irqreturn_t tsens_irq_thread(int irq, void *data) void __iomem *sensor_status_ctrl_addr; u32 rc = 0, addr_offset; sensor_status_addr = TSENS_SN_STATUS_ADDR(tm->tsens_tm_addr); sensor_status_addr = TSENS_SN_STATUS_ADDR(tm->tsens_tm_addr + tm->ctrl_data->tsens_sn_offset); sensor_status_ctrl_addr = TSENS_S0_UPPER_LOWER_STATUS_CTRL_ADDR(tm->tsens_tm_addr); Loading Loading @@ -419,7 +423,8 @@ static int tsens1xxx_hw_sensor_en(struct tsens_device *tmdev, void __iomem *srot_addr; unsigned int srot_val, sensor_en; srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + 0x4); srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + tmdev->ctrl_data->tsens_srot_offset); srot_val = readl_relaxed(srot_addr); srot_val = TSENS_CTRL_SENSOR_EN_MASK(srot_val); Loading @@ -433,7 +438,8 @@ static int tsens1xxx_hw_init(struct tsens_device *tmdev) void __iomem *srot_addr; unsigned int srot_val; srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + 0x4); srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + tmdev->ctrl_data->tsens_srot_offset); srot_val = readl_relaxed(srot_addr); if (!(srot_val & TSENS_EN)) { pr_err("TSENS device is not enabled\n"); Loading Loading @@ -508,6 +514,9 @@ const struct tsens_data data_tsens14xx = { .mtc = true, .ver_major = 1, .ver_minor = 4, .tsens_srot_offset = TSENS_SROT_OFFSET_8937, .tsens_sn_offset = TSENS_SN_STATUS_ADDR_8937, .tsens_trdy_offset = TSENS_TRDY_ADDR_8937, }; static const struct tsens_ops ops_tsens1xxx_405 = { Loading @@ -527,4 +536,28 @@ const struct tsens_data data_tsens14xx_405 = { .mtc = true, .ver_major = 1, .ver_minor = 4, .tsens_srot_offset = TSENS_SROT_OFFSET_405, .tsens_sn_offset = TSENS_SN_STATUS_ADDR_405, .tsens_trdy_offset = TSENS_TRDY_ADDR_405, }; static const struct tsens_ops ops_tsens1xxx_9607 = { .hw_init = tsens1xxx_hw_init, .get_temp = tsens1xxx_get_temp, .set_trips = tsens1xxx_set_trip_temp, .interrupts_reg = tsens1xxx_register_interrupts, .sensor_en = tsens1xxx_hw_sensor_en, .calibrate = calibrate_9607, .dbg = tsens2xxx_dbg, }; const struct tsens_data data_tsens14xx_9607 = { .num_sensors = TSENS_NUM_SENSORS_9607, .ops = &ops_tsens1xxx_9607, .valid_status_check = true, .ver_major = 1, .ver_minor = 4, .tsens_srot_offset = TSENS_SROT_OFFSET_9607, .tsens_sn_offset = TSENS_SN_STATUS_ADDR_9607, .tsens_trdy_offset = TSENS_TRDY_ADDR_9607, }; drivers/thermal/tsens_calib.c +82 −1 Original line number Diff line number Diff line /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -125,6 +125,37 @@ #define CAL_SEL_MASK_405 0x7 /* eeprom layout data for 9607 */ #define BASE0_MASK_9607 0x000000ff #define BASE1_MASK_9607 0x000ff000 #define BASE1_SHIFT_9607 12 #define S0_P1_MASK_9607 0x00003f00 #define S1_P1_MASK_9607 0x03f00000 #define S2_P1_MASK_9607 0x0000003f #define S3_P1_MASK_9607 0x0003f000 #define S4_P1_MASK_9607 0x0000003f #define S0_P2_MASK_9607 0x000fc000 #define S1_P2_MASK_9607 0xfc000000 #define S2_P2_MASK_9607 0x00000fc0 #define S3_P2_MASK_9607 0x00fc0000 #define S4_P2_MASK_9607 0x00000fc0 #define S0_P1_SHIFT_9607 8 #define S1_P1_SHIFT_9607 20 #define S3_P1_SHIFT_9607 12 #define S0_P2_SHIFT_9607 14 #define S1_P2_SHIFT_9607 26 #define S2_P2_SHIFT_9607 6 #define S3_P2_SHIFT_9607 18 #define S4_P2_SHIFT_9607 6 #define CAL_SEL_MASK_9607 0x00700000 #define CAL_SEL_SHIFT_9607 20 #define CAL_DEGC_PT1 30 #define CAL_DEGC_PT2 120 Loading Loading @@ -301,3 +332,53 @@ int calibrate_405(struct tsens_device *tmdev) return 0; } int calibrate_9607(struct tsens_device *tmdev) { int base0 = 0, base1 = 0, i; u32 p1[TSENS_NUM_SENSORS_9607], p2[TSENS_NUM_SENSORS_9607]; int mode = 0; u32 qfprom_cdata[3] = { 0, 0, 0}; qfprom_cdata[0] = readl_relaxed(tmdev->tsens_calib_addr + 0x228); qfprom_cdata[1] = readl_relaxed(tmdev->tsens_calib_addr + 0x22C); qfprom_cdata[2] = readl_relaxed(tmdev->tsens_calib_addr + 0x230); mode = (qfprom_cdata[2] & CAL_SEL_MASK_9607) >> CAL_SEL_SHIFT_9607; pr_debug("calibration mode is %d\n", mode); switch (mode) { case TWO_PT_CALIB: base1 = (qfprom_cdata[2] & BASE1_MASK_9607) >> BASE1_SHIFT_9607; p2[0] = (qfprom_cdata[0] & S0_P2_MASK_9607) >> S0_P2_SHIFT_9607; p2[1] = (qfprom_cdata[0] & S1_P2_MASK_9607) >> S1_P2_SHIFT_9607; p2[2] = (qfprom_cdata[1] & S2_P2_MASK_9607) >> S2_P2_SHIFT_9607; p2[3] = (qfprom_cdata[1] & S3_P2_MASK_9607) >> S3_P2_SHIFT_9607; p2[4] = (qfprom_cdata[2] & S4_P2_MASK_9607) >> S4_P2_SHIFT_9607; for (i = 0; i < TSENS_NUM_SENSORS_9607; i++) p2[i] = ((base1 + p2[i]) << 2); /* Fall through */ case ONE_PT_CALIB2: base0 = (qfprom_cdata[0] & BASE0_MASK_9607); p1[0] = (qfprom_cdata[0] & S0_P1_MASK_9607) >> S0_P1_SHIFT_9607; p1[1] = (qfprom_cdata[0] & S1_P1_MASK_9607) >> S1_P1_SHIFT_9607; p1[2] = (qfprom_cdata[1] & S2_P1_MASK_9607); p1[3] = (qfprom_cdata[1] & S3_P1_MASK_9607) >> S3_P1_SHIFT_9607; p1[4] = (qfprom_cdata[2] & S4_P1_MASK_9607); for (i = 0; i < TSENS_NUM_SENSORS_9607; i++) p1[i] = (((base0) + p1[i]) << 2); break; default: for (i = 0; i < TSENS_NUM_SENSORS_9607; i++) { p1[i] = 500; p2[i] = 780; } break; } compute_intercept_slope(tmdev, p1, p2, mode); return 0; } Loading
drivers/thermal/msm-tsens.c +3 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,9 @@ static const struct of_device_id tsens_table[] = { { .compatible = "qcom,qcs405-tsens", .data = &data_tsens14xx_405, }, { .compatible = "qcom,mdm9607-tsens", .data = &data_tsens14xx_9607, }, {} }; MODULE_DEVICE_TABLE(of, tsens_table); Loading
drivers/thermal/tsens.h +17 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,17 @@ #define TSENS_MAX_SENSORS 16 #define TSENS_NUM_SENSORS_8937 11 #define TSENS_NUM_SENSORS_405 10 #define TSENS_NUM_SENSORS_9607 5 #define TSENS_SROT_OFFSET_8937 0x4 #define TSENS_SROT_OFFSET_405 0x4 #define TSENS_SROT_OFFSET_9607 0x0 #define TSENS_SN_STATUS_ADDR_8937 0x44 #define TSENS_TRDY_ADDR_8937 0x84 #define TSENS_SN_STATUS_ADDR_405 0x44 #define TSENS_TRDY_ADDR_405 0x84 #define TSENS_SN_STATUS_ADDR_9607 0x30 #define TSENS_TRDY_ADDR_9607 0x5c #define TSENS_CONTROLLER_ID(n) (n) #define TSENS_CTRL_ADDR(n) (n) #define TSENS_TM_SN_STATUS(n) ((n) + 0xa0) Loading Loading @@ -184,6 +195,9 @@ struct tsens_data { bool valid_status_check; u32 ver_major; u32 ver_minor; const u32 tsens_srot_offset; const u32 tsens_sn_offset; const u32 tsens_trdy_offset; }; struct tsens_mtc_sysfs { Loading Loading @@ -218,10 +232,12 @@ struct tsens_device { }; extern const struct tsens_data data_tsens2xxx, data_tsens23xx, data_tsens24xx; extern const struct tsens_data data_tsens14xx, data_tsens14xx_405; extern const struct tsens_data data_tsens14xx, data_tsens14xx_405, data_tsens14xx_9607; extern struct list_head tsens_device_list; extern int calibrate_8937(struct tsens_device *tmdev); extern int calibrate_405(struct tsens_device *tmdev); extern int calibrate_9607(struct tsens_device *tmdev); #endif /* __QCOM_TSENS_H__ */
drivers/thermal/tsens1xxx.c +41 −8 Original line number Diff line number Diff line /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -41,10 +41,11 @@ #define TSENS_TRDY_MASK BIT(0) #define TSENS_SN_STATUS_ADDR(n) ((n) + 0x44) #define TSENS_SN_STATUS_ADDR(n) (n) #define TSENS_SN_STATUS_VALID BIT(14) #define TSENS_SN_STATUS_VALID_MASK 0x4000 #define TSENS_TRDY_ADDR(n) ((n) + 0x84) #define TSENS_TRDY_ADDR(n) (n) #define TSENS_CTRL_ADDR(n) (n) #define TSENS_EN BIT(0) Loading Loading @@ -103,8 +104,10 @@ static int tsens1xxx_get_temp(struct tsens_sensor *sensor, int *temp) tmdev = sensor->tmdev; trdy_addr = TSENS_TRDY_ADDR(tmdev->tsens_tm_addr); sensor_addr = TSENS_SN_STATUS_ADDR(tmdev->tsens_tm_addr); trdy_addr = TSENS_TRDY_ADDR(tmdev->tsens_tm_addr + tmdev->ctrl_data->tsens_trdy_offset); sensor_addr = TSENS_SN_STATUS_ADDR(tmdev->tsens_tm_addr + tmdev->ctrl_data->tsens_sn_offset); code = readl_relaxed(sensor_addr + (sensor->hw_id << TSENS_STATUS_ADDR_OFFSET)); Loading Loading @@ -324,7 +327,8 @@ static irqreturn_t tsens_irq_thread(int irq, void *data) void __iomem *sensor_status_ctrl_addr; u32 rc = 0, addr_offset; sensor_status_addr = TSENS_SN_STATUS_ADDR(tm->tsens_tm_addr); sensor_status_addr = TSENS_SN_STATUS_ADDR(tm->tsens_tm_addr + tm->ctrl_data->tsens_sn_offset); sensor_status_ctrl_addr = TSENS_S0_UPPER_LOWER_STATUS_CTRL_ADDR(tm->tsens_tm_addr); Loading Loading @@ -419,7 +423,8 @@ static int tsens1xxx_hw_sensor_en(struct tsens_device *tmdev, void __iomem *srot_addr; unsigned int srot_val, sensor_en; srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + 0x4); srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + tmdev->ctrl_data->tsens_srot_offset); srot_val = readl_relaxed(srot_addr); srot_val = TSENS_CTRL_SENSOR_EN_MASK(srot_val); Loading @@ -433,7 +438,8 @@ static int tsens1xxx_hw_init(struct tsens_device *tmdev) void __iomem *srot_addr; unsigned int srot_val; srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + 0x4); srot_addr = TSENS_CTRL_ADDR(tmdev->tsens_srot_addr + tmdev->ctrl_data->tsens_srot_offset); srot_val = readl_relaxed(srot_addr); if (!(srot_val & TSENS_EN)) { pr_err("TSENS device is not enabled\n"); Loading Loading @@ -508,6 +514,9 @@ const struct tsens_data data_tsens14xx = { .mtc = true, .ver_major = 1, .ver_minor = 4, .tsens_srot_offset = TSENS_SROT_OFFSET_8937, .tsens_sn_offset = TSENS_SN_STATUS_ADDR_8937, .tsens_trdy_offset = TSENS_TRDY_ADDR_8937, }; static const struct tsens_ops ops_tsens1xxx_405 = { Loading @@ -527,4 +536,28 @@ const struct tsens_data data_tsens14xx_405 = { .mtc = true, .ver_major = 1, .ver_minor = 4, .tsens_srot_offset = TSENS_SROT_OFFSET_405, .tsens_sn_offset = TSENS_SN_STATUS_ADDR_405, .tsens_trdy_offset = TSENS_TRDY_ADDR_405, }; static const struct tsens_ops ops_tsens1xxx_9607 = { .hw_init = tsens1xxx_hw_init, .get_temp = tsens1xxx_get_temp, .set_trips = tsens1xxx_set_trip_temp, .interrupts_reg = tsens1xxx_register_interrupts, .sensor_en = tsens1xxx_hw_sensor_en, .calibrate = calibrate_9607, .dbg = tsens2xxx_dbg, }; const struct tsens_data data_tsens14xx_9607 = { .num_sensors = TSENS_NUM_SENSORS_9607, .ops = &ops_tsens1xxx_9607, .valid_status_check = true, .ver_major = 1, .ver_minor = 4, .tsens_srot_offset = TSENS_SROT_OFFSET_9607, .tsens_sn_offset = TSENS_SN_STATUS_ADDR_9607, .tsens_trdy_offset = TSENS_TRDY_ADDR_9607, };
drivers/thermal/tsens_calib.c +82 −1 Original line number Diff line number Diff line /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -125,6 +125,37 @@ #define CAL_SEL_MASK_405 0x7 /* eeprom layout data for 9607 */ #define BASE0_MASK_9607 0x000000ff #define BASE1_MASK_9607 0x000ff000 #define BASE1_SHIFT_9607 12 #define S0_P1_MASK_9607 0x00003f00 #define S1_P1_MASK_9607 0x03f00000 #define S2_P1_MASK_9607 0x0000003f #define S3_P1_MASK_9607 0x0003f000 #define S4_P1_MASK_9607 0x0000003f #define S0_P2_MASK_9607 0x000fc000 #define S1_P2_MASK_9607 0xfc000000 #define S2_P2_MASK_9607 0x00000fc0 #define S3_P2_MASK_9607 0x00fc0000 #define S4_P2_MASK_9607 0x00000fc0 #define S0_P1_SHIFT_9607 8 #define S1_P1_SHIFT_9607 20 #define S3_P1_SHIFT_9607 12 #define S0_P2_SHIFT_9607 14 #define S1_P2_SHIFT_9607 26 #define S2_P2_SHIFT_9607 6 #define S3_P2_SHIFT_9607 18 #define S4_P2_SHIFT_9607 6 #define CAL_SEL_MASK_9607 0x00700000 #define CAL_SEL_SHIFT_9607 20 #define CAL_DEGC_PT1 30 #define CAL_DEGC_PT2 120 Loading Loading @@ -301,3 +332,53 @@ int calibrate_405(struct tsens_device *tmdev) return 0; } int calibrate_9607(struct tsens_device *tmdev) { int base0 = 0, base1 = 0, i; u32 p1[TSENS_NUM_SENSORS_9607], p2[TSENS_NUM_SENSORS_9607]; int mode = 0; u32 qfprom_cdata[3] = { 0, 0, 0}; qfprom_cdata[0] = readl_relaxed(tmdev->tsens_calib_addr + 0x228); qfprom_cdata[1] = readl_relaxed(tmdev->tsens_calib_addr + 0x22C); qfprom_cdata[2] = readl_relaxed(tmdev->tsens_calib_addr + 0x230); mode = (qfprom_cdata[2] & CAL_SEL_MASK_9607) >> CAL_SEL_SHIFT_9607; pr_debug("calibration mode is %d\n", mode); switch (mode) { case TWO_PT_CALIB: base1 = (qfprom_cdata[2] & BASE1_MASK_9607) >> BASE1_SHIFT_9607; p2[0] = (qfprom_cdata[0] & S0_P2_MASK_9607) >> S0_P2_SHIFT_9607; p2[1] = (qfprom_cdata[0] & S1_P2_MASK_9607) >> S1_P2_SHIFT_9607; p2[2] = (qfprom_cdata[1] & S2_P2_MASK_9607) >> S2_P2_SHIFT_9607; p2[3] = (qfprom_cdata[1] & S3_P2_MASK_9607) >> S3_P2_SHIFT_9607; p2[4] = (qfprom_cdata[2] & S4_P2_MASK_9607) >> S4_P2_SHIFT_9607; for (i = 0; i < TSENS_NUM_SENSORS_9607; i++) p2[i] = ((base1 + p2[i]) << 2); /* Fall through */ case ONE_PT_CALIB2: base0 = (qfprom_cdata[0] & BASE0_MASK_9607); p1[0] = (qfprom_cdata[0] & S0_P1_MASK_9607) >> S0_P1_SHIFT_9607; p1[1] = (qfprom_cdata[0] & S1_P1_MASK_9607) >> S1_P1_SHIFT_9607; p1[2] = (qfprom_cdata[1] & S2_P1_MASK_9607); p1[3] = (qfprom_cdata[1] & S3_P1_MASK_9607) >> S3_P1_SHIFT_9607; p1[4] = (qfprom_cdata[2] & S4_P1_MASK_9607); for (i = 0; i < TSENS_NUM_SENSORS_9607; i++) p1[i] = (((base0) + p1[i]) << 2); break; default: for (i = 0; i < TSENS_NUM_SENSORS_9607; i++) { p1[i] = 500; p2[i] = 780; } break; } compute_intercept_slope(tmdev, p1, p2, mode); return 0; }