From nobody Sat Apr 11 14:30:46 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DD37BC678D5 for ; Tue, 7 Mar 2023 15:08:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230491AbjCGPIz (ORCPT ); Tue, 7 Mar 2023 10:08:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54860 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230109AbjCGPIX (ORCPT ); Tue, 7 Mar 2023 10:08:23 -0500 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 24FDD9477D; Tue, 7 Mar 2023 07:02:18 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 236B0FDA80; Tue, 7 Mar 2023 07:01:31 -0800 (PST) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BxXrkvE0NLeg; Tue, 7 Mar 2023 07:01:30 -0800 (PST) From: Martin Kepplinger DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=puri.sm; s=comms; t=1678201289; bh=dtdkOCwy9s3nPyIuBhfBbGTaTHH+9miRiDC5P18TY3k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uazh8/EX05g6B7O50HxjZ/SOXJ8DmgYh1xmt8PHk1pe6NsX68HFHnqPjNEYgNNYgp 5JjA1rKifkkuZGMLCqg2ObhaN0+RDO1RLxXo0Uwha4FLc/ymsZxMvOU9c0rKG3p9OW 4GHYRPZO3/zO4SRI9ImMxT4orvfvY6krvpc9kS/31yEBQuLXfbNe+MOTuLOgU9qHwC PUtAPGO2wAbPttuQCOXEckxHUCU7vS6uXNM6qmPccMoiZ3CXQ6zA/PZtxDettRJ90W 7NOrldBPnc81BDZ6uHOAivyAexPlMYvCduUKIa4oouIy7bRAjCL8ISdfMdG1V3Iy8+ 6Z/+TnDfNmaFQ== To: laurent.pinchart@ideasonboard.com, slongerbeam@gmail.com, p.zabel@pengutronix.de, mchehab@kernel.org, gregkh@linuxfoundation.org, shawnguo@kernel.org Cc: kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, linux-media@vger.kernel.org, linux-staging@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel@puri.sm, Martin Kepplinger Subject: [PATCH v2 1/2] media: imx: imx8mq-mipi-csi2: Use V4L2 subdev active state Date: Tue, 7 Mar 2023 16:00:46 +0100 Message-Id: <20230307150047.1486186-2-martin.kepplinger@puri.sm> In-Reply-To: <20230307150047.1486186-1-martin.kepplinger@puri.sm> References: <20230307150047.1486186-1-martin.kepplinger@puri.sm> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Simplify the driver by using the V4L2 subdev active state API to store the active format. Signed-off-by: Martin Kepplinger Reviewed-by: Laurent Pinchart --- drivers/staging/media/imx/imx8mq-mipi-csi2.c | 118 ++++++++----------- 1 file changed, 46 insertions(+), 72 deletions(-) diff --git a/drivers/staging/media/imx/imx8mq-mipi-csi2.c b/drivers/staging= /media/imx/imx8mq-mipi-csi2.c index c0d0bf770096..1aa8622a3bae 100644 --- a/drivers/staging/media/imx/imx8mq-mipi-csi2.c +++ b/drivers/staging/media/imx/imx8mq-mipi-csi2.c @@ -119,9 +119,7 @@ struct csi_state { =20 struct v4l2_mbus_config_mipi_csi2 bus; =20 - struct mutex lock; /* Protect csi2_fmt, format_mbus, state, hs_settle */ - const struct csi2_pix_format *csi2_fmt; - struct v4l2_mbus_framefmt format_mbus[MIPI_CSI2_PADS_NUM]; + struct mutex lock; /* Protect state and hs_settle */ u32 state; u32 hs_settle; =20 @@ -322,16 +320,23 @@ static int imx8mq_mipi_csi_clk_get(struct csi_state *= state) return devm_clk_bulk_get(state->dev, CSI2_NUM_CLKS, state->clks); } =20 -static int imx8mq_mipi_csi_calc_hs_settle(struct csi_state *state) +static int imx8mq_mipi_csi_calc_hs_settle(struct csi_state *state, + struct v4l2_subdev_state *sd_state) { s64 link_freq; u32 lane_rate; unsigned long esc_clk_rate; u32 min_ths_settle, max_ths_settle, ths_settle_ns, esc_clk_period_ns; + const struct v4l2_mbus_framefmt *fmt; + const struct csi2_pix_format *csi2_fmt; =20 /* Calculate the line rate from the pixel rate. */ + + fmt =3D v4l2_subdev_get_pad_format(&state->sd, sd_state, MIPI_CSI2_PAD_SI= NK); + csi2_fmt =3D find_csi2_format(fmt->code); + link_freq =3D v4l2_get_link_freq(state->src_sd->ctrl_handler, - state->csi2_fmt->width, + csi2_fmt->width, state->bus.num_data_lanes * 2); if (link_freq < 0) { dev_err(state->dev, "Unable to obtain link frequency: %d\n", @@ -380,7 +385,8 @@ static int imx8mq_mipi_csi_calc_hs_settle(struct csi_st= ate *state) return 0; } =20 -static int imx8mq_mipi_csi_start_stream(struct csi_state *state) +static int imx8mq_mipi_csi_start_stream(struct csi_state *state, + struct v4l2_subdev_state *sd_state) { int ret; =20 @@ -389,7 +395,7 @@ static int imx8mq_mipi_csi_start_stream(struct csi_stat= e *state) return ret; =20 imx8mq_mipi_csi_set_params(state); - ret =3D imx8mq_mipi_csi_calc_hs_settle(state); + ret =3D imx8mq_mipi_csi_calc_hs_settle(state, sd_state); if (ret) return ret; =20 @@ -415,6 +421,7 @@ static struct csi_state *mipi_sd_to_csi2_state(struct v= 4l2_subdev *sdev) static int imx8mq_mipi_csi_s_stream(struct v4l2_subdev *sd, int enable) { struct csi_state *state =3D mipi_sd_to_csi2_state(sd); + struct v4l2_subdev_state *sd_state; int ret =3D 0; =20 if (enable) { @@ -431,7 +438,9 @@ static int imx8mq_mipi_csi_s_stream(struct v4l2_subdev = *sd, int enable) goto unlock; } =20 - ret =3D imx8mq_mipi_csi_start_stream(state); + sd_state =3D v4l2_subdev_lock_and_get_active_state(sd); + + ret =3D imx8mq_mipi_csi_start_stream(state, sd_state); if (ret < 0) goto unlock; =20 @@ -440,6 +449,8 @@ static int imx8mq_mipi_csi_s_stream(struct v4l2_subdev = *sd, int enable) goto unlock; =20 state->state |=3D ST_STREAMING; + + v4l2_subdev_unlock_state(sd_state); } else { v4l2_subdev_call(state->src_sd, video, s_stream, 0); imx8mq_mipi_csi_stop_stream(state); @@ -455,29 +466,14 @@ static int imx8mq_mipi_csi_s_stream(struct v4l2_subde= v *sd, int enable) return ret; } =20 -static struct v4l2_mbus_framefmt * -imx8mq_mipi_csi_get_format(struct csi_state *state, - struct v4l2_subdev_state *sd_state, - enum v4l2_subdev_format_whence which, - unsigned int pad) -{ - if (which =3D=3D V4L2_SUBDEV_FORMAT_TRY) - return v4l2_subdev_get_try_format(&state->sd, sd_state, pad); - - return &state->format_mbus[pad]; -} - static int imx8mq_mipi_csi_init_cfg(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state) { - struct csi_state *state =3D mipi_sd_to_csi2_state(sd); struct v4l2_mbus_framefmt *fmt_sink; struct v4l2_mbus_framefmt *fmt_source; - enum v4l2_subdev_format_whence which; =20 - which =3D sd_state ? V4L2_SUBDEV_FORMAT_TRY : V4L2_SUBDEV_FORMAT_ACTIVE; - fmt_sink =3D imx8mq_mipi_csi_get_format(state, sd_state, which, - MIPI_CSI2_PAD_SINK); + fmt_sink =3D v4l2_subdev_get_pad_format(sd, sd_state, MIPI_CSI2_PAD_SINK); + fmt_source =3D v4l2_subdev_get_pad_format(sd, sd_state, MIPI_CSI2_PAD_SOU= RCE); =20 fmt_sink->code =3D MEDIA_BUS_FMT_SGBRG10_1X10; fmt_sink->width =3D MIPI_CSI2_DEF_PIX_WIDTH; @@ -491,38 +487,15 @@ static int imx8mq_mipi_csi_init_cfg(struct v4l2_subde= v *sd, V4L2_MAP_QUANTIZATION_DEFAULT(false, fmt_sink->colorspace, fmt_sink->ycbcr_enc); =20 - fmt_source =3D imx8mq_mipi_csi_get_format(state, sd_state, which, - MIPI_CSI2_PAD_SOURCE); *fmt_source =3D *fmt_sink; =20 return 0; } =20 -static int imx8mq_mipi_csi_get_fmt(struct v4l2_subdev *sd, - struct v4l2_subdev_state *sd_state, - struct v4l2_subdev_format *sdformat) -{ - struct csi_state *state =3D mipi_sd_to_csi2_state(sd); - struct v4l2_mbus_framefmt *fmt; - - fmt =3D imx8mq_mipi_csi_get_format(state, sd_state, sdformat->which, - sdformat->pad); - - mutex_lock(&state->lock); - - sdformat->format =3D *fmt; - - mutex_unlock(&state->lock); - - return 0; -} - static int imx8mq_mipi_csi_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_mbus_code_enum *code) { - struct csi_state *state =3D mipi_sd_to_csi2_state(sd); - /* * We can't transcode in any way, the source format is identical * to the sink format. @@ -533,8 +506,7 @@ static int imx8mq_mipi_csi_enum_mbus_code(struct v4l2_s= ubdev *sd, if (code->index > 0) return -EINVAL; =20 - fmt =3D imx8mq_mipi_csi_get_format(state, sd_state, code->which, - code->pad); + fmt =3D v4l2_subdev_get_pad_format(sd, sd_state, code->pad); code->code =3D fmt->code; return 0; } @@ -554,8 +526,7 @@ static int imx8mq_mipi_csi_set_fmt(struct v4l2_subdev *= sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_format *sdformat) { - struct csi_state *state =3D mipi_sd_to_csi2_state(sd); - struct csi2_pix_format const *csi2_fmt; + const struct csi2_pix_format *csi2_fmt; struct v4l2_mbus_framefmt *fmt; =20 /* @@ -563,7 +534,7 @@ static int imx8mq_mipi_csi_set_fmt(struct v4l2_subdev *= sd, * modified. */ if (sdformat->pad =3D=3D MIPI_CSI2_PAD_SOURCE) - return imx8mq_mipi_csi_get_fmt(sd, sd_state, sdformat); + return v4l2_subdev_get_fmt(sd, sd_state, sdformat); =20 if (sdformat->pad !=3D MIPI_CSI2_PAD_SINK) return -EINVAL; @@ -572,10 +543,7 @@ static int imx8mq_mipi_csi_set_fmt(struct v4l2_subdev = *sd, if (!csi2_fmt) csi2_fmt =3D &imx8mq_mipi_csi_formats[0]; =20 - fmt =3D imx8mq_mipi_csi_get_format(state, sd_state, sdformat->which, - sdformat->pad); - - mutex_lock(&state->lock); + fmt =3D v4l2_subdev_get_pad_format(sd, sd_state, sdformat->pad); =20 fmt->code =3D csi2_fmt->code; fmt->width =3D sdformat->format.width; @@ -584,16 +552,9 @@ static int imx8mq_mipi_csi_set_fmt(struct v4l2_subdev = *sd, sdformat->format =3D *fmt; =20 /* Propagate the format from sink to source. */ - fmt =3D imx8mq_mipi_csi_get_format(state, sd_state, sdformat->which, - MIPI_CSI2_PAD_SOURCE); + fmt =3D v4l2_subdev_get_pad_format(sd, sd_state, MIPI_CSI2_PAD_SOURCE); *fmt =3D sdformat->format; =20 - /* Store the CSI2 format descriptor for active formats. */ - if (sdformat->which =3D=3D V4L2_SUBDEV_FORMAT_ACTIVE) - state->csi2_fmt =3D csi2_fmt; - - mutex_unlock(&state->lock); - return 0; } =20 @@ -604,7 +565,7 @@ static const struct v4l2_subdev_video_ops imx8mq_mipi_c= si_video_ops =3D { static const struct v4l2_subdev_pad_ops imx8mq_mipi_csi_pad_ops =3D { .init_cfg =3D imx8mq_mipi_csi_init_cfg, .enum_mbus_code =3D imx8mq_mipi_csi_enum_mbus_code, - .get_fmt =3D imx8mq_mipi_csi_get_fmt, + .get_fmt =3D v4l2_subdev_get_fmt, .set_fmt =3D imx8mq_mipi_csi_set_fmt, }; =20 @@ -732,6 +693,7 @@ static int imx8mq_mipi_csi_pm_resume(struct device *dev) { struct v4l2_subdev *sd =3D dev_get_drvdata(dev); struct csi_state *state =3D mipi_sd_to_csi2_state(sd); + struct v4l2_subdev_state *sd_state; int ret =3D 0; =20 mutex_lock(&state->lock); @@ -741,7 +703,9 @@ static int imx8mq_mipi_csi_pm_resume(struct device *dev) ret =3D imx8mq_mipi_csi_clk_enable(state); } if (state->state & ST_STREAMING) { - ret =3D imx8mq_mipi_csi_start_stream(state); + sd_state =3D v4l2_subdev_lock_and_get_active_state(sd); + ret =3D imx8mq_mipi_csi_start_stream(state, sd_state); + v4l2_subdev_unlock_state(sd_state); if (ret) goto unlock; } @@ -821,6 +785,7 @@ static const struct dev_pm_ops imx8mq_mipi_csi_pm_ops = =3D { static int imx8mq_mipi_csi_subdev_init(struct csi_state *state) { struct v4l2_subdev *sd =3D &state->sd; + int ret; =20 v4l2_subdev_init(sd, &imx8mq_mipi_csi_subdev_ops); sd->owner =3D THIS_MODULE; @@ -834,15 +799,22 @@ static int imx8mq_mipi_csi_subdev_init(struct csi_sta= te *state) =20 sd->dev =3D state->dev; =20 - state->csi2_fmt =3D &imx8mq_mipi_csi_formats[0]; - imx8mq_mipi_csi_init_cfg(sd, NULL); - state->pads[MIPI_CSI2_PAD_SINK].flags =3D MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_MUST_CONNECT; state->pads[MIPI_CSI2_PAD_SOURCE].flags =3D MEDIA_PAD_FL_SOURCE | MEDIA_PAD_FL_MUST_CONNECT; - return media_entity_pads_init(&sd->entity, MIPI_CSI2_PADS_NUM, - state->pads); + ret =3D media_entity_pads_init(&sd->entity, MIPI_CSI2_PADS_NUM, + state->pads); + if (ret) + return ret; + + ret =3D v4l2_subdev_init_finalize(sd); + if (ret) { + media_entity_cleanup(&sd->entity); + return ret; + } + + return 0; } =20 static void imx8mq_mipi_csi_release_icc(struct platform_device *pdev) @@ -968,6 +940,7 @@ static int imx8mq_mipi_csi_probe(struct platform_device= *pdev) imx8mq_mipi_csi_runtime_suspend(&pdev->dev); =20 media_entity_cleanup(&state->sd.entity); + v4l2_subdev_cleanup(&state->sd); v4l2_async_nf_unregister(&state->notifier); v4l2_async_nf_cleanup(&state->notifier); v4l2_async_unregister_subdev(&state->sd); @@ -991,6 +964,7 @@ static int imx8mq_mipi_csi_remove(struct platform_devic= e *pdev) pm_runtime_disable(&pdev->dev); imx8mq_mipi_csi_runtime_suspend(&pdev->dev); media_entity_cleanup(&state->sd.entity); + v4l2_subdev_cleanup(&state->sd); mutex_destroy(&state->lock); pm_runtime_set_suspended(&pdev->dev); imx8mq_mipi_csi_release_icc(pdev); --=20 2.30.2 From nobody Sat Apr 11 14:30:46 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63678C678D5 for ; Tue, 7 Mar 2023 15:08:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230311AbjCGPIb (ORCPT ); Tue, 7 Mar 2023 10:08:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230298AbjCGPIH (ORCPT ); Tue, 7 Mar 2023 10:08:07 -0500 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 68ADE4FF1C; Tue, 7 Mar 2023 07:01:54 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id EF347FDA7E; Tue, 7 Mar 2023 07:01:34 -0800 (PST) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kw7ysgBL9VYr; Tue, 7 Mar 2023 07:01:33 -0800 (PST) From: Martin Kepplinger DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=puri.sm; s=comms; t=1678201293; bh=jlx4mkYv8DWYEk8wvjS1oACmUl5j+kfP5YErl2ThcKQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BQ+JaQmH+kCmbzeAvnKQ9GbiSzv1VOPFzi4IrjiRt/0+x+twMiYXWSoT4BZAiEZyW 7v0BhUXXqbGjjSmwCGJ42+/2u19XXjQl6vmz5loLuNTQFLCKBKw+PZtXfrD0amZK74 r5DHaAXxG+o0BzOYM/xqIb5HLD3K5/0thDY44VuStdOt4ho6OQ1WLR1v30IF3PwoCy 1TGJ0eEh3ASMaWseGxO4rnq4/VXE8tykUlAN7m9hNDvj/pbUhypyQGdDcjcoB2uFGu M0TElc6F/SIMtXo62+T+SPK1qghqJXK0wefIKaqdDj2dyFfCruRD9nmynx5vuU/+FB LXb7G414LHPHg== To: laurent.pinchart@ideasonboard.com, slongerbeam@gmail.com, p.zabel@pengutronix.de, mchehab@kernel.org, gregkh@linuxfoundation.org, shawnguo@kernel.org Cc: kernel@pengutronix.de, festevam@gmail.com, linux-imx@nxp.com, linux-media@vger.kernel.org, linux-staging@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel@puri.sm, Martin Kepplinger Subject: [PATCH v2 2/2] media: imx: imx8mq-mipi-csi2: remove unneeded state variable and function Date: Tue, 7 Mar 2023 16:00:47 +0100 Message-Id: <20230307150047.1486186-3-martin.kepplinger@puri.sm> In-Reply-To: <20230307150047.1486186-1-martin.kepplinger@puri.sm> References: <20230307150047.1486186-1-martin.kepplinger@puri.sm> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Clean up the driver a bit by inlining the imx8mq_mipi_csi_system_enable() function to the callsites and removing the hs_settle variable from the driver state. Signed-off-by: Martin Kepplinger Reviewed-by: Laurent Pinchart --- drivers/staging/media/imx/imx8mq-mipi-csi2.c | 41 ++++++++------------ 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/drivers/staging/media/imx/imx8mq-mipi-csi2.c b/drivers/staging= /media/imx/imx8mq-mipi-csi2.c index 1aa8622a3bae..f10b59b8f1c0 100644 --- a/drivers/staging/media/imx/imx8mq-mipi-csi2.c +++ b/drivers/staging/media/imx/imx8mq-mipi-csi2.c @@ -119,9 +119,8 @@ struct csi_state { =20 struct v4l2_mbus_config_mipi_csi2 bus; =20 - struct mutex lock; /* Protect state and hs_settle */ + struct mutex lock; /* Protect state */ u32 state; - u32 hs_settle; =20 struct regmap *phy_gpr; u8 phy_gpr_reg; @@ -264,23 +263,6 @@ static int imx8mq_mipi_csi_sw_reset(struct csi_state *= state) return 0; } =20 -static void imx8mq_mipi_csi_system_enable(struct csi_state *state, int on) -{ - if (!on) { - imx8mq_mipi_csi_write(state, CSI2RX_CFG_DISABLE_DATA_LANES, 0xf); - return; - } - - regmap_update_bits(state->phy_gpr, - state->phy_gpr_reg, - 0x3fff, - GPR_CSI2_1_RX_ENABLE | - GPR_CSI2_1_VID_INTFC_ENB | - GPR_CSI2_1_HSEL | - GPR_CSI2_1_CONT_CLK_MODE | - GPR_CSI2_1_S_PRG_RXHS_SETTLE(state->hs_settle)); -} - static void imx8mq_mipi_csi_set_params(struct csi_state *state) { int lanes =3D state->bus.num_data_lanes; @@ -321,7 +303,8 @@ static int imx8mq_mipi_csi_clk_get(struct csi_state *st= ate) } =20 static int imx8mq_mipi_csi_calc_hs_settle(struct csi_state *state, - struct v4l2_subdev_state *sd_state) + struct v4l2_subdev_state *sd_state, + u32 *hs_settle) { s64 link_freq; u32 lane_rate; @@ -377,10 +360,10 @@ static int imx8mq_mipi_csi_calc_hs_settle(struct csi_= state *state, max_ths_settle =3D 140 + 10 * 1000000 / (lane_rate / 1000); ths_settle_ns =3D (min_ths_settle + max_ths_settle) / 2; =20 - state->hs_settle =3D ths_settle_ns / esc_clk_period_ns - 1; + *hs_settle =3D ths_settle_ns / esc_clk_period_ns - 1; =20 dev_dbg(state->dev, "lane rate %u Ths_settle %u hs_settle %u\n", - lane_rate, ths_settle_ns, state->hs_settle); + lane_rate, ths_settle_ns, *hs_settle); =20 return 0; } @@ -389,24 +372,32 @@ static int imx8mq_mipi_csi_start_stream(struct csi_st= ate *state, struct v4l2_subdev_state *sd_state) { int ret; + u32 hs_settle; =20 ret =3D imx8mq_mipi_csi_sw_reset(state); if (ret) return ret; =20 imx8mq_mipi_csi_set_params(state); - ret =3D imx8mq_mipi_csi_calc_hs_settle(state, sd_state); + ret =3D imx8mq_mipi_csi_calc_hs_settle(state, sd_state, &hs_settle); if (ret) return ret; =20 - imx8mq_mipi_csi_system_enable(state, true); + regmap_update_bits(state->phy_gpr, + state->phy_gpr_reg, + 0x3fff, + GPR_CSI2_1_RX_ENABLE | + GPR_CSI2_1_VID_INTFC_ENB | + GPR_CSI2_1_HSEL | + GPR_CSI2_1_CONT_CLK_MODE | + GPR_CSI2_1_S_PRG_RXHS_SETTLE(hs_settle)); =20 return 0; } =20 static void imx8mq_mipi_csi_stop_stream(struct csi_state *state) { - imx8mq_mipi_csi_system_enable(state, false); + imx8mq_mipi_csi_write(state, CSI2RX_CFG_DISABLE_DATA_LANES, 0xf); } =20 /* -----------------------------------------------------------------------= ------ --=20 2.30.2