|
@@ -309,10 +309,13 @@ static int soc_dts_enable(int id)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static struct soc_sensor_entry *alloc_soc_dts(int id, u32 tj_max)
|
|
|
+static struct soc_sensor_entry *alloc_soc_dts(int id, u32 tj_max,
|
|
|
+ bool notification_support)
|
|
|
{
|
|
|
struct soc_sensor_entry *aux_entry;
|
|
|
char name[10];
|
|
|
+ int trip_count = 0;
|
|
|
+ int trip_mask = 0;
|
|
|
int err;
|
|
|
|
|
|
aux_entry = kzalloc(sizeof(*aux_entry), GFP_KERNEL);
|
|
@@ -332,11 +335,16 @@ static struct soc_sensor_entry *alloc_soc_dts(int id, u32 tj_max)
|
|
|
aux_entry->tj_max = tj_max;
|
|
|
aux_entry->temp_mask = 0x00FF << (id * 8);
|
|
|
aux_entry->temp_shift = id * 8;
|
|
|
+ if (notification_support) {
|
|
|
+ trip_count = SOC_MAX_DTS_TRIPS;
|
|
|
+ trip_mask = 0x02;
|
|
|
+ }
|
|
|
snprintf(name, sizeof(name), "soc_dts%d", id);
|
|
|
aux_entry->tzone = thermal_zone_device_register(name,
|
|
|
- SOC_MAX_DTS_TRIPS,
|
|
|
- 0x02,
|
|
|
- aux_entry, &tzone_ops, NULL, 0, 0);
|
|
|
+ trip_count,
|
|
|
+ trip_mask,
|
|
|
+ aux_entry, &tzone_ops,
|
|
|
+ NULL, 0, 0);
|
|
|
if (IS_ERR(aux_entry->tzone)) {
|
|
|
err = PTR_ERR(aux_entry->tzone);
|
|
|
goto err_ret;
|
|
@@ -402,6 +410,7 @@ static irqreturn_t soc_irq_thread_fn(int irq, void *dev_data)
|
|
|
|
|
|
static const struct x86_cpu_id soc_thermal_ids[] = {
|
|
|
{ X86_VENDOR_INTEL, X86_FAMILY_ANY, 0x37, 0, BYT_SOC_DTS_APIC_IRQ},
|
|
|
+ { X86_VENDOR_INTEL, X86_FAMILY_ANY, 0x4c, 0, 0},
|
|
|
{}
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(x86cpu, soc_thermal_ids);
|
|
@@ -420,8 +429,11 @@ static int __init intel_soc_thermal_init(void)
|
|
|
if (get_tj_max(&tj_max))
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ soc_dts_thres_irq = (int)match_cpu->driver_data;
|
|
|
+
|
|
|
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
|
|
|
- soc_dts[i] = alloc_soc_dts(i, tj_max);
|
|
|
+ soc_dts[i] = alloc_soc_dts(i, tj_max,
|
|
|
+ soc_dts_thres_irq ? true : false);
|
|
|
if (IS_ERR(soc_dts[i])) {
|
|
|
err = PTR_ERR(soc_dts[i]);
|
|
|
goto err_free;
|
|
@@ -430,15 +442,15 @@ static int __init intel_soc_thermal_init(void)
|
|
|
|
|
|
spin_lock_init(&intr_notify_lock);
|
|
|
|
|
|
- soc_dts_thres_irq = (int)match_cpu->driver_data;
|
|
|
-
|
|
|
- err = request_threaded_irq(soc_dts_thres_irq, NULL,
|
|
|
- soc_irq_thread_fn,
|
|
|
- IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
|
|
- "soc_dts", soc_dts);
|
|
|
- if (err) {
|
|
|
- pr_err("request_threaded_irq ret %d\n", err);
|
|
|
- goto err_free;
|
|
|
+ if (soc_dts_thres_irq) {
|
|
|
+ err = request_threaded_irq(soc_dts_thres_irq, NULL,
|
|
|
+ soc_irq_thread_fn,
|
|
|
+ IRQF_TRIGGER_RISING | IRQF_ONESHOT,
|
|
|
+ "soc_dts", soc_dts);
|
|
|
+ if (err) {
|
|
|
+ pr_err("request_threaded_irq ret %d\n", err);
|
|
|
+ goto err_free;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
|
|
@@ -451,7 +463,8 @@ static int __init intel_soc_thermal_init(void)
|
|
|
|
|
|
err_trip_temp:
|
|
|
i = SOC_MAX_DTS_SENSORS;
|
|
|
- free_irq(soc_dts_thres_irq, soc_dts);
|
|
|
+ if (soc_dts_thres_irq)
|
|
|
+ free_irq(soc_dts_thres_irq, soc_dts);
|
|
|
err_free:
|
|
|
while (--i >= 0)
|
|
|
free_soc_dts(soc_dts[i]);
|
|
@@ -466,7 +479,8 @@ static void __exit intel_soc_thermal_exit(void)
|
|
|
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i)
|
|
|
update_trip_temp(soc_dts[i], 0, 0);
|
|
|
|
|
|
- free_irq(soc_dts_thres_irq, soc_dts);
|
|
|
+ if (soc_dts_thres_irq)
|
|
|
+ free_irq(soc_dts_thres_irq, soc_dts);
|
|
|
|
|
|
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i)
|
|
|
free_soc_dts(soc_dts[i]);
|