From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C7DFD41DEE0; Thu, 16 Jul 2026 12:56:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784206575; cv=none; b=f2k/+1hHkwi6JcYiBc03HnmjaAcsSgNpFfMhOZJ2wEbxjR33esv0rM+kvzwsluANrTb1mR5QorNpnxkSw7k5glyT89clsTkOOJjd7FUOFVsk+/nN0W4Z549m25eU5jp6AQEZ/RUCrymhv/ss1jvopGDBWXXMHx8eayL3QViarkc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784206575; c=relaxed/simple; bh=ADkGh99ahXQ0S8qKSfshg89gjbWmgVJ+4SvzlICKBZM=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=alzIHZjcSyGWlsi4RF5oqB7OdExQt2VsO0mq3WirablDhDVp1EsHnk6hBdWaveUV1etRiK1mHdrKAy6UydDNIOS7DBdrxkrG/49DhP303T4n8CZ8I5HN70YTXEsjh1dyQvQwgPXW0PJXbzKi1bfBJN1e4+QTel5vyNanxJYZGtY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Z9uf38+h; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Z9uf38+h" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0EAF1F000E9; Thu, 16 Jul 2026 12:56:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1784206573; bh=wl4ctcrDak/oWjHZd311YyJ+ok+7slrBrUhQSthrebk=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=Z9uf38+h4YNhUj38uZI7CjgLx/olwIu+e9R+qckRBKE7k4A64wx8uEIriuihacBad T7k6WxzEKk36lN1nVzyepaYr9kVKdeK0GfQd+Y1kLcxcgjTiGF1Q8E9h96DgemayJ3 7X+02CTP8ECYSaGjvyoHiTMT1kjpoq9UP9Nyp0+UaTUh9TWcHQtVHxM0uRgmiOtkZj p1R2Bt8DQ6Jap2SAUNmaqw5PQ2i621faRALsdCjSCxAI7d6hCcjYIMY28T6EPRgnpH d1gEJlsGtOFtan8OQI5n0KBz/6j+SQ45oH30jnAPkxjUoUaLDGwQzFqQYZSr/nQcTj FsDAw0sd2OgRw== Message-ID: <85505d92-ebe3-4ffd-84e1-8fe26994e053@kernel.org> Date: Thu, 16 Jul 2026 14:56:02 +0200 Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v7 2/2] drm/bridge: Add Lontium LT9609C(EX/UXD) MIPI DSI to HDMI driver To: mohit.dsor@oss.qualcomm.com, Sunyun Yang , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Vinod Koul Cc: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, venkata.valluru@oss.qualcomm.com, Jessica Zhang References: <20260716-lt9611c-v7-v7-0-7553a14735fc@oss.qualcomm.com> <20260716-lt9611c-v7-v7-2-7553a14735fc@oss.qualcomm.com> From: Krzysztof Kozlowski Content-Language: en-US Autocrypt: addr=krzk@kernel.org; keydata= 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 In-Reply-To: <20260716-lt9611c-v7-v7-2-7553a14735fc@oss.qualcomm.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 16/07/2026 13:31, mohit.dsor@oss.qualcomm.com wrote: > From: Sunyun Yang > > LT9611C(EX/UXD) is an I2C-controlled chip that Receiver signal/dual port > mipi dsi and output hdmi, differences in hardware features: > - LT9611C: supports 1-port mipi dsi to hdmi 1.4 > - LT9611EX: supports 2-port mipi dsi to hdmi 1.4 > - LT9611UXD: supports 2-port mipi dsi to hdmi 1.4/2.0 > > Signed-off-by: Sunyun Yang > Co-developed-by: Mohit Dsor > Signed-off-by: Mohit Dsor > --- > MAINTAINERS | 7 + > drivers/gpu/drm/bridge/Kconfig | 18 + > drivers/gpu/drm/bridge/Makefile | 1 + > drivers/gpu/drm/bridge/lontium-lt9611c.c | 1293 ++++++++++++++++++++++++++++++ > 4 files changed, 1319 insertions(+) > > diff --git a/MAINTAINERS b/MAINTAINERS > index 6dea93a41962..30be2eaf2bec 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -15184,6 +15184,13 @@ S: Maintained > F: Documentation/devicetree/bindings/display/bridge/lontium,lt8912b.yaml > F: drivers/gpu/drm/bridge/lontium-lt8912b.c > > +LONTIUM LT9611C MIPI DSI TO HDMI BRIDGE > +M: Sunyun Yang > +M: Mohit Dsor > +S: Maintained > +F: Documentation/devicetree/bindings/display/bridge/lontium,lt9611.yaml > +F: drivers/gpu/drm/bridge/lontium-lt9611c.c > + > LOONGARCH > M: Huacai Chen > R: WANG Xuerui > diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig > index 4a57d49b4c6d..b8959b8e2ad0 100644 > --- a/drivers/gpu/drm/bridge/Kconfig > +++ b/drivers/gpu/drm/bridge/Kconfig > @@ -177,6 +177,24 @@ config DRM_LONTIUM_LT9611 > HDMI signals > Please say Y if you have such hardware. > > +config DRM_LONTIUM_LT9611C > + tristate "Lontium LT9611C DSI/HDMI bridge" > + select SND_SOC_HDMI_CODEC if SND_SOC > + depends on OF > + select CRC8 > + select FW_LOADER > + select DRM_PANEL_BRIDGE > + select DRM_KMS_HELPER > + select DRM_MIPI_DSI > + select DRM_DISPLAY_HELPER > + select DRM_DISPLAY_HDMI_STATE_HELPER > + select REGMAP_I2C > + help > + Driver for Lontium DSI to HDMI bridge > + chip driver that converts dual DSI and I2S to > + HDMI signals > + Please say Y if you have such hardware. Please wrap the code to appropriate limits. ... > + > +static void lt9611c_reset(struct lt9611c *lt9611c) > +{ > + gpiod_set_value_cansleep(lt9611c->reset_gpio, 1); > + usleep_range(10000, 12000); > + > + gpiod_set_value_cansleep(lt9611c->reset_gpio, 0); > + msleep(400); > + > + dev_dbg(lt9611c->dev, "lt9611c reset"); Same comment as before. > +} > + > +static int lt9611c_upgrade_result(struct lt9611c *lt9611c, u8 fw_crc) > +{ > + struct device *dev = lt9611c->dev; > + unsigned int crc_result; > + > + regmap_write(lt9611c->regmap, 0xe0ee, 0x01); > + regmap_read(lt9611c->regmap, 0xe021, &crc_result); > + > + if (crc_result != fw_crc) { > + dev_err(dev, "lt9611c fw upgrade failed, expected crc=0x%02x, read crc=0x%02x\n", > + fw_crc, crc_result); > + return -1; > + } > + > + dev_dbg(dev, "lt9611c firmware upgrade success, crc=0x%02x\n", crc_result); > + return 0; > +} ... > + > +static ssize_t lt9611c_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) > +{ > + struct lt9611c *lt9611c = dev_get_drvdata(dev); > + > + return sysfs_emit(buf, "0x%04x\n", lt9611c->fw_version); > +} > + > +static DEVICE_ATTR_RW(lt9611c_firmware); Where is this ABI documented? > + > +static struct attribute *lt9611c_attrs[] = { > + &dev_attr_lt9611c_firmware.attr, > + NULL, > +}; > + > +static const struct attribute_group lt9611c_attr_group = { > + .attrs = lt9611c_attrs, > +}; > + > +static const struct attribute_group *lt9611c_attr_groups[] = { > + <9611c_attr_group, > + NULL, > +}; > + > +static int lt9611c_probe(struct i2c_client *client) > +{ > + struct lt9611c *lt9611c; > + struct device *dev = &client->dev; > + bool fw_updated = false; > + int ret; > + > + crc8_populate_msb(lt9611c_crc8_table, LT9611C_CRC_POLYNOMIAL); > + > + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) > + return dev_err_probe(dev, -ENODEV, "device doesn't support I2C\n"); > + > + lt9611c = devm_drm_bridge_alloc(dev, struct lt9611c, bridge, <9611c_bridge_funcs); > + if (IS_ERR(lt9611c)) > + return dev_err_probe(dev, PTR_ERR(lt9611c), "drm bridge alloc failed.\n"); > + > + lt9611c->dev = dev; > + lt9611c->client = client; > + lt9611c->chip_type = (uintptr_t)i2c_get_match_data(client); uintptr_t is not for kernel, use unsigned long. > + > + ret = devm_mutex_init(dev, <9611c->ocm_lock); > + if (ret) > + return dev_err_probe(dev, ret, "failed to init mutex\n"); > + > + lt9611c->regmap = devm_regmap_init_i2c(client, <9611c_regmap_config); > + if (IS_ERR(lt9611c->regmap)) > + return dev_err_probe(dev, PTR_ERR(lt9611c->regmap), "regmap i2c init failed\n"); > + > + ret = lt9611c_parse_dt(dev, lt9611c); > + if (ret) > + return dev_err_probe(dev, ret, "failed to parse device tree\n"); > + > + ret = lt9611c_gpio_init(lt9611c); > + if (ret < 0) > + goto err_of_put; > + > + ret = lt9611c_regulator_init(lt9611c); > + if (ret < 0) > + goto err_of_put; > + > + ret = regulator_bulk_enable(ARRAY_SIZE(lt9611c->supplies), lt9611c->supplies); > + if (ret) > + goto err_of_put; > + > + lt9611c_reset(lt9611c); > + > + lt9611c_lock(lt9611c); > + > + ret = lt9611c_read_chipid(lt9611c); > + if (ret < 0) { > + dev_err(dev, "failed to read chip id.\n"); > + lt9611c_unlock(lt9611c); > + goto err_disable_regulators; > + } > + > +retry: > + lt9611c->fw_version = lt9611c_read_version(lt9611c); > + if (lt9611c->fw_version < 0) { > + dev_err(dev, "failed to read fw version\n"); > + ret = -EOPNOTSUPP; > + lt9611c_unlock(lt9611c); > + goto err_disable_regulators; > + > + } else if (lt9611c->fw_version == 0) { > + if (!fw_updated) { > + fw_updated = true; > + ret = lt9611c_firmware_upgrade(lt9611c); > + if (ret < 0) { > + lt9611c_unlock(lt9611c); > + goto err_disable_regulators; > + } > + > + goto retry; > + > + } else { > + dev_err(dev, "fw version 0x%04x, update failed\n", lt9611c->fw_version); > + ret = -EOPNOTSUPP; > + lt9611c_unlock(lt9611c); > + goto err_disable_regulators; > + } > + } > + > + lt9611c_unlock(lt9611c); > + dev_dbg(dev, "current version:0x%04x", lt9611c->fw_version); > + > + INIT_WORK(<9611c->work, lt9611c_hpd_work); > + > + ret = devm_request_threaded_irq(&client->dev, client->irq, NULL, > + lt9611c_irq_thread_handler, > + IRQF_TRIGGER_FALLING | > + IRQF_ONESHOT | > + IRQF_NO_AUTOEN, > + "lt9611c", lt9611c); > + if (ret) { > + dev_err(dev, "failed to request irq\n"); > + goto err_disable_regulators; > + } > + > + lt9611c->bridge.of_node = client->dev.of_node; > + lt9611c->bridge.ops = DRM_BRIDGE_OP_DETECT | > + DRM_BRIDGE_OP_EDID | > + DRM_BRIDGE_OP_HPD | > + DRM_BRIDGE_OP_HDMI | > + DRM_BRIDGE_OP_HDMI_AUDIO; > + lt9611c->bridge.type = DRM_MODE_CONNECTOR_HDMIA; > + > + lt9611c->bridge.vendor = "Lontium"; > + lt9611c->bridge.product = "LT9611C"; > + > + lt9611c->bridge.hdmi_audio_dev = dev; > + lt9611c->bridge.hdmi_audio_max_i2s_playback_channels = 8; > + lt9611c->bridge.hdmi_audio_dai_port = 2; > + > + devm_drm_bridge_add(dev, <9611c->bridge); > + > + /* Attach primary DSI */ > + lt9611c->dsi0 = lt9611c_attach_dsi(lt9611c, lt9611c->dsi0_node); > + if (IS_ERR(lt9611c->dsi0)) { > + ret = PTR_ERR(lt9611c->dsi0); > + goto err_remove_bridge; > + } > + > + /* Attach secondary DSI, if specified */ > + if (lt9611c->dsi1_node) { > + lt9611c->dsi1 = lt9611c_attach_dsi(lt9611c, lt9611c->dsi1_node); > + if (IS_ERR(lt9611c->dsi1)) { > + ret = PTR_ERR(lt9611c->dsi1); > + goto err_remove_bridge; > + } > + } > + > + lt9611c->hdmi_connected = false; > + i2c_set_clientdata(client, lt9611c); > + enable_irq(client->irq); > + > + lt9611c_reset(lt9611c); > + return 0; > + > +err_remove_bridge: > + cancel_work_sync(<9611c->work); > + > +err_disable_regulators: > + regulator_bulk_disable(ARRAY_SIZE(lt9611c->supplies), lt9611c->supplies); > + > +err_of_put: > + of_node_put(lt9611c->dsi1_node); > + of_node_put(lt9611c->dsi0_node); > + > + return ret; > +} > + > +static void lt9611c_remove(struct i2c_client *client) > +{ > + struct lt9611c *lt9611c = i2c_get_clientdata(client); > + > + cancel_work_sync(<9611c->work); > + regulator_bulk_disable(ARRAY_SIZE(lt9611c->supplies), lt9611c->supplies); > + of_node_put(lt9611c->dsi1_node); > + of_node_put(lt9611c->dsi0_node); > +} > + > +static int lt9611c_bridge_suspend(struct device *dev) > +{ > + struct lt9611c *lt9611c = dev_get_drvdata(dev); > + int ret; > + > + dev_dbg(lt9611c->dev, "suspend\n"); Same comments. This does not look like useful printk message. Drivers should be silent on success: https://elixir.bootlin.com/linux/v6.15-rc7/source/Documentation/process/coding-style.rst#L913 https://elixir.bootlin.com/linux/v6.15-rc7/source/Documentation/process/debugging/driver_development_debugging_guide.rst#L79 Best regards, Krzysztof