Loading Documentation/devicetree/bindings/thermal/tsens.txt +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ Required properties: should be "qcom,msm8x26-tsens" for 8x26 TSENS driver. should be "qcom,fsm9900-tsens" for 9900 TSENS driver. should be "qcom,mdm9630-tsens" for 9630 TSENS driver. should be "qcom,msmplutonium-tsens" for Plutonium TSENS driver. The compatible property is used to identify the respective fusemap to use for the corresponding SoC. - reg : offset and length of the TSENS registers. Loading drivers/thermal/msm8974-tsens.c +337 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ #define TSENS_TRDY_MASK BIT(0) #define TSENS2_SN_STATUS_ADDR(n) ((n) + 0x1044) #define TSENS2_SN_STATUS_VALID BIT(14) #define TSENS2_TRDY_ADDR(n) ((n) + 0x84) #define TSENS_CTRL_ADDR(n) (n) Loading Loading @@ -92,6 +93,14 @@ #define TSENS_8936_EEPROM(n) ((n) + 0xa0) #define TSENS_PLUTO_EEPROM(n) ((n) + 0xd0) #define TSENS_PLUTO_EEPROM_REDUN_SEL(n) ((n) + 0x464) #define TSENS_REDUN_REGION1_EEPROM(n) ((n) + 0x1c0) #define TSENS_REDUN_REGION2_EEPROM(n) ((n) + 0x1c4) #define TSENS_REDUN_REGION3_EEPROM(n) ((n) + 0x1cc) #define TSENS_REDUN_REGION4_EEPROM(n) ((n) + 0x440) #define TSENS_REDUN_REGION5_EEPROM(n) ((n) + 0x444) /* TSENS calibration Mask data */ #define TSENS_BASE1_MASK 0xff #define TSENS0_POINT1_MASK 0x3f00 Loading Loading @@ -330,6 +339,7 @@ #define TSENS1_8916_POINT2_SHIFT 22 #define TSENS3_8916_POINT2_SHIFT 10 #define TSENS4_8916_POINT2_SHIFT 20 #define TSENS_VALID_CNT_2 2 #define TSENS_8936_BASE0_MASK 0x00ff0000 #define TSENS_8936_BASE1_MASK 0xff000000 Loading Loading @@ -383,6 +393,84 @@ #define TSENS7_8936_POINT2_SHIFT_2_5 2 #define TSENS8_8936_POINT2_SHIFT 10 #define TSENS_BASE0_PLUTO_MASK 0x3ff #define TSENS_BASE1_PLUTO_MASK 0xffc00 #define TSENS_BASE1_PLUTO_SHIFT 10 #define TSENS0_OFFSET_PLUTO_MASK 0xf00000 #define TSENS0_OFFSET_PLUTO_SHIFT 20 #define TSENS1_OFFSET_PLUTO_MASK 0xf000000 #define TSENS1_OFFSET_PLUTO_SHIFT 24 #define TSENS2_OFFSET_PLUTO_MASK 0xf0000000 #define TSENS2_OFFSET_PLUTO_SHIFT 28 #define TSENS3_OFFSET_PLUTO_MASK 0xf #define TSENS4_OFFSET_PLUTO_MASK 0xf0 #define TSENS4_OFFSET_PLUTO_SHIFT 4 #define TSENS5_OFFSET_PLUTO_MASK 0xf00 #define TSENS5_OFFSET_PLUTO_SHIFT 8 #define TSENS6_OFFSET_PLUTO_MASK 0xf000 #define TSENS6_OFFSET_PLUTO_SHIFT 12 #define TSENS7_OFFSET_PLUTO_MASK 0xf0000 #define TSENS7_OFFSET_PLUTO_SHIFT 16 #define TSENS8_OFFSET_PLUTO_MASK 0xf00000 #define TSENS8_OFFSET_PLUTO_SHIFT 20 #define TSENS9_OFFSET_PLUTO_MASK 0xf000000 #define TSENS9_OFFSET_PLUTO_SHIFT 24 #define TSENS10_OFFSET_PLUTO_MASK 0xf0000000 #define TSENS10_OFFSET_PLUTO_SHIFT 28 #define TSENS11_OFFSET_PLUTO_MASK 0xf #define TSENS12_OFFSET_PLUTO_MASK 0xf0 #define TSENS12_OFFSET_PLUTO_SHIFT 4 #define TSENS13_OFFSET_PLUTO_MASK 0xf00 #define TSENS13_OFFSET_PLUTO_SHIFT 8 #define TSENS14_OFFSET_PLUTO_MASK 0xf000 #define TSENS14_OFFSET_PLUTO_SHIFT 12 #define TSENS15_OFFSET_PLUTO_MASK 0xf0000 #define TSENS15_OFFSET_PLUTO_SHIFT 16 #define TSENS_PLUTO_CAL_SEL_MASK 0x700000 #define TSENS_PLUTO_CAL_SEL_SHIFT 20 #define TSENS_BASE0_PLUTO_REDUN_MASK 0x7fe00000 #define TSENS_BASE0_PLUTO_REDUN_MASK_SHIFT 21 #define TSENS_BASE1_BIT0_PLUTO_REDUN_MASK 0x80000000 #define TSENS_BASE1_BIT0_SHIFT_COMPUTE 22 #define TSENS_BASE1_BIT1_9_PLUTO_REDUN_MASK 0x1ff #define TSENS0_OFFSET_PLUTO_REDUN_MASK 0x1e00 #define TSENS0_OFFSET_PLUTO_REDUN_SHIFT 9 #define TSENS1_OFFSET_PLUTO_REDUN_MASK 0x1e000 #define TSENS1_OFFSET_PLUTO_REDUN_SHIFT 13 #define TSENS2_OFFSET_PLUTO_REDUN_MASK 0x1e0000 #define TSENS2_OFFSET_PLUTO_REDUN_SHIFT 17 #define TSENS3_OFFSET_PLUTO_REDUN_MASK 0x1e00000 #define TSENS3_OFFSET_PLUTO_REDUN_SHIFT 21 #define TSENS4_OFFSET_PLUTO_REDUN_MASK 0x1e000000 #define TSENS4_OFFSET_PLUTO_REDUN_SHIFT 25 #define TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT0_2 0xe0000000 #define TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT0_2 29 #define TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT3 0x800000 #define TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT3 20 #define TSENS6_OFFSET_PLUTO_REDUN_MASK 0xf000000 #define TSENS6_OFFSET_PLUTO_REDUN_SHIFT 24 #define TSENS7_OFFSET_PLUTO_REDUN_MASK 0xf0000000 #define TSENS7_OFFSET_PLUTO_REDUN_SHIFT 28 #define TSENS8_OFFSET_PLUTO_REDUN_MASK 0xf #define TSENS9_OFFSET_PLUTO_REDUN_MASK 0xf0 #define TSENS9_OFFSET_PLUTO_REDUN_SHIFT 4 #define TSENS10_OFFSET_PLUTO_REDUN_MASK 0xf00 #define TSENS10_OFFSET_PLUTO_REDUN_SHIFT 8 #define TSENS11_OFFSET_PLUTO_REDUN_MASK 0xf000 #define TSENS11_OFFSET_PLUTO_REDUN_SHIFT 12 #define TSENS12_OFFSET_PLUTO_REDUN_MASK 0xf0000 #define TSENS12_OFFSET_PLUTO_REDUN_SHIFT 16 #define TSENS13_OFFSET_PLUTO_REDUN_MASK 0xf00000 #define TSENS13_OFFSET_PLUTO_REDUN_SHIFT 20 #define TSENS14_OFFSET_PLUTO_REDUN_MASK 0xf000000 #define TSENS14_OFFSET_PLUTO_REDUN_SHIFT 24 #define TSENS15_OFFSET_PLUTO_REDUN_MASK 0xf0000000 #define TSENS15_OFFSET_PLUTO_REDUN_SHIFT 28 #define TSENS_PLUTO_REDUN_SEL_MASK 0x7 #define TSENS_PLUTO_CAL_SEL_REDUN_MASK 0xe0000000 #define TSENS_PLUTO_CAL_SEL_REDUN_SHIFT 29 enum tsens_calib_fuse_map_type { TSENS_CALIB_FUSE_MAP_8974 = 0, TSENS_CALIB_FUSE_MAP_8X26, Loading @@ -391,6 +479,7 @@ enum tsens_calib_fuse_map_type { TSENS_CALIB_FUSE_MAP_9630, TSENS_CALIB_FUSE_MAP_8916, TSENS_CALIB_FUSE_MAP_8936, TSENS_CALIB_FUSE_MAP_PLUTO, TSENS_CALIB_FUSE_MAP_NUM, }; Loading Loading @@ -1321,6 +1410,249 @@ compute_intercept_slope: return 0; } static int tsens_calib_pluto_sensors(void) { int i, tsens_base0_data = 0, tsens0_point = 0, tsens1_point = 0; int tsens2_point = 0, tsens3_point = 0, tsens4_point = 0; int tsens5_point = 0, tsens6_point = 0, tsens7_point = 0; int tsens8_point = 0, tsens9_point = 0, tsens10_point = 0; int tsens11_point = 0, tsens12_point = 0, tsens13_point = 0; int tsens14_point = 0, tsens15_point = 0; int tsens_base1_data = 0, calib_mode = 0; uint32_t calib_data[6], calib_tsens_point_data[16], calib_redun_sel; if (tmdev->calibration_less_mode) goto calibration_less_mode; calib_redun_sel = readl_relaxed( TSENS_PLUTO_EEPROM_REDUN_SEL(tmdev->tsens_calib_addr)); calib_redun_sel = calib_redun_sel & TSENS_PLUTO_CAL_SEL_REDUN_MASK; calib_redun_sel >>= TSENS_PLUTO_CAL_SEL_REDUN_SHIFT; if (calib_redun_sel == TSENS_QFPROM_BACKUP_SEL) { calib_data[0] = readl_relaxed( TSENS_REDUN_REGION1_EEPROM(tmdev->tsens_calib_addr)); calib_data[1] = readl_relaxed( TSENS_REDUN_REGION2_EEPROM(tmdev->tsens_calib_addr)); calib_data[2] = readl_relaxed( TSENS_REDUN_REGION3_EEPROM(tmdev->tsens_calib_addr)); calib_data[3] = readl_relaxed( TSENS_REDUN_REGION4_EEPROM(tmdev->tsens_calib_addr)); calib_data[4] = readl_relaxed( TSENS_REDUN_REGION5_EEPROM(tmdev->tsens_calib_addr)); calib_mode = (calib_data[4] & TSENS_PLUTO_REDUN_SEL_MASK); pr_debug("calib mode is %d\n", calib_mode); if (calib_mode == TSENS_TWO_POINT_CALIB) { tsens_base0_data = (calib_data[0] & TSENS_BASE0_PLUTO_REDUN_MASK) >> TSENS_BASE0_PLUTO_REDUN_MASK_SHIFT; tsens_base1_data = (calib_data[0] & TSENS_BASE1_BIT0_PLUTO_REDUN_MASK) >> TSENS_BASE1_BIT0_SHIFT_COMPUTE; tsens_base1_data |= (calib_data[1] & TSENS_BASE1_BIT1_9_PLUTO_REDUN_MASK); tsens0_point = (calib_data[1] & TSENS0_OFFSET_PLUTO_REDUN_MASK) >> TSENS0_OFFSET_PLUTO_REDUN_SHIFT; tsens1_point = (calib_data[1] & TSENS1_OFFSET_PLUTO_REDUN_MASK) >> TSENS1_OFFSET_PLUTO_REDUN_SHIFT; tsens2_point = (calib_data[1] & TSENS2_OFFSET_PLUTO_REDUN_MASK) >> TSENS2_OFFSET_PLUTO_REDUN_SHIFT; tsens3_point = (calib_data[1] & TSENS3_OFFSET_PLUTO_REDUN_MASK) >> TSENS3_OFFSET_PLUTO_REDUN_SHIFT; tsens4_point = (calib_data[1] & TSENS4_OFFSET_PLUTO_REDUN_MASK) >> TSENS4_OFFSET_PLUTO_REDUN_SHIFT; tsens5_point = (calib_data[1] & TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT0_2) >> TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT0_2; tsens5_point |= ((calib_data[2] & TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT3) >> TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT3); tsens6_point = (calib_data[2] & TSENS6_OFFSET_PLUTO_REDUN_MASK) >> TSENS6_OFFSET_PLUTO_REDUN_SHIFT; tsens7_point = (calib_data[2] & TSENS7_OFFSET_PLUTO_REDUN_MASK) >> TSENS7_OFFSET_PLUTO_REDUN_SHIFT; tsens8_point = (calib_data[3] & TSENS8_OFFSET_PLUTO_REDUN_MASK); tsens9_point = (calib_data[3] & TSENS9_OFFSET_PLUTO_REDUN_MASK) >> TSENS9_OFFSET_PLUTO_REDUN_SHIFT; tsens10_point = (calib_data[3] & TSENS10_OFFSET_PLUTO_REDUN_MASK) >> TSENS10_OFFSET_PLUTO_REDUN_SHIFT; tsens11_point = (calib_data[3] & TSENS11_OFFSET_PLUTO_REDUN_MASK) >> TSENS11_OFFSET_PLUTO_REDUN_SHIFT; tsens12_point = (calib_data[3] & TSENS12_OFFSET_PLUTO_REDUN_MASK) >> TSENS12_OFFSET_PLUTO_REDUN_SHIFT; tsens13_point = (calib_data[3] & TSENS13_OFFSET_PLUTO_REDUN_MASK) >> TSENS13_OFFSET_PLUTO_REDUN_SHIFT; tsens14_point = (calib_data[3] & TSENS14_OFFSET_PLUTO_REDUN_MASK) >> TSENS14_OFFSET_PLUTO_REDUN_SHIFT; tsens15_point = (calib_data[3] & TSENS15_OFFSET_PLUTO_REDUN_MASK) >> TSENS15_OFFSET_PLUTO_REDUN_SHIFT; calib_tsens_point_data[0] = tsens0_point; calib_tsens_point_data[1] = tsens1_point; calib_tsens_point_data[2] = tsens2_point; calib_tsens_point_data[3] = tsens3_point; calib_tsens_point_data[4] = tsens4_point; calib_tsens_point_data[5] = tsens5_point; calib_tsens_point_data[6] = tsens6_point; calib_tsens_point_data[7] = tsens7_point; calib_tsens_point_data[8] = tsens8_point; calib_tsens_point_data[9] = tsens9_point; calib_tsens_point_data[10] = tsens10_point; calib_tsens_point_data[11] = tsens11_point; calib_tsens_point_data[12] = tsens12_point; calib_tsens_point_data[13] = tsens13_point; calib_tsens_point_data[14] = tsens14_point; calib_tsens_point_data[15] = tsens15_point; } else goto calibration_less_mode; } else { calib_data[0] = readl_relaxed( TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr)); calib_data[1] = readl_relaxed( (TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr) + 0X4)); calib_data[2] = readl_relaxed( (TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr) + 0x8)); calib_mode = (calib_data[2] & TSENS_PLUTO_CAL_SEL_MASK) >> TSENS_PLUTO_CAL_SEL_SHIFT; pr_debug("calib mode is %d\n", calib_mode); if (calib_mode == TSENS_TWO_POINT_CALIB) { tsens_base0_data = (calib_data[0] & TSENS_BASE0_PLUTO_MASK); tsens_base1_data = (calib_data[0] & TSENS_BASE1_PLUTO_MASK) >> TSENS_BASE1_PLUTO_SHIFT; tsens0_point = (calib_data[0] & TSENS0_OFFSET_PLUTO_MASK) >> TSENS0_OFFSET_PLUTO_SHIFT; tsens1_point = (calib_data[0] & TSENS1_OFFSET_PLUTO_MASK) >> TSENS1_OFFSET_PLUTO_SHIFT; tsens2_point = (calib_data[0] & TSENS2_OFFSET_PLUTO_MASK) >> TSENS2_OFFSET_PLUTO_SHIFT; tsens3_point = (calib_data[1] & TSENS3_OFFSET_PLUTO_MASK); tsens4_point = (calib_data[1] & TSENS4_OFFSET_PLUTO_MASK) >> TSENS4_OFFSET_PLUTO_SHIFT; tsens5_point = (calib_data[1] & TSENS5_OFFSET_PLUTO_MASK) >> TSENS5_OFFSET_PLUTO_SHIFT; tsens6_point = (calib_data[1] & TSENS6_OFFSET_PLUTO_MASK) >> TSENS6_OFFSET_PLUTO_SHIFT; tsens7_point = (calib_data[1] & TSENS7_OFFSET_PLUTO_MASK) >> TSENS7_OFFSET_PLUTO_SHIFT; tsens8_point = (calib_data[1] & TSENS8_OFFSET_PLUTO_MASK) >> TSENS8_OFFSET_PLUTO_SHIFT; tsens9_point = (calib_data[1] & TSENS9_OFFSET_PLUTO_MASK) >> TSENS9_OFFSET_PLUTO_SHIFT; tsens10_point = (calib_data[1] & TSENS10_OFFSET_PLUTO_MASK) >> TSENS10_OFFSET_PLUTO_SHIFT; tsens11_point = (calib_data[2] & TSENS11_OFFSET_PLUTO_MASK); tsens12_point = (calib_data[2] & TSENS12_OFFSET_PLUTO_MASK) >> TSENS12_OFFSET_PLUTO_SHIFT; tsens13_point = (calib_data[2] & TSENS13_OFFSET_PLUTO_MASK) >> TSENS13_OFFSET_PLUTO_SHIFT; tsens14_point = (calib_data[2] & TSENS14_OFFSET_PLUTO_MASK) >> TSENS14_OFFSET_PLUTO_SHIFT; tsens15_point = (calib_data[2] & TSENS15_OFFSET_PLUTO_MASK) >> TSENS15_OFFSET_PLUTO_SHIFT; calib_tsens_point_data[0] = tsens0_point; calib_tsens_point_data[1] = tsens1_point; calib_tsens_point_data[2] = tsens2_point; calib_tsens_point_data[3] = tsens3_point; calib_tsens_point_data[4] = tsens4_point; calib_tsens_point_data[5] = tsens5_point; calib_tsens_point_data[6] = tsens6_point; calib_tsens_point_data[7] = tsens7_point; calib_tsens_point_data[8] = tsens8_point; calib_tsens_point_data[9] = tsens9_point; calib_tsens_point_data[10] = tsens10_point; calib_tsens_point_data[11] = tsens11_point; calib_tsens_point_data[12] = tsens12_point; calib_tsens_point_data[13] = tsens13_point; calib_tsens_point_data[14] = tsens14_point; calib_tsens_point_data[15] = tsens15_point; } else { calibration_less_mode: pr_debug("TSENS is calibrationless mode\n"); calib_tsens_point_data[0] = 532; calib_tsens_point_data[1] = 532; calib_tsens_point_data[2] = 532; calib_tsens_point_data[3] = 532; calib_tsens_point_data[4] = 532; calib_tsens_point_data[5] = 532; calib_tsens_point_data[6] = 532; calib_tsens_point_data[7] = 532; calib_tsens_point_data[8] = 532; calib_tsens_point_data[9] = 532; calib_tsens_point_data[10] = 532; calib_tsens_point_data[11] = 532; calib_tsens_point_data[12] = 532; calib_tsens_point_data[13] = 532; calib_tsens_point_data[14] = 532; calib_tsens_point_data[15] = 532; } } for (i = 0; i < tmdev->tsens_num_sensor; i++) { int32_t num = 0, den = 0, adc_code_of_tempx = 0; tmdev->sensor[i].calib_data_point2 = tsens_base1_data; tmdev->sensor[i].calib_data_point1 = tsens_base0_data; pr_debug("sensor:%d - calib_data_point1:0x%x, calib_data_point2:0x%x\n", i, tmdev->sensor[i].calib_data_point1, tmdev->sensor[i].calib_data_point2); if (calib_mode == TSENS_TWO_POINT_CALIB) { /* slope (m) = adc_code2 - adc_code1 (y2 - y1)/ temp_120_degc - temp_30_degc (x2 - x1) */ num = tmdev->sensor[i].calib_data_point2 - tmdev->sensor[i].calib_data_point1; num *= tmdev->tsens_factor; den = TSENS_CAL_DEGC_POINT2 - TSENS_CAL_DEGC_POINT1; tmdev->sensor[i].slope_mul_tsens_factor = num/den; } adc_code_of_tempx = tsens_base0_data + calib_tsens_point_data[i]; pr_debug("offset_adc_code_of_tempx:0x%x\n", adc_code_of_tempx); tmdev->sensor[i].offset = (adc_code_of_tempx * tmdev->tsens_factor) - (TSENS_CAL_DEGC_POINT1 * tmdev->sensor[i].slope_mul_tsens_factor); pr_debug("offset:%d and slope:%d\n", tmdev->sensor[i].offset, tmdev->sensor[i].slope_mul_tsens_factor); INIT_WORK(&tmdev->sensor[i].work, notify_uspace_tsens_fn); tmdev->prev_reading_avail = false; } return 0; } static int tsens_calib_8x10_sensors(void) { int i, tsens_base0_data = 0, tsens0_point1 = 0, tsens1_point1 = 0; Loading Loading @@ -2216,6 +2548,8 @@ static int tsens_calib_sensors(void) rc = tsens_calib_8916_sensors(); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_8936) rc = tsens_calib_8936_sensors(); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_PLUTO) rc = tsens_calib_pluto_sensors(); else { pr_err("TSENS Calib fuse not found\n"); rc = -ENODEV; Loading Loading @@ -2246,6 +2580,9 @@ static struct of_device_id tsens_match[] = { { .compatible = "qcom,msm8936-tsens", .data = (void *)TSENS_CALIB_FUSE_MAP_8936, }, { .compatible = "qcom,msmplutonium-tsens", .data = (void *)TSENS_CALIB_FUSE_MAP_PLUTO, }, {} }; Loading Loading
Documentation/devicetree/bindings/thermal/tsens.txt +1 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ Required properties: should be "qcom,msm8x26-tsens" for 8x26 TSENS driver. should be "qcom,fsm9900-tsens" for 9900 TSENS driver. should be "qcom,mdm9630-tsens" for 9630 TSENS driver. should be "qcom,msmplutonium-tsens" for Plutonium TSENS driver. The compatible property is used to identify the respective fusemap to use for the corresponding SoC. - reg : offset and length of the TSENS registers. Loading
drivers/thermal/msm8974-tsens.c +337 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ #define TSENS_TRDY_MASK BIT(0) #define TSENS2_SN_STATUS_ADDR(n) ((n) + 0x1044) #define TSENS2_SN_STATUS_VALID BIT(14) #define TSENS2_TRDY_ADDR(n) ((n) + 0x84) #define TSENS_CTRL_ADDR(n) (n) Loading Loading @@ -92,6 +93,14 @@ #define TSENS_8936_EEPROM(n) ((n) + 0xa0) #define TSENS_PLUTO_EEPROM(n) ((n) + 0xd0) #define TSENS_PLUTO_EEPROM_REDUN_SEL(n) ((n) + 0x464) #define TSENS_REDUN_REGION1_EEPROM(n) ((n) + 0x1c0) #define TSENS_REDUN_REGION2_EEPROM(n) ((n) + 0x1c4) #define TSENS_REDUN_REGION3_EEPROM(n) ((n) + 0x1cc) #define TSENS_REDUN_REGION4_EEPROM(n) ((n) + 0x440) #define TSENS_REDUN_REGION5_EEPROM(n) ((n) + 0x444) /* TSENS calibration Mask data */ #define TSENS_BASE1_MASK 0xff #define TSENS0_POINT1_MASK 0x3f00 Loading Loading @@ -330,6 +339,7 @@ #define TSENS1_8916_POINT2_SHIFT 22 #define TSENS3_8916_POINT2_SHIFT 10 #define TSENS4_8916_POINT2_SHIFT 20 #define TSENS_VALID_CNT_2 2 #define TSENS_8936_BASE0_MASK 0x00ff0000 #define TSENS_8936_BASE1_MASK 0xff000000 Loading Loading @@ -383,6 +393,84 @@ #define TSENS7_8936_POINT2_SHIFT_2_5 2 #define TSENS8_8936_POINT2_SHIFT 10 #define TSENS_BASE0_PLUTO_MASK 0x3ff #define TSENS_BASE1_PLUTO_MASK 0xffc00 #define TSENS_BASE1_PLUTO_SHIFT 10 #define TSENS0_OFFSET_PLUTO_MASK 0xf00000 #define TSENS0_OFFSET_PLUTO_SHIFT 20 #define TSENS1_OFFSET_PLUTO_MASK 0xf000000 #define TSENS1_OFFSET_PLUTO_SHIFT 24 #define TSENS2_OFFSET_PLUTO_MASK 0xf0000000 #define TSENS2_OFFSET_PLUTO_SHIFT 28 #define TSENS3_OFFSET_PLUTO_MASK 0xf #define TSENS4_OFFSET_PLUTO_MASK 0xf0 #define TSENS4_OFFSET_PLUTO_SHIFT 4 #define TSENS5_OFFSET_PLUTO_MASK 0xf00 #define TSENS5_OFFSET_PLUTO_SHIFT 8 #define TSENS6_OFFSET_PLUTO_MASK 0xf000 #define TSENS6_OFFSET_PLUTO_SHIFT 12 #define TSENS7_OFFSET_PLUTO_MASK 0xf0000 #define TSENS7_OFFSET_PLUTO_SHIFT 16 #define TSENS8_OFFSET_PLUTO_MASK 0xf00000 #define TSENS8_OFFSET_PLUTO_SHIFT 20 #define TSENS9_OFFSET_PLUTO_MASK 0xf000000 #define TSENS9_OFFSET_PLUTO_SHIFT 24 #define TSENS10_OFFSET_PLUTO_MASK 0xf0000000 #define TSENS10_OFFSET_PLUTO_SHIFT 28 #define TSENS11_OFFSET_PLUTO_MASK 0xf #define TSENS12_OFFSET_PLUTO_MASK 0xf0 #define TSENS12_OFFSET_PLUTO_SHIFT 4 #define TSENS13_OFFSET_PLUTO_MASK 0xf00 #define TSENS13_OFFSET_PLUTO_SHIFT 8 #define TSENS14_OFFSET_PLUTO_MASK 0xf000 #define TSENS14_OFFSET_PLUTO_SHIFT 12 #define TSENS15_OFFSET_PLUTO_MASK 0xf0000 #define TSENS15_OFFSET_PLUTO_SHIFT 16 #define TSENS_PLUTO_CAL_SEL_MASK 0x700000 #define TSENS_PLUTO_CAL_SEL_SHIFT 20 #define TSENS_BASE0_PLUTO_REDUN_MASK 0x7fe00000 #define TSENS_BASE0_PLUTO_REDUN_MASK_SHIFT 21 #define TSENS_BASE1_BIT0_PLUTO_REDUN_MASK 0x80000000 #define TSENS_BASE1_BIT0_SHIFT_COMPUTE 22 #define TSENS_BASE1_BIT1_9_PLUTO_REDUN_MASK 0x1ff #define TSENS0_OFFSET_PLUTO_REDUN_MASK 0x1e00 #define TSENS0_OFFSET_PLUTO_REDUN_SHIFT 9 #define TSENS1_OFFSET_PLUTO_REDUN_MASK 0x1e000 #define TSENS1_OFFSET_PLUTO_REDUN_SHIFT 13 #define TSENS2_OFFSET_PLUTO_REDUN_MASK 0x1e0000 #define TSENS2_OFFSET_PLUTO_REDUN_SHIFT 17 #define TSENS3_OFFSET_PLUTO_REDUN_MASK 0x1e00000 #define TSENS3_OFFSET_PLUTO_REDUN_SHIFT 21 #define TSENS4_OFFSET_PLUTO_REDUN_MASK 0x1e000000 #define TSENS4_OFFSET_PLUTO_REDUN_SHIFT 25 #define TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT0_2 0xe0000000 #define TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT0_2 29 #define TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT3 0x800000 #define TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT3 20 #define TSENS6_OFFSET_PLUTO_REDUN_MASK 0xf000000 #define TSENS6_OFFSET_PLUTO_REDUN_SHIFT 24 #define TSENS7_OFFSET_PLUTO_REDUN_MASK 0xf0000000 #define TSENS7_OFFSET_PLUTO_REDUN_SHIFT 28 #define TSENS8_OFFSET_PLUTO_REDUN_MASK 0xf #define TSENS9_OFFSET_PLUTO_REDUN_MASK 0xf0 #define TSENS9_OFFSET_PLUTO_REDUN_SHIFT 4 #define TSENS10_OFFSET_PLUTO_REDUN_MASK 0xf00 #define TSENS10_OFFSET_PLUTO_REDUN_SHIFT 8 #define TSENS11_OFFSET_PLUTO_REDUN_MASK 0xf000 #define TSENS11_OFFSET_PLUTO_REDUN_SHIFT 12 #define TSENS12_OFFSET_PLUTO_REDUN_MASK 0xf0000 #define TSENS12_OFFSET_PLUTO_REDUN_SHIFT 16 #define TSENS13_OFFSET_PLUTO_REDUN_MASK 0xf00000 #define TSENS13_OFFSET_PLUTO_REDUN_SHIFT 20 #define TSENS14_OFFSET_PLUTO_REDUN_MASK 0xf000000 #define TSENS14_OFFSET_PLUTO_REDUN_SHIFT 24 #define TSENS15_OFFSET_PLUTO_REDUN_MASK 0xf0000000 #define TSENS15_OFFSET_PLUTO_REDUN_SHIFT 28 #define TSENS_PLUTO_REDUN_SEL_MASK 0x7 #define TSENS_PLUTO_CAL_SEL_REDUN_MASK 0xe0000000 #define TSENS_PLUTO_CAL_SEL_REDUN_SHIFT 29 enum tsens_calib_fuse_map_type { TSENS_CALIB_FUSE_MAP_8974 = 0, TSENS_CALIB_FUSE_MAP_8X26, Loading @@ -391,6 +479,7 @@ enum tsens_calib_fuse_map_type { TSENS_CALIB_FUSE_MAP_9630, TSENS_CALIB_FUSE_MAP_8916, TSENS_CALIB_FUSE_MAP_8936, TSENS_CALIB_FUSE_MAP_PLUTO, TSENS_CALIB_FUSE_MAP_NUM, }; Loading Loading @@ -1321,6 +1410,249 @@ compute_intercept_slope: return 0; } static int tsens_calib_pluto_sensors(void) { int i, tsens_base0_data = 0, tsens0_point = 0, tsens1_point = 0; int tsens2_point = 0, tsens3_point = 0, tsens4_point = 0; int tsens5_point = 0, tsens6_point = 0, tsens7_point = 0; int tsens8_point = 0, tsens9_point = 0, tsens10_point = 0; int tsens11_point = 0, tsens12_point = 0, tsens13_point = 0; int tsens14_point = 0, tsens15_point = 0; int tsens_base1_data = 0, calib_mode = 0; uint32_t calib_data[6], calib_tsens_point_data[16], calib_redun_sel; if (tmdev->calibration_less_mode) goto calibration_less_mode; calib_redun_sel = readl_relaxed( TSENS_PLUTO_EEPROM_REDUN_SEL(tmdev->tsens_calib_addr)); calib_redun_sel = calib_redun_sel & TSENS_PLUTO_CAL_SEL_REDUN_MASK; calib_redun_sel >>= TSENS_PLUTO_CAL_SEL_REDUN_SHIFT; if (calib_redun_sel == TSENS_QFPROM_BACKUP_SEL) { calib_data[0] = readl_relaxed( TSENS_REDUN_REGION1_EEPROM(tmdev->tsens_calib_addr)); calib_data[1] = readl_relaxed( TSENS_REDUN_REGION2_EEPROM(tmdev->tsens_calib_addr)); calib_data[2] = readl_relaxed( TSENS_REDUN_REGION3_EEPROM(tmdev->tsens_calib_addr)); calib_data[3] = readl_relaxed( TSENS_REDUN_REGION4_EEPROM(tmdev->tsens_calib_addr)); calib_data[4] = readl_relaxed( TSENS_REDUN_REGION5_EEPROM(tmdev->tsens_calib_addr)); calib_mode = (calib_data[4] & TSENS_PLUTO_REDUN_SEL_MASK); pr_debug("calib mode is %d\n", calib_mode); if (calib_mode == TSENS_TWO_POINT_CALIB) { tsens_base0_data = (calib_data[0] & TSENS_BASE0_PLUTO_REDUN_MASK) >> TSENS_BASE0_PLUTO_REDUN_MASK_SHIFT; tsens_base1_data = (calib_data[0] & TSENS_BASE1_BIT0_PLUTO_REDUN_MASK) >> TSENS_BASE1_BIT0_SHIFT_COMPUTE; tsens_base1_data |= (calib_data[1] & TSENS_BASE1_BIT1_9_PLUTO_REDUN_MASK); tsens0_point = (calib_data[1] & TSENS0_OFFSET_PLUTO_REDUN_MASK) >> TSENS0_OFFSET_PLUTO_REDUN_SHIFT; tsens1_point = (calib_data[1] & TSENS1_OFFSET_PLUTO_REDUN_MASK) >> TSENS1_OFFSET_PLUTO_REDUN_SHIFT; tsens2_point = (calib_data[1] & TSENS2_OFFSET_PLUTO_REDUN_MASK) >> TSENS2_OFFSET_PLUTO_REDUN_SHIFT; tsens3_point = (calib_data[1] & TSENS3_OFFSET_PLUTO_REDUN_MASK) >> TSENS3_OFFSET_PLUTO_REDUN_SHIFT; tsens4_point = (calib_data[1] & TSENS4_OFFSET_PLUTO_REDUN_MASK) >> TSENS4_OFFSET_PLUTO_REDUN_SHIFT; tsens5_point = (calib_data[1] & TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT0_2) >> TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT0_2; tsens5_point |= ((calib_data[2] & TSENS5_OFFSET_PLUTO_REDUN_MASK_BIT3) >> TSENS5_OFFSET_PLUTO_REDUN_SHIFT_BIT3); tsens6_point = (calib_data[2] & TSENS6_OFFSET_PLUTO_REDUN_MASK) >> TSENS6_OFFSET_PLUTO_REDUN_SHIFT; tsens7_point = (calib_data[2] & TSENS7_OFFSET_PLUTO_REDUN_MASK) >> TSENS7_OFFSET_PLUTO_REDUN_SHIFT; tsens8_point = (calib_data[3] & TSENS8_OFFSET_PLUTO_REDUN_MASK); tsens9_point = (calib_data[3] & TSENS9_OFFSET_PLUTO_REDUN_MASK) >> TSENS9_OFFSET_PLUTO_REDUN_SHIFT; tsens10_point = (calib_data[3] & TSENS10_OFFSET_PLUTO_REDUN_MASK) >> TSENS10_OFFSET_PLUTO_REDUN_SHIFT; tsens11_point = (calib_data[3] & TSENS11_OFFSET_PLUTO_REDUN_MASK) >> TSENS11_OFFSET_PLUTO_REDUN_SHIFT; tsens12_point = (calib_data[3] & TSENS12_OFFSET_PLUTO_REDUN_MASK) >> TSENS12_OFFSET_PLUTO_REDUN_SHIFT; tsens13_point = (calib_data[3] & TSENS13_OFFSET_PLUTO_REDUN_MASK) >> TSENS13_OFFSET_PLUTO_REDUN_SHIFT; tsens14_point = (calib_data[3] & TSENS14_OFFSET_PLUTO_REDUN_MASK) >> TSENS14_OFFSET_PLUTO_REDUN_SHIFT; tsens15_point = (calib_data[3] & TSENS15_OFFSET_PLUTO_REDUN_MASK) >> TSENS15_OFFSET_PLUTO_REDUN_SHIFT; calib_tsens_point_data[0] = tsens0_point; calib_tsens_point_data[1] = tsens1_point; calib_tsens_point_data[2] = tsens2_point; calib_tsens_point_data[3] = tsens3_point; calib_tsens_point_data[4] = tsens4_point; calib_tsens_point_data[5] = tsens5_point; calib_tsens_point_data[6] = tsens6_point; calib_tsens_point_data[7] = tsens7_point; calib_tsens_point_data[8] = tsens8_point; calib_tsens_point_data[9] = tsens9_point; calib_tsens_point_data[10] = tsens10_point; calib_tsens_point_data[11] = tsens11_point; calib_tsens_point_data[12] = tsens12_point; calib_tsens_point_data[13] = tsens13_point; calib_tsens_point_data[14] = tsens14_point; calib_tsens_point_data[15] = tsens15_point; } else goto calibration_less_mode; } else { calib_data[0] = readl_relaxed( TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr)); calib_data[1] = readl_relaxed( (TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr) + 0X4)); calib_data[2] = readl_relaxed( (TSENS_PLUTO_EEPROM(tmdev->tsens_calib_addr) + 0x8)); calib_mode = (calib_data[2] & TSENS_PLUTO_CAL_SEL_MASK) >> TSENS_PLUTO_CAL_SEL_SHIFT; pr_debug("calib mode is %d\n", calib_mode); if (calib_mode == TSENS_TWO_POINT_CALIB) { tsens_base0_data = (calib_data[0] & TSENS_BASE0_PLUTO_MASK); tsens_base1_data = (calib_data[0] & TSENS_BASE1_PLUTO_MASK) >> TSENS_BASE1_PLUTO_SHIFT; tsens0_point = (calib_data[0] & TSENS0_OFFSET_PLUTO_MASK) >> TSENS0_OFFSET_PLUTO_SHIFT; tsens1_point = (calib_data[0] & TSENS1_OFFSET_PLUTO_MASK) >> TSENS1_OFFSET_PLUTO_SHIFT; tsens2_point = (calib_data[0] & TSENS2_OFFSET_PLUTO_MASK) >> TSENS2_OFFSET_PLUTO_SHIFT; tsens3_point = (calib_data[1] & TSENS3_OFFSET_PLUTO_MASK); tsens4_point = (calib_data[1] & TSENS4_OFFSET_PLUTO_MASK) >> TSENS4_OFFSET_PLUTO_SHIFT; tsens5_point = (calib_data[1] & TSENS5_OFFSET_PLUTO_MASK) >> TSENS5_OFFSET_PLUTO_SHIFT; tsens6_point = (calib_data[1] & TSENS6_OFFSET_PLUTO_MASK) >> TSENS6_OFFSET_PLUTO_SHIFT; tsens7_point = (calib_data[1] & TSENS7_OFFSET_PLUTO_MASK) >> TSENS7_OFFSET_PLUTO_SHIFT; tsens8_point = (calib_data[1] & TSENS8_OFFSET_PLUTO_MASK) >> TSENS8_OFFSET_PLUTO_SHIFT; tsens9_point = (calib_data[1] & TSENS9_OFFSET_PLUTO_MASK) >> TSENS9_OFFSET_PLUTO_SHIFT; tsens10_point = (calib_data[1] & TSENS10_OFFSET_PLUTO_MASK) >> TSENS10_OFFSET_PLUTO_SHIFT; tsens11_point = (calib_data[2] & TSENS11_OFFSET_PLUTO_MASK); tsens12_point = (calib_data[2] & TSENS12_OFFSET_PLUTO_MASK) >> TSENS12_OFFSET_PLUTO_SHIFT; tsens13_point = (calib_data[2] & TSENS13_OFFSET_PLUTO_MASK) >> TSENS13_OFFSET_PLUTO_SHIFT; tsens14_point = (calib_data[2] & TSENS14_OFFSET_PLUTO_MASK) >> TSENS14_OFFSET_PLUTO_SHIFT; tsens15_point = (calib_data[2] & TSENS15_OFFSET_PLUTO_MASK) >> TSENS15_OFFSET_PLUTO_SHIFT; calib_tsens_point_data[0] = tsens0_point; calib_tsens_point_data[1] = tsens1_point; calib_tsens_point_data[2] = tsens2_point; calib_tsens_point_data[3] = tsens3_point; calib_tsens_point_data[4] = tsens4_point; calib_tsens_point_data[5] = tsens5_point; calib_tsens_point_data[6] = tsens6_point; calib_tsens_point_data[7] = tsens7_point; calib_tsens_point_data[8] = tsens8_point; calib_tsens_point_data[9] = tsens9_point; calib_tsens_point_data[10] = tsens10_point; calib_tsens_point_data[11] = tsens11_point; calib_tsens_point_data[12] = tsens12_point; calib_tsens_point_data[13] = tsens13_point; calib_tsens_point_data[14] = tsens14_point; calib_tsens_point_data[15] = tsens15_point; } else { calibration_less_mode: pr_debug("TSENS is calibrationless mode\n"); calib_tsens_point_data[0] = 532; calib_tsens_point_data[1] = 532; calib_tsens_point_data[2] = 532; calib_tsens_point_data[3] = 532; calib_tsens_point_data[4] = 532; calib_tsens_point_data[5] = 532; calib_tsens_point_data[6] = 532; calib_tsens_point_data[7] = 532; calib_tsens_point_data[8] = 532; calib_tsens_point_data[9] = 532; calib_tsens_point_data[10] = 532; calib_tsens_point_data[11] = 532; calib_tsens_point_data[12] = 532; calib_tsens_point_data[13] = 532; calib_tsens_point_data[14] = 532; calib_tsens_point_data[15] = 532; } } for (i = 0; i < tmdev->tsens_num_sensor; i++) { int32_t num = 0, den = 0, adc_code_of_tempx = 0; tmdev->sensor[i].calib_data_point2 = tsens_base1_data; tmdev->sensor[i].calib_data_point1 = tsens_base0_data; pr_debug("sensor:%d - calib_data_point1:0x%x, calib_data_point2:0x%x\n", i, tmdev->sensor[i].calib_data_point1, tmdev->sensor[i].calib_data_point2); if (calib_mode == TSENS_TWO_POINT_CALIB) { /* slope (m) = adc_code2 - adc_code1 (y2 - y1)/ temp_120_degc - temp_30_degc (x2 - x1) */ num = tmdev->sensor[i].calib_data_point2 - tmdev->sensor[i].calib_data_point1; num *= tmdev->tsens_factor; den = TSENS_CAL_DEGC_POINT2 - TSENS_CAL_DEGC_POINT1; tmdev->sensor[i].slope_mul_tsens_factor = num/den; } adc_code_of_tempx = tsens_base0_data + calib_tsens_point_data[i]; pr_debug("offset_adc_code_of_tempx:0x%x\n", adc_code_of_tempx); tmdev->sensor[i].offset = (adc_code_of_tempx * tmdev->tsens_factor) - (TSENS_CAL_DEGC_POINT1 * tmdev->sensor[i].slope_mul_tsens_factor); pr_debug("offset:%d and slope:%d\n", tmdev->sensor[i].offset, tmdev->sensor[i].slope_mul_tsens_factor); INIT_WORK(&tmdev->sensor[i].work, notify_uspace_tsens_fn); tmdev->prev_reading_avail = false; } return 0; } static int tsens_calib_8x10_sensors(void) { int i, tsens_base0_data = 0, tsens0_point1 = 0, tsens1_point1 = 0; Loading Loading @@ -2216,6 +2548,8 @@ static int tsens_calib_sensors(void) rc = tsens_calib_8916_sensors(); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_8936) rc = tsens_calib_8936_sensors(); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_PLUTO) rc = tsens_calib_pluto_sensors(); else { pr_err("TSENS Calib fuse not found\n"); rc = -ENODEV; Loading Loading @@ -2246,6 +2580,9 @@ static struct of_device_id tsens_match[] = { { .compatible = "qcom,msm8936-tsens", .data = (void *)TSENS_CALIB_FUSE_MAP_8936, }, { .compatible = "qcom,msmplutonium-tsens", .data = (void *)TSENS_CALIB_FUSE_MAP_PLUTO, }, {} }; Loading