|
@@ -38,6 +38,7 @@
|
|
|
/* common data structures */
|
|
|
struct ti_thermal_data {
|
|
|
struct thermal_zone_device *ti_thermal;
|
|
|
+ struct thermal_zone_device *pcb_tz;
|
|
|
struct thermal_cooling_device *cool_dev;
|
|
|
struct ti_bandgap *bgp;
|
|
|
enum thermal_device_mode mode;
|
|
@@ -77,10 +78,12 @@ static inline int ti_thermal_hotspot_temperature(int t, int s, int c)
|
|
|
static inline int ti_thermal_get_temp(struct thermal_zone_device *thermal,
|
|
|
unsigned long *temp)
|
|
|
{
|
|
|
+ struct thermal_zone_device *pcb_tz = NULL;
|
|
|
struct ti_thermal_data *data = thermal->devdata;
|
|
|
struct ti_bandgap *bgp;
|
|
|
const struct ti_temp_sensor *s;
|
|
|
- int ret, tmp, pcb_temp, slope, constant;
|
|
|
+ int ret, tmp, slope, constant;
|
|
|
+ unsigned long pcb_temp;
|
|
|
|
|
|
if (!data)
|
|
|
return 0;
|
|
@@ -92,16 +95,22 @@ static inline int ti_thermal_get_temp(struct thermal_zone_device *thermal,
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- pcb_temp = 0;
|
|
|
- /* TODO: Introduce pcb temperature lookup */
|
|
|
+ /* Default constants */
|
|
|
+ slope = s->slope;
|
|
|
+ constant = s->constant;
|
|
|
+
|
|
|
+ pcb_tz = data->pcb_tz;
|
|
|
/* In case pcb zone is available, use the extrapolation rule with it */
|
|
|
- if (pcb_temp) {
|
|
|
- tmp -= pcb_temp;
|
|
|
- slope = s->slope_pcb;
|
|
|
- constant = s->constant_pcb;
|
|
|
- } else {
|
|
|
- slope = s->slope;
|
|
|
- constant = s->constant;
|
|
|
+ if (!IS_ERR_OR_NULL(pcb_tz)) {
|
|
|
+ ret = thermal_zone_get_temp(pcb_tz, &pcb_temp);
|
|
|
+ if (!ret) {
|
|
|
+ tmp -= pcb_temp; /* got a valid PCB temp */
|
|
|
+ slope = s->slope_pcb;
|
|
|
+ constant = s->constant_pcb;
|
|
|
+ } else {
|
|
|
+ dev_err(bgp->dev,
|
|
|
+ "Failed to read PCB state. Using defaults\n");
|
|
|
+ }
|
|
|
}
|
|
|
*temp = ti_thermal_hotspot_temperature(tmp, slope, constant);
|
|
|
|
|
@@ -273,6 +282,7 @@ static struct ti_thermal_data
|
|
|
data->sensor_id = id;
|
|
|
data->bgp = bgp;
|
|
|
data->mode = THERMAL_DEVICE_ENABLED;
|
|
|
+ data->pcb_tz = thermal_zone_get_zone_by_name("pcb");
|
|
|
INIT_WORK(&data->thermal_wq, ti_thermal_work);
|
|
|
|
|
|
return data;
|