Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * OMAP3 thermal driver.
0004  *
0005  * Copyright (C) 2011-2012 Texas Instruments Inc.
0006  * Copyright (C) 2014 Pavel Machek <pavel@ucw.cz>
0007  *
0008  * Note
0009  * http://www.ti.com/lit/er/sprz278f/sprz278f.pdf "Advisory
0010  * 3.1.1.186 MMC OCP Clock Not Gated When Thermal Sensor Is Used"
0011  *
0012  * Also TI says:
0013  * Just be careful when you try to make thermal policy like decisions
0014  * based on this sensor. Placement of the sensor w.r.t the actual logic
0015  * generating heat has to be a factor as well. If you are just looking
0016  * for an approximation temperature (thermometerish kind), you might be
0017  * ok with this. I am not sure we'd find any TI data around this.. just a
0018  * heads up.
0019  */
0020 
0021 #include "ti-thermal.h"
0022 #include "ti-bandgap.h"
0023 
0024 /*
0025  * OMAP34XX has one instance of thermal sensor for MPU
0026  * need to describe the individual bit fields
0027  */
0028 static struct temp_sensor_registers
0029 omap34xx_mpu_temp_sensor_registers = {
0030     .temp_sensor_ctrl = 0,
0031     .bgap_soc_mask = BIT(8),
0032     .bgap_eocz_mask = BIT(7),
0033     .bgap_dtemp_mask = 0x7f,
0034 
0035     .bgap_mode_ctrl = 0,
0036     .mode_ctrl_mask = BIT(9),
0037 };
0038 
0039 /* Thresholds and limits for OMAP34XX MPU temperature sensor */
0040 static struct temp_sensor_data omap34xx_mpu_temp_sensor_data = {
0041     .min_freq = 32768,
0042     .max_freq = 32768,
0043 };
0044 
0045 /*
0046  * Temperature values in milli degree celsius
0047  */
0048 static const int
0049 omap34xx_adc_to_temp[128] = {
0050     -40000, -40000, -40000, -40000, -40000, -39000, -38000, -36000,
0051     -34000, -32000, -31000, -29000, -28000, -26000, -25000, -24000,
0052     -22000, -21000, -19000, -18000, -17000, -15000, -14000, -12000,
0053     -11000, -9000, -8000, -7000, -5000, -4000, -2000, -1000, 0000,
0054     1000, 3000, 4000, 5000, 7000, 8000, 10000, 11000, 13000, 14000,
0055     15000, 17000, 18000, 20000, 21000, 22000, 24000, 25000, 27000,
0056     28000, 30000, 31000, 32000, 34000, 35000, 37000, 38000, 39000,
0057     41000, 42000, 44000, 45000, 47000, 48000, 49000, 51000, 52000,
0058     53000, 55000, 56000, 58000, 59000, 60000, 62000, 63000, 65000,
0059     66000, 67000, 69000, 70000, 72000, 73000, 74000, 76000, 77000,
0060     79000, 80000, 81000, 83000, 84000, 85000, 87000, 88000, 89000,
0061     91000, 92000, 94000, 95000, 96000, 98000, 99000, 100000,
0062     102000, 103000, 105000, 106000, 107000, 109000, 110000, 111000,
0063     113000, 114000, 116000, 117000, 118000, 120000, 121000, 122000,
0064     124000, 124000, 125000, 125000, 125000, 125000, 125000
0065 };
0066 
0067 /* OMAP34XX data */
0068 const struct ti_bandgap_data omap34xx_data = {
0069     .features = TI_BANDGAP_FEATURE_CLK_CTRL | TI_BANDGAP_FEATURE_UNRELIABLE,
0070     .fclock_name = "ts_fck",
0071     .div_ck_name = "ts_fck",
0072     .conv_table = omap34xx_adc_to_temp,
0073     .adc_start_val = 0,
0074     .adc_end_val = 127,
0075     .expose_sensor = ti_thermal_expose_sensor,
0076     .remove_sensor = ti_thermal_remove_sensor,
0077 
0078     .sensors = {
0079         {
0080         .registers = &omap34xx_mpu_temp_sensor_registers,
0081         .ts_data = &omap34xx_mpu_temp_sensor_data,
0082         .domain = "cpu",
0083         .slope_pcb = 0,
0084         .constant_pcb = 20000,
0085         .register_cooling = NULL,
0086         .unregister_cooling = NULL,
0087         },
0088     },
0089     .sensor_count = 1,
0090 };
0091 
0092 /*
0093  * OMAP36XX has one instance of thermal sensor for MPU
0094  * need to describe the individual bit fields
0095  */
0096 static struct temp_sensor_registers
0097 omap36xx_mpu_temp_sensor_registers = {
0098     .temp_sensor_ctrl = 0,
0099     .bgap_soc_mask = BIT(9),
0100     .bgap_eocz_mask = BIT(8),
0101     .bgap_dtemp_mask = 0xFF,
0102 
0103     .bgap_mode_ctrl = 0,
0104     .mode_ctrl_mask = BIT(10),
0105 };
0106 
0107 /* Thresholds and limits for OMAP36XX MPU temperature sensor */
0108 static struct temp_sensor_data omap36xx_mpu_temp_sensor_data = {
0109     .min_freq = 32768,
0110     .max_freq = 32768,
0111 };
0112 
0113 /*
0114  * Temperature values in milli degree celsius
0115  */
0116 static const int
0117 omap36xx_adc_to_temp[128] = {
0118     -40000, -40000, -40000, -40000, -40000, -40000, -40000, -40000,
0119     -40000, -40000, -40000, -40000, -40000, -38000, -35000, -34000,
0120     -32000, -30000, -28000, -26000, -24000, -22000, -20000, -18500,
0121     -17000, -15000, -13500, -12000, -10000, -8000, -6500, -5000, -3500,
0122     -1500, 0, 2000, 3500, 5000, 6500, 8500, 10000, 12000, 13500,
0123     15000, 17000, 19000, 21000, 23000, 25000, 27000, 28500, 30000,
0124     32000, 33500, 35000, 37000, 38500, 40000, 42000, 43500, 45000,
0125     47000, 48500, 50000, 52000, 53500, 55000, 57000, 58500, 60000,
0126     62000, 64000, 66000, 68000, 70000, 71500, 73500, 75000, 77000,
0127     78500, 80000, 82000, 83500, 85000, 87000, 88500, 90000, 92000,
0128     93500, 95000, 97000, 98500, 100000, 102000, 103500, 105000, 107000,
0129     109000, 111000, 113000, 115000, 117000, 118500, 120000, 122000,
0130     123500, 125000, 125000, 125000, 125000, 125000, 125000, 125000,
0131     125000, 125000, 125000, 125000, 125000, 125000, 125000, 125000,
0132     125000, 125000, 125000, 125000, 125000, 125000, 125000
0133 };
0134 
0135 /* OMAP36XX data */
0136 const struct ti_bandgap_data omap36xx_data = {
0137     .features = TI_BANDGAP_FEATURE_CLK_CTRL | TI_BANDGAP_FEATURE_UNRELIABLE,
0138     .fclock_name = "ts_fck",
0139     .div_ck_name = "ts_fck",
0140     .conv_table = omap36xx_adc_to_temp,
0141     .adc_start_val = 0,
0142     .adc_end_val = 127,
0143     .expose_sensor = ti_thermal_expose_sensor,
0144     .remove_sensor = ti_thermal_remove_sensor,
0145 
0146     .sensors = {
0147         {
0148         .registers = &omap36xx_mpu_temp_sensor_registers,
0149         .ts_data = &omap36xx_mpu_temp_sensor_data,
0150         .domain = "cpu",
0151         .slope_pcb = 0,
0152         .constant_pcb = 20000,
0153         .register_cooling = NULL,
0154         .unregister_cooling = NULL,
0155         },
0156     },
0157     .sensor_count = 1,
0158 };