i40e-i40evf-spread-cpu-affinity-hints-across-online-cpus-only.patch
pci-aer-report-non-fatal-errors-only-to-the-affected-endpoint.patch
tracing-exclude-generic-fields-from-histograms.patch
+thermal-drivers-hisi-fix-missing-interrupt-enablement.patch
+thermal-drivers-hisi-fix-kernel-panic-on-alarm-interrupt.patch
+thermal-drivers-hisi-fix-multiple-alarm-interrupts-firing.patch
asoc-codecs-msm8916-wcd-analog-fix-micbias-level.patch
asoc-img-parallel-out-add-pm_runtime_get-put-to-set_fmt-callback.patch
powerpc-xmon-avoid-tripping-smp-hardlockup-watchdog.patch
--- /dev/null
+From 2cb4de785c40d4a2132cfc13e63828f5a28c3351 Mon Sep 17 00:00:00 2001
+From: Daniel Lezcano <daniel.lezcano@linaro.org>
+Date: Thu, 19 Oct 2017 19:05:45 +0200
+Subject: thermal/drivers/hisi: Fix kernel panic on alarm interrupt
+
+From: Daniel Lezcano <daniel.lezcano@linaro.org>
+
+commit 2cb4de785c40d4a2132cfc13e63828f5a28c3351 upstream.
+
+The threaded interrupt for the alarm interrupt is requested before the
+temperature controller is setup. This one can fire an interrupt immediately
+leading to a kernel panic as the sensor data is not initialized.
+
+In order to prevent that, move the threaded irq after the Tsensor is setup.
+
+Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
+Reviewed-by: Leo Yan <leo.yan@linaro.org>
+Tested-by: Leo Yan <leo.yan@linaro.org>
+Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
+Signed-off-by: Kevin Wangtao <kevin.wangtao@hisilicon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/thermal/hisi_thermal.c | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+--- a/drivers/thermal/hisi_thermal.c
++++ b/drivers/thermal/hisi_thermal.c
+@@ -317,15 +317,6 @@ static int hisi_thermal_probe(struct pla
+ if (data->irq < 0)
+ return data->irq;
+
+- ret = devm_request_threaded_irq(&pdev->dev, data->irq,
+- hisi_thermal_alarm_irq,
+- hisi_thermal_alarm_irq_thread,
+- 0, "hisi_thermal", data);
+- if (ret < 0) {
+- dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret);
+- return ret;
+- }
+-
+ platform_set_drvdata(pdev, data);
+
+ data->clk = devm_clk_get(&pdev->dev, "thermal_clk");
+@@ -357,6 +348,15 @@ static int hisi_thermal_probe(struct pla
+ hisi_thermal_toggle_sensor(&data->sensors[i], true);
+ }
+
++ ret = devm_request_threaded_irq(&pdev->dev, data->irq,
++ hisi_thermal_alarm_irq,
++ hisi_thermal_alarm_irq_thread,
++ 0, "hisi_thermal", data);
++ if (ret < 0) {
++ dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret);
++ return ret;
++ }
++
+ enable_irq(data->irq);
+
+ return 0;
--- /dev/null
+From c176b10b025acee4dc8f2ab1cd64eb73b5ccef53 Mon Sep 17 00:00:00 2001
+From: Daniel Lezcano <daniel.lezcano@linaro.org>
+Date: Thu, 19 Oct 2017 19:05:43 +0200
+Subject: thermal/drivers/hisi: Fix missing interrupt enablement
+
+From: Daniel Lezcano <daniel.lezcano@linaro.org>
+
+commit c176b10b025acee4dc8f2ab1cd64eb73b5ccef53 upstream.
+
+The interrupt for the temperature threshold is not enabled at the end of the
+probe function, enable it after the setup is complete.
+
+On the other side, the irq_enabled is not correctly set as we are checking if
+the interrupt is masked where 'yes' means irq_enabled=false.
+
+ irq_get_irqchip_state(data->irq, IRQCHIP_STATE_MASKED,
+ &data->irq_enabled);
+
+As we are always enabling the interrupt, it is pointless to check if
+the interrupt is masked or not, just set irq_enabled to 'true'.
+
+Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
+Reviewed-by: Leo Yan <leo.yan@linaro.org>
+Tested-by: Leo Yan <leo.yan@linaro.org>
+Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
+Signed-off-by: Kevin Wangtao <kevin.wangtao@hisilicon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/thermal/hisi_thermal.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/thermal/hisi_thermal.c
++++ b/drivers/thermal/hisi_thermal.c
+@@ -345,8 +345,7 @@ static int hisi_thermal_probe(struct pla
+ }
+
+ hisi_thermal_enable_bind_irq_sensor(data);
+- irq_get_irqchip_state(data->irq, IRQCHIP_STATE_MASKED,
+- &data->irq_enabled);
++ data->irq_enabled = true;
+
+ for (i = 0; i < HISI_MAX_SENSORS; ++i) {
+ ret = hisi_thermal_register_sensor(pdev, data,
+@@ -358,6 +357,8 @@ static int hisi_thermal_probe(struct pla
+ hisi_thermal_toggle_sensor(&data->sensors[i], true);
+ }
+
++ enable_irq(data->irq);
++
+ return 0;
+ }
+
--- /dev/null
+From db2b0332608c8e648ea1e44727d36ad37cdb56cb Mon Sep 17 00:00:00 2001
+From: Daniel Lezcano <daniel.lezcano@linaro.org>
+Date: Thu, 19 Oct 2017 19:05:47 +0200
+Subject: thermal/drivers/hisi: Fix multiple alarm interrupts firing
+
+From: Daniel Lezcano <daniel.lezcano@linaro.org>
+
+commit db2b0332608c8e648ea1e44727d36ad37cdb56cb upstream.
+
+The DT specifies a threshold of 65000, we setup the register with a value in
+the temperature resolution for the controller, 64656.
+
+When we reach 64656, the interrupt fires, the interrupt is disabled. Then the
+irq thread runs and calls thermal_zone_device_update() which will call in turn
+hisi_thermal_get_temp().
+
+The function will look if the temperature decreased, assuming it was more than
+65000, but that is not the case because the current temperature is 64656
+(because of the rounding when setting the threshold). This condition being
+true, we re-enable the interrupt which fires immediately after exiting the irq
+thread. That happens again and again until the temperature goes to more than
+65000.
+
+Potentially, there is here an interrupt storm if the temperature stabilizes at
+this temperature. A very unlikely case but possible.
+
+In any case, it does not make sense to handle dozens of alarm interrupt for
+nothing.
+
+Fix this by rounding the threshold value to the controller resolution so the
+check against the threshold is consistent with the one set in the controller.
+
+Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
+Reviewed-by: Leo Yan <leo.yan@linaro.org>
+Tested-by: Leo Yan <leo.yan@linaro.org>
+Signed-off-by: Eduardo Valentin <edubezval@gmail.com>
+Signed-off-by: Kevin Wangtao <kevin.wangtao@hisilicon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/thermal/hisi_thermal.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/drivers/thermal/hisi_thermal.c
++++ b/drivers/thermal/hisi_thermal.c
+@@ -76,6 +76,12 @@ static inline long _temp_to_step(long te
+ return ((temp - HISI_TEMP_BASE * 1000) * 255) / 200000;
+ }
+
++static inline long hisi_thermal_round_temp(int temp)
++{
++ return hisi_thermal_step_to_temp(
++ hisi_thermal_temp_to_step(temp));
++}
++
+ static long hisi_thermal_get_sensor_temp(struct hisi_thermal_data *data,
+ struct hisi_thermal_sensor *sensor)
+ {
+@@ -230,7 +236,7 @@ static irqreturn_t hisi_thermal_alarm_ir
+ sensor = &data->sensors[data->irq_bind_sensor];
+
+ dev_crit(&data->pdev->dev, "THERMAL ALARM: T > %d\n",
+- sensor->thres_temp / 1000);
++ sensor->thres_temp);
+ mutex_unlock(&data->thermal_lock);
+
+ for (i = 0; i < HISI_MAX_SENSORS; i++) {
+@@ -269,7 +275,7 @@ static int hisi_thermal_register_sensor(
+
+ for (i = 0; i < of_thermal_get_ntrips(sensor->tzd); i++) {
+ if (trip[i].type == THERMAL_TRIP_PASSIVE) {
+- sensor->thres_temp = trip[i].temperature;
++ sensor->thres_temp = hisi_thermal_round_temp(trip[i].temperature);
+ break;
+ }
+ }