From: Jonghun Han <jonghun.han@samsung.com>
To: 'Jingoo Han' <jg1.han@samsung.com>,
linux-fbdev@vger.kernel.org, 'Paul Mundt' <lethal@linux-sh.org>,
linux-samsung-soc@vger.kernel.org
Cc: ben-linux@fluff.org, 'Ilho Lee' <ilho215.lee@samsung.com>
Subject: RE: [PATCH] s3c-fb: add support for runtime pm
Date: Tue, 21 Dec 2010 08:30:00 +0000 [thread overview]
Message-ID: <005c01cba0e9$44957220$cdc05660$%han@samsung.com> (raw)
In-Reply-To: <1292571946-13595-1-git-send-email-jg1.han@samsung.com>
Hi Jingoo,
Here is a quick review.
Best regards,
Jingoo Han wrote:
> This patch adds support for runtime pm using the functions.
> - pm_runtime_get_sync()
> - pm_runtime_put_sync()
>
> pm_runtime_get_sync() and pm_runtime_put_sync() are called when open or
> release function of framebufer driver is called to inform the system if
hardware is
> idle or not.
>
> Signed-off-by: Jingoo Han <jg1.han@samsung.com>
> ---
> drivers/video/s3c-fb.c | 111
> ++++++++++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 107 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c index
f9aca9d..83ce9a0
> 100644
> --- a/drivers/video/s3c-fb.c
> +++ b/drivers/video/s3c-fb.c
<snip>
> +static int s3c_fb_release(struct fb_info *info, int user) {
> + struct s3c_fb_win *win = info->par;
> + struct s3c_fb *sfb = win->parent;
> +
> + pm_runtime_put_sync(sfb->dev);
> +
> + return 0;
> +}
> +
> static struct fb_ops s3c_fb_ops = {
> .owner = THIS_MODULE,
> + .fb_open = s3c_fb_open,
> + .fb_release = s3c_fb_release,
> .fb_check_var = s3c_fb_check_var,
> .fb_set_par = s3c_fb_set_par,
> .fb_blank = s3c_fb_blank,
How about use pm_runtime_put (sfb->dev) instead
pm_runtime_put_sync(sfb->dev) ?
In my opinion no need to sync option in *put* case.
> @@ -1322,6 +1345,8 @@ static int __devinit s3c_fb_probe(struct
platform_device
> *pdev)
>
> clk_enable(sfb->bus_clk);
>
> + pm_runtime_enable(sfb->dev);
> +
> res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> if (!res) {
> dev_err(dev, "failed to find registers\n"); @@ -1360,6
+1385,9
How about move pm_runtime_enable upper pm_runtime_get_sync in s3c_fb_probe?
> @@ static int __devinit s3c_fb_probe(struct platform_device *pdev)
>
> dev_dbg(dev, "got resources (regs %p), probing windows\n",
sfb->regs);
>
> + platform_set_drvdata(pdev, sfb);
> + pm_runtime_get_sync(sfb->dev);
> +
> /* setup gpio and output polarity controls */
>
> pd->setup_gpio();
platform_set_drvdata(pdev, sfb); already exists line# 1402.
<snip>
>
> @@ -1434,6 +1463,8 @@ static int __devexit s3c_fb_remove(struct
> platform_device *pdev)
> struct s3c_fb *sfb = platform_get_drvdata(pdev);
> int win;
>
> + pm_runtime_get_sync(sfb->dev);
> +
> for (win = 0; win < S3C_FB_MAX_WIN; win++)
> if (sfb->windows[win])
> s3c_fb_release_win(sfb, sfb->windows[win]); @@ -
sfb->variant.nr_windows is better than S3C_FB_MAX_WIN.
> 1450,12 +1481,74 @@ static int __devexit s3c_fb_remove(struct
platform_device
> *pdev)
>
<snip>
> +
> + for (win_no = S3C_FB_MAX_WIN - 1; win_no >= 0; win_no--) {
Ditto
> + win = sfb->windows[win_no];
> + if (!win)
> + continue;
> +
> + /* use the blank function to push into power-down */
> + s3c_fb_blank(FB_BLANK_POWERDOWN, win->fbinfo);
> + }
> +
> + clk_disable(sfb->bus_clk);
> + return 0;
> +}
> +
> +static int s3c_fb_resume(struct device *dev) {
> + struct platform_device *pdev = to_platform_device(dev);
> + struct s3c_fb *sfb = platform_get_drvdata(pdev);
> + struct s3c_fb_platdata *pd = sfb->pdata;
> + struct s3c_fb_win *win;
> + int win_no;
> +
> + clk_enable(sfb->bus_clk);
> +
> + /* setup registers */
> + writel(pd->vidcon1, sfb->regs + VIDCON1);
> +
> + /* zero all windows before we do anything */
> + for (win_no = 0; win_no < sfb->variant.nr_windows; win_no++)
> + s3c_fb_clear_win(sfb, win_no);
Is it right "win_no < sfb->variant.nr_windows" not "nr_windows - 1" ?
> +
> + for (win_no = 0; win_no < sfb->variant.nr_windows - 1; win_no++) {
> + void __iomem *regs = sfb->regs + sfb->variant.keycon;
> +
> + regs += (win_no * 8);
> + writel(0xffffff, regs + WKEYCON0);
> + writel(0xffffff, regs + WKEYCON1);
> + }
> +
> + /* restore framebuffers */
> + for (win_no = 0; win_no < S3C_FB_MAX_WIN; win_no++) {
> + win = sfb->windows[win_no];
> + if (!win)
> + continue;
> +
> + dev_dbg(&pdev->dev, "resuming window %d\n", win_no);
> + s3c_fb_set_par(win->fbinfo);
> + }
> +
> + return 0;
> +}
> +
How about merge three for loop ?
In my opinion s3c_fb_blank(FB_BLANK_UNBLANK, win->fbinfo) should be called
in resume.
Because sfb->enabled was cleared in suspend function using
s3c_fb_blank(FB_BLANK_POWERDOWN, win->fbinfo).
<snip>
>
> @@ -1710,15 +1807,21 @@ static struct platform_device_id
s3c_fb_driver_ids[] > { }; MODULE_DEVICE_TABLE(platform, s3c_fb_driver_ids);
>
> +static const struct dev_pm_ops s3cfb_pm_ops = {
> + .suspend = s3c_fb_suspend,
> + .resume = s3c_fb_resume,
> + .runtime_suspend = s3c_fb_runtime_suspend,
> + .runtime_resume = s3c_fb_runtime_resume,
> +};
s3c_fb_suspend and s3c_fb_resume are exactly same with
s3c_fb_runtime_suspend s3c_fb_runtime_resume.
Why don't you register the same function ?
<snip>
>
> --
> 1.6.2.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body
> of a message to majordomo@vger.kernel.org More majordomo info at
> http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: Jonghun Han <jonghun.han@samsung.com>
To: 'Jingoo Han' <jg1.han@samsung.com>,
linux-fbdev@vger.kernel.org, 'Paul Mundt' <lethal@linux-sh.org>,
linux-samsung-soc@vger.kernel.org
Cc: ben-linux@fluff.org, 'Ilho Lee' <ilho215.lee@samsung.com>
Subject: RE: [PATCH] s3c-fb: add support for runtime pm
Date: Tue, 21 Dec 2010 17:30:00 +0900 [thread overview]
Message-ID: <005c01cba0e9$44957220$cdc05660$%han@samsung.com> (raw)
In-Reply-To: <1292571946-13595-1-git-send-email-jg1.han@samsung.com>
Hi Jingoo,
Here is a quick review.
Best regards,
Jingoo Han wrote:
> This patch adds support for runtime pm using the functions.
> - pm_runtime_get_sync()
> - pm_runtime_put_sync()
>
> pm_runtime_get_sync() and pm_runtime_put_sync() are called when open or
> release function of framebufer driver is called to inform the system if
hardware is
> idle or not.
>
> Signed-off-by: Jingoo Han <jg1.han@samsung.com>
> ---
> drivers/video/s3c-fb.c | 111
> ++++++++++++++++++++++++++++++++++++++++++++++--
> 1 files changed, 107 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c index
f9aca9d..83ce9a0
> 100644
> --- a/drivers/video/s3c-fb.c
> +++ b/drivers/video/s3c-fb.c
<snip>
> +static int s3c_fb_release(struct fb_info *info, int user) {
> + struct s3c_fb_win *win = info->par;
> + struct s3c_fb *sfb = win->parent;
> +
> + pm_runtime_put_sync(sfb->dev);
> +
> + return 0;
> +}
> +
> static struct fb_ops s3c_fb_ops = {
> .owner = THIS_MODULE,
> + .fb_open = s3c_fb_open,
> + .fb_release = s3c_fb_release,
> .fb_check_var = s3c_fb_check_var,
> .fb_set_par = s3c_fb_set_par,
> .fb_blank = s3c_fb_blank,
How about use pm_runtime_put (sfb->dev) instead
pm_runtime_put_sync(sfb->dev) ?
In my opinion no need to sync option in *put* case.
> @@ -1322,6 +1345,8 @@ static int __devinit s3c_fb_probe(struct
platform_device
> *pdev)
>
> clk_enable(sfb->bus_clk);
>
> + pm_runtime_enable(sfb->dev);
> +
> res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> if (!res) {
> dev_err(dev, "failed to find registers\n"); @@ -1360,6
+1385,9
How about move pm_runtime_enable upper pm_runtime_get_sync in s3c_fb_probe?
> @@ static int __devinit s3c_fb_probe(struct platform_device *pdev)
>
> dev_dbg(dev, "got resources (regs %p), probing windows\n",
sfb->regs);
>
> + platform_set_drvdata(pdev, sfb);
> + pm_runtime_get_sync(sfb->dev);
> +
> /* setup gpio and output polarity controls */
>
> pd->setup_gpio();
platform_set_drvdata(pdev, sfb); already exists line# 1402.
<snip>
>
> @@ -1434,6 +1463,8 @@ static int __devexit s3c_fb_remove(struct
> platform_device *pdev)
> struct s3c_fb *sfb = platform_get_drvdata(pdev);
> int win;
>
> + pm_runtime_get_sync(sfb->dev);
> +
> for (win = 0; win < S3C_FB_MAX_WIN; win++)
> if (sfb->windows[win])
> s3c_fb_release_win(sfb, sfb->windows[win]); @@ -
sfb->variant.nr_windows is better than S3C_FB_MAX_WIN.
> 1450,12 +1481,74 @@ static int __devexit s3c_fb_remove(struct
platform_device
> *pdev)
>
<snip>
> +
> + for (win_no = S3C_FB_MAX_WIN - 1; win_no >= 0; win_no--) {
Ditto
> + win = sfb->windows[win_no];
> + if (!win)
> + continue;
> +
> + /* use the blank function to push into power-down */
> + s3c_fb_blank(FB_BLANK_POWERDOWN, win->fbinfo);
> + }
> +
> + clk_disable(sfb->bus_clk);
> + return 0;
> +}
> +
> +static int s3c_fb_resume(struct device *dev) {
> + struct platform_device *pdev = to_platform_device(dev);
> + struct s3c_fb *sfb = platform_get_drvdata(pdev);
> + struct s3c_fb_platdata *pd = sfb->pdata;
> + struct s3c_fb_win *win;
> + int win_no;
> +
> + clk_enable(sfb->bus_clk);
> +
> + /* setup registers */
> + writel(pd->vidcon1, sfb->regs + VIDCON1);
> +
> + /* zero all windows before we do anything */
> + for (win_no = 0; win_no < sfb->variant.nr_windows; win_no++)
> + s3c_fb_clear_win(sfb, win_no);
Is it right "win_no < sfb->variant.nr_windows" not "nr_windows - 1" ?
> +
> + for (win_no = 0; win_no < sfb->variant.nr_windows - 1; win_no++) {
> + void __iomem *regs = sfb->regs + sfb->variant.keycon;
> +
> + regs += (win_no * 8);
> + writel(0xffffff, regs + WKEYCON0);
> + writel(0xffffff, regs + WKEYCON1);
> + }
> +
> + /* restore framebuffers */
> + for (win_no = 0; win_no < S3C_FB_MAX_WIN; win_no++) {
> + win = sfb->windows[win_no];
> + if (!win)
> + continue;
> +
> + dev_dbg(&pdev->dev, "resuming window %d\n", win_no);
> + s3c_fb_set_par(win->fbinfo);
> + }
> +
> + return 0;
> +}
> +
How about merge three for loop ?
In my opinion s3c_fb_blank(FB_BLANK_UNBLANK, win->fbinfo) should be called
in resume.
Because sfb->enabled was cleared in suspend function using
s3c_fb_blank(FB_BLANK_POWERDOWN, win->fbinfo).
<snip>
>
> @@ -1710,15 +1807,21 @@ static struct platform_device_id
s3c_fb_driver_ids[] =
> { }; MODULE_DEVICE_TABLE(platform, s3c_fb_driver_ids);
>
> +static const struct dev_pm_ops s3cfb_pm_ops = {
> + .suspend = s3c_fb_suspend,
> + .resume = s3c_fb_resume,
> + .runtime_suspend = s3c_fb_runtime_suspend,
> + .runtime_resume = s3c_fb_runtime_resume,
> +};
s3c_fb_suspend and s3c_fb_resume are exactly same with
s3c_fb_runtime_suspend s3c_fb_runtime_resume.
Why don't you register the same function ?
<snip>
>
> --
> 1.6.2.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
the body
> of a message to majordomo@vger.kernel.org More majordomo info at
> http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2010-12-21 8:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-17 7:45 [PATCH] s3c-fb: add support for runtime pm Jingoo Han
2010-12-17 7:45 ` Jingoo Han
2010-12-20 15:58 ` Paul Mundt
2010-12-20 15:58 ` Paul Mundt
2010-12-21 8:30 ` Jonghun Han [this message]
2010-12-21 8:30 ` Jonghun Han
2010-12-21 8:57 ` Jonghun Han
2010-12-21 8:57 ` Jonghun Han
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='005c01cba0e9$44957220$cdc05660$%han@samsung.com' \
--to=jonghun.han@samsung.com \
--cc=ben-linux@fluff.org \
--cc=ilho215.lee@samsung.com \
--cc=jg1.han@samsung.com \
--cc=lethal@linux-sh.org \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
/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.