summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Suvorov <oleksandr.suvorov@toradex.com>2021-02-13 18:07:16 +0200
committerOleksandr Suvorov <oleksandr.suvorov@toradex.com>2021-02-18 12:37:41 +0200
commit0eeccda5bafe749311e2940e73d83f9105887725 (patch)
treea4bd3c47ebb61b89c41c3a2e7b78a2e42d1aa2fd
parent20da64e790e54fc1c3f5f6eafeb4bd44db2fa592 (diff)
drm: bridge: lt8912: fix exit path for i2c-ddc
The i2c-ddc bus needs to be put in the error exit path to keep references balanced. Add proper error exit path. Also remove obsolete and dead code for configured skipping of the first probe. Related-to: ELB-3426, ELB-3395 Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov@toradex.com>
-rw-r--r--drivers/gpu/drm/bridge/lt8912.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/drivers/gpu/drm/bridge/lt8912.c b/drivers/gpu/drm/bridge/lt8912.c
index 60addc5591db..197f4f3a5fa8 100644
--- a/drivers/gpu/drm/bridge/lt8912.c
+++ b/drivers/gpu/drm/bridge/lt8912.c
@@ -540,14 +540,7 @@ static int lt8912_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
struct device_node *ddc_phandle;
struct device_node *endpoint;
unsigned int irq_flags;
- int ret;
-
- static int initialize_it = 1;
-
- if(!initialize_it) {
- initialize_it = 1;
- return -EPROBE_DEFER;
- }
+ int ret = 0;
lt = devm_kzalloc(dev, sizeof(*lt), GFP_KERNEL);
if (!lt)
@@ -566,18 +559,22 @@ static int lt8912_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
lt->hpd_gpio = devm_gpiod_get(dev, "hpd", GPIOD_IN);
if (IS_ERR(lt->hpd_gpio)) {
- dev_err(dev, "failed to get hpd gpio\n");
- return ret;
+ ret = PTR_ERR(lt->hpd_gpio);
+ if (ret != -EPROBE_DEFER)
+ dev_err(dev, "failed to get hpd gpio: %d\n", ret);
+ goto put_i2c_ddc;
}
lt->irq = gpiod_to_irq(lt->hpd_gpio);
if (lt->irq == -ENXIO) {
dev_err(dev, "failed to get hpd irq\n");
- return -ENODEV;
+ ret = -ENODEV;
+ goto put_i2c_ddc;
}
if (lt->irq < 0) {
dev_err(dev, "failed to get hpd irq, %i\n", lt->irq);
- return lt->irq;
+ ret = lt->irq;
+ goto put_i2c_ddc;
}
irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
ret = devm_request_threaded_irq(dev, lt->irq,
@@ -585,8 +582,9 @@ static int lt8912_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
lt8912_hpd_irq_thread,
irq_flags, "lt8912_hpd", lt);
if (ret) {
- dev_err(dev, "failed to request irq\n");
- return -ENODEV;
+ dev_err(dev, "failed to request irq: %d\n", ret);
+ ret = -ENODEV;
+ goto put_i2c_ddc;
}
disable_irq(lt->irq);
@@ -594,13 +592,14 @@ static int lt8912_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
lt->reset_n = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS);
if (IS_ERR(lt->reset_n)) {
ret = PTR_ERR(lt->reset_n);
- dev_err(dev, "failed to request reset GPIO: %d\n", ret);
- return ret;
+ if (ret != -EPROBE_DEFER)
+ dev_err(dev, "failed to request reset GPIO: %d\n", ret);
+ goto put_i2c_ddc;
}
ret = lt8912_i2c_init(lt, i2c);
if (ret)
- return ret;
+ goto put_i2c_ddc;
/* TODO: interrupt handing */
@@ -625,6 +624,10 @@ static int lt8912_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
drm_bridge_add(&lt->bridge);
return 0;
+
+put_i2c_ddc:
+ i2c_put_adapter(lt->ddc);
+ return ret;
}
static int lt8912_remove(struct i2c_client *i2c)