From nobody Sat Jun 20 08:27:13 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB15D33FE0F for ; Fri, 17 Apr 2026 16:55:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776444906; cv=none; b=er95kw4kKnOmgOQWj1JdD/Qh8SQOSDdbavL1Jrc7M5dTZoTNnLIkqkYxKfPM0W7J47pc1qVFcGqvL43w14sDL1jd22J3TP7/2HUcRsCTT2Me38b7aRDZ9QKo3icM8oiBYy5NA7V3GGE8O2FWLuip0Nw7bNl00XhbhXdlmVVg2gI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776444906; c=relaxed/simple; bh=BHigvg6b/xqk90nvVeVuWyZzDRDWyUo7hgBVk2dW4Ns=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=cRRmzbtITaoAm3NMCCySdqPaEOAvZIXUXgxFXFTT7pOfPLtdB6o6u7V7I9FMMjh6pnPiTgyFLwMLEqbJjrRVU/7mDgtb5lRK+FUoW/AWCqAeL+vQy5kqgWyVUqPxPjaDrevLqP527SI17q2d1njOznts9Hckab1NBAZtlNG5mVg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VuDxMdYV; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VuDxMdYV" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-488ba6366a7so12067265e9.0 for ; Fri, 17 Apr 2026 09:55:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776444903; x=1777049703; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=w3d2BGP9irgdfdO8KFh82k9rWglwq3WmMsGPehw78ns=; b=VuDxMdYVtZzBo/67l4lB8eWF/i5WlFCHARvM86p8NQKDlqHcb2mSt6rWhhvJW6+s39 Ku4FLGv7BMt0QYU4S84DNmXk/kNP8SELMteLhBVElnCElM81Fzyww8yfU6cLhH66zDWr uXF9I+Y9D0ccZVcw044d73XZ+268+Y3r8yUnZcu8du38LA5e+VzjIFgoNkRH59z9Nn0/ /EWS303kX7gq4GUndmg3XJ+iH2g8+xt9pMQNGruxyCiuE6qk0+0q4mmhAuUmbGU6pvb5 Ng3hPjSvq/occ1rfkL+MSnl2Lm5r2bl23LdfFoFGMpNpjNpmHD3ed4duuk5P+Nh/XU0I PMTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776444903; x=1777049703; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=w3d2BGP9irgdfdO8KFh82k9rWglwq3WmMsGPehw78ns=; b=G0jVyfRL127eHQNPCigCrowCgZFSpBKfpGy2ceYTqor+wYoPXp7av7Z5+sS1ibvKpW ktPNrV6e+7S5oJ/fAVVdXDt4bcYsQP+anxGEy2IT4FRGbSNv47r22dRk5wEJL2KnWloL D+Nhl1zyXpsw0Ccsnb7IZqpSf4AV8PMiy2w6SK6K+2VV4mO726PxESzBbxlaoD4Tl/uJ 8/sd8NFkToW0W79H0mcLT5Eb1Ei/D/GGoWdWYPUixeEgArDG2VAJ+lcvYBtoUwR1DnGN c7FQH4PmTwTEnPGkPieeC+vPLUI0qjjU9pLk1ztqsJAgodCLxW3MD+Ye+figNecUWgiP gPEA== X-Forwarded-Encrypted: i=1; AFNElJ+gKBC+nACFNOVBxHSP1rPTtDbO6k33GoUtLFFJ4vQLHKd2VZJRlvhMCeUmW5hLtRrfIPuSW6KBJ+VgmpQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yx4TB2QsrB33iwP9uCe2Ytn6pkqzekIEXHCfTuAsZcE4yX980tX dlYj21VlWDQLYWa+PBmBtWQSOqJ4CWXw93+oE2w0jcASZuS6r1c7cVls X-Gm-Gg: AeBDieugtD61DgFtZk5oPNgqapd0/tTjIqDXpMfRU2QIycQ8wEn90LHPedxfk5zPxAn /jAx3u2y3jtgJ2XQU8JP/COpnIb+eQUmuFZqU8e1FnhobOu18ylBIedtTLPOCBYvfZg9dsoxe4W GEeH0HyaFoVSHq0LlyjHWNN3cmM5Dv/3VfiSPvUT2dliAevRm9rgyUFFX4OmH/UWBMDrGXIlwNP 3oM6EXVVB9rI5/bIew1Q5RZHT6K9oIzxg7hTNpARIBepEU9SxZPo4hgxv7dN0FR2bxo6B25zss1 5b2Ykr0RpyS3QkNGG+12NotoUypwwqovrjI/rLackI7W5xWMln0lK5rDKBP6J2wA5Th+IUk4bCv FBXsbbnhn97vXC34+vD64XGUZln3zMoukvOAw1PHMo/3aTdqQscHDuZ5nADIm+MhrHM5ukk6pyk WSkBa6xqyj1LqD79ewE6anAhwky51Vnc/gZ70mZD/W X-Received: by 2002:a05:600c:31a9:b0:489:95:3dd2 with SMTP id 5b1f17b1804b1-48900953e9bmr183645e9.8.1776444903017; Fri, 17 Apr 2026 09:55:03 -0700 (PDT) Received: from biju.lan ([2a00:23c4:a758:8a01:528c:590:5bef:9bc8]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488fc189f2esm95735645e9.7.2026.04.17.09.55.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Apr 2026 09:55:02 -0700 (PDT) From: Biju X-Google-Original-From: Biju To: Liu Ying , Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: Biju Das , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven , Prabhakar Mahadev Lad , Biju Das , linux-renesas-soc@vger.kernel.org Subject: [PATCH v3] drm/bridge: ite-it6263: Support power cycle in runtime Date: Fri, 17 Apr 2026 17:54:58 +0100 Message-ID: <20260417165501.213681-1-biju.das.jz@bp.renesas.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Biju Das On the RZ/G3L SMARC EVK using PSCI, suspend to RAM powers down the ITE IT6263 chip. The display controller driver's system PM callbacks invoke drm_mode_config_helper_{suspend,resume}, which in turn call the bridge's atomic_{disable,enable} callbacks can handle suspend/resume for the bridge without dedicated PM ops. Switch from devm_regulator_bulk_get_enable() to devm_regulator_bulk_get() so that regulators can be explicitly enabled and disabled across power cycles. Move reset_gpio and regulator state into the it6263 struct so they are accessible beyond probe time. Move it6263_supplies[] to the top of the file, before the it6263 struct definition, as it is now referenced by ARRAY_SIZE() within the struct. Add reset, I2C address configuration, and LVDS/HDMI initialisation to the atomic_enable callback so that the hardware is fully reinitialised after each power cycle. Correspondingly, remove these steps from probe, since they are no longer needed there. Add regulator_bulk_disable() to the atomic_disable callback to power down the supplies on bridge disable, completing the power cycle support. Signed-off-by: Biju Das --- Tested s2idle, s2ram and hotplug on Renesas RZ/G3L SMARC EVK platform. v2->v3: * Updated commit header and description. * Moved it6263_supplies above struct it6263. * Replaced *supplies with supplies[] in struct it6263 and removed the num_supplies variable from struct it6263, as ARRAY_SIZE already provides this information. * Dropped it6263_bridge_{init,uninit}(). * Added reset, I2C address configuration, and LVDS/HDMI initialisation to the atomic_enable callback so that the hardware is fully reinitialised after each power cycle. Correspondingly, remove these steps from probe, since they are no longer needed there. * Dropped the remove callback as it is not needed. * Dropped the variable powered from struct it6263. v1->v2: * Dropped system PM callbacks instead using bridge's atomic_{disable,enable} callbacks to handle suspend/resume. --- drivers/gpu/drm/bridge/ite-it6263.c | 49 +++++++++++++++++------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/bridge/ite-it6263.c b/drivers/gpu/drm/bridge/i= te-it6263.c index 4f3ebb7af4d4..10bf4cc89eb6 100644 --- a/drivers/gpu/drm/bridge/ite-it6263.c +++ b/drivers/gpu/drm/bridge/ite-it6263.c @@ -192,6 +192,11 @@ */ #define MAX_HDMI_TMDS_CHAR_RATE_HZ 225000000 =20 +static const char * const it6263_supplies[] =3D { + "ivdd", "ovdd", "txavcc18", "txavcc33", "pvcc1", "pvcc2", + "avcc", "anvdd", "apvdd" +}; + struct it6263 { struct device *dev; struct i2c_client *hdmi_i2c; @@ -200,6 +205,8 @@ struct it6263 { struct regmap *lvds_regmap; struct drm_bridge bridge; struct drm_bridge *next_bridge; + struct gpio_desc *reset_gpio; + struct regulator_bulk_data supplies[ARRAY_SIZE(it6263_supplies)]; int lvds_data_mapping; bool lvds_dual_link; bool lvds_link12_swap; @@ -344,11 +351,6 @@ static const struct regmap_config it6263_lvds_regmap_c= onfig =3D { .cache_type =3D REGCACHE_MAPLE, }; =20 -static const char * const it6263_supplies[] =3D { - "ivdd", "ovdd", "txavcc18", "txavcc33", "pvcc1", "pvcc2", - "avcc", "anvdd", "apvdd" -}; - static int it6263_parse_dt(struct it6263 *it) { struct device *dev =3D it->dev; @@ -587,6 +589,8 @@ static void it6263_bridge_atomic_disable(struct drm_bri= dge *bridge, regmap_write(it->hdmi_regmap, HDMI_REG_PKT_GENERAL_CTRL, 0); regmap_write(it->hdmi_regmap, HDMI_REG_AFE_DRV_CTRL, AFE_DRV_RST | AFE_DRV_PWD); + + regulator_bulk_disable(ARRAY_SIZE(it->supplies), it->supplies); } =20 static void it6263_bridge_atomic_enable(struct drm_bridge *bridge, @@ -603,6 +607,19 @@ static void it6263_bridge_atomic_enable(struct drm_bri= dge *bridge, bool pclk_high; int i, ret; =20 + ret =3D regulator_bulk_enable(ARRAY_SIZE(it->supplies), it->supplies); + if (ret) + dev_err(it->dev, "failed to enable power supplies\n"); + + it6263_hw_reset(it->reset_gpio); + + ret =3D it6263_lvds_set_i2c_addr(it); + if (ret) + dev_err(it->dev, "failed to set I2C addr\n"); + + it6263_lvds_config(it); + it6263_hdmi_config(it); + connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->encoder); crtc =3D drm_atomic_get_new_connector_state(state, connector)->crtc; @@ -840,7 +857,6 @@ static const struct drm_bridge_funcs it6263_bridge_func= s =3D { static int it6263_probe(struct i2c_client *client) { struct device *dev =3D &client->dev; - struct gpio_desc *reset_gpio; struct it6263 *it; int ret; =20 @@ -858,13 +874,15 @@ static int it6263_probe(struct i2c_client *client) return dev_err_probe(dev, PTR_ERR(it->hdmi_regmap), "failed to init I2C regmap for HDMI\n"); =20 - reset_gpio =3D devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); - if (IS_ERR(reset_gpio)) - return dev_err_probe(dev, PTR_ERR(reset_gpio), + it->reset_gpio =3D devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); + if (IS_ERR(it->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(it->reset_gpio), "failed to get reset gpio\n"); =20 - ret =3D devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(it6263_supplies), - it6263_supplies); + for (unsigned int i =3D 0; i < ARRAY_SIZE(it->supplies); i++) + it->supplies[i].supply =3D it6263_supplies[i]; + + ret =3D devm_regulator_bulk_get(dev, ARRAY_SIZE(it->supplies), it->suppli= es); if (ret) return dev_err_probe(dev, ret, "failed to get power supplies\n"); =20 @@ -872,12 +890,6 @@ static int it6263_probe(struct i2c_client *client) if (ret) return ret; =20 - it6263_hw_reset(reset_gpio); - - ret =3D it6263_lvds_set_i2c_addr(it); - if (ret) - return dev_err_probe(dev, ret, "failed to set I2C addr\n"); - it->lvds_i2c =3D devm_i2c_new_dummy_device(dev, client->adapter, LVDS_INPUT_CTRL_I2C_ADDR); if (IS_ERR(it->lvds_i2c)) @@ -890,9 +902,6 @@ static int it6263_probe(struct i2c_client *client) return dev_err_probe(dev, PTR_ERR(it->lvds_regmap), "failed to init I2C regmap for LVDS\n"); =20 - it6263_lvds_config(it); - it6263_hdmi_config(it); - i2c_set_clientdata(client, it); =20 it->bridge.of_node =3D dev->of_node; --=20 2.43.0