Merge remote-tracking branches 'regulator/fix/da9210' and 'regulator/fix/rk808' into...
[cascardo/linux.git] / drivers / thermal / intel_soc_dts_thermal.c
index 5580f5b..9013505 100644 (file)
@@ -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]);