Loading Documentation/devicetree/bindings/thermal/tsens.txt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,7 @@ Required properties: should be "qcom,mdm9607-tsens" for 9607 TSENS driver. should be "qcom,mdm9607-tsens" for 9607 TSENS driver. should be "qcom,msmtitanium-tsens" for titanium TSENS driver. should be "qcom,msmtitanium-tsens" for titanium TSENS driver. should be "qcom,msm8937-tsens" for 8937 TSENS driver. should be "qcom,msm8937-tsens" for 8937 TSENS driver. should be "qcom,msmgold-tsens" for gold TSENS driver. The compatible property is used to identify the respective fusemap to use The compatible property is used to identify the respective fusemap to use for the corresponding SoC. for the corresponding SoC. - reg : offset and length of the TSENS registers. - reg : offset and length of the TSENS registers. Loading Loading @@ -70,6 +71,10 @@ Optional properties: total number of supported sensors with each controller instance. total number of supported sensors with each controller instance. - qcom,valid-status-check: If property is present, check the VALID bit is set - qcom,valid-status-check: If property is present, check the VALID bit is set before reporting the temperature data. before reporting the temperature data. - qcom,temp1-offset: If property is present, Use these offset values to be added for 30 deg calib points. - qcom,temp2-offset: If property is present, Use these offset values to be added for 120 deg calib points. Example: Example: Loading arch/arm/boot/dts/qcom/msmgold.dtsi +13 −0 Original line number Original line Diff line number Diff line Loading @@ -122,6 +122,19 @@ clock-frequency = <32768>; clock-frequency = <32768>; }; }; tsens: tsens@4a8000 { compatible = "qcom,msmgold-tsens"; reg = <0x4a8000 0x2000>, <0xa4000 0x1000>; reg-names = "tsens_physical", "tsens_eeprom_physical"; interrupts = <0 184 0>; interrupt-names = "tsens-upper-lower"; qcom,sensors = <10>; qcom,slope = <3200 3200 3200 3200 3200 3200 3200 3200 3200 3200>; qcom,valid-status-check; }; blsp1_uart2: serial@78b0000 { blsp1_uart2: serial@78b0000 { compatible = "qcom,msm-lsuart-v14"; compatible = "qcom,msm-lsuart-v14"; reg = <0x78b0000 0x200>; reg = <0x78b0000 0x200>; Loading drivers/thermal/msm-tsens.c +106 −29 Original line number Original line Diff line number Diff line Loading @@ -742,6 +742,7 @@ enum tsens_calib_fuse_map_type { TSENS_CALIB_FUSE_MAP_MSM8952, TSENS_CALIB_FUSE_MAP_MSM8952, TSENS_CALIB_FUSE_MAP_MDM9607, TSENS_CALIB_FUSE_MAP_MDM9607, TSENS_CALIB_FUSE_MAP_MSM8937, TSENS_CALIB_FUSE_MAP_MSM8937, TSENS_CALIB_FUSE_MAP_MSMGOLD, TSENS_CALIB_FUSE_MAP_NUM, TSENS_CALIB_FUSE_MAP_NUM, }; }; Loading Loading @@ -792,6 +793,8 @@ struct tsens_tm_device_sensor { * decidegC based on the controller settings. * decidegC based on the controller settings. */ */ int dbg_adc_code; int dbg_adc_code; u32 wa_temp1_calib_offset_factor; u32 wa_temp2_calib_offset_factor; }; }; struct tsens_dbg_counter { struct tsens_dbg_counter { Loading Loading @@ -911,6 +914,9 @@ static struct of_device_id tsens_match[] = { { .compatible = "qcom,msm8937-tsens", { .compatible = "qcom,msm8937-tsens", .data = (void *)TSENS_CALIB_FUSE_MAP_MSM8937, .data = (void *)TSENS_CALIB_FUSE_MAP_MSM8937, }, }, { .compatible = "qcom,msmgold-tsens", .data = (void *)TSENS_CALIB_FUSE_MAP_MSMGOLD, }, {} {} }; }; Loading Loading @@ -2618,9 +2624,9 @@ static int tsens_hw_init(struct tsens_tm_device *tmdev) return 0; return 0; } } static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) static int tsens_calib_msm8937_msmgold_sensors(struct tsens_tm_device *tmdev) { { int i, tsens_base0_data = 0, tsens_base1_data = 0; int i, tsens_base0_data = 0, tsens_base1_data = 0, ext_sen = 1; int tsens0_point1 = 0, tsens0_point2 = 0; int tsens0_point1 = 0, tsens0_point2 = 0; int tsens1_point1 = 0, tsens1_point2 = 0; int tsens1_point1 = 0, tsens1_point2 = 0; int tsens2_point1 = 0, tsens2_point2 = 0; int tsens2_point1 = 0, tsens2_point2 = 0; Loading @@ -2637,6 +2643,9 @@ static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) uint32_t calib_data[5] = {0, 0, 0, 0, 0}; uint32_t calib_data[5] = {0, 0, 0, 0, 0}; uint32_t calib_tsens_point1_data[11], calib_tsens_point2_data[11]; uint32_t calib_tsens_point1_data[11], calib_tsens_point2_data[11]; if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSMGOLD) ext_sen = 0; if (!tmdev->calibration_less_mode) { if (!tmdev->calibration_less_mode) { calib_data[0] = readl_relaxed(tmdev->tsens_calib_addr + 0x1D8); calib_data[0] = readl_relaxed(tmdev->tsens_calib_addr + 0x1D8); Loading Loading @@ -2687,6 +2696,7 @@ static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) >> TSENS8_CONTR_14_POINT1_SHIFT; >> TSENS8_CONTR_14_POINT1_SHIFT; tsens9_point1 = (calib_data[4] & tsens9_point1 = (calib_data[4] & TSENS9_CONTR_14_POINT1_MASK); TSENS9_CONTR_14_POINT1_MASK); if (ext_sen) tsens10_point1 = (calib_data[4] & tsens10_point1 = (calib_data[4] & TSENS10_CONTR_14_POINT1_MASK) TSENS10_CONTR_14_POINT1_MASK) >> TSENS10_CONTR_14_POINT1_SHIFT; >> TSENS10_CONTR_14_POINT1_SHIFT; Loading Loading @@ -2726,6 +2736,7 @@ static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) tsens9_point2 = (calib_data[4] & tsens9_point2 = (calib_data[4] & TSENS9_CONTR_14_POINT2_MASK) TSENS9_CONTR_14_POINT2_MASK) >> TSENS9_CONTR_14_POINT2_SHIFT; >> TSENS9_CONTR_14_POINT2_SHIFT; if (ext_sen) tsens10_point2 = (calib_data[4] & tsens10_point2 = (calib_data[4] & TSENS10_CONTR_14_POINT2_MASK) TSENS10_CONTR_14_POINT2_MASK) >> TSENS10_CONTR_14_POINT2_SHIFT; >> TSENS10_CONTR_14_POINT2_SHIFT; Loading @@ -2742,53 +2753,77 @@ static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) if ((tsens_calibration_mode == TSENS_ONE_POINT_CALIB_OPTION_2) || if ((tsens_calibration_mode == TSENS_ONE_POINT_CALIB_OPTION_2) || (tsens_calibration_mode == TSENS_TWO_POINT_CALIB)) { (tsens_calibration_mode == TSENS_TWO_POINT_CALIB)) { calib_tsens_point1_data[0] = calib_tsens_point1_data[0] = (((tsens_base0_data) + tsens0_point1) << 2); (((tsens_base0_data) + tsens0_point1) << 2) + tmdev->sensor[0].wa_temp1_calib_offset_factor; calib_tsens_point1_data[1] = calib_tsens_point1_data[1] = (((tsens_base0_data) + tsens1_point1) << 2); (((tsens_base0_data) + tsens1_point1) << 2) + tmdev->sensor[1].wa_temp1_calib_offset_factor; calib_tsens_point1_data[2] = calib_tsens_point1_data[2] = (((tsens_base0_data) + tsens2_point1) << 2); (((tsens_base0_data) + tsens2_point1) << 2) + tmdev->sensor[2].wa_temp1_calib_offset_factor; calib_tsens_point1_data[3] = calib_tsens_point1_data[3] = (((tsens_base0_data) + tsens3_point1) << 2); (((tsens_base0_data) + tsens3_point1) << 2) + tmdev->sensor[3].wa_temp1_calib_offset_factor; calib_tsens_point1_data[4] = calib_tsens_point1_data[4] = (((tsens_base0_data) + tsens4_point1) << 2); (((tsens_base0_data) + tsens4_point1) << 2) + tmdev->sensor[4].wa_temp1_calib_offset_factor; calib_tsens_point1_data[5] = calib_tsens_point1_data[5] = (((tsens_base0_data) + tsens5_point1) << 2); (((tsens_base0_data) + tsens5_point1) << 2) + tmdev->sensor[5].wa_temp1_calib_offset_factor; calib_tsens_point1_data[6] = calib_tsens_point1_data[6] = (((tsens_base0_data) + tsens6_point1) << 2); (((tsens_base0_data) + tsens6_point1) << 2) + tmdev->sensor[6].wa_temp1_calib_offset_factor; calib_tsens_point1_data[7] = calib_tsens_point1_data[7] = (((tsens_base0_data) + tsens7_point1) << 2); (((tsens_base0_data) + tsens7_point1) << 2) + tmdev->sensor[7].wa_temp1_calib_offset_factor; calib_tsens_point1_data[8] = calib_tsens_point1_data[8] = (((tsens_base0_data) + tsens8_point1) << 2); (((tsens_base0_data) + tsens8_point1) << 2) + tmdev->sensor[8].wa_temp1_calib_offset_factor; calib_tsens_point1_data[9] = calib_tsens_point1_data[9] = (((tsens_base0_data) + tsens9_point1) << 2); (((tsens_base0_data) + tsens9_point1) << 2) + tmdev->sensor[9].wa_temp1_calib_offset_factor; if (ext_sen) calib_tsens_point1_data[10] = calib_tsens_point1_data[10] = (((tsens_base0_data) + tsens10_point1) << 2); (((tsens_base0_data) + tsens10_point1) << 2) + tmdev->sensor[10].wa_temp1_calib_offset_factor; } } if (tsens_calibration_mode == TSENS_TWO_POINT_CALIB) { if (tsens_calibration_mode == TSENS_TWO_POINT_CALIB) { pr_debug("two point calibration calculation\n"); pr_debug("two point calibration calculation\n"); calib_tsens_point2_data[0] = calib_tsens_point2_data[0] = ((tsens_base1_data + tsens0_point2) << 2); ((tsens_base1_data + tsens0_point2) << 2) + tmdev->sensor[0].wa_temp2_calib_offset_factor; calib_tsens_point2_data[1] = calib_tsens_point2_data[1] = ((tsens_base1_data + tsens1_point2) << 2); ((tsens_base1_data + tsens1_point2) << 2) + tmdev->sensor[1].wa_temp2_calib_offset_factor; calib_tsens_point2_data[2] = calib_tsens_point2_data[2] = ((tsens_base1_data + tsens2_point2) << 2); ((tsens_base1_data + tsens2_point2) << 2) + tmdev->sensor[2].wa_temp2_calib_offset_factor; calib_tsens_point2_data[3] = calib_tsens_point2_data[3] = ((tsens_base1_data + tsens3_point2) << 2); ((tsens_base1_data + tsens3_point2) << 2) + tmdev->sensor[3].wa_temp2_calib_offset_factor; calib_tsens_point2_data[4] = calib_tsens_point2_data[4] = ((tsens_base1_data + tsens4_point2) << 2); ((tsens_base1_data + tsens4_point2) << 2) + tmdev->sensor[4].wa_temp2_calib_offset_factor; calib_tsens_point2_data[5] = calib_tsens_point2_data[5] = ((tsens_base1_data + tsens5_point2) << 2); ((tsens_base1_data + tsens5_point2) << 2) + tmdev->sensor[5].wa_temp2_calib_offset_factor; calib_tsens_point2_data[6] = calib_tsens_point2_data[6] = ((tsens_base1_data + tsens6_point2) << 2); ((tsens_base1_data + tsens6_point2) << 2) + tmdev->sensor[6].wa_temp2_calib_offset_factor; calib_tsens_point2_data[7] = calib_tsens_point2_data[7] = ((tsens_base1_data + tsens7_point2) << 2); ((tsens_base1_data + tsens7_point2) << 2) + tmdev->sensor[7].wa_temp2_calib_offset_factor; calib_tsens_point2_data[8] = calib_tsens_point2_data[8] = ((tsens_base1_data + tsens8_point2) << 2); ((tsens_base1_data + tsens8_point2) << 2) + tmdev->sensor[8].wa_temp2_calib_offset_factor; calib_tsens_point2_data[9] = calib_tsens_point2_data[9] = ((tsens_base1_data + tsens9_point2) << 2); ((tsens_base1_data + tsens9_point2) << 2) + tmdev->sensor[9].wa_temp2_calib_offset_factor; if (ext_sen) calib_tsens_point2_data[10] = calib_tsens_point2_data[10] = ((tsens_base1_data + tsens10_point2) << 2); ((tsens_base1_data + tsens10_point2) << 2) + tmdev->sensor[10].wa_temp2_calib_offset_factor; } } for (i = 0; i < tmdev->tsens_num_sensor; i++) { for (i = 0; i < tmdev->tsens_num_sensor; i++) { Loading Loading @@ -5208,7 +5243,9 @@ static int tsens_calib_sensors(struct tsens_tm_device *tmdev) else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MDM9607) else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MDM9607) rc = tsens_calib_mdm9607_sensors(tmdev); rc = tsens_calib_mdm9607_sensors(tmdev); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSM8937) else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSM8937) rc = tsens_calib_msm8937_sensors(tmdev); rc = tsens_calib_msm8937_msmgold_sensors(tmdev); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSMGOLD) rc = tsens_calib_msm8937_msmgold_sensors(tmdev); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_NONE) { else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_NONE) { pr_debug("Fuse map info not required\n"); pr_debug("Fuse map info not required\n"); rc = 0; rc = 0; Loading @@ -5226,6 +5263,7 @@ static int get_device_tree_data(struct platform_device *pdev, struct device_node *of_node = pdev->dev.of_node; struct device_node *of_node = pdev->dev.of_node; struct resource *res_mem = NULL; struct resource *res_mem = NULL; u32 *tsens_slope_data, *sensor_id, *client_id; u32 *tsens_slope_data, *sensor_id, *client_id; u32 *temp1_calib_offset_factor, *temp2_calib_offset_factor; u32 rc = 0, i, tsens_num_sensors = 0; u32 rc = 0, i, tsens_num_sensors = 0; const struct of_device_id *id; const struct of_device_id *id; Loading Loading @@ -5323,6 +5361,7 @@ static int get_device_tree_data(struct platform_device *pdev, tmdev->tsens_type = TSENS_TYPE3; tmdev->tsens_type = TSENS_TYPE3; tsens_poll_check = 0; tsens_poll_check = 0; } else if (!strcmp(id->compatible, "qcom,msm8952-tsens") || } else if (!strcmp(id->compatible, "qcom,msm8952-tsens") || (!strcmp(id->compatible, "qcom,msmgold-tsens")) || (!strcmp(id->compatible, "qcom,msm8937-tsens"))) (!strcmp(id->compatible, "qcom,msm8937-tsens"))) tmdev->tsens_type = TSENS_TYPE4; tmdev->tsens_type = TSENS_TYPE4; else else Loading Loading @@ -5361,6 +5400,44 @@ static int get_device_tree_data(struct platform_device *pdev, } } } } temp1_calib_offset_factor = devm_kzalloc(&pdev->dev, tsens_num_sensors * sizeof(u32), GFP_KERNEL); if (!temp1_calib_offset_factor) return -ENOMEM; rc = of_property_read_u32_array(of_node, "qcom,temp1-offset", temp1_calib_offset_factor, tsens_num_sensors); if (rc) { pr_debug("Default temp1-offsets\n"); for (i = 0; i < tsens_num_sensors; i++) tmdev->sensor[i].wa_temp1_calib_offset_factor = 0; } else { pr_debug("Use specific temp1-offsets\n"); for (i = 0; i < tsens_num_sensors; i++) tmdev->sensor[i].wa_temp1_calib_offset_factor = temp1_calib_offset_factor[i]; } temp2_calib_offset_factor = devm_kzalloc(&pdev->dev, tsens_num_sensors * sizeof(u32), GFP_KERNEL); if (!temp2_calib_offset_factor) return -ENOMEM; rc = of_property_read_u32_array(of_node, "qcom,temp2-offset", temp2_calib_offset_factor, tsens_num_sensors); if (rc) { pr_debug("Default temp2-offsets\n"); for (i = 0; i < tsens_num_sensors; i++) tmdev->sensor[i].wa_temp2_calib_offset_factor = 0; } else { pr_debug("Use specific temp2-offsets\n"); for (i = 0; i < tsens_num_sensors; i++) tmdev->sensor[i].wa_temp2_calib_offset_factor = temp2_calib_offset_factor[i]; } /* TSENS register region */ /* TSENS register region */ tmdev->res_tsens_mem = platform_get_resource_byname(pdev, tmdev->res_tsens_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tsens_physical"); IORESOURCE_MEM, "tsens_physical"); Loading Loading
Documentation/devicetree/bindings/thermal/tsens.txt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,7 @@ Required properties: should be "qcom,mdm9607-tsens" for 9607 TSENS driver. should be "qcom,mdm9607-tsens" for 9607 TSENS driver. should be "qcom,msmtitanium-tsens" for titanium TSENS driver. should be "qcom,msmtitanium-tsens" for titanium TSENS driver. should be "qcom,msm8937-tsens" for 8937 TSENS driver. should be "qcom,msm8937-tsens" for 8937 TSENS driver. should be "qcom,msmgold-tsens" for gold TSENS driver. The compatible property is used to identify the respective fusemap to use The compatible property is used to identify the respective fusemap to use for the corresponding SoC. for the corresponding SoC. - reg : offset and length of the TSENS registers. - reg : offset and length of the TSENS registers. Loading Loading @@ -70,6 +71,10 @@ Optional properties: total number of supported sensors with each controller instance. total number of supported sensors with each controller instance. - qcom,valid-status-check: If property is present, check the VALID bit is set - qcom,valid-status-check: If property is present, check the VALID bit is set before reporting the temperature data. before reporting the temperature data. - qcom,temp1-offset: If property is present, Use these offset values to be added for 30 deg calib points. - qcom,temp2-offset: If property is present, Use these offset values to be added for 120 deg calib points. Example: Example: Loading
arch/arm/boot/dts/qcom/msmgold.dtsi +13 −0 Original line number Original line Diff line number Diff line Loading @@ -122,6 +122,19 @@ clock-frequency = <32768>; clock-frequency = <32768>; }; }; tsens: tsens@4a8000 { compatible = "qcom,msmgold-tsens"; reg = <0x4a8000 0x2000>, <0xa4000 0x1000>; reg-names = "tsens_physical", "tsens_eeprom_physical"; interrupts = <0 184 0>; interrupt-names = "tsens-upper-lower"; qcom,sensors = <10>; qcom,slope = <3200 3200 3200 3200 3200 3200 3200 3200 3200 3200>; qcom,valid-status-check; }; blsp1_uart2: serial@78b0000 { blsp1_uart2: serial@78b0000 { compatible = "qcom,msm-lsuart-v14"; compatible = "qcom,msm-lsuart-v14"; reg = <0x78b0000 0x200>; reg = <0x78b0000 0x200>; Loading
drivers/thermal/msm-tsens.c +106 −29 Original line number Original line Diff line number Diff line Loading @@ -742,6 +742,7 @@ enum tsens_calib_fuse_map_type { TSENS_CALIB_FUSE_MAP_MSM8952, TSENS_CALIB_FUSE_MAP_MSM8952, TSENS_CALIB_FUSE_MAP_MDM9607, TSENS_CALIB_FUSE_MAP_MDM9607, TSENS_CALIB_FUSE_MAP_MSM8937, TSENS_CALIB_FUSE_MAP_MSM8937, TSENS_CALIB_FUSE_MAP_MSMGOLD, TSENS_CALIB_FUSE_MAP_NUM, TSENS_CALIB_FUSE_MAP_NUM, }; }; Loading Loading @@ -792,6 +793,8 @@ struct tsens_tm_device_sensor { * decidegC based on the controller settings. * decidegC based on the controller settings. */ */ int dbg_adc_code; int dbg_adc_code; u32 wa_temp1_calib_offset_factor; u32 wa_temp2_calib_offset_factor; }; }; struct tsens_dbg_counter { struct tsens_dbg_counter { Loading Loading @@ -911,6 +914,9 @@ static struct of_device_id tsens_match[] = { { .compatible = "qcom,msm8937-tsens", { .compatible = "qcom,msm8937-tsens", .data = (void *)TSENS_CALIB_FUSE_MAP_MSM8937, .data = (void *)TSENS_CALIB_FUSE_MAP_MSM8937, }, }, { .compatible = "qcom,msmgold-tsens", .data = (void *)TSENS_CALIB_FUSE_MAP_MSMGOLD, }, {} {} }; }; Loading Loading @@ -2618,9 +2624,9 @@ static int tsens_hw_init(struct tsens_tm_device *tmdev) return 0; return 0; } } static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) static int tsens_calib_msm8937_msmgold_sensors(struct tsens_tm_device *tmdev) { { int i, tsens_base0_data = 0, tsens_base1_data = 0; int i, tsens_base0_data = 0, tsens_base1_data = 0, ext_sen = 1; int tsens0_point1 = 0, tsens0_point2 = 0; int tsens0_point1 = 0, tsens0_point2 = 0; int tsens1_point1 = 0, tsens1_point2 = 0; int tsens1_point1 = 0, tsens1_point2 = 0; int tsens2_point1 = 0, tsens2_point2 = 0; int tsens2_point1 = 0, tsens2_point2 = 0; Loading @@ -2637,6 +2643,9 @@ static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) uint32_t calib_data[5] = {0, 0, 0, 0, 0}; uint32_t calib_data[5] = {0, 0, 0, 0, 0}; uint32_t calib_tsens_point1_data[11], calib_tsens_point2_data[11]; uint32_t calib_tsens_point1_data[11], calib_tsens_point2_data[11]; if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSMGOLD) ext_sen = 0; if (!tmdev->calibration_less_mode) { if (!tmdev->calibration_less_mode) { calib_data[0] = readl_relaxed(tmdev->tsens_calib_addr + 0x1D8); calib_data[0] = readl_relaxed(tmdev->tsens_calib_addr + 0x1D8); Loading Loading @@ -2687,6 +2696,7 @@ static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) >> TSENS8_CONTR_14_POINT1_SHIFT; >> TSENS8_CONTR_14_POINT1_SHIFT; tsens9_point1 = (calib_data[4] & tsens9_point1 = (calib_data[4] & TSENS9_CONTR_14_POINT1_MASK); TSENS9_CONTR_14_POINT1_MASK); if (ext_sen) tsens10_point1 = (calib_data[4] & tsens10_point1 = (calib_data[4] & TSENS10_CONTR_14_POINT1_MASK) TSENS10_CONTR_14_POINT1_MASK) >> TSENS10_CONTR_14_POINT1_SHIFT; >> TSENS10_CONTR_14_POINT1_SHIFT; Loading Loading @@ -2726,6 +2736,7 @@ static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) tsens9_point2 = (calib_data[4] & tsens9_point2 = (calib_data[4] & TSENS9_CONTR_14_POINT2_MASK) TSENS9_CONTR_14_POINT2_MASK) >> TSENS9_CONTR_14_POINT2_SHIFT; >> TSENS9_CONTR_14_POINT2_SHIFT; if (ext_sen) tsens10_point2 = (calib_data[4] & tsens10_point2 = (calib_data[4] & TSENS10_CONTR_14_POINT2_MASK) TSENS10_CONTR_14_POINT2_MASK) >> TSENS10_CONTR_14_POINT2_SHIFT; >> TSENS10_CONTR_14_POINT2_SHIFT; Loading @@ -2742,53 +2753,77 @@ static int tsens_calib_msm8937_sensors(struct tsens_tm_device *tmdev) if ((tsens_calibration_mode == TSENS_ONE_POINT_CALIB_OPTION_2) || if ((tsens_calibration_mode == TSENS_ONE_POINT_CALIB_OPTION_2) || (tsens_calibration_mode == TSENS_TWO_POINT_CALIB)) { (tsens_calibration_mode == TSENS_TWO_POINT_CALIB)) { calib_tsens_point1_data[0] = calib_tsens_point1_data[0] = (((tsens_base0_data) + tsens0_point1) << 2); (((tsens_base0_data) + tsens0_point1) << 2) + tmdev->sensor[0].wa_temp1_calib_offset_factor; calib_tsens_point1_data[1] = calib_tsens_point1_data[1] = (((tsens_base0_data) + tsens1_point1) << 2); (((tsens_base0_data) + tsens1_point1) << 2) + tmdev->sensor[1].wa_temp1_calib_offset_factor; calib_tsens_point1_data[2] = calib_tsens_point1_data[2] = (((tsens_base0_data) + tsens2_point1) << 2); (((tsens_base0_data) + tsens2_point1) << 2) + tmdev->sensor[2].wa_temp1_calib_offset_factor; calib_tsens_point1_data[3] = calib_tsens_point1_data[3] = (((tsens_base0_data) + tsens3_point1) << 2); (((tsens_base0_data) + tsens3_point1) << 2) + tmdev->sensor[3].wa_temp1_calib_offset_factor; calib_tsens_point1_data[4] = calib_tsens_point1_data[4] = (((tsens_base0_data) + tsens4_point1) << 2); (((tsens_base0_data) + tsens4_point1) << 2) + tmdev->sensor[4].wa_temp1_calib_offset_factor; calib_tsens_point1_data[5] = calib_tsens_point1_data[5] = (((tsens_base0_data) + tsens5_point1) << 2); (((tsens_base0_data) + tsens5_point1) << 2) + tmdev->sensor[5].wa_temp1_calib_offset_factor; calib_tsens_point1_data[6] = calib_tsens_point1_data[6] = (((tsens_base0_data) + tsens6_point1) << 2); (((tsens_base0_data) + tsens6_point1) << 2) + tmdev->sensor[6].wa_temp1_calib_offset_factor; calib_tsens_point1_data[7] = calib_tsens_point1_data[7] = (((tsens_base0_data) + tsens7_point1) << 2); (((tsens_base0_data) + tsens7_point1) << 2) + tmdev->sensor[7].wa_temp1_calib_offset_factor; calib_tsens_point1_data[8] = calib_tsens_point1_data[8] = (((tsens_base0_data) + tsens8_point1) << 2); (((tsens_base0_data) + tsens8_point1) << 2) + tmdev->sensor[8].wa_temp1_calib_offset_factor; calib_tsens_point1_data[9] = calib_tsens_point1_data[9] = (((tsens_base0_data) + tsens9_point1) << 2); (((tsens_base0_data) + tsens9_point1) << 2) + tmdev->sensor[9].wa_temp1_calib_offset_factor; if (ext_sen) calib_tsens_point1_data[10] = calib_tsens_point1_data[10] = (((tsens_base0_data) + tsens10_point1) << 2); (((tsens_base0_data) + tsens10_point1) << 2) + tmdev->sensor[10].wa_temp1_calib_offset_factor; } } if (tsens_calibration_mode == TSENS_TWO_POINT_CALIB) { if (tsens_calibration_mode == TSENS_TWO_POINT_CALIB) { pr_debug("two point calibration calculation\n"); pr_debug("two point calibration calculation\n"); calib_tsens_point2_data[0] = calib_tsens_point2_data[0] = ((tsens_base1_data + tsens0_point2) << 2); ((tsens_base1_data + tsens0_point2) << 2) + tmdev->sensor[0].wa_temp2_calib_offset_factor; calib_tsens_point2_data[1] = calib_tsens_point2_data[1] = ((tsens_base1_data + tsens1_point2) << 2); ((tsens_base1_data + tsens1_point2) << 2) + tmdev->sensor[1].wa_temp2_calib_offset_factor; calib_tsens_point2_data[2] = calib_tsens_point2_data[2] = ((tsens_base1_data + tsens2_point2) << 2); ((tsens_base1_data + tsens2_point2) << 2) + tmdev->sensor[2].wa_temp2_calib_offset_factor; calib_tsens_point2_data[3] = calib_tsens_point2_data[3] = ((tsens_base1_data + tsens3_point2) << 2); ((tsens_base1_data + tsens3_point2) << 2) + tmdev->sensor[3].wa_temp2_calib_offset_factor; calib_tsens_point2_data[4] = calib_tsens_point2_data[4] = ((tsens_base1_data + tsens4_point2) << 2); ((tsens_base1_data + tsens4_point2) << 2) + tmdev->sensor[4].wa_temp2_calib_offset_factor; calib_tsens_point2_data[5] = calib_tsens_point2_data[5] = ((tsens_base1_data + tsens5_point2) << 2); ((tsens_base1_data + tsens5_point2) << 2) + tmdev->sensor[5].wa_temp2_calib_offset_factor; calib_tsens_point2_data[6] = calib_tsens_point2_data[6] = ((tsens_base1_data + tsens6_point2) << 2); ((tsens_base1_data + tsens6_point2) << 2) + tmdev->sensor[6].wa_temp2_calib_offset_factor; calib_tsens_point2_data[7] = calib_tsens_point2_data[7] = ((tsens_base1_data + tsens7_point2) << 2); ((tsens_base1_data + tsens7_point2) << 2) + tmdev->sensor[7].wa_temp2_calib_offset_factor; calib_tsens_point2_data[8] = calib_tsens_point2_data[8] = ((tsens_base1_data + tsens8_point2) << 2); ((tsens_base1_data + tsens8_point2) << 2) + tmdev->sensor[8].wa_temp2_calib_offset_factor; calib_tsens_point2_data[9] = calib_tsens_point2_data[9] = ((tsens_base1_data + tsens9_point2) << 2); ((tsens_base1_data + tsens9_point2) << 2) + tmdev->sensor[9].wa_temp2_calib_offset_factor; if (ext_sen) calib_tsens_point2_data[10] = calib_tsens_point2_data[10] = ((tsens_base1_data + tsens10_point2) << 2); ((tsens_base1_data + tsens10_point2) << 2) + tmdev->sensor[10].wa_temp2_calib_offset_factor; } } for (i = 0; i < tmdev->tsens_num_sensor; i++) { for (i = 0; i < tmdev->tsens_num_sensor; i++) { Loading Loading @@ -5208,7 +5243,9 @@ static int tsens_calib_sensors(struct tsens_tm_device *tmdev) else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MDM9607) else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MDM9607) rc = tsens_calib_mdm9607_sensors(tmdev); rc = tsens_calib_mdm9607_sensors(tmdev); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSM8937) else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSM8937) rc = tsens_calib_msm8937_sensors(tmdev); rc = tsens_calib_msm8937_msmgold_sensors(tmdev); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_MSMGOLD) rc = tsens_calib_msm8937_msmgold_sensors(tmdev); else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_NONE) { else if (tmdev->calib_mode == TSENS_CALIB_FUSE_MAP_NONE) { pr_debug("Fuse map info not required\n"); pr_debug("Fuse map info not required\n"); rc = 0; rc = 0; Loading @@ -5226,6 +5263,7 @@ static int get_device_tree_data(struct platform_device *pdev, struct device_node *of_node = pdev->dev.of_node; struct device_node *of_node = pdev->dev.of_node; struct resource *res_mem = NULL; struct resource *res_mem = NULL; u32 *tsens_slope_data, *sensor_id, *client_id; u32 *tsens_slope_data, *sensor_id, *client_id; u32 *temp1_calib_offset_factor, *temp2_calib_offset_factor; u32 rc = 0, i, tsens_num_sensors = 0; u32 rc = 0, i, tsens_num_sensors = 0; const struct of_device_id *id; const struct of_device_id *id; Loading Loading @@ -5323,6 +5361,7 @@ static int get_device_tree_data(struct platform_device *pdev, tmdev->tsens_type = TSENS_TYPE3; tmdev->tsens_type = TSENS_TYPE3; tsens_poll_check = 0; tsens_poll_check = 0; } else if (!strcmp(id->compatible, "qcom,msm8952-tsens") || } else if (!strcmp(id->compatible, "qcom,msm8952-tsens") || (!strcmp(id->compatible, "qcom,msmgold-tsens")) || (!strcmp(id->compatible, "qcom,msm8937-tsens"))) (!strcmp(id->compatible, "qcom,msm8937-tsens"))) tmdev->tsens_type = TSENS_TYPE4; tmdev->tsens_type = TSENS_TYPE4; else else Loading Loading @@ -5361,6 +5400,44 @@ static int get_device_tree_data(struct platform_device *pdev, } } } } temp1_calib_offset_factor = devm_kzalloc(&pdev->dev, tsens_num_sensors * sizeof(u32), GFP_KERNEL); if (!temp1_calib_offset_factor) return -ENOMEM; rc = of_property_read_u32_array(of_node, "qcom,temp1-offset", temp1_calib_offset_factor, tsens_num_sensors); if (rc) { pr_debug("Default temp1-offsets\n"); for (i = 0; i < tsens_num_sensors; i++) tmdev->sensor[i].wa_temp1_calib_offset_factor = 0; } else { pr_debug("Use specific temp1-offsets\n"); for (i = 0; i < tsens_num_sensors; i++) tmdev->sensor[i].wa_temp1_calib_offset_factor = temp1_calib_offset_factor[i]; } temp2_calib_offset_factor = devm_kzalloc(&pdev->dev, tsens_num_sensors * sizeof(u32), GFP_KERNEL); if (!temp2_calib_offset_factor) return -ENOMEM; rc = of_property_read_u32_array(of_node, "qcom,temp2-offset", temp2_calib_offset_factor, tsens_num_sensors); if (rc) { pr_debug("Default temp2-offsets\n"); for (i = 0; i < tsens_num_sensors; i++) tmdev->sensor[i].wa_temp2_calib_offset_factor = 0; } else { pr_debug("Use specific temp2-offsets\n"); for (i = 0; i < tsens_num_sensors; i++) tmdev->sensor[i].wa_temp2_calib_offset_factor = temp2_calib_offset_factor[i]; } /* TSENS register region */ /* TSENS register region */ tmdev->res_tsens_mem = platform_get_resource_byname(pdev, tmdev->res_tsens_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tsens_physical"); IORESOURCE_MEM, "tsens_physical"); Loading