Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * OMAP4 thermal driver.
0004  *
0005  * Copyright (C) 2011-2012 Texas Instruments Inc.
0006  * Contact:
0007  *  Eduardo Valentin <eduardo.valentin@ti.com>
0008  */
0009 
0010 #include "ti-thermal.h"
0011 #include "ti-bandgap.h"
0012 #include "omap4xxx-bandgap.h"
0013 
0014 /*
0015  * OMAP4430 has one instance of thermal sensor for MPU
0016  * need to describe the individual bit fields
0017  */
0018 static struct temp_sensor_registers
0019 omap4430_mpu_temp_sensor_registers = {
0020     .temp_sensor_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET,
0021     .bgap_tempsoff_mask = OMAP4430_BGAP_TEMPSOFF_MASK,
0022     .bgap_soc_mask = OMAP4430_BGAP_TEMP_SENSOR_SOC_MASK,
0023     .bgap_eocz_mask = OMAP4430_BGAP_TEMP_SENSOR_EOCZ_MASK,
0024     .bgap_dtemp_mask = OMAP4430_BGAP_TEMP_SENSOR_DTEMP_MASK,
0025 
0026     .bgap_mode_ctrl = OMAP4430_TEMP_SENSOR_CTRL_OFFSET,
0027     .mode_ctrl_mask = OMAP4430_CONTINUOUS_MODE_MASK,
0028 
0029     .bgap_efuse = OMAP4430_FUSE_OPP_BGAP,
0030 };
0031 
0032 /* Thresholds and limits for OMAP4430 MPU temperature sensor */
0033 static struct temp_sensor_data omap4430_mpu_temp_sensor_data = {
0034     .min_freq = OMAP4430_MIN_FREQ,
0035     .max_freq = OMAP4430_MAX_FREQ,
0036 };
0037 
0038 /*
0039  * Temperature values in milli degree celsius
0040  * ADC code values from 13 to 107, see TRM
0041  * "18.4.10.2.3 ADC Codes Versus Temperature".
0042  */
0043 static const int
0044 omap4430_adc_to_temp[OMAP4430_ADC_END_VALUE - OMAP4430_ADC_START_VALUE + 1] = {
0045     -40000, -38000, -35000, -34000, -32000, -30000, -28000, -26000, -24000,
0046     -22000, -20000, -18500, -17000, -15000, -13500, -12000, -10000, -8000,
0047     -6500, -5000, -3500, -1500, 0, 2000, 3500, 5000, 6500, 8500, 10000,
0048     12000, 13500, 15000, 17000, 19000, 21000, 23000, 25000, 27000, 28500,
0049     30000, 32000, 33500, 35000, 37000, 38500, 40000, 42000, 43500, 45000,
0050     47000, 48500, 50000, 52000, 53500, 55000, 57000, 58500, 60000, 62000,
0051     64000, 66000, 68000, 70000, 71500, 73500, 75000, 77000, 78500, 80000,
0052     82000, 83500, 85000, 87000, 88500, 90000, 92000, 93500, 95000, 97000,
0053     98500, 100000, 102000, 103500, 105000, 107000, 109000, 111000, 113000,
0054     115000, 117000, 118500, 120000, 122000, 123500, 125000,
0055 };
0056 
0057 /* OMAP4430 data */
0058 const struct ti_bandgap_data omap4430_data = {
0059     .features = TI_BANDGAP_FEATURE_MODE_CONFIG |
0060             TI_BANDGAP_FEATURE_CLK_CTRL |
0061             TI_BANDGAP_FEATURE_POWER_SWITCH |
0062             TI_BANDGAP_FEATURE_CONT_MODE_ONLY,
0063     .fclock_name = "bandgap_fclk",
0064     .div_ck_name = "bandgap_fclk",
0065     .conv_table = omap4430_adc_to_temp,
0066     .adc_start_val = OMAP4430_ADC_START_VALUE,
0067     .adc_end_val = OMAP4430_ADC_END_VALUE,
0068     .expose_sensor = ti_thermal_expose_sensor,
0069     .remove_sensor = ti_thermal_remove_sensor,
0070     .sensors = {
0071         {
0072         .registers = &omap4430_mpu_temp_sensor_registers,
0073         .ts_data = &omap4430_mpu_temp_sensor_data,
0074         .domain = "cpu",
0075         .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4430,
0076         .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4430,
0077         .register_cooling = ti_thermal_register_cpu_cooling,
0078         .unregister_cooling = ti_thermal_unregister_cpu_cooling,
0079         },
0080     },
0081     .sensor_count = 1,
0082 };
0083 /*
0084  * OMAP4460 has one instance of thermal sensor for MPU
0085  * need to describe the individual bit fields
0086  */
0087 static struct temp_sensor_registers
0088 omap4460_mpu_temp_sensor_registers = {
0089     .temp_sensor_ctrl = OMAP4460_TEMP_SENSOR_CTRL_OFFSET,
0090     .bgap_tempsoff_mask = OMAP4460_BGAP_TEMPSOFF_MASK,
0091     .bgap_soc_mask = OMAP4460_BGAP_TEMP_SENSOR_SOC_MASK,
0092     .bgap_eocz_mask = OMAP4460_BGAP_TEMP_SENSOR_EOCZ_MASK,
0093     .bgap_dtemp_mask = OMAP4460_BGAP_TEMP_SENSOR_DTEMP_MASK,
0094 
0095     .bgap_mask_ctrl = OMAP4460_BGAP_CTRL_OFFSET,
0096     .mask_hot_mask = OMAP4460_MASK_HOT_MASK,
0097     .mask_cold_mask = OMAP4460_MASK_COLD_MASK,
0098 
0099     .bgap_mode_ctrl = OMAP4460_BGAP_CTRL_OFFSET,
0100     .mode_ctrl_mask = OMAP4460_CONTINUOUS_MODE_MASK,
0101 
0102     .bgap_counter = OMAP4460_BGAP_COUNTER_OFFSET,
0103     .counter_mask = OMAP4460_COUNTER_MASK,
0104 
0105     .bgap_threshold = OMAP4460_BGAP_THRESHOLD_OFFSET,
0106     .threshold_thot_mask = OMAP4460_T_HOT_MASK,
0107     .threshold_tcold_mask = OMAP4460_T_COLD_MASK,
0108 
0109     .tshut_threshold = OMAP4460_BGAP_TSHUT_OFFSET,
0110     .tshut_hot_mask = OMAP4460_TSHUT_HOT_MASK,
0111     .tshut_cold_mask = OMAP4460_TSHUT_COLD_MASK,
0112 
0113     .bgap_status = OMAP4460_BGAP_STATUS_OFFSET,
0114     .status_hot_mask = OMAP4460_HOT_FLAG_MASK,
0115     .status_cold_mask = OMAP4460_COLD_FLAG_MASK,
0116 
0117     .bgap_efuse = OMAP4460_FUSE_OPP_BGAP,
0118 };
0119 
0120 /* Thresholds and limits for OMAP4460 MPU temperature sensor */
0121 static struct temp_sensor_data omap4460_mpu_temp_sensor_data = {
0122     .tshut_hot = OMAP4460_TSHUT_HOT,
0123     .tshut_cold = OMAP4460_TSHUT_COLD,
0124     .t_hot = OMAP4460_T_HOT,
0125     .t_cold = OMAP4460_T_COLD,
0126     .min_freq = OMAP4460_MIN_FREQ,
0127     .max_freq = OMAP4460_MAX_FREQ,
0128 };
0129 
0130 /*
0131  * Temperature values in milli degree celsius
0132  * ADC code values from 530 to 923
0133  */
0134 static const int
0135 omap4460_adc_to_temp[OMAP4460_ADC_END_VALUE - OMAP4460_ADC_START_VALUE + 1] = {
0136     -40000, -40000, -40000, -40000, -39800, -39400, -39000, -38600, -38200,
0137     -37800, -37300, -36800, -36400, -36000, -35600, -35200, -34800,
0138     -34300, -33800, -33400, -33000, -32600, -32200, -31800, -31300,
0139     -30800, -30400, -30000, -29600, -29200, -28700, -28200, -27800,
0140     -27400, -27000, -26600, -26200, -25700, -25200, -24800, -24400,
0141     -24000, -23600, -23200, -22700, -22200, -21800, -21400, -21000,
0142     -20600, -20200, -19700, -19200, -18800, -18400, -18000, -17600,
0143     -17200, -16700, -16200, -15800, -15400, -15000, -14600, -14200,
0144     -13700, -13200, -12800, -12400, -12000, -11600, -11200, -10700,
0145     -10200, -9800, -9400, -9000, -8600, -8200, -7700, -7200, -6800,
0146     -6400, -6000, -5600, -5200, -4800, -4300, -3800, -3400, -3000,
0147     -2600, -2200, -1800, -1300, -800, -400, 0, 400, 800, 1200, 1600,
0148     2100, 2600, 3000, 3400, 3800, 4200, 4600, 5100, 5600, 6000, 6400,
0149     6800, 7200, 7600, 8000, 8500, 9000, 9400, 9800, 10200, 10600, 11000,
0150     11400, 11900, 12400, 12800, 13200, 13600, 14000, 14400, 14800,
0151     15300, 15800, 16200, 16600, 17000, 17400, 17800, 18200, 18700,
0152     19200, 19600, 20000, 20400, 20800, 21200, 21600, 22100, 22600,
0153     23000, 23400, 23800, 24200, 24600, 25000, 25400, 25900, 26400,
0154     26800, 27200, 27600, 28000, 28400, 28800, 29300, 29800, 30200,
0155     30600, 31000, 31400, 31800, 32200, 32600, 33100, 33600, 34000,
0156     34400, 34800, 35200, 35600, 36000, 36400, 36800, 37300, 37800,
0157     38200, 38600, 39000, 39400, 39800, 40200, 40600, 41100, 41600,
0158     42000, 42400, 42800, 43200, 43600, 44000, 44400, 44800, 45300,
0159     45800, 46200, 46600, 47000, 47400, 47800, 48200, 48600, 49000,
0160     49500, 50000, 50400, 50800, 51200, 51600, 52000, 52400, 52800,
0161     53200, 53700, 54200, 54600, 55000, 55400, 55800, 56200, 56600,
0162     57000, 57400, 57800, 58200, 58700, 59200, 59600, 60000, 60400,
0163     60800, 61200, 61600, 62000, 62400, 62800, 63300, 63800, 64200,
0164     64600, 65000, 65400, 65800, 66200, 66600, 67000, 67400, 67800,
0165     68200, 68700, 69200, 69600, 70000, 70400, 70800, 71200, 71600,
0166     72000, 72400, 72800, 73200, 73600, 74100, 74600, 75000, 75400,
0167     75800, 76200, 76600, 77000, 77400, 77800, 78200, 78600, 79000,
0168     79400, 79800, 80300, 80800, 81200, 81600, 82000, 82400, 82800,
0169     83200, 83600, 84000, 84400, 84800, 85200, 85600, 86000, 86400,
0170     86800, 87300, 87800, 88200, 88600, 89000, 89400, 89800, 90200,
0171     90600, 91000, 91400, 91800, 92200, 92600, 93000, 93400, 93800,
0172     94200, 94600, 95000, 95500, 96000, 96400, 96800, 97200, 97600,
0173     98000, 98400, 98800, 99200, 99600, 100000, 100400, 100800, 101200,
0174     101600, 102000, 102400, 102800, 103200, 103600, 104000, 104400,
0175     104800, 105200, 105600, 106100, 106600, 107000, 107400, 107800,
0176     108200, 108600, 109000, 109400, 109800, 110200, 110600, 111000,
0177     111400, 111800, 112200, 112600, 113000, 113400, 113800, 114200,
0178     114600, 115000, 115400, 115800, 116200, 116600, 117000, 117400,
0179     117800, 118200, 118600, 119000, 119400, 119800, 120200, 120600,
0180     121000, 121400, 121800, 122200, 122600, 123000, 123400, 123800, 124200,
0181     124600, 124900, 125000, 125000, 125000, 125000
0182 };
0183 
0184 /* OMAP4460 data */
0185 const struct ti_bandgap_data omap4460_data = {
0186     .features = TI_BANDGAP_FEATURE_TSHUT |
0187             TI_BANDGAP_FEATURE_TSHUT_CONFIG |
0188             TI_BANDGAP_FEATURE_TALERT |
0189             TI_BANDGAP_FEATURE_MODE_CONFIG |
0190             TI_BANDGAP_FEATURE_POWER_SWITCH |
0191             TI_BANDGAP_FEATURE_CLK_CTRL |
0192             TI_BANDGAP_FEATURE_COUNTER,
0193     .fclock_name = "bandgap_ts_fclk",
0194     .div_ck_name = "div_ts_ck",
0195     .conv_table = omap4460_adc_to_temp,
0196     .adc_start_val = OMAP4460_ADC_START_VALUE,
0197     .adc_end_val = OMAP4460_ADC_END_VALUE,
0198     .expose_sensor = ti_thermal_expose_sensor,
0199     .remove_sensor = ti_thermal_remove_sensor,
0200     .report_temperature = ti_thermal_report_sensor_temperature,
0201     .sensors = {
0202         {
0203         .registers = &omap4460_mpu_temp_sensor_registers,
0204         .ts_data = &omap4460_mpu_temp_sensor_data,
0205         .domain = "cpu",
0206         .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4460,
0207         .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4460,
0208         .register_cooling = ti_thermal_register_cpu_cooling,
0209         .unregister_cooling = ti_thermal_unregister_cpu_cooling,
0210         },
0211     },
0212     .sensor_count = 1,
0213 };
0214 
0215 /* OMAP4470 data */
0216 const struct ti_bandgap_data omap4470_data = {
0217     .features = TI_BANDGAP_FEATURE_TSHUT |
0218             TI_BANDGAP_FEATURE_TSHUT_CONFIG |
0219             TI_BANDGAP_FEATURE_TALERT |
0220             TI_BANDGAP_FEATURE_MODE_CONFIG |
0221             TI_BANDGAP_FEATURE_POWER_SWITCH |
0222             TI_BANDGAP_FEATURE_CLK_CTRL |
0223             TI_BANDGAP_FEATURE_COUNTER,
0224     .fclock_name = "bandgap_ts_fclk",
0225     .div_ck_name = "div_ts_ck",
0226     .conv_table = omap4460_adc_to_temp,
0227     .adc_start_val = OMAP4460_ADC_START_VALUE,
0228     .adc_end_val = OMAP4460_ADC_END_VALUE,
0229     .expose_sensor = ti_thermal_expose_sensor,
0230     .remove_sensor = ti_thermal_remove_sensor,
0231     .report_temperature = ti_thermal_report_sensor_temperature,
0232     .sensors = {
0233         {
0234         .registers = &omap4460_mpu_temp_sensor_registers,
0235         .ts_data = &omap4460_mpu_temp_sensor_data,
0236         .domain = "cpu",
0237         .slope_pcb = OMAP_GRADIENT_SLOPE_W_PCB_4470,
0238         .constant_pcb = OMAP_GRADIENT_CONST_W_PCB_4470,
0239         .register_cooling = ti_thermal_register_cpu_cooling,
0240         .unregister_cooling = ti_thermal_unregister_cpu_cooling,
0241         },
0242     },
0243     .sensor_count = 1,
0244 };