From: Neil Armstrong <neil.armstrong@linaro.org>
To: Hironori KIKUCHI <kikuchan98@gmail.com>, linux-kernel@vger.kernel.org
Cc: Jagan Teki <jagan@amarulasolutions.com>,
Jessica Zhang <quic_jesszhan@quicinc.com>,
Sam Ravnborg <sam@ravnborg.org>, David Airlie <airlied@gmail.com>,
Daniel Vetter <daniel@ffwll.ch>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org
Subject: Re: [PATCH v3 2/5] drm/panel: st7701: Decouple DSI and DRM parts
Date: Mon, 8 Jul 2024 09:44:29 +0200 [thread overview]
Message-ID: <c6a911c9-64e4-46aa-a6da-3311907b1c8b@linaro.org> (raw)
In-Reply-To: <20240706102338.99231-3-kikuchan98@gmail.com>
On 06/07/2024 12:23, Hironori KIKUCHI wrote:
> Split into a DSI-specific part and a DRM-specific part.
>
> Additionally, use devm_add_action_or_reset() to simplify the flow,
> and disable and unprepare the panel on cleanup.
>
> Signed-off-by: Hironori KIKUCHI <kikuchan98@gmail.com>
> ---
> drivers/gpu/drm/panel/panel-sitronix-st7701.c | 72 ++++++++++++-------
> 1 file changed, 45 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7701.c b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> index a9a8fd85057..a0644f7a4c8 100644
> --- a/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> +++ b/drivers/gpu/drm/panel/panel-sitronix-st7701.c
> @@ -539,7 +539,7 @@ static int st7701_get_modes(struct drm_panel *panel,
>
> mode = drm_mode_duplicate(connector->dev, desc_mode);
> if (!mode) {
> - dev_err(&st7701->dsi->dev, "failed to add mode %ux%u@%u\n",
> + dev_err(panel->dev, "failed to add mode %ux%u@%u\n",
> desc_mode->hdisplay, desc_mode->vdisplay,
> drm_mode_vrefresh(desc_mode));
> return -ENOMEM;
> @@ -974,42 +974,48 @@ static const struct st7701_panel_desc rg_arc_desc = {
> .gip_sequence = rg_arc_gip_sequence,
> };
>
> -static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
> +static void st7701_cleanup(void *data)
> +{
> + struct st7701 *st7701 = (struct st7701 *)data;
> +
> + drm_panel_remove(&st7701->panel);
> + drm_panel_disable(&st7701->panel);
> + drm_panel_unprepare(&st7701->panel);
> +}
> +
> +static int st7701_probe(struct device *dev, int connector_type)
> {
> const struct st7701_panel_desc *desc;
> struct st7701 *st7701;
> int ret;
>
> - st7701 = devm_kzalloc(&dsi->dev, sizeof(*st7701), GFP_KERNEL);
> + st7701 = devm_kzalloc(dev, sizeof(*st7701), GFP_KERNEL);
> if (!st7701)
> return -ENOMEM;
>
> - desc = of_device_get_match_data(&dsi->dev);
> - dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
> - MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS;
> - dsi->format = desc->format;
> - dsi->lanes = desc->lanes;
> + desc = of_device_get_match_data(dev);
> + if (!desc)
> + return -ENODEV;
>
> st7701->supplies[0].supply = "VCC";
> st7701->supplies[1].supply = "IOVCC";
>
> - ret = devm_regulator_bulk_get(&dsi->dev, ARRAY_SIZE(st7701->supplies),
> + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(st7701->supplies),
> st7701->supplies);
> if (ret < 0)
> return ret;
>
> - st7701->reset = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
> + st7701->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
> if (IS_ERR(st7701->reset)) {
> - dev_err(&dsi->dev, "Couldn't get our reset GPIO\n");
> + dev_err(dev, "Couldn't get our reset GPIO\n");
> return PTR_ERR(st7701->reset);
> }
>
> - ret = of_drm_get_panel_orientation(dsi->dev.of_node, &st7701->orientation);
> + ret = of_drm_get_panel_orientation(dev->of_node, &st7701->orientation);
> if (ret < 0)
> - return dev_err_probe(&dsi->dev, ret, "Failed to get orientation\n");
> + return dev_err_probe(dev, ret, "Failed to get orientation\n");
>
> - drm_panel_init(&st7701->panel, &dsi->dev, &st7701_funcs,
> - DRM_MODE_CONNECTOR_DSI);
> + drm_panel_init(&st7701->panel, dev, &st7701_funcs, connector_type);
>
> /**
> * Once sleep out has been issued, ST7701 IC required to wait 120ms
> @@ -1028,27 +1034,39 @@ static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
>
> drm_panel_add(&st7701->panel);
>
> - mipi_dsi_set_drvdata(dsi, st7701);
> - st7701->dsi = dsi;
> + dev_set_drvdata(dev, st7701);
> st7701->desc = desc;
>
> - ret = mipi_dsi_attach(dsi);
> - if (ret)
> - goto err_attach;
> + return devm_add_action_or_reset(dev, st7701_cleanup, st7701);
> +}
> +
> +static int st7701_dsi_probe(struct mipi_dsi_device *dsi)
> +{
> + struct st7701 *st7701;
> + int err;
> +
> + err = st7701_probe(&dsi->dev, DRM_MODE_CONNECTOR_DSI);
> + if (err)
> + return err;
> +
> + st7701 = dev_get_drvdata(&dsi->dev);
> + st7701->dsi = dsi;
> +
> + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
> + MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS;
> + dsi->format = st7701->desc->format;
> + dsi->lanes = st7701->desc->lanes;
> +
> + err = mipi_dsi_attach(dsi);
> + if (err)
> + return dev_err_probe(&dsi->dev, err, "Failed to init MIPI DSI\n");
>
> return 0;
> -
> -err_attach:
> - drm_panel_remove(&st7701->panel);
> - return ret;
> }
>
> static void st7701_dsi_remove(struct mipi_dsi_device *dsi)
> {
> - struct st7701 *st7701 = mipi_dsi_get_drvdata(dsi);
> -
> mipi_dsi_detach(dsi);
> - drm_panel_remove(&st7701->panel);
> }
>
> static const struct of_device_id st7701_of_match[] = {
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
next prev parent reply other threads:[~2024-07-08 7:44 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-06 10:23 [PATCH v3 0/5] drm/panel: st7701: Add Anbernic RG28XX panel support Hironori KIKUCHI
2024-07-06 10:23 ` [PATCH v3 1/5] drm/panel: st7701: Rename macros Hironori KIKUCHI
2024-07-08 7:43 ` Neil Armstrong
2024-07-12 21:37 ` Jessica Zhang
2024-07-06 10:23 ` [PATCH v3 2/5] drm/panel: st7701: Decouple DSI and DRM parts Hironori KIKUCHI
2024-07-08 7:44 ` Neil Armstrong [this message]
2024-07-06 10:23 ` [PATCH v3 3/5] dt-bindings: display: st7701: Add Anbernic RG28XX panel Hironori KIKUCHI
2024-07-10 14:01 ` Conor Dooley
2024-07-24 7:54 ` Neil Armstrong
2024-07-06 10:23 ` [PATCH v3 4/5] drm/panel: st7701: Add support for SPI for configuration Hironori KIKUCHI
2024-07-24 7:53 ` Neil Armstrong
2024-07-06 10:23 ` [PATCH v3 5/5] drm/panel: st7701: Add Anbernic RG28XX panel support Hironori KIKUCHI
2024-07-24 7:54 ` Neil Armstrong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c6a911c9-64e4-46aa-a6da-3311907b1c8b@linaro.org \
--to=neil.armstrong@linaro.org \
--cc=airlied@gmail.com \
--cc=conor+dt@kernel.org \
--cc=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=jagan@amarulasolutions.com \
--cc=kikuchan98@gmail.com \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=quic_jesszhan@quicinc.com \
--cc=robh@kernel.org \
--cc=sam@ravnborg.org \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®