93 lines
2.9 KiB
Diff
93 lines
2.9 KiB
Diff
|
From 7ac57bfbc9f6d7f6657dbe543cbc3b1b7eddac93 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= <megi@xff.cz>
|
||
|
Date: Wed, 8 Jul 2020 12:21:14 +0200
|
||
|
Subject: [PATCH 238/464] thermal: sun8i: Be loud when probe fails
|
||
|
|
||
|
I noticed several mobile Linux distributions failing to enable the
|
||
|
thermal regulation correctly, because the kernel is silent
|
||
|
when thermal driver fails to probe. Add enough error reporting
|
||
|
to debug issues and warn users in case thermal sensor is failing
|
||
|
to probe.
|
||
|
|
||
|
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||
|
---
|
||
|
drivers/thermal/sun8i_thermal.c | 25 +++++++++++++++++++++----
|
||
|
1 file changed, 21 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/thermal/sun8i_thermal.c b/drivers/thermal/sun8i_thermal.c
|
||
|
index 195f3c5d0b38..37feb157f799 100644
|
||
|
--- a/drivers/thermal/sun8i_thermal.c
|
||
|
+++ b/drivers/thermal/sun8i_thermal.c
|
||
|
@@ -288,8 +288,13 @@ static int sun8i_ths_calibrate(struct ths_device *tmdev)
|
||
|
|
||
|
calcell = devm_nvmem_cell_get(dev, "calibration");
|
||
|
if (IS_ERR(calcell)) {
|
||
|
+ dev_err_probe(dev, PTR_ERR(calcell),
|
||
|
+ "Failed to get calibration nvmem cell (%pe)\n",
|
||
|
+ calcell);
|
||
|
+
|
||
|
if (PTR_ERR(calcell) == -EPROBE_DEFER)
|
||
|
return -EPROBE_DEFER;
|
||
|
+
|
||
|
/*
|
||
|
* Even if the external calibration data stored in sid is
|
||
|
* not accessible, the THS hardware can still work, although
|
||
|
@@ -309,6 +314,8 @@ static int sun8i_ths_calibrate(struct ths_device *tmdev)
|
||
|
caldata = nvmem_cell_read(calcell, &callen);
|
||
|
if (IS_ERR(caldata)) {
|
||
|
ret = PTR_ERR(caldata);
|
||
|
+ dev_err(dev, "Failed to read calibration data (%pe)\n",
|
||
|
+ caldata);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
@@ -336,13 +343,17 @@ static int sun8i_ths_resource_init(struct ths_device *tmdev)
|
||
|
return PTR_ERR(base);
|
||
|
|
||
|
tmdev->regmap = devm_regmap_init_mmio(dev, base, &config);
|
||
|
- if (IS_ERR(tmdev->regmap))
|
||
|
+ if (IS_ERR(tmdev->regmap)) {
|
||
|
+ dev_err(dev, "Failed to init regmap (%pe)\n", tmdev->regmap);
|
||
|
return PTR_ERR(tmdev->regmap);
|
||
|
+ }
|
||
|
|
||
|
if (tmdev->chip->has_bus_clk_reset) {
|
||
|
tmdev->reset = devm_reset_control_get(dev, NULL);
|
||
|
- if (IS_ERR(tmdev->reset))
|
||
|
+ if (IS_ERR(tmdev->reset)) {
|
||
|
+ dev_err(dev, "Failed to get reset (%pe)\n", tmdev->reset);
|
||
|
return PTR_ERR(tmdev->reset);
|
||
|
+ }
|
||
|
|
||
|
ret = reset_control_deassert(tmdev->reset);
|
||
|
if (ret)
|
||
|
@@ -465,8 +476,12 @@ static int sun8i_ths_register(struct ths_device *tmdev)
|
||
|
i,
|
||
|
&tmdev->sensor[i],
|
||
|
&ths_ops);
|
||
|
- if (IS_ERR(tmdev->sensor[i].tzd))
|
||
|
+ if (IS_ERR(tmdev->sensor[i].tzd)) {
|
||
|
+ dev_err(tmdev->dev,
|
||
|
+ "Failed to register sensor %d (%pe)\n",
|
||
|
+ i, tmdev->sensor[i].tzd);
|
||
|
return PTR_ERR(tmdev->sensor[i].tzd);
|
||
|
+ }
|
||
|
|
||
|
devm_thermal_add_hwmon_sysfs(tmdev->dev, tmdev->sensor[i].tzd);
|
||
|
}
|
||
|
@@ -515,8 +530,10 @@ static int sun8i_ths_probe(struct platform_device *pdev)
|
||
|
ret = devm_request_threaded_irq(dev, irq, NULL,
|
||
|
sun8i_irq_thread,
|
||
|
IRQF_ONESHOT, "ths", tmdev);
|
||
|
- if (ret)
|
||
|
+ if (ret) {
|
||
|
+ dev_err(dev, "Failed to request irq (%d)\n", ret);
|
||
|
return ret;
|
||
|
+ }
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
--
|
||
|
2.34.1
|
||
|
|