lkml.org 
[lkml]   [2011]   [Dec]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/6] video: s3c-fb: Make runtime PM functional again
    Date
    The change in "video: s3c-fb: modify runtime pm functions" (commit
    35784b) renders the runtime power management for the device completely
    ineffectual as while it leaves runtime power management notionally
    enabled a runtime power reference is held for the entire time the device
    is registered meaning it will never actually do anything.

    A further issue is introduced as runtime power management is added
    during the system suspend path which is not something which drivers are
    supposed to do and would interact poorly if there were any operations
    done in the runtime power management callbacks.

    While this does make things simpler (the main motivation for the
    original change) it will not only cause us to use more power in the
    framebuffer controller but will also prevent us entering lower power
    domain and SoC wide states as we can never power down the domain
    containing the device. Since neither of these things is desirable
    revert the change.

    Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
    ---
    drivers/video/s3c-fb.c | 51 +++++++++++++++++++++++++++++------------------
    1 files changed, 31 insertions(+), 20 deletions(-)

    diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c
    index a0b3fd6..b1a75a0 100644
    --- a/drivers/video/s3c-fb.c
    +++ b/drivers/video/s3c-fb.c
    @@ -1038,8 +1038,30 @@ static int s3c_fb_ioctl(struct fb_info *info, unsigned int cmd,
    return ret;
    }

    +static int s3c_fb_open(struct fb_info *info, int user)
    +{
    + struct s3c_fb_win *win = info->par;
    + struct s3c_fb *sfb = win->parent;
    +
    + pm_runtime_get_sync(sfb->dev);
    +
    + return 0;
    +}
    +
    +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,
    @@ -1446,6 +1468,7 @@ static int __devinit s3c_fb_probe(struct platform_device *pdev)
    }

    platform_set_drvdata(pdev, sfb);
    + pm_runtime_put_sync(sfb->dev);

    return 0;

    @@ -1485,6 +1508,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]);
    @@ -1510,7 +1535,7 @@ static int __devexit s3c_fb_remove(struct platform_device *pdev)
    return 0;
    }

    -#ifdef CONFIG_PM_SLEEP
    +#ifdef CONFIG_PM
    static int s3c_fb_suspend(struct device *dev)
    {
    struct platform_device *pdev = to_platform_device(dev);
    @@ -1531,8 +1556,6 @@ static int s3c_fb_suspend(struct device *dev)
    clk_disable(sfb->lcd_clk);

    clk_disable(sfb->bus_clk);
    - pm_runtime_put_sync(sfb->dev);
    -
    return 0;
    }

    @@ -1544,7 +1567,6 @@ static int s3c_fb_resume(struct device *dev)
    struct s3c_fb_win *win;
    int win_no;

    - pm_runtime_get_sync(sfb->dev);
    clk_enable(sfb->bus_clk);

    if (!sfb->variant.has_clksel)
    @@ -1583,19 +1605,11 @@ static int s3c_fb_resume(struct device *dev)

    return 0;
    }
    +#else
    +#define s3c_fb_suspend NULL
    +#define s3c_fb_resume NULL
    #endif

    -#ifdef CONFIG_PM_RUNTIME
    -static int s3c_fb_runtime_suspend(struct device *dev)
    -{
    - return 0;
    -}
    -
    -static int s3c_fb_runtime_resume(struct device *dev)
    -{
    - return 0;
    -}
    -#endif

    #define VALID_BPP124 (VALID_BPP(1) | VALID_BPP(2) | VALID_BPP(4))
    #define VALID_BPP1248 (VALID_BPP124 | VALID_BPP(8))
    @@ -1918,10 +1932,7 @@ static struct platform_device_id s3c_fb_driver_ids[] = {
    };
    MODULE_DEVICE_TABLE(platform, s3c_fb_driver_ids);

    -static const struct dev_pm_ops s3c_fb_pm_ops = {
    - SET_SYSTEM_SLEEP_PM_OPS(s3c_fb_suspend, s3c_fb_resume)
    - SET_RUNTIME_PM_OPS(s3c_fb_runtime_suspend, s3c_fb_runtime_resume, NULL)
    -};
    +static UNIVERSAL_DEV_PM_OPS(s3cfb_pm_ops, s3c_fb_suspend, s3c_fb_resume, NULL);

    static struct platform_driver s3c_fb_driver = {
    .probe = s3c_fb_probe,
    @@ -1930,7 +1941,7 @@ static struct platform_driver s3c_fb_driver = {
    .driver = {
    .name = "s3c-fb",
    .owner = THIS_MODULE,
    - .pm = &s3c_fb_pm_ops,
    + .pm = &s3cfb_pm_ops,
    },
    };

    --
    1.7.7.3


    \
     
     \ /
      Last update: 2011-12-27 15:19    [W:0.027 / U:61.264 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site