]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm: adv7511: override i2c address of cec before accessing it
authorAntonio Borneo <antonio.borneo@foss.st.com>
Tue, 7 Jun 2022 21:31:44 +0000 (23:31 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Aug 2022 09:17:38 +0000 (11:17 +0200)
[ Upstream commit d3bb8eab7fff8d7a8cef4bd08229b43551688e02 ]

Commit dbbe6a773cf0 ("drm: adv7511: Add support for
i2c_new_secondary_device") allows a device tree node to override
the default addresses of the secondary i2c devices. This is useful
for solving address conflicts on the i2c bus.

In adv7511_init_cec_regmap() the new i2c address of cec device is
read from device tree and immediately accessed, well before it is
written in the proper register to override the default address.
This can cause an i2c error during probe and a consequent probe
failure.

Once the new i2c address is read from the device tree, override
the default address before any attempt to access the cec.

Tested with adv7533 and stm32mp157f.

Signed-off-by: Antonio Borneo <antonio.borneo@foss.st.com>
Fixes: dbbe6a773cf0 ("drm: adv7511: Add support for i2c_new_secondary_device")
Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Signed-off-by: Robert Foss <robert.foss@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20220607213144.427177-1-antonio.borneo@foss.st.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c

index e7bf32f234d71724054253c733b587c7c07896f0..e2f84e2d5d3c2badb7a24ed1ba42a564fabb679c 100644 (file)
@@ -985,6 +985,10 @@ static int adv7511_init_cec_regmap(struct adv7511 *adv)
                                                ADV7511_CEC_I2C_ADDR_DEFAULT);
        if (IS_ERR(adv->i2c_cec))
                return PTR_ERR(adv->i2c_cec);
+
+       regmap_write(adv->regmap, ADV7511_REG_CEC_I2C_ADDR,
+                    adv->i2c_cec->addr << 1);
+
        i2c_set_clientdata(adv->i2c_cec, adv);
 
        adv->regmap_cec = devm_regmap_init_i2c(adv->i2c_cec,
@@ -1189,9 +1193,6 @@ static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
        if (ret)
                goto err_i2c_unregister_packet;
 
-       regmap_write(adv7511->regmap, ADV7511_REG_CEC_I2C_ADDR,
-                    adv7511->i2c_cec->addr << 1);
-
        INIT_WORK(&adv7511->hpd_work, adv7511_hpd_work);
 
        if (i2c->irq) {