1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * OMAP4 thermal driver. 4 * 5 * Copyright (C) 2011-2012 Texas Instruments Inc. 6 * Contact: 7 * Eduardo Valentin <eduardo.valentin@ti.com> 8 */ 9 10 #include "ti-thermal.h" 11 #include "ti-bandgap.h" 12 #include "omap4xxx-bandgap.h" 13 14 /* 15 * OMAP4430 has one instance of thermal sensor for MPU 16 * need to describe the individual bit fields 17 */ 18 static struct temp_sensor_registers 19 omap4430_mpu_temp_sensor_registers = { 20 .temp_sensor_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET, 21 .bgap_tempsoff_mask = OMAP4430_BGAP_TEMPSOFF_MASK, 22 .bgap_soc_mask = OMAP4430_BGAP_TEMP_SENSOR_SOC_MASK, 23 .bgap_eocz_mask = OMAP4430_BGAP_TEMP_SENSOR_EOCZ_MASK, 24 .bgap_dtemp_mask = OMAP4430_BGAP_TEMP_SENSOR_DTEMP_MASK, 25 26 .bgap_mode_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET, 27 .mode_ctrl_mask = OMAP4430_SINGLE_MODE_MASK, 28 29 .bgap_efuse = OMAP4430_FUSE_OPP_BGAP, 30 }; 31 32 /* Thresholds and limits for OMAP4430 MPU temperature sensor */ 33 static struct temp_sensor_data omap4430_mpu_temp_sensor_data = { 34 .min_freq = OMAP4430_MIN_FREQ, 35 .max_freq = OMAP4430_MAX_FREQ, 36 }; 37 38 /* 39 * Temperature values in milli degree celsius 40 * ADC code values from 13 to 107, see TRM 41 * "18.4.10.2.3 ADC Codes Versus Temperature". 42 */ 43 static const int 44 omap4430_adc_to_temp[OMAP4430_ADC_END_VALUE - OMAP4430_ADC_START_VALUE + 1] = { 45 -40000, -38000, -35000, -34000, -32000, -30000, -28000, -26000, -24000, 46 -22000, -20000, -18500, -17000, -15000, -13500, -12000, -10000, -8000, 47 -6500, -5000, -3500, -1500, 0, 2000, 3500, 5000, 6500, 8500, 10000, 48 12000, 13500, 15000, 17000, 19000, 21000, 23000, 25000, 27000, 28500, 49 30000, 32000, 33500, 35000, 37000, 38500, 40000, 42000, 43500, 45000, 50 47000, 48500, 50000, 52000, 53500, 55000, 57000, 58500, 60000, 62000, 51 64000, 66000, 68000, 70000, 71500, 73500, 75000, 77000, 78500, 80000, 52 82000, 83500, 85000, 87000, 88500, 90000, 92000, 93500, 95000, 97000, 53 98500, 100000, 102000, 103500, 105000, 107000, 109000, 111000, 113000, 54 115000, 117000, 118500, 120000, 122000, 123500, 125000, 55 }; 56 57 /* OMAP4430 data */ 58 const struct ti_bandgap_data omap4430_data = { 59 .features = TI_BANDGAP_FEATURE_MODE_CONFIG | 60 TI_BANDGAP_FEATURE_CLK_CTRL | 61 TI_BANDGAP_FEATURE_POWER_SWITCH, 62 .fclock_name = "bandgap_fclk", 63 .div_ck_name = "bandgap_fclk", 64 .conv_table = omap4430_adc_to_temp, 65 .adc_start_val = OMAP4430_ADC_START_VALUE, 66 .adc_end_val = OMAP4430_ADC_END_VALUE, 67 .expose_sensor = ti_thermal_expose_sensor, 68 .remove_sensor = ti_thermal_remove_sensor, 69 .sensors = { 70 { 71 .registers = &omap4430_mpu_temp_sensor_registers, 72 .ts_data = &omap4430_mpu_temp_sensor_data, 73 .domain = "cpu", 74 .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4430, 75 .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4430, 76 .register_cooling = ti_thermal_register_cpu_cooling, 77 .unregister_cooling = ti_thermal_unregister_cpu_cooling, 78 }, 79 }, 80 .sensor_count = 1, 81 }; 82 /* 83 * OMAP4460 has one instance of thermal sensor for MPU 84 * need to describe the individual bit fields 85 */ 86 static struct temp_sensor_registers 87 omap4460_mpu_temp_sensor_registers = { 88 .temp_sensor_ctrl = OMAP4460_TEMP_SENSOR_CTRL_OFFSET, 89 .bgap_tempsoff_mask = OMAP4460_BGAP_TEMPSOFF_MASK, 90 .bgap_soc_mask = OMAP4460_BGAP_TEMP_SENSOR_SOC_MASK, 91 .bgap_eocz_mask = OMAP4460_BGAP_TEMP_SENSOR_EOCZ_MASK, 92 .bgap_dtemp_mask = OMAP4460_BGAP_TEMP_SENSOR_DTEMP_MASK, 93 94 .bgap_mask_ctrl = OMAP4460_BGAP_CTRL_OFFSET, 95 .mask_hot_mask = OMAP4460_MASK_HOT_MASK, 96 .mask_cold_mask = OMAP4460_MASK_COLD_MASK, 97 98 .bgap_mode_ctrl = OMAP4460_BGAP_CTRL_OFFSET, 99 .mode_ctrl_mask = OMAP4460_SINGLE_MODE_MASK, 100 101 .bgap_counter = OMAP4460_BGAP_COUNTER_OFFSET, 102 .counter_mask = OMAP4460_COUNTER_MASK, 103 104 .bgap_threshold = OMAP4460_BGAP_THRESHOLD_OFFSET, 105 .threshold_thot_mask = OMAP4460_T_HOT_MASK, 106 .threshold_tcold_mask = OMAP4460_T_COLD_MASK, 107 108 .tshut_threshold = OMAP4460_BGAP_TSHUT_OFFSET, 109 .tshut_hot_mask = OMAP4460_TSHUT_HOT_MASK, 110 .tshut_cold_mask = OMAP4460_TSHUT_COLD_MASK, 111 112 .bgap_status = OMAP4460_BGAP_STATUS_OFFSET, 113 .status_hot_mask = OMAP4460_HOT_FLAG_MASK, 114 .status_cold_mask = OMAP4460_COLD_FLAG_MASK, 115 116 .bgap_efuse = OMAP4460_FUSE_OPP_BGAP, 117 }; 118 119 /* Thresholds and limits for OMAP4460 MPU temperature sensor */ 120 static struct temp_sensor_data omap4460_mpu_temp_sensor_data = { 121 .tshut_hot = OMAP4460_TSHUT_HOT, 122 .tshut_cold = OMAP4460_TSHUT_COLD, 123 .t_hot = OMAP4460_T_HOT, 124 .t_cold = OMAP4460_T_COLD, 125 .min_freq = OMAP4460_MIN_FREQ, 126 .max_freq = OMAP4460_MAX_FREQ, 127 }; 128 129 /* 130 * Temperature values in milli degree celsius 131 * ADC code values from 530 to 923 132 */ 133 static const int 134 omap4460_adc_to_temp[OMAP4460_ADC_END_VALUE - OMAP4460_ADC_START_VALUE + 1] = { 135 -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, -38200, 136 -37800, -37300, -36800, -36400, -36000, -35600, -35200, -34800, 137 -34300, -33800, -33400, -33000, -32600, -32200, -31800, -31300, 138 -30800, -30400, -30000, -29600, -29200, -28700, -28200, -27800, 139 -27400, -27000, -26600, -26200, -25700, -25200, -24800, -24400, 140 -24000, -23600, -23200, -22700, -22200, -21800, -21400, -21000, 141 -20600, -20200, -19700, -19200, -18800, -18400, -18000, -17600, 142 -17200, -16700, -16200, -15800, -15400, -15000, -14600, -14200, 143 -13700, -13200, -12800, -12400, -12000, -11600, -11200, -10700, 144 -10200, -9800, -9400, -9000, -8600, -8200, -7700, -7200, -6800, 145 -6400, -6000, -5600, -5200, -4800, -4300, -3800, -3400, -3000, 146 -2600, -2200, -1800, -1300, -800, -400, 0, 400, 800, 1200, 1600, 147 2100, 2600, 3000, 3400, 3800, 4200, 4600, 5100, 5600, 6000, 6400, 148 6800, 7200, 7600, 8000, 8500, 9000, 9400, 9800, 10200, 10600, 11000, 149 11400, 11900, 12400, 12800, 13200, 13600, 14000, 14400, 14800, 150 15300, 15800, 16200, 16600, 17000, 17400, 17800, 18200, 18700, 151 19200, 19600, 20000, 20400, 20800, 21200, 21600, 22100, 22600, 152 23000, 23400, 23800, 24200, 24600, 25000, 25400, 25900, 26400, 153 26800, 27200, 27600, 28000, 28400, 28800, 29300, 29800, 30200, 154 30600, 31000, 31400, 31800, 32200, 32600, 33100, 33600, 34000, 155 34400, 34800, 35200, 35600, 36000, 36400, 36800, 37300, 37800, 156 38200, 38600, 39000, 39400, 39800, 40200, 40600, 41100, 41600, 157 42000, 42400, 42800, 43200, 43600, 44000, 44400, 44800, 45300, 158 45800, 46200, 46600, 47000, 47400, 47800, 48200, 48600, 49000, 159 49500, 50000, 50400, 50800, 51200, 51600, 52000, 52400, 52800, 160 53200, 53700, 54200, 54600, 55000, 55400, 55800, 56200, 56600, 161 57000, 57400, 57800, 58200, 58700, 59200, 59600, 60000, 60400, 162 60800, 61200, 61600, 62000, 62400, 62800, 63300, 63800, 64200, 163 64600, 65000, 65400, 65800, 66200, 66600, 67000, 67400, 67800, 164 68200, 68700, 69200, 69600, 70000, 70400, 70800, 71200, 71600, 165 72000, 72400, 72800, 73200, 73600, 74100, 74600, 75000, 75400, 166 75800, 76200, 76600, 77000, 77400, 77800, 78200, 78600, 79000, 167 79400, 79800, 80300, 80800, 81200, 81600, 82000, 82400, 82800, 168 83200, 83600, 84000, 84400, 84800, 85200, 85600, 86000, 86400, 169 86800, 87300, 87800, 88200, 88600, 89000, 89400, 89800, 90200, 170 90600, 91000, 91400, 91800, 92200, 92600, 93000, 93400, 93800, 171 94200, 94600, 95000, 95500, 96000, 96400, 96800, 97200, 97600, 172 98000, 98400, 98800, 99200, 99600, 100000, 100400, 100800, 101200, 173 101600, 102000, 102400, 102800, 103200, 103600, 104000, 104400, 174 104800, 105200, 105600, 106100, 106600, 107000, 107400, 107800, 175 108200, 108600, 109000, 109400, 109800, 110200, 110600, 111000, 176 111400, 111800, 112200, 112600, 113000, 113400, 113800, 114200, 177 114600, 115000, 115400, 115800, 116200, 116600, 117000, 117400, 178 117800, 118200, 118600, 119000, 119400, 119800, 120200, 120600, 179 121000, 121400, 121800, 122200, 122600, 123000, 123400, 123800, 124200, 180 124600, 124900, 125000, 125000, 125000, 125000 181 }; 182 183 /* OMAP4460 data */ 184 const struct ti_bandgap_data omap4460_data = { 185 .features = TI_BANDGAP_FEATURE_TSHUT | 186 TI_BANDGAP_FEATURE_TSHUT_CONFIG | 187 TI_BANDGAP_FEATURE_TALERT | 188 TI_BANDGAP_FEATURE_MODE_CONFIG | 189 TI_BANDGAP_FEATURE_POWER_SWITCH | 190 TI_BANDGAP_FEATURE_CLK_CTRL | 191 TI_BANDGAP_FEATURE_COUNTER, 192 .fclock_name = "bandgap_ts_fclk", 193 .div_ck_name = "div_ts_ck", 194 .conv_table = omap4460_adc_to_temp, 195 .adc_start_val = OMAP4460_ADC_START_VALUE, 196 .adc_end_val = OMAP4460_ADC_END_VALUE, 197 .expose_sensor = ti_thermal_expose_sensor, 198 .remove_sensor = ti_thermal_remove_sensor, 199 .report_temperature = ti_thermal_report_sensor_temperature, 200 .sensors = { 201 { 202 .registers = &omap4460_mpu_temp_sensor_registers, 203 .ts_data = &omap4460_mpu_temp_sensor_data, 204 .domain = "cpu", 205 .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4460, 206 .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4460, 207 .register_cooling = ti_thermal_register_cpu_cooling, 208 .unregister_cooling = ti_thermal_unregister_cpu_cooling, 209 }, 210 }, 211 .sensor_count = 1, 212 }; 213 214 /* OMAP4470 data */ 215 const struct ti_bandgap_data omap4470_data = { 216 .features = TI_BANDGAP_FEATURE_TSHUT | 217 TI_BANDGAP_FEATURE_TSHUT_CONFIG | 218 TI_BANDGAP_FEATURE_TALERT | 219 TI_BANDGAP_FEATURE_MODE_CONFIG | 220 TI_BANDGAP_FEATURE_POWER_SWITCH | 221 TI_BANDGAP_FEATURE_CLK_CTRL | 222 TI_BANDGAP_FEATURE_COUNTER, 223 .fclock_name = "bandgap_ts_fclk", 224 .div_ck_name = "div_ts_ck", 225 .conv_table = omap4460_adc_to_temp, 226 .adc_start_val = OMAP4460_ADC_START_VALUE, 227 .adc_end_val = OMAP4460_ADC_END_VALUE, 228 .expose_sensor = ti_thermal_expose_sensor, 229 .remove_sensor = ti_thermal_remove_sensor, 230 .report_temperature = ti_thermal_report_sensor_temperature, 231 .sensors = { 232 { 233 .registers = &omap4460_mpu_temp_sensor_registers, 234 .ts_data = &omap4460_mpu_temp_sensor_data, 235 .domain = "cpu", 236 .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4470, 237 .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4470, 238 .register_cooling = ti_thermal_register_cpu_cooling, 239 .unregister_cooling = ti_thermal_unregister_cpu_cooling, 240 }, 241 }, 242 .sensor_count = 1, 243 }; 244