summaryrefslogtreecommitdiffstats
path: root/0001-backlight-lp855x-Ensure-regulators-are-disabled-on-p.patch
diff options
context:
space:
mode:
Diffstat (limited to '0001-backlight-lp855x-Ensure-regulators-are-disabled-on-p.patch')
-rw-r--r--0001-backlight-lp855x-Ensure-regulators-are-disabled-on-p.patch118
1 files changed, 118 insertions, 0 deletions
diff --git a/0001-backlight-lp855x-Ensure-regulators-are-disabled-on-p.patch b/0001-backlight-lp855x-Ensure-regulators-are-disabled-on-p.patch
new file mode 100644
index 000000000..c6fdb5aa6
--- /dev/null
+++ b/0001-backlight-lp855x-Ensure-regulators-are-disabled-on-p.patch
@@ -0,0 +1,118 @@
+From 9b408dc1e89cfe36a8f715a7c7624687bb876028 Mon Sep 17 00:00:00 2001
+From: Jon Hunter <jonathanh@nvidia.com>
+Date: Mon, 24 Feb 2020 14:07:48 +0000
+Subject: [PATCH] backlight: lp855x: Ensure regulators are disabled on probe
+ failure
+
+If probing the LP885x backlight fails after the regulators have been
+enabled, then the following warning is seen when releasing the
+regulators ...
+
+ WARNING: CPU: 1 PID: 289 at drivers/regulator/core.c:2051 _regulator_put.part.28+0x158/0x160
+ Modules linked in: tegra_xudc lp855x_bl(+) host1x pwm_tegra ip_tables x_tables ipv6 nf_defrag_ipv6
+ CPU: 1 PID: 289 Comm: systemd-udevd Not tainted 5.6.0-rc2-next-20200224 #1
+ Hardware name: NVIDIA Jetson TX1 Developer Kit (DT)
+
+ ...
+
+ Call trace:
+ _regulator_put.part.28+0x158/0x160
+ regulator_put+0x34/0x50
+ devm_regulator_release+0x10/0x18
+ release_nodes+0x12c/0x230
+ devres_release_all+0x34/0x50
+ really_probe+0x1c0/0x370
+ driver_probe_device+0x58/0x100
+ device_driver_attach+0x6c/0x78
+ __driver_attach+0xb0/0xf0
+ bus_for_each_dev+0x68/0xc8
+ driver_attach+0x20/0x28
+ bus_add_driver+0x160/0x1f0
+ driver_register+0x60/0x110
+ i2c_register_driver+0x40/0x80
+ lp855x_driver_init+0x20/0x1000 [lp855x_bl]
+ do_one_initcall+0x58/0x1a0
+ do_init_module+0x54/0x1d0
+ load_module+0x1d80/0x21c8
+ __do_sys_finit_module+0xe8/0x100
+ __arm64_sys_finit_module+0x18/0x20
+ el0_svc_common.constprop.3+0xb0/0x168
+ do_el0_svc+0x20/0x98
+ el0_sync_handler+0xf4/0x1b0
+ el0_sync+0x140/0x180
+
+Fix this by ensuring that the regulators are disabled, if enabled, on
+probe failure.
+
+Finally, ensure that the vddio regulator is disabled in the driver
+remove handler.
+
+Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
+Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
+---
+ drivers/video/backlight/lp855x_bl.c | 20 ++++++++++++++++----
+ 1 file changed, 16 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/video/backlight/lp855x_bl.c b/drivers/video/backlight/lp855x_bl.c
+index f68920131a4a..e94932c69f54 100644
+--- a/drivers/video/backlight/lp855x_bl.c
++++ b/drivers/video/backlight/lp855x_bl.c
+@@ -456,7 +456,7 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
+ ret = regulator_enable(lp->enable);
+ if (ret < 0) {
+ dev_err(lp->dev, "failed to enable vddio: %d\n", ret);
+- return ret;
++ goto disable_supply;
+ }
+
+ /*
+@@ -471,24 +471,34 @@ static int lp855x_probe(struct i2c_client *cl, const struct i2c_device_id *id)
+ ret = lp855x_configure(lp);
+ if (ret) {
+ dev_err(lp->dev, "device config err: %d", ret);
+- return ret;
++ goto disable_vddio;
+ }
+
+ ret = lp855x_backlight_register(lp);
+ if (ret) {
+ dev_err(lp->dev,
+ "failed to register backlight. err: %d\n", ret);
+- return ret;
++ goto disable_vddio;
+ }
+
+ ret = sysfs_create_group(&lp->dev->kobj, &lp855x_attr_group);
+ if (ret) {
+ dev_err(lp->dev, "failed to register sysfs. err: %d\n", ret);
+- return ret;
++ goto disable_vddio;
+ }
+
+ backlight_update_status(lp->bl);
++
+ return 0;
++
++disable_vddio:
++ if (lp->enable)
++ regulator_disable(lp->enable);
++disable_supply:
++ if (lp->supply)
++ regulator_disable(lp->supply);
++
++ return ret;
+ }
+
+ static int lp855x_remove(struct i2c_client *cl)
+@@ -497,6 +507,8 @@ static int lp855x_remove(struct i2c_client *cl)
+
+ lp->bl->props.brightness = 0;
+ backlight_update_status(lp->bl);
++ if (lp->enable)
++ regulator_disable(lp->enable);
+ if (lp->supply)
+ regulator_disable(lp->supply);
+ sysfs_remove_group(&lp->dev->kobj, &lp855x_attr_group);
+--
+2.26.0
+