| 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; |