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