[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAD=FV=XD=L=otnj+YsQ1qEtrO_+wBD-ZYpDNmickcD1tb+6OoA@mail.gmail.com>
Date: Tue, 30 Sep 2025 07:29:08 -0700
From: Doug Anderson <dianders@...omium.org>
To: Svyatoslav Ryhel <clamor95@...il.com>
Cc: Neil Armstrong <neil.armstrong@...aro.org>, Jessica Zhang <quic_jesszhan@...cinc.com>,
Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>, Maxime Ripard <mripard@...nel.org>,
Thomas Zimmermann <tzimmermann@...e.de>, David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>,
Rob Herring <robh@...nel.org>, Krzysztof Kozlowski <krzk+dt@...nel.org>, Conor Dooley <conor+dt@...nel.org>,
Thierry Reding <thierry.reding@...il.com>, Jonathan Hunter <jonathanh@...dia.com>,
Sam Ravnborg <sam@...nborg.org>, dri-devel@...ts.freedesktop.org,
devicetree@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-tegra@...r.kernel.org
Subject: Re: [PATCH v1 2/8] gpu/drm: panel: add support for LG LD070WX3-SL01
MIPI DSI panel
Hi,
On Mon, Sep 29, 2025 at 10:13 PM Svyatoslav Ryhel <clamor95@...il.com> wrote:
>
> > > +static int lg_ld070wx3_unprepare(struct drm_panel *panel)
> > > +{
> > > + struct lg_ld070wx3 *priv = to_lg_ld070wx3(panel);
> > > + struct mipi_dsi_multi_context ctx = { .dsi = priv->dsi };
> > > +
> > > + mipi_dsi_dcs_enter_sleep_mode_multi(&ctx);
> > > +
> >
> > Maybe add some comment about ignoring the accumulated error in the
> > context and still doing the sleeps?
> >
>
> Isn't that obvious? Regardless of what command returns power supply
> should be turned off, preferably with a set amount of delays (delays
> are taken from datasheet) to avoid leaving panel in uncertain state
> with power on.
I won't insist, though IMO any time an error return is purposely
ignored a comment about why can be justified.
> > > + msleep(50);
> > > +
> > > + regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
> > > +
> > > + /* power supply must be off for at least 1s after panel disable */
> > > + msleep(1000);
> >
> > Presumably it would be better to keep track of the time you turned it
> > off and then make sure you don't turn it on again before that time?
> > Otherwise you've got a pretty wasteful delay here.
> >
>
> And how do you propose to implement that? Should I use mutex?
> Datasheet is clear regarding this, after supply is turned off there
> MUST be AT LEAST 1 second of delay before supplies can be turned back
> on.
You don't really need a mutex since the DRM core will make sure that
prepare and unprepare can't be called at the same time. panel-edp
implements this. See `unprepared_time` I believe.
NOTE: if you want to get really deep into this, it's actually a bit of
a complicated topic and I would also encourage you to add an
"off-on-delay-us" to the regulator in your device tree (which only
works on some regulators but really should be universal). This is
important because:
1. The regulator could be shared by other consumers and they could
cause violations of this.
2. The regulator could potentially be in either state when Linux starts.
3. The regulator framework could adjust the state of the regulator at
regulator probe time.
The "off-on-delay-us" handles at least some more of those cases,
though I seem to remember that at least a few of them still have rough
edges...
> > > +static int lg_ld070wx3_probe(struct mipi_dsi_device *dsi)
> > > +{
> > > + struct device *dev = &dsi->dev;
> > > + struct lg_ld070wx3 *priv;
> > > + int ret;
> > > +
> > > + priv = devm_drm_panel_alloc(dev, struct lg_ld070wx3, panel,
> > > + &lg_ld070wx3_panel_funcs,
> > > + DRM_MODE_CONNECTOR_DSI);
> > > + if (IS_ERR(priv))
> > > + return PTR_ERR(priv);
> > > +
> > > + priv->supplies[0].supply = "vcc";
> > > + priv->supplies[1].supply = "vdd";
> > > +
> > > + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(priv->supplies), priv->supplies);
> > > + if (ret < 0)
> > > + return dev_err_probe(dev, ret, "failed to get regulators\n");
> >
> > Better to use devm_regulator_bulk_get_const() so you don't need to
> > manually init the supplies?
>
> So you propose to init supplies in the probe? Are you aware that
> between probe and panel prepare may be 8-10 seconds, sometimes even
> more. Having power supplies enabled without panel configuration may
> result in permanent panel damage during that time especially since
> panel has no hardware reset mechanism.
Maybe look more closely at devm_regulator_bulk_get_const(). Really it
should just save you the lines of code:
priv->supplies[0].supply = "vcc";
priv->supplies[1].supply = "vdd";
...and it lets you put those names in a "static const" table in your
driver. All the timings of when regulators are initted should be the
same.
-Doug
Powered by blists - more mailing lists