From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (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 EB262438FF0 for ; Fri, 15 May 2026 09:03:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.133.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778835809; cv=none; b=jWYI9czEgreHovwiegui0T4BfEO8ERDvoAptxUAryKIjNKxcQGRN2SBJwYKfx3r1YonR4LPDGYa5b31ATPOuX9hfuuxdm5JHQ6E7UPbspbHqXpOqC8WQYH7ukiT4xV8mlH2l0ePV4CBgJXmuKkRYIhIQCDYq40UBMHaq9Uu/EMw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778835809; c=relaxed/simple; bh=ImOBGDkhhIfZyUdE+sek3T05mETZUQkyh8OQDReTLg8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rITIFJQEBJZqAgOrtsujJ/umE02ayrOKfpbCyjc5w+NTHnO58ccWMU19dR633/JcAKJ+ZDHOoE+mo3RIlA6b4CUJHG0v2ZRXFIkXw0KuRuQE9LvCzJtjuD2HpfJxXLDF0ii6W8ZsmKWFbgu7U+/PUrPFaT5Ms1GeioiCWQhHtPw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=UxLp7NOF; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=bbmDvfaU; arc=none smtp.client-ip=170.10.133.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="UxLp7NOF"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="bbmDvfaU" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778835807; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=cU8nfuQshDfTgMYlYFriNnuspV8nePWV/d7r2OJywA8=; b=UxLp7NOFC0N5NfrkEHEnIuIs079fAyjBV3oqLE7jqI0YBgYWxEM0uIKjEtgZINmp8L1l+Y JKCALETUabpfepBL/vXIYkeirVIW3LMQbh412yPjbqwhA46nNN73l7xerhtk/mNp8cGpgx 9vq6QORf43aVyo7P7vEPtaD9KK5jNPo= Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-668-MwJxIm8rOheCqOz_ecHKGw-1; Fri, 15 May 2026 05:03:25 -0400 X-MC-Unique: MwJxIm8rOheCqOz_ecHKGw-1 X-Mimecast-MFC-AGG-ID: MwJxIm8rOheCqOz_ecHKGw_1778835804 Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-b8ff07df5e4so780461266b.3 for ; Fri, 15 May 2026 02:03:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1778835804; x=1779440604; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cU8nfuQshDfTgMYlYFriNnuspV8nePWV/d7r2OJywA8=; b=bbmDvfaUKEZXg59mAEklvZGFoCMN1LYKroAIcipV8+utNvi0U0TOxSc/twl29Jlydn Xvpx3xlCdvrMTV+D50eTOOD/Gzpjw/IOctsHduLqWqAfhpFH6isOVyFhpWAXzodJsJN0 GCj2SlhFwx7Yqs95kboZKcDz+eni+/6ikGS/HChIO7gPCrbf5SA5ZM/c5qWgxGqZnyiH v6064Wxpb/uHLxFUEHkRlPRMdUu6PgCFIrDmPuY4s4FjsDEB4Yd21vmBT9KiPPyY6QDb i24+ww1fgKB4cHQtui2ThOAUtJv642Ti154h+HmO9+gcB+I2dHQIl3VyOP9WzSGNPkN7 P7AQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778835804; x=1779440604; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=cU8nfuQshDfTgMYlYFriNnuspV8nePWV/d7r2OJywA8=; b=TkdrwCHROv+ad8FQNvw+x1JGo67Q7In5UA6DCPq6h0HWF4f17LzTTo/6E3E2BU4ZEm ZvSO2hUS0WofFez+phWHS+k/TX3LmIsyS3iFeeA4pSv8ggsCWQc+Nun2qCMAyiCTDQra OCVOePneZW9GRo3/tD8ukp9Wx/ARWQjczCljGgUcg6toQ1GOTgfyXQLxxbiup9RkE8GJ 7/+wICnGFeN0dfdm6RWCX1agkXEgz3VYjpEKvk+wH0mZpVC4TysjasWiLV9twZA4Mv8v gl1kJYB4K7N2qG+aegNpilmJwYWflYJkYdWqnNt7A8ENH3vU5LmFzvQZvSHbrpDeei/P aEbA== X-Gm-Message-State: AOJu0YwGM/1Sa7Y46xmTj1WFvZaspBsGpULSjogcnyzh4C9Irgc/wXtv ZxigBWgj47tAIZmdBigx8UMFHRr9YLugN0jfD4gpqXP+eXGhdx8hm7yumQgAUnSdQl+yVIz43NS Bzw8oDSZRy7ATF5ea6R7yFMGCbMp9Xv3VEgUI6dcehzEzrSnCG/Nt2VGssdTh9Kxhj3iWXuZhox ri50jPXEgE8Ogm4IZRvQNa8wCiIX/Sk9vRJS/HORxErkDK8f2L X-Gm-Gg: Acq92OEp6AK4WI6qlFPIt+9p2ODibPAstn4ZXHUlmvo6xCJU0qsfgpjnRf0x8hr5viD p4xr7JwJydCu8i7GoQFUu7MV2FshGW+BoZiOMaDnxiS4zK2/+DJ0VRUAZf/4x+Y/QNxP3JbYsFB fhAUzf5sj9KCuZvz2C9Axl8aWNt0E8fFqaanUjD2mQAF+LqhR+mDHP5C31h+nEvu8iiErSh5FKg rYcrwB1IxwWJZ78ch5T5wsKN+noycySIzAAXIEnJJcHIyuKoJJL9buKsxcFC3MNQAGWQ+zhJBJJ 7CHsFSDh2u9urFDO/yWKEy1rnAUhOc1j6KlZfdgEGfU+9FLNIASS837mxgvHkEr8EiAq3flE/ri GH0fsJErCiBncPijfVFF+qHM3GgCIqw3f4X/dcqMkpCCNf9Q= X-Received: by 2002:a17:907:785:b0:bd4:f2c9:d094 with SMTP id a640c23a62f3a-bd5177a849dmr167238266b.3.1778835803785; Fri, 15 May 2026 02:03:23 -0700 (PDT) X-Received: by 2002:a17:907:785:b0:bd4:f2c9:d094 with SMTP id a640c23a62f3a-bd5177a849dmr167230166b.3.1778835803009; Fri, 15 May 2026 02:03:23 -0700 (PDT) Received: from localhost (62-151-111-63.jazzfree.ya.com. [62.151.111.63]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45d9e768c4fsm13176383f8f.8.2026.05.15.02.03.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 May 2026 02:03:22 -0700 (PDT) From: Javier Martinez Canillas To: linux-kernel@vger.kernel.org Cc: Javier Martinez Canillas , Maxime Ripard , Andrzej Hajda , David Airlie , Jernej Skrabec , Jonas Karlman , Laurent Pinchart , Luca Ceresoli , Maarten Lankhorst , Neil Armstrong , Phong LE , Robert Foss , Simona Vetter , Thomas Zimmermann , dri-devel@lists.freedesktop.org Subject: [PATCH v4 1/3] drm/bridge: ite-it66121: Switch to the HDMI connector helpers Date: Fri, 15 May 2026 11:02:09 +0200 Message-ID: <20260515090220.809830-2-javierm@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260515090220.809830-1-javierm@redhat.com> References: <20260515090220.809830-1-javierm@redhat.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Instead of open coding the HDMI AVI Infoframes buffer management, use the helpers provided by the HDMI connector framework. Suggested-by: Maxime Ripard Signed-off-by: Javier Martinez Canillas --- Changes in v4: - New patch for v4 drivers/gpu/drm/bridge/Kconfig | 2 + drivers/gpu/drm/bridge/ite-it66121.c | 132 ++++++++++++++++----------- 2 files changed, 83 insertions(+), 51 deletions(-) diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index f81b566c82a1..4a57d49b4c6d 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -205,6 +205,8 @@ config DRM_LONTIUM_LT8713SX config DRM_ITE_IT66121 tristate "ITE IT66121 HDMI bridge" depends on OF + select DRM_DISPLAY_HDMI_STATE_HELPER + select DRM_DISPLAY_HELPER select DRM_KMS_HELPER select REGMAP_I2C help diff --git a/drivers/gpu/drm/bridge/ite-it66121.c b/drivers/gpu/drm/bridge/ite-it66121.c index 19a027d75b61..947b7a0f0a45 100644 --- a/drivers/gpu/drm/bridge/ite-it66121.c +++ b/drivers/gpu/drm/bridge/ite-it66121.c @@ -20,6 +20,8 @@ #include #include +#include +#include #include #include #include @@ -304,7 +306,6 @@ struct it66121_ctx { struct i2c_client *client; u32 bus_width; struct mutex lock; /* Protects fields below and device registers */ - struct hdmi_avi_infoframe hdmi_avi_infoframe; struct { struct platform_device *pdev; u8 ch_enable; @@ -727,6 +728,10 @@ static void it66121_bridge_enable(struct drm_bridge *bridge, struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); ctx->connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder); + if (!ctx->connector) + return; + + drm_atomic_helper_connector_hdmi_update_infoframes(ctx->connector, state); it66121_set_mute(ctx, false); } @@ -764,40 +769,10 @@ void it66121_bridge_mode_set(struct drm_bridge *bridge, const struct drm_display_mode *mode, const struct drm_display_mode *adjusted_mode) { - u8 buf[HDMI_INFOFRAME_SIZE(AVI)]; struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); - int ret; mutex_lock(&ctx->lock); - ret = drm_hdmi_avi_infoframe_from_display_mode(&ctx->hdmi_avi_infoframe, ctx->connector, - adjusted_mode); - if (ret) { - DRM_ERROR("Failed to setup AVI infoframe: %d\n", ret); - goto unlock; - } - - ret = hdmi_avi_infoframe_pack(&ctx->hdmi_avi_infoframe, buf, sizeof(buf)); - if (ret < 0) { - DRM_ERROR("Failed to pack infoframe: %d\n", ret); - goto unlock; - } - - /* Write new AVI infoframe packet */ - ret = regmap_bulk_write(ctx->regmap, IT66121_AVIINFO_DB1_REG, - &buf[HDMI_INFOFRAME_HEADER_SIZE], - HDMI_AVI_INFOFRAME_SIZE); - if (ret) - goto unlock; - - if (regmap_write(ctx->regmap, IT66121_AVIINFO_CSUM_REG, buf[3])) - goto unlock; - - /* Enable AVI infoframe */ - if (regmap_write(ctx->regmap, IT66121_AVI_INFO_PKT_REG, - IT66121_AVI_INFO_PKT_ON | IT66121_AVI_INFO_PKT_RPT)) - goto unlock; - /* Set TX mode to HDMI */ if (regmap_write(ctx->regmap, IT66121_HDMI_MODE_REG, IT66121_HDMI_MODE_HDMI)) goto unlock; @@ -825,24 +800,6 @@ void it66121_bridge_mode_set(struct drm_bridge *bridge, mutex_unlock(&ctx->lock); } -static enum drm_mode_status it66121_bridge_mode_valid(struct drm_bridge *bridge, - const struct drm_display_info *info, - const struct drm_display_mode *mode) -{ - struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); - unsigned long max_clock; - - max_clock = (ctx->bus_width == 12) ? 74250 : 148500; - - if (mode->clock > max_clock) - return MODE_CLOCK_HIGH; - - if (mode->clock < 25000) - return MODE_CLOCK_LOW; - - return MODE_OK; -} - static enum drm_connector_status it66121_bridge_detect(struct drm_bridge *bridge, struct drm_connector *connector) { @@ -873,6 +830,72 @@ static void it66121_bridge_hpd_disable(struct drm_bridge *bridge) dev_err(ctx->dev, "failed to disable HPD IRQ\n"); } +static enum drm_mode_status +it66121_bridge_hdmi_tmds_char_rate_valid(const struct drm_bridge *bridge, + const struct drm_display_mode *mode, + unsigned long long tmds_rate) +{ + const struct it66121_ctx *ctx = + container_of(bridge, const struct it66121_ctx, bridge); + unsigned long max_clock; + + max_clock = (ctx->bus_width == 12) ? 74250 : 148500; + + if (mode->clock > max_clock) + return MODE_CLOCK_HIGH; + + if (mode->clock < 25000) + return MODE_CLOCK_LOW; + + return MODE_OK; +} + +static int it66121_bridge_hdmi_clear_avi_infoframe(struct drm_bridge *bridge) +{ + struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); + + return regmap_write(ctx->regmap, IT66121_AVI_INFO_PKT_REG, 0); +} + +static int it66121_bridge_hdmi_clear_hdmi_infoframe(struct drm_bridge *bridge) +{ + return 0; +} + +static int it66121_bridge_hdmi_write_avi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + struct it66121_ctx *ctx = container_of(bridge, struct it66121_ctx, bridge); + int ret; + + mutex_lock(&ctx->lock); + + /* Write new AVI infoframe packet */ + ret = regmap_bulk_write(ctx->regmap, IT66121_AVIINFO_DB1_REG, + &buffer[HDMI_INFOFRAME_HEADER_SIZE], + HDMI_AVI_INFOFRAME_SIZE); + if (ret) + goto unlock; + + ret = regmap_write(ctx->regmap, IT66121_AVIINFO_CSUM_REG, buffer[3]); + if (ret) + goto unlock; + + /* Enable AVI infoframe */ + ret = regmap_write(ctx->regmap, IT66121_AVI_INFO_PKT_REG, + IT66121_AVI_INFO_PKT_ON | IT66121_AVI_INFO_PKT_RPT); + +unlock: + mutex_unlock(&ctx->lock); + return ret; +} + +static int it66121_bridge_hdmi_write_hdmi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + return 0; +} + static const struct drm_edid *it66121_bridge_edid_read(struct drm_bridge *bridge, struct drm_connector *connector) { @@ -913,11 +936,15 @@ static const struct drm_bridge_funcs it66121_bridge_funcs = { .atomic_disable = it66121_bridge_disable, .atomic_check = it66121_bridge_check, .mode_set = it66121_bridge_mode_set, - .mode_valid = it66121_bridge_mode_valid, .detect = it66121_bridge_detect, .edid_read = it66121_bridge_edid_read, .hpd_enable = it66121_bridge_hpd_enable, .hpd_disable = it66121_bridge_hpd_disable, + .hdmi_tmds_char_rate_valid = it66121_bridge_hdmi_tmds_char_rate_valid, + .hdmi_clear_avi_infoframe = it66121_bridge_hdmi_clear_avi_infoframe, + .hdmi_write_avi_infoframe = it66121_bridge_hdmi_write_avi_infoframe, + .hdmi_clear_hdmi_infoframe = it66121_bridge_hdmi_clear_hdmi_infoframe, + .hdmi_write_hdmi_infoframe = it66121_bridge_hdmi_write_hdmi_infoframe, }; static irqreturn_t it66121_irq_threaded_handler(int irq, void *dev_id) @@ -1588,7 +1615,10 @@ static int it66121_probe(struct i2c_client *client) ctx->bridge.of_node = dev->of_node; ctx->bridge.type = DRM_MODE_CONNECTOR_HDMIA; - ctx->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID; + ctx->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | + DRM_BRIDGE_OP_HDMI; + ctx->bridge.vendor = "ITE"; + ctx->bridge.product = "IT66121"; if (client->irq > 0) { ctx->bridge.ops |= DRM_BRIDGE_OP_HPD; -- 2.54.0