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