drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 1 + 1 file changed, 1 insertion(+)
The LT9611UXC only has an I2S input and therefore only an HDMI-TX
audio channel. In this case, the capture channel must be disabled
on the HDMI sound card.
Signed-off-by: Vladimir Yakovlev <vovchkir@gmail.com>
---
drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
index b17483f1550c..79feaec77afc 100644
--- a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
+++ b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
@@ -562,6 +562,7 @@ static int lt9611uxc_audio_init(struct device *dev, struct lt9611uxc *lt9611uxc)
struct hdmi_codec_pdata codec_data = {
.ops = <9611uxc_codec_ops,
.max_i2s_channels = 2,
+ .no_i2s_capture = 1,
.i2s = 1,
.data = lt9611uxc,
};
--
2.34.1
The chip does not receive an interrupt if the monitor was connected
before powering up.
Therefore, you need to wake up the task if the necessary bits are set
when calling bridge_detect() after DRM is started.
Signed-off-by: Vladimir Yakovlev <vovchkir@gmail.com>
---
drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
index 748bed8acd2d..5051cdfe2fee 100644
--- a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
+++ b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
@@ -358,17 +358,24 @@ static enum drm_connector_status lt9611uxc_bridge_detect(struct drm_bridge *brid
unsigned int reg_val = 0;
int ret;
bool connected = true;
+ bool edid_read = true;
lt9611uxc_lock(lt9611uxc);
if (lt9611uxc->hpd_supported) {
ret = regmap_read(lt9611uxc->regmap, 0xb023, ®_val);
- if (ret)
+ if (ret) {
dev_err(lt9611uxc->dev, "failed to read hpd status: %d\n", ret);
- else
+ } else {
+ dev_dbg(lt9611uxc->dev, "detect() reg[0xb023]=0x%02X\n", reg_val);
connected = reg_val & BIT(1);
+ edid_read = reg_val & BIT(0);
+ if (edid_read)
+ wake_up_all(<9611uxc->wq);
+ }
}
+ lt9611uxc->edid_read = edid_read;
lt9611uxc->hdmi_connected = connected;
lt9611uxc_unlock(lt9611uxc);
--
2.34.1
On some systems the interrupt pin may not be used.
In this case we exclude DRM_BRIDGE_OP_HPD from supported operations,
after which a polling thread is started to detect the connection.
(the default polling period for DRM is 10 seconds)
Signed-off-by: Vladimir Yakovlev <vovchkir@gmail.com>
---
drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 25 ++++++++++++++--------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
index 1aeb5b29704b..b17483f1550c 100644
--- a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
+++ b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
@@ -854,12 +854,17 @@ static int lt9611uxc_probe(struct i2c_client *client)
init_waitqueue_head(<9611uxc->wq);
INIT_WORK(<9611uxc->work, lt9611uxc_hpd_work);
- ret = request_threaded_irq(client->irq, NULL,
- lt9611uxc_irq_thread_handler,
- IRQF_ONESHOT, "lt9611uxc", lt9611uxc);
- if (ret) {
- dev_err(dev, "failed to request irq\n");
- goto err_disable_regulators;
+ if (client->irq) {
+ ret = request_threaded_irq(client->irq, NULL,
+ lt9611uxc_irq_thread_handler,
+ IRQF_ONESHOT, "lt9611uxc", lt9611uxc);
+ if (ret) {
+ dev_err(dev, "failed to request irq\n");
+ goto err_disable_regulators;
+ }
+ dev_dbg(dev, "Uses IRQ\n");
+ } else {
+ dev_warn(dev, "Irq isn't present. Check Irq or use the polling!!\n");
}
i2c_set_clientdata(client, lt9611uxc);
@@ -867,7 +872,7 @@ static int lt9611uxc_probe(struct i2c_client *client)
lt9611uxc->bridge.funcs = <9611uxc_bridge_funcs;
lt9611uxc->bridge.of_node = client->dev.of_node;
lt9611uxc->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID;
- if (lt9611uxc->hpd_supported)
+ if (lt9611uxc->hpd_supported && client->irq)
lt9611uxc->bridge.ops |= DRM_BRIDGE_OP_HPD;
lt9611uxc->bridge.type = DRM_MODE_CONNECTOR_HDMIA;
@@ -896,7 +901,8 @@ static int lt9611uxc_probe(struct i2c_client *client)
return 0;
err_remove_bridge:
- free_irq(client->irq, lt9611uxc);
+ if (client->irq)
+ free_irq(client->irq, lt9611uxc);
cancel_work_sync(<9611uxc->work);
drm_bridge_remove(<9611uxc->bridge);
@@ -914,7 +920,8 @@ static void lt9611uxc_remove(struct i2c_client *client)
{
struct lt9611uxc *lt9611uxc = i2c_get_clientdata(client);
- free_irq(client->irq, lt9611uxc);
+ if (client->irq)
+ free_irq(client->irq, lt9611uxc);
cancel_work_sync(<9611uxc->work);
lt9611uxc_audio_exit(lt9611uxc);
drm_bridge_remove(<9611uxc->bridge);
--
2.34.1
On some systems the reset pin may not be used.
Signed-off-by: Vladimir Yakovlev <vovchkir@gmail.com>
---
drivers/gpu/drm/bridge/lontium-lt9611uxc.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
index 5051cdfe2fee..1aeb5b29704b 100644
--- a/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
+++ b/drivers/gpu/drm/bridge/lontium-lt9611uxc.c
@@ -179,6 +179,9 @@ static void lt9611uxc_hpd_work(struct work_struct *work)
static void lt9611uxc_reset(struct lt9611uxc *lt9611uxc)
{
+ if (!lt9611uxc->reset_gpio)
+ return;
+
gpiod_set_value_cansleep(lt9611uxc->reset_gpio, 1);
msleep(20);
@@ -460,7 +463,7 @@ static int lt9611uxc_gpio_init(struct lt9611uxc *lt9611uxc)
{
struct device *dev = lt9611uxc->dev;
- lt9611uxc->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
+ lt9611uxc->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(lt9611uxc->reset_gpio)) {
dev_err(dev, "failed to acquire reset gpio\n");
return PTR_ERR(lt9611uxc->reset_gpio);
--
2.34.1
© 2016 - 2025 Red Hat, Inc.