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