| From: Bai Ping <b51503@freescale.com> |
| Date: Mon, 14 Sep 2015 19:09:51 +0800 |
| Subject: thermal: imx: register irq handler later in probe |
| |
| commit 84866ee5818e95f6e97194656777c10ac24cb9d3 upstream. |
| |
| The irq handler should be registered after the tempmon |
| module has been initialized in a known state and the |
| thermal_zone and cpu_cooling device have been registered |
| successfully. Otherwise, if the irq is triggled earlier |
| before thermal probe has been finished, it may lead to |
| 'NULL' pointer kernel panic. |
| |
| Signed-off-by: Bai Ping <b51503@freescale.com> |
| Signed-off-by: Eduardo Valentin <edubezval@gmail.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/thermal/imx_thermal.c | 19 +++++++++++-------- |
| 1 file changed, 11 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/thermal/imx_thermal.c |
| +++ b/drivers/thermal/imx_thermal.c |
| @@ -422,14 +422,6 @@ static int imx_thermal_probe(struct plat |
| if (data->irq < 0) |
| return data->irq; |
| |
| - ret = devm_request_threaded_irq(&pdev->dev, data->irq, |
| - imx_thermal_alarm_irq, imx_thermal_alarm_irq_thread, |
| - 0, "imx_thermal", data); |
| - if (ret < 0) { |
| - dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret); |
| - return ret; |
| - } |
| - |
| platform_set_drvdata(pdev, data); |
| |
| ret = imx_get_sensor_data(pdev); |
| @@ -492,6 +484,17 @@ static int imx_thermal_probe(struct plat |
| regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN); |
| regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP); |
| |
| + ret = devm_request_threaded_irq(&pdev->dev, data->irq, |
| + imx_thermal_alarm_irq, imx_thermal_alarm_irq_thread, |
| + 0, "imx_thermal", data); |
| + if (ret < 0) { |
| + dev_err(&pdev->dev, "failed to request alarm irq: %d\n", ret); |
| + clk_disable_unprepare(data->thermal_clk); |
| + thermal_zone_device_unregister(data->tz); |
| + cpufreq_cooling_unregister(data->cdev); |
| + return ret; |
| + } |
| + |
| data->irq_enabled = true; |
| data->mode = THERMAL_DEVICE_ENABLED; |
| |