From nobody Wed Oct 8 19:20:35 2025 Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) (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 C4AC42FCE33 for ; Wed, 25 Jun 2025 16:46:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.197 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750869985; cv=none; b=JZYDP2RlGxW36IGNuC5aKJ9n4iTmBIBi5VITKvSzeTJmT3yBl15hk2lMCptyAm5a2mG5yIdzirt6B9lzcxsJ3gccTiLpKxVSrLgKuai3K7ISWpnAa8PW5cDLEes4+gFXI5hN/30WJPBmrnNNZxxUUHjxZ4+RWhw6mgKzi3JPgsA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750869985; c=relaxed/simple; bh=btkUD3js9fZmPERHdg4b2imu/6qqDfNt+jC1CiXGkOg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gdgq6pU7NkOd9GdmUpvZDlKkR96N8gkQhk4vlpdOE1HGU6ae+lW7w6oUBV676qHPJ9KlQmeTreqgEkZezie7c1fP3LquuDeKw44c/zIxxztcviTjwZlDv3tCS+AcHMGsuDDYROhf8M54RBTAj+ehWkUsbdzm17bfqgXZp3YzwVg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=KwMhO1fW; arc=none smtp.client-ip=217.70.183.197 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="KwMhO1fW" Received: by mail.gandi.net (Postfix) with ESMTPSA id C94EF44386; Wed, 25 Jun 2025 16:46:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1750869982; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PhdruiDO3p/+Z0EKuOpJRIFOGJMP+PiOgTpEv4z015E=; b=KwMhO1fWnjVqOOMp6urimEkFl+ESq42B9iNjuacKArivE5QzI6MWLywJPvNxn5dKh/ECzi IVhsNaHW52CFt14jRY+8f/Pb50qMh3M6ymA4W9s7Vgdjpevj/nlFAUJ3zd3zl3axXq5y9I YLOj8+Zw4atqfyjX1pYJMAqHUIeQT85MkZRpmQQqE4rbj7BuaaLqG42LIroiBqweNflh7d H+QR2juwwKA1jFqs8usmdfolQOp+omTQar/sOVos/nAQz9BR1WMdlGA1yuXtxTt14eezIl OZm0UE+uNUFaJzIu2VNIF0e1yj8UyyE+1cBaPh+ZeqjAzDaLNxxi2SaO5+bRxg== From: Luca Ceresoli Date: Wed, 25 Jun 2025 18:45:30 +0200 Subject: [PATCH 26/32] drm/bridge: cdns-dsi: convert to the .attach_new op Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250625-drm-dsi-host-no-device-ptr-v1-26-e36bc258a7c5@bootlin.com> References: <20250625-drm-dsi-host-no-device-ptr-v1-0-e36bc258a7c5@bootlin.com> In-Reply-To: <20250625-drm-dsi-host-no-device-ptr-v1-0-e36bc258a7c5@bootlin.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Inki Dae , Jagan Teki , Marek Szyprowski , Jani Nikula , Dmitry Baryshkov Cc: Hui Pu , Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-sunxi@lists.linux.dev, Luca Ceresoli X-Mailer: b4 0.14.2 X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtddvgddvfedvkecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertdertdejnecuhfhrohhmpefnuhgtrgcuvegvrhgvshholhhiuceolhhutggrrdgtvghrvghsohhlihessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepieeiuedvffetgfeuudelheeutefggfejieettdetteekueeuueeukeevvedvueevnecukfhppedvrgdtvdemieejtdemvddtvddtmegvrgdtudemsggvgedumeelhegvjeemfeegfeemledufegvnecuvehluhhsthgvrhfuihiivgepvdehnecurfgrrhgrmhepihhnvghtpedvrgdtvdemieejtdemvddtvddtmegvrgdtudemsggvgedumeelhegvjeemfeegfeemledufegvpdhhvghloheplgduledvrdduieekrddujeekrdejhegnpdhmrghilhhfrhhomheplhhutggrrdgtvghrvghsohhlihessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddvpdhrtghpthhtohepjhhonhgrsheskhifihgsohhordhsvgdprhgtphhtthhopehthhhomhgrshdrphgvthgriiiiohhnihessghoohhtlhhinhdrtghomhdprhgtphhtthhopehlihhnuhigqdhsuhhngihisehlihhsthhsrdhlihhnuhigrdguvghvp dhrtghpthhtohepmhdrshiihihprhhofihskhhisehsrghmshhunhhgrdgtohhmpdhrtghpthhtoheprhhfohhssheskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepmhgrrghrthgvnhdrlhgrnhhkhhhorhhstheslhhinhhugidrihhnthgvlhdrtghomhdprhgtphhtthhopehnvghilhdrrghrmhhsthhrohhngheslhhinhgrrhhordhorhhgpdhrtghpthhtohepjhgrnhhirdhnihhkuhhlrgeslhhinhhugidrihhnthgvlhdrtghomh X-GND-Sasl: luca.ceresoli@bootlin.com This op does not pass any pointer to the DSI device, so the DSI host driver cannot store it. This driver uses the DSI device format parameters in various places outside the .attach op, and currently it does so by storing a pointer to the struct mipi_dsi_device. That's exactly what .attach_new aims at removing. Store a copy of the format parameters instead of the struct mipi_dsi_device pointer. Signed-off-by: Luca Ceresoli --- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c | 57 +++++++++++++---------= ---- drivers/gpu/drm/bridge/cadence/cdns-dsi-core.h | 2 +- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c b/drivers/gpu/d= rm/bridge/cadence/cdns-dsi-core.c index 005aa6121227b2f7ac682f3b724e4518e8e5f721..15743d29a8d4fb9074f04b65a3c= 4bb390a5829d2 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c @@ -487,10 +487,10 @@ static int cdns_dsi_mode2cfg(struct cdns_dsi *dsi, =20 memset(dsi_cfg, 0, sizeof(*dsi_cfg)); =20 - if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) + if (output->bus_fmt.mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) sync_pulse =3D true; =20 - bpp =3D mipi_dsi_pixel_format_to_bpp(output->dev->format); + bpp =3D mipi_dsi_pixel_format_to_bpp(output->bus_fmt.format); =20 if (mode_valid_check) tmp =3D mode->htotal - @@ -534,10 +534,10 @@ static int cdns_dsi_adjust_phy_config(struct cdns_dsi= *dsi, unsigned long dpi_htotal; unsigned long dpi_hz; unsigned int dsi_hfp_ext; - unsigned int lanes =3D output->dev->lanes; + unsigned int lanes =3D output->bus_fmt.lanes; =20 dsi_htotal =3D dsi_cfg->hbp + DSI_HBP_FRAME_OVERHEAD; - if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) + if (output->bus_fmt.mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) dsi_htotal +=3D dsi_cfg->hsa + DSI_HSA_FRAME_OVERHEAD; =20 dsi_htotal +=3D dsi_cfg->hact; @@ -578,7 +578,7 @@ static int cdns_dsi_check_conf(struct cdns_dsi *dsi, struct cdns_dsi_output *output =3D &dsi->output; struct phy_configure_opts_mipi_dphy *phy_cfg =3D &output->phy_opts.mipi_d= phy; unsigned long dsi_hss_hsa_hse_hbp; - unsigned int nlanes =3D output->dev->lanes; + unsigned int nlanes =3D output->bus_fmt.lanes; int mode_clock =3D (mode_valid_check ? mode->clock : mode->crtc_clock); int ret; =20 @@ -587,7 +587,7 @@ static int cdns_dsi_check_conf(struct cdns_dsi *dsi, return ret; =20 ret =3D phy_mipi_dphy_get_default_config(mode_clock * 1000, - mipi_dsi_pixel_format_to_bpp(output->dev->format), + mipi_dsi_pixel_format_to_bpp(output->bus_fmt.format), nlanes, phy_cfg); if (ret) return ret; @@ -601,7 +601,7 @@ static int cdns_dsi_check_conf(struct cdns_dsi *dsi, return ret; =20 dsi_hss_hsa_hse_hbp =3D dsi_cfg->hbp + DSI_HBP_FRAME_OVERHEAD; - if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) + if (output->bus_fmt.mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) dsi_hss_hsa_hse_hbp +=3D dsi_cfg->hsa + DSI_HSA_FRAME_OVERHEAD; =20 /* @@ -659,7 +659,7 @@ cdns_dsi_bridge_mode_valid(struct drm_bridge *bridge, return MODE_V_ILLEGAL; =20 /* HACT must be 32-bits aligned. */ - bpp =3D mipi_dsi_pixel_format_to_bpp(output->dev->format); + bpp =3D mipi_dsi_pixel_format_to_bpp(output->bus_fmt.format); if ((mode->hdisplay * bpp) % 32) return MODE_H_ILLEGAL; =20 @@ -739,7 +739,7 @@ static void cdns_dsi_hs_init(struct cdns_dsi *dsi) status & PLL_LOCKED, 100, 100)); /* De-assert data and clock reset lines. */ writel(DPHY_CMN_PSO | DPHY_ALL_D_PDN | DPHY_C_PDN | DPHY_CMN_PDN | - DPHY_D_RSTB(output->dev->lanes) | DPHY_C_RSTB, + DPHY_D_RSTB(output->bus_fmt.lanes) | DPHY_C_RSTB, dsi->regs + MCTL_DPHY_CFG0); dsi->phy_initialized =3D true; } @@ -755,10 +755,10 @@ static void cdns_dsi_init_link(struct cdns_dsi *dsi) return; =20 val =3D 0; - for (i =3D 1; i < output->dev->lanes; i++) + for (i =3D 1; i < output->bus_fmt.lanes; i++) val |=3D DATA_LANE_EN(i); =20 - if (!(output->dev->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)) + if (!(output->bus_fmt.mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)) val |=3D CLK_CONTINUOUS; =20 writel(val, dsi->regs + MCTL_MAIN_PHY_CTL); @@ -772,7 +772,7 @@ static void cdns_dsi_init_link(struct cdns_dsi *dsi) writel(LINK_EN, dsi->regs + MCTL_MAIN_DATA_CTL); =20 val =3D CLK_LANE_EN | PLL_START; - for (i =3D 0; i < output->dev->lanes; i++) + for (i =3D 0; i < output->bus_fmt.lanes; i++) val |=3D DATA_LANE_START(i); =20 writel(val, dsi->regs + MCTL_MAIN_EN); @@ -830,7 +830,7 @@ static void cdns_dsi_bridge_atomic_pre_enable(struct dr= m_bridge *bridge, conn_state =3D drm_atomic_get_new_connector_state(state, connector); crtc_state =3D drm_atomic_get_new_crtc_state(state, conn_state->crtc); mode =3D &crtc_state->adjusted_mode; - nlanes =3D output->dev->lanes; + nlanes =3D output->bus_fmt.lanes; =20 cdns_dsi_init_link(dsi); cdns_dsi_hs_init(dsi); @@ -863,21 +863,21 @@ static void cdns_dsi_bridge_atomic_pre_enable(struct = drm_bridge *bridge, (dsi_cfg.hsa + DSI_BLANKING_FRAME_OVERHEAD + DSI_HSA_FRAME_OVERHEAD); writel(BLK_LINE_PULSE_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE2); - if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) + if (output->bus_fmt.mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) writel(MAX_LINE_LIMIT(tmp - DSI_NULL_FRAME_OVERHEAD), dsi->regs + VID_VCA_SETTING2); =20 tmp =3D dsi_cfg.htotal - (DSI_HSS_VSS_VSE_FRAME_OVERHEAD + DSI_BLANKING_FRAME_OVERHEAD); writel(BLK_LINE_EVENT_PKT_LEN(tmp), dsi->regs + VID_BLKSIZE1); - if (!(output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)) + if (!(output->bus_fmt.mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)) writel(MAX_LINE_LIMIT(tmp - DSI_NULL_FRAME_OVERHEAD), dsi->regs + VID_VCA_SETTING2); =20 tmp =3D DIV_ROUND_UP(dsi_cfg.htotal, nlanes) - DIV_ROUND_UP(dsi_cfg.hsa, nlanes); =20 - if (!(output->dev->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)) + if (!(output->bus_fmt.mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)) tmp -=3D DIV_ROUND_UP(DSI_EOT_PKT_SIZE, nlanes); =20 tx_byte_period =3D DIV_ROUND_DOWN_ULL((u64)NSEC_PER_SEC * 8, @@ -909,8 +909,8 @@ static void cdns_dsi_bridge_atomic_pre_enable(struct dr= m_bridge *bridge, =20 writel(LPRX_TIMEOUT(tmp), dsi->regs + MCTL_DPHY_TIMEOUT2); =20 - if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO) { - switch (output->dev->format) { + if (output->bus_fmt.mode_flags & MIPI_DSI_MODE_VIDEO) { + switch (output->bus_fmt.format) { case MIPI_DSI_FMT_RGB888: tmp =3D VID_PIXEL_MODE_RGB888 | VID_DATATYPE(MIPI_DSI_PACKED_PIXEL_STREAM_24); @@ -936,7 +936,7 @@ static void cdns_dsi_bridge_atomic_pre_enable(struct dr= m_bridge *bridge, return; } =20 - if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) + if (output->bus_fmt.mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE) tmp |=3D SYNC_PULSE_ACTIVE | SYNC_PULSE_HORIZONTAL; =20 tmp |=3D REG_BLKLINE_MODE(REG_BLK_MODE_BLANKING_PKT) | @@ -950,10 +950,10 @@ static void cdns_dsi_bridge_atomic_pre_enable(struct = drm_bridge *bridge, tmp =3D readl(dsi->regs + MCTL_MAIN_DATA_CTL); tmp &=3D ~(IF_VID_SELECT_MASK | HOST_EOT_GEN | IF_VID_MODE); =20 - if (!(output->dev->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)) + if (!(output->bus_fmt.mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)) tmp |=3D HOST_EOT_GEN; =20 - if (output->dev->mode_flags & MIPI_DSI_MODE_VIDEO) + if (output->bus_fmt.mode_flags & MIPI_DSI_MODE_VIDEO) tmp |=3D IF_VID_MODE | IF_VID_SELECT(input->id) | VID_EN; =20 writel(tmp, dsi->regs + MCTL_MAIN_DATA_CTL); @@ -980,7 +980,7 @@ static u32 *cdns_dsi_bridge_get_input_bus_fmts(struct d= rm_bridge *bridge, if (!input_fmts) return NULL; =20 - input_fmts[0] =3D drm_mipi_dsi_get_input_bus_fmt(output->dev->format); + input_fmts[0] =3D drm_mipi_dsi_get_input_bus_fmt(output->bus_fmt.format); if (!input_fmts[0]) return NULL; =20 @@ -1066,7 +1066,7 @@ static const struct drm_bridge_funcs cdns_dsi_bridge_= funcs =3D { }; =20 static int cdns_dsi_attach(struct mipi_dsi_host *host, - struct mipi_dsi_device *dev) + const struct mipi_dsi_bus_fmt *bus_fmt) { struct cdns_dsi *dsi =3D to_cdns_dsi(host); struct cdns_dsi_output *output =3D &dsi->output; @@ -1078,11 +1078,11 @@ static int cdns_dsi_attach(struct mipi_dsi_host *ho= st, * same host. In order to support that we'd need the DRM bridge * framework to allow dynamic reconfiguration of the bridge chain. */ - if (output->dev) + if (output->bus_fmt.lanes) return -EBUSY; =20 /* We do not support burst mode yet. */ - if (dev->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) + if (bus_fmt->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) return -ENOTSUPP; =20 /* @@ -1091,12 +1091,12 @@ static int cdns_dsi_attach(struct mipi_dsi_host *ho= st, * this representation. */ bridge =3D devm_drm_of_get_bridge(dsi->base.dev, dsi->base.dev->of_node, - DSI_OUTPUT_PORT, dev->channel); + DSI_OUTPUT_PORT, bus_fmt->channel); if (IS_ERR(bridge)) return PTR_ERR(bridge); =20 - output->dev =3D dev; output->bridge =3D bridge; + output->bus_fmt =3D *bus_fmt; =20 /* * The DSI output has been properly configured, we can now safely @@ -1254,7 +1254,7 @@ static ssize_t cdns_dsi_transfer(struct mipi_dsi_host= *host, } =20 static const struct mipi_dsi_host_ops cdns_dsi_ops =3D { - .attach =3D cdns_dsi_attach, + .attach_new =3D cdns_dsi_attach, .detach =3D cdns_dsi_detach, .transfer =3D cdns_dsi_transfer, }; @@ -1437,4 +1437,3 @@ MODULE_AUTHOR("Boris Brezillon "); MODULE_DESCRIPTION("Cadence DSI driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:cdns-dsi"); - diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.h b/drivers/gpu/d= rm/bridge/cadence/cdns-dsi-core.h index 5db5dbbbcaadbe7a49596b349e381a671741a810..7439f88994cac1d454d7027fd88= abcd82b7847e3 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.h +++ b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.h @@ -19,9 +19,9 @@ struct clk; struct reset_control; =20 struct cdns_dsi_output { - struct mipi_dsi_device *dev; struct drm_bridge *bridge; union phy_configure_opts phy_opts; + struct mipi_dsi_bus_fmt bus_fmt; }; =20 enum cdns_dsi_input_id { --=20 2.49.0