From: Sam Ravnborg <sam@ravnborg.org>
To: Jitao Shi <jitao.shi@mediatek.com>
Cc: David Airlie <airlied@linux.ie>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
linux-kernel@vger.kernel.org, Maxime Ripard <mripard@kernel.org>,
sj.huang@mediatek.com, Thierry Reding <thierry.reding@gmail.com>,
linux-mediatek@lists.infradead.org,
dri-devel@lists.freedesktop.org, Daniel Vetter <daniel@ffwll.ch>,
CK Hu <ck.hu@mediatek.com>, Sean Paul <sean@poorly.run>
Subject: Re: [PATCH] drm/panel: seperate panel power control from panel prepare/unprepare
Date: Sun, 15 Dec 2019 13:35:51 +0100 [thread overview]
Message-ID: <20191215123551.GA32327@ravnborg.org> (raw)
In-Reply-To: <20191106064005.8016-1-jitao.shi@mediatek.com>
Hi Jitao.
On Wed, Nov 06, 2019 at 02:40:05PM +0800, Jitao Shi wrote:
> Some dsi panels require the dsi lanes keeping low before panel power
> on. So seperate the panel power control and the communication with panel.
>
> And put the power control in drm_panel_prepare_power and
> drm_panel_unprepare_power. Put the communication with panel in
> drm_panel_prepare and drm_panel_unprepare.
>
> Signed-off-by: Jitao Shi <jitao.shi@mediatek.com>
Panels that requires power before communicating often/always have
some timing constraints. Power need to be applied in XYZ micro seconds
before it is safe to communicate with the panel.
To support this a typical pattern is:
panel_xxx_prepare()
{
// power on the panel using one or a few regulators
// wait until panel is known to be ready
// Communicate with the panel
}
first driver I looked at (panel-feiyang-fy07024di26a30d.c) follows this
pattern.
So we have the timing spelled out in the enable() function
and the sequence is obvious.
What will the benefit be from a separate drm_panel_prepare_power()
function pointer?
Sam
> ---
> drivers/gpu/drm/drm_panel.c | 38 +++++++++++++++++++++++++++++++++++++
> include/drm/drm_panel.h | 17 +++++++++++++++++
> 2 files changed, 55 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> index 6b0bf42039cf..e57f6385d2cc 100644
> --- a/drivers/gpu/drm/drm_panel.c
> +++ b/drivers/gpu/drm/drm_panel.c
> @@ -131,6 +131,24 @@ void drm_panel_detach(struct drm_panel *panel)
> }
> EXPORT_SYMBOL(drm_panel_detach);
>
> +/**
> + * drm_panel_prepare_power - power on a panel's power
> + * @panel: DRM panel
> + *
> + * Calling this function will enable power and deassert any reset signals to
> + * the panel.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int drm_panel_prepare_power(struct drm_panel *panel)
> +{
> + if (panel && panel->funcs && panel->funcs->prepare_power)
> + return panel->funcs->prepare_power(panel);
> +
> + return panel ? -ENOSYS : -EINVAL;
> +}
> +EXPORT_SYMBOL(drm_panel_prepare_power);
> +
> /**
> * drm_panel_prepare - power on a panel
> * @panel: DRM panel
> @@ -170,6 +188,26 @@ int drm_panel_unprepare(struct drm_panel *panel)
> }
> EXPORT_SYMBOL(drm_panel_unprepare);
>
> +/**
> + * drm_panel_unprepare_power - power off a panel
> + * @panel: DRM panel
> + *
> + * Calling this function will completely power off a panel (assert the panel's
> + * reset, turn off power supplies, ...). After this function has completed, it
> + * is usually no longer possible to communicate with the panel until another
> + * call to drm_panel_prepare_power and drm_panel_prepare().
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int drm_panel_unprepare_power(struct drm_panel *panel)
> +{
> + if (panel && panel->funcs && panel->funcs->unprepare_power)
> + return panel->funcs->unprepare_power(panel);
> +
> + return panel ? -ENOSYS : -EINVAL;
> +}
> +EXPORT_SYMBOL(drm_panel_unprepare_power);
> +
> /**
> * drm_panel_enable - enable a panel
> * @panel: DRM panel
> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> index 624bd15ecfab..0d8c4855405c 100644
> --- a/include/drm/drm_panel.h
> +++ b/include/drm/drm_panel.h
> @@ -61,6 +61,13 @@ struct display_timing;
> * the panel. This is the job of the .unprepare() function.
> */
> struct drm_panel_funcs {
> + /**
> + * @prepare_power:
> + *
> + * Turn on panel power.
> + */
> + int (*prepare_power)(struct drm_panel *panel);
> +
> /**
> * @prepare:
> *
> @@ -89,6 +96,13 @@ struct drm_panel_funcs {
> */
> int (*unprepare)(struct drm_panel *panel);
>
> + /**
> + * @unprepare_power:
> + *
> + * Turn off panel_power.
> + */
> + int (*unprepare_power)(struct drm_panel *panel);
> +
> /**
> * @get_modes:
> *
> @@ -155,6 +169,9 @@ void drm_panel_remove(struct drm_panel *panel);
> int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector);
> void drm_panel_detach(struct drm_panel *panel);
>
> +int drm_panel_prepare_power(struct drm_panel *panel);
> +int drm_panel_unprepare_power(struct drm_panel *panel);
> +
> int drm_panel_prepare(struct drm_panel *panel);
> int drm_panel_unprepare(struct drm_panel *panel);
>
> --
> 2.21.0
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek
WARNING: multiple messages have this Message-ID (diff)
From: Sam Ravnborg <sam@ravnborg.org>
To: Jitao Shi <jitao.shi@mediatek.com>
Cc: David Airlie <airlied@linux.ie>,
linux-kernel@vger.kernel.org, sj.huang@mediatek.com,
Thierry Reding <thierry.reding@gmail.com>,
linux-mediatek@lists.infradead.org,
dri-devel@lists.freedesktop.org, Sean Paul <sean@poorly.run>
Subject: Re: [PATCH] drm/panel: seperate panel power control from panel prepare/unprepare
Date: Sun, 15 Dec 2019 13:35:51 +0100 [thread overview]
Message-ID: <20191215123551.GA32327@ravnborg.org> (raw)
In-Reply-To: <20191106064005.8016-1-jitao.shi@mediatek.com>
Hi Jitao.
On Wed, Nov 06, 2019 at 02:40:05PM +0800, Jitao Shi wrote:
> Some dsi panels require the dsi lanes keeping low before panel power
> on. So seperate the panel power control and the communication with panel.
>
> And put the power control in drm_panel_prepare_power and
> drm_panel_unprepare_power. Put the communication with panel in
> drm_panel_prepare and drm_panel_unprepare.
>
> Signed-off-by: Jitao Shi <jitao.shi@mediatek.com>
Panels that requires power before communicating often/always have
some timing constraints. Power need to be applied in XYZ micro seconds
before it is safe to communicate with the panel.
To support this a typical pattern is:
panel_xxx_prepare()
{
// power on the panel using one or a few regulators
// wait until panel is known to be ready
// Communicate with the panel
}
first driver I looked at (panel-feiyang-fy07024di26a30d.c) follows this
pattern.
So we have the timing spelled out in the enable() function
and the sequence is obvious.
What will the benefit be from a separate drm_panel_prepare_power()
function pointer?
Sam
> ---
> drivers/gpu/drm/drm_panel.c | 38 +++++++++++++++++++++++++++++++++++++
> include/drm/drm_panel.h | 17 +++++++++++++++++
> 2 files changed, 55 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> index 6b0bf42039cf..e57f6385d2cc 100644
> --- a/drivers/gpu/drm/drm_panel.c
> +++ b/drivers/gpu/drm/drm_panel.c
> @@ -131,6 +131,24 @@ void drm_panel_detach(struct drm_panel *panel)
> }
> EXPORT_SYMBOL(drm_panel_detach);
>
> +/**
> + * drm_panel_prepare_power - power on a panel's power
> + * @panel: DRM panel
> + *
> + * Calling this function will enable power and deassert any reset signals to
> + * the panel.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int drm_panel_prepare_power(struct drm_panel *panel)
> +{
> + if (panel && panel->funcs && panel->funcs->prepare_power)
> + return panel->funcs->prepare_power(panel);
> +
> + return panel ? -ENOSYS : -EINVAL;
> +}
> +EXPORT_SYMBOL(drm_panel_prepare_power);
> +
> /**
> * drm_panel_prepare - power on a panel
> * @panel: DRM panel
> @@ -170,6 +188,26 @@ int drm_panel_unprepare(struct drm_panel *panel)
> }
> EXPORT_SYMBOL(drm_panel_unprepare);
>
> +/**
> + * drm_panel_unprepare_power - power off a panel
> + * @panel: DRM panel
> + *
> + * Calling this function will completely power off a panel (assert the panel's
> + * reset, turn off power supplies, ...). After this function has completed, it
> + * is usually no longer possible to communicate with the panel until another
> + * call to drm_panel_prepare_power and drm_panel_prepare().
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int drm_panel_unprepare_power(struct drm_panel *panel)
> +{
> + if (panel && panel->funcs && panel->funcs->unprepare_power)
> + return panel->funcs->unprepare_power(panel);
> +
> + return panel ? -ENOSYS : -EINVAL;
> +}
> +EXPORT_SYMBOL(drm_panel_unprepare_power);
> +
> /**
> * drm_panel_enable - enable a panel
> * @panel: DRM panel
> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> index 624bd15ecfab..0d8c4855405c 100644
> --- a/include/drm/drm_panel.h
> +++ b/include/drm/drm_panel.h
> @@ -61,6 +61,13 @@ struct display_timing;
> * the panel. This is the job of the .unprepare() function.
> */
> struct drm_panel_funcs {
> + /**
> + * @prepare_power:
> + *
> + * Turn on panel power.
> + */
> + int (*prepare_power)(struct drm_panel *panel);
> +
> /**
> * @prepare:
> *
> @@ -89,6 +96,13 @@ struct drm_panel_funcs {
> */
> int (*unprepare)(struct drm_panel *panel);
>
> + /**
> + * @unprepare_power:
> + *
> + * Turn off panel_power.
> + */
> + int (*unprepare_power)(struct drm_panel *panel);
> +
> /**
> * @get_modes:
> *
> @@ -155,6 +169,9 @@ void drm_panel_remove(struct drm_panel *panel);
> int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector);
> void drm_panel_detach(struct drm_panel *panel);
>
> +int drm_panel_prepare_power(struct drm_panel *panel);
> +int drm_panel_unprepare_power(struct drm_panel *panel);
> +
> int drm_panel_prepare(struct drm_panel *panel);
> int drm_panel_unprepare(struct drm_panel *panel);
>
> --
> 2.21.0
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
WARNING: multiple messages have this Message-ID (diff)
From: Sam Ravnborg <sam@ravnborg.org>
To: Jitao Shi <jitao.shi@mediatek.com>
Cc: Thierry Reding <thierry.reding@gmail.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>, Sean Paul <sean@poorly.run>,
David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
CK Hu <ck.hu@mediatek.com>,
linux-mediatek@lists.infradead.org, sj.huang@mediatek.com
Subject: Re: [PATCH] drm/panel: seperate panel power control from panel prepare/unprepare
Date: Sun, 15 Dec 2019 13:35:51 +0100 [thread overview]
Message-ID: <20191215123551.GA32327@ravnborg.org> (raw)
In-Reply-To: <20191106064005.8016-1-jitao.shi@mediatek.com>
Hi Jitao.
On Wed, Nov 06, 2019 at 02:40:05PM +0800, Jitao Shi wrote:
> Some dsi panels require the dsi lanes keeping low before panel power
> on. So seperate the panel power control and the communication with panel.
>
> And put the power control in drm_panel_prepare_power and
> drm_panel_unprepare_power. Put the communication with panel in
> drm_panel_prepare and drm_panel_unprepare.
>
> Signed-off-by: Jitao Shi <jitao.shi@mediatek.com>
Panels that requires power before communicating often/always have
some timing constraints. Power need to be applied in XYZ micro seconds
before it is safe to communicate with the panel.
To support this a typical pattern is:
panel_xxx_prepare()
{
// power on the panel using one or a few regulators
// wait until panel is known to be ready
// Communicate with the panel
}
first driver I looked at (panel-feiyang-fy07024di26a30d.c) follows this
pattern.
So we have the timing spelled out in the enable() function
and the sequence is obvious.
What will the benefit be from a separate drm_panel_prepare_power()
function pointer?
Sam
> ---
> drivers/gpu/drm/drm_panel.c | 38 +++++++++++++++++++++++++++++++++++++
> include/drm/drm_panel.h | 17 +++++++++++++++++
> 2 files changed, 55 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
> index 6b0bf42039cf..e57f6385d2cc 100644
> --- a/drivers/gpu/drm/drm_panel.c
> +++ b/drivers/gpu/drm/drm_panel.c
> @@ -131,6 +131,24 @@ void drm_panel_detach(struct drm_panel *panel)
> }
> EXPORT_SYMBOL(drm_panel_detach);
>
> +/**
> + * drm_panel_prepare_power - power on a panel's power
> + * @panel: DRM panel
> + *
> + * Calling this function will enable power and deassert any reset signals to
> + * the panel.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int drm_panel_prepare_power(struct drm_panel *panel)
> +{
> + if (panel && panel->funcs && panel->funcs->prepare_power)
> + return panel->funcs->prepare_power(panel);
> +
> + return panel ? -ENOSYS : -EINVAL;
> +}
> +EXPORT_SYMBOL(drm_panel_prepare_power);
> +
> /**
> * drm_panel_prepare - power on a panel
> * @panel: DRM panel
> @@ -170,6 +188,26 @@ int drm_panel_unprepare(struct drm_panel *panel)
> }
> EXPORT_SYMBOL(drm_panel_unprepare);
>
> +/**
> + * drm_panel_unprepare_power - power off a panel
> + * @panel: DRM panel
> + *
> + * Calling this function will completely power off a panel (assert the panel's
> + * reset, turn off power supplies, ...). After this function has completed, it
> + * is usually no longer possible to communicate with the panel until another
> + * call to drm_panel_prepare_power and drm_panel_prepare().
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int drm_panel_unprepare_power(struct drm_panel *panel)
> +{
> + if (panel && panel->funcs && panel->funcs->unprepare_power)
> + return panel->funcs->unprepare_power(panel);
> +
> + return panel ? -ENOSYS : -EINVAL;
> +}
> +EXPORT_SYMBOL(drm_panel_unprepare_power);
> +
> /**
> * drm_panel_enable - enable a panel
> * @panel: DRM panel
> diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h
> index 624bd15ecfab..0d8c4855405c 100644
> --- a/include/drm/drm_panel.h
> +++ b/include/drm/drm_panel.h
> @@ -61,6 +61,13 @@ struct display_timing;
> * the panel. This is the job of the .unprepare() function.
> */
> struct drm_panel_funcs {
> + /**
> + * @prepare_power:
> + *
> + * Turn on panel power.
> + */
> + int (*prepare_power)(struct drm_panel *panel);
> +
> /**
> * @prepare:
> *
> @@ -89,6 +96,13 @@ struct drm_panel_funcs {
> */
> int (*unprepare)(struct drm_panel *panel);
>
> + /**
> + * @unprepare_power:
> + *
> + * Turn off panel_power.
> + */
> + int (*unprepare_power)(struct drm_panel *panel);
> +
> /**
> * @get_modes:
> *
> @@ -155,6 +169,9 @@ void drm_panel_remove(struct drm_panel *panel);
> int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector);
> void drm_panel_detach(struct drm_panel *panel);
>
> +int drm_panel_prepare_power(struct drm_panel *panel);
> +int drm_panel_unprepare_power(struct drm_panel *panel);
> +
> int drm_panel_prepare(struct drm_panel *panel);
> int drm_panel_unprepare(struct drm_panel *panel);
>
> --
> 2.21.0
next prev parent reply other threads:[~2019-12-15 12:36 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-06 6:40 [PATCH] drm/panel: seperate panel power control from panel prepare/unprepare Jitao Shi
2019-11-06 6:40 ` Jitao Shi
2019-11-06 6:40 ` Jitao Shi
2019-11-06 6:40 ` Jitao Shi
2019-12-15 12:35 ` Sam Ravnborg [this message]
2019-12-15 12:35 ` Sam Ravnborg
2019-12-15 12:35 ` Sam Ravnborg
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=20191215123551.GA32327@ravnborg.org \
--to=sam@ravnborg.org \
--cc=airlied@linux.ie \
--cc=ck.hu@mediatek.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=jitao.shi@mediatek.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=sean@poorly.run \
--cc=sj.huang@mediatek.com \
--cc=thierry.reding@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.