From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CDCC0CD5BD1 for ; Mon, 1 Jun 2026 12:02:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=DIMM/UuiKwfx/YeG9zdQSBbNa1KLdJ52JXl7ajReGSM=; b=GRw+DE5G55QdxD7fJuv8tYTq78 1JWUoRMhxNCyiyDmyAFVQdwis58u6mv5SJ3v9qBu/LHF8tbIye66TJgON10KrWGh6pKIqO89oddL6 /TyY56eupCS8P320E9rkj/954ezGzXORziymot8M2wXPjCJ6M75qVwFtiC+GLAVMmafkh4xhCHtGL zPJjY4O2SSJm10V3gtT4sVJ7QI33JNHbPZRgVFiLf4RZj4OobGXwbuDJ+AVzY4vKMUdHm227d/hDn E3BeKX7o+1yDJhb9Ale4m6hgWCUXgeJLvecYsOhU7jGBYWEaUyt4/bv7ZfE/HhJGvbEIv4lXXKaTS 5BaGoZAw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wU1L3-0000000Aq8f-3NFB; Mon, 01 Jun 2026 12:01:49 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wU1JN-0000000Amwk-2jHm; Mon, 01 Jun 2026 12:00:07 +0000 ARC-Seal: i=1; a=rsa-sha256; t=1780315177; cv=none; d=zohomail.com; s=zohoarc; b=U1Syv7zfhXvwwo1exj8uJZCBU7MyWW3QbmsuUB1gXj1nEp9FC7yI2ixf5+TtKrQX8mwcdFCr2tiZ6EFX2TzYMloTXk2ChRHVV6Xw7u0RLQmGvplSsDaNZXhxQ4wY9skgtTL7TORSXfSQgtr61CzpjspbLHZKncILsqtrdMLqkjQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1780315177; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=DIMM/UuiKwfx/YeG9zdQSBbNa1KLdJ52JXl7ajReGSM=; b=lwJOkuTR5VjGe+KvnVblShkU0ytUU6TMpQ+FoaDTPT/4ZxozaGdAvwct91RE18k/izj3oKGp+U7mH15lWZYIkxBOVWNjMust257gfykB5vMefa7NljZ/8Vo1mg7wyUch/hv3nrH9NUC0SyWoD1O98H6igfehzSxlEMHP8tQyWfw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=sebastian.reichel@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1780315177; s=zohomail; d=collabora.com; i=sebastian.reichel@collabora.com; h=Date:Date:From:From:To:To:Cc:Cc:Subject:Subject:Message-ID:References:MIME-Version:Content-Type:In-Reply-To:Message-Id:Reply-To; bh=DIMM/UuiKwfx/YeG9zdQSBbNa1KLdJ52JXl7ajReGSM=; b=aGhxFuf48cjhVftQG1KkPTLUSnFnLenyMVbHbJ7S1yzD64VRSkAl/JoYjEhqx6l0 FTNwJ4tL+jVa8Gf4iBqOZtKkZcOzKDCKlYEbnJSgc9sTRgJ1RnJwlAVpIYXtu/xXSiC 9j2b/E6G1MLH/MuX+FS+mi98jo42edRdpOeoA6bE= Received: by mx.zohomail.com with SMTPS id 1780315176260511.75002317945086; Mon, 1 Jun 2026 04:59:36 -0700 (PDT) Received: by venus (Postfix, from userid 1000) id E0298181D80; Mon, 01 Jun 2026 13:59:29 +0200 (CEST) Date: Mon, 1 Jun 2026 13:59:29 +0200 From: Sebastian Reichel To: Damon Ding Cc: hjc@rock-chips.com, heiko@sntech.de, andy.yan@rock-chips.com, maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, andrzej.hajda@intel.com, neil.armstrong@linaro.org, rfoss@kernel.org, Laurent.pinchart@ideasonboard.com, jonas@kwiboo.se, jernej.skrabec@gmail.com, nicolas.frattaroli@collabora.com, cristian.ciocaltea@collabora.com, dmitry.baryshkov@oss.qualcomm.com, luca.ceresoli@bootlin.com, dianders@chromium.org, m.szyprowski@samsung.com, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v4 3/3] drm/bridge: analogix_dp: Add support for optional data-lanes mapping Message-ID: References: <20260529040530.741336-1-damon.ding@rock-chips.com> <20260529040530.741336-4-damon.ding@rock-chips.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="t74ugcorb2thls5c" Content-Disposition: inline In-Reply-To: <20260529040530.741336-4-damon.ding@rock-chips.com> X-Zoho-Virus-Status: 1 X-Zoho-AV-Stamp: zmail-av-0.2.2.1.5.2/280.300.36 X-ZohoMailClient: External X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260601_050005_790484_5E4B64FD X-CRM114-Status: GOOD ( 30.13 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org --t74ugcorb2thls5c Content-Type: text/plain; protected-headers=v1; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Subject: Re: [PATCH v4 3/3] drm/bridge: analogix_dp: Add support for optional data-lanes mapping MIME-Version: 1.0 Hi, On Fri, May 29, 2026 at 12:05:30PM +0800, Damon Ding wrote: > Parse the optional 'data-lanes' device tree property to support > custom physical lane mapping configuration. >=20 > If no valid configuration is found, fall back to the default > lane map (0, 1, 2, 3) automatically and keep the driver running. >=20 > Lane mapping is mainly used for below scenarios: > 1. Correct PCB lane swap and differential line routing crossover > without hardware changes; > 2. Adapt mismatched lane pin definitions between SoC and eDP panel; > 3. Support multiple panel hardware variants on the same board > by configuring data-lanes in device tree only. >=20 > Signed-off-by: Damon Ding >=20 > --- Reviewed-by: Sebastian Reichel Greetings, -- Sebastian >=20 > Changes in v2: > - Add lane mapping application scenarios in commit message. > --- > .../drm/bridge/analogix/analogix_dp_core.c | 56 +++++++++++++++++++ > .../drm/bridge/analogix/analogix_dp_core.h | 4 +- > .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 15 +++-- > .../gpu/drm/bridge/analogix/analogix_dp_reg.h | 4 ++ > 4 files changed, 70 insertions(+), 9 deletions(-) >=20 > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers= /gpu/drm/bridge/analogix/analogix_dp_core.c > index 699a7f380c56..b2e729850391 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > @@ -1234,6 +1234,59 @@ static const struct drm_bridge_funcs analogix_dp_b= ridge_funcs =3D { > .detect =3D analogix_dp_bridge_detect, > }; > =20 > +static int analogix_dp_dt_parse_lanes_map(struct analogix_dp_device *dp) > +{ > + struct video_info *video_info =3D &dp->video_info; > + struct device_node *endpoint; > + u32 tmp[LANE_COUNT4]; > + u32 map[LANE_COUNT4] =3D {0, 1, 2, 3}; > + bool used[LANE_COUNT4] =3D {false}; > + int num_lanes; > + int ret, i; > + > + memcpy(video_info->lane_map, map, sizeof(map)); > + > + num_lanes =3D drm_of_get_data_lanes_count_ep(dp->dev->of_node, 1, 0, 1, > + video_info->max_lane_count); > + if (num_lanes < 0) > + return -EINVAL; > + > + endpoint =3D of_graph_get_endpoint_by_regs(dp->dev->of_node, 1, -1); > + if (!endpoint) > + return -EINVAL; > + > + ret =3D of_property_read_u32_array(endpoint, "data-lanes", tmp, num_lan= es); > + of_node_put(endpoint); > + if (ret) > + return -EINVAL; > + > + for (i =3D 0; i < num_lanes; i++) { > + if (tmp[i] >=3D LANE_COUNT4) { > + dev_dbg(dp->dev, "data-lanes[%d] =3D %u is out of range\n", i, tmp[i]= ); > + return -EINVAL; > + } > + > + if (used[tmp[i]]) { > + dev_dbg(dp->dev, "data-lanes[%d] =3D %u is duplicate\n", i, tmp[i]); > + return -EINVAL; > + } > + > + used[tmp[i]] =3D true; > + map[i] =3D tmp[i]; > + } > + > + for (i =3D 0; i < LANE_COUNT4 && num_lanes < LANE_COUNT4; i++) { > + if (!used[i]) > + map[num_lanes++] =3D i; > + } > + > + dev_dbg(dp->dev, "Using parsed lane map: <%u %u %u %u>\n", map[0], map[= 1], map[2], map[3]); > + > + memcpy(video_info->lane_map, map, sizeof(map)); > + > + return 0; > +} > + > static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp) > { > struct device_node *dp_node =3D dp->dev->of_node; > @@ -1274,6 +1327,9 @@ static int analogix_dp_dt_parse_pdata(struct analog= ix_dp_device *dp) > break; > } > =20 > + if (analogix_dp_dt_parse_lanes_map(dp)) > + dev_dbg(dp->dev, "No valid data-lanes found, using default lane map\n"= ); > + > return 0; > } > =20 > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers= /gpu/drm/bridge/analogix/analogix_dp_core.h > index 17347448c6b0..634fad241e69 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h > @@ -137,6 +137,8 @@ struct video_info { > =20 > int max_link_rate; > enum link_lane_count_type max_lane_count; > + > + u32 lane_map[LANE_COUNT4]; > }; > =20 > struct link_train { > @@ -175,7 +177,7 @@ struct analogix_dp_device { > /* analogix_dp_reg.c */ > void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool e= nable); > void analogix_dp_stop_video(struct analogix_dp_device *dp); > -void analogix_dp_lane_swap(struct analogix_dp_device *dp, bool enable); > +void analogix_dp_lane_mapping(struct analogix_dp_device *dp); > void analogix_dp_init_analog_param(struct analogix_dp_device *dp); > void analogix_dp_init_interrupt(struct analogix_dp_device *dp); > void analogix_dp_reset(struct analogix_dp_device *dp); > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/= gpu/drm/bridge/analogix/analogix_dp_reg.c > index 38fd8d5014d2..45c7652645a1 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c > @@ -48,16 +48,15 @@ void analogix_dp_stop_video(struct analogix_dp_device= *dp) > writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1); > } > =20 > -void analogix_dp_lane_swap(struct analogix_dp_device *dp, bool enable) > +void analogix_dp_lane_mapping(struct analogix_dp_device *dp) > { > + u32 *lane_map =3D dp->video_info.lane_map; > u32 reg; > =20 > - if (enable) > - reg =3D LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 | > - LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3; > - else > - reg =3D LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 | > - LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0; > + reg =3D lane_map[0] << LANE0_MAP_SHIFT; > + reg |=3D lane_map[1] << LANE1_MAP_SHIFT; > + reg |=3D lane_map[2] << LANE2_MAP_SHIFT; > + reg |=3D lane_map[3] << LANE3_MAP_SHIFT; > =20 > writel(reg, dp->reg_base + ANALOGIX_DP_LANE_MAP); > } > @@ -140,7 +139,7 @@ void analogix_dp_reset(struct analogix_dp_device *dp) > =20 > usleep_range(20, 30); > =20 > - analogix_dp_lane_swap(dp, 0); > + analogix_dp_lane_mapping(dp); > =20 > writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_1); > writel(0x40, dp->reg_base + ANALOGIX_DP_SYS_CTL_2); > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h b/drivers/= gpu/drm/bridge/analogix/analogix_dp_reg.h > index 12735139046c..ac914e37089b 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h > @@ -209,6 +209,10 @@ > #define LANE0_MAP_LOGIC_LANE_1 (0x1 << 0) > #define LANE0_MAP_LOGIC_LANE_2 (0x2 << 0) > #define LANE0_MAP_LOGIC_LANE_3 (0x3 << 0) > +#define LANE3_MAP_SHIFT (6) > +#define LANE2_MAP_SHIFT (4) > +#define LANE1_MAP_SHIFT (2) > +#define LANE0_MAP_SHIFT (0) > =20 > /* ANALOGIX_DP_ANALOG_CTL_1 */ > #define TX_TERMINAL_CTRL_50_OHM (0x1 << 4) > --=20 > 2.34.1 >=20 --t74ugcorb2thls5c Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE72YNB0Y/i3JqeVQT2O7X88g7+poFAmoddCEACgkQ2O7X88g7 +poaCQ//T78V/qc8Cf73l6MRp6lUG032nhDoN6X5opJBT/O4rt8pXA1BBah+QUlS Jak5Y/RU4d9Ho9lu3EG2DJMDIeEuI9PcHORVGRXsTlDt1+WvVzcGsiDhxpUrJ5hP eyszyt/z6GmRJ/WIj+PQunwssofNoKtA5CxeNAv8K8e9euGYu5A4YVqODHmb6rlj V5eOc8rVY9EHKAWa5q3adANnAyR18zItfQ3zu2Fqz3flV/h/MxmtHrhYp/dHcp2F uspj8JWQA4sRJaIHhyQVRUI4bQjtxscVDlJCGr9pJOgnEJx7ivRmeXIfUaSXKnMD g4YcTxh3oRVj0mI3GAhfOXvMTloMub+DZ4v/dxRp/R255D5sx94DtiMHdBxGH6f2 eU2Ny/VCeLSfPq42kR7RD8Tfg5udQEpQ+CCjLaNduZDOFgYJjP45G6L+ogGqHs7L osXOatEeey1LfK3bLV6FZXIySDEJrz4jPsW6nkCrfcf3S6hQpoqz4qoPLB6TGjqb ryK+AB0v1StH6AJh3bR8qjD2r4HNYSAtRCPkIBAnzX9YNhLhD4WmPrsQ9O0iT2PD kJtIUDzmnGDTbY0uZ6CxtgQLfaO0mXX18hhO+LsRq1wQvVnQg2Pb5hvFVZfYZVdv 6z1qAeNg4deE8A4fPnkbiPnQ02qwsu3zmy0MBfd/r5NpkxCN/Ac= =+lYi -----END PGP SIGNATURE----- --t74ugcorb2thls5c--