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