drm/panel: simple: Support delays in panel functions
authorAjay Kumar <ajaykumar.rs@samsung.com>
Thu, 31 Jul 2014 17:42:11 +0000 (23:12 +0530)
committerThierry Reding <treding@nvidia.com>
Wed, 6 Aug 2014 14:44:14 +0000 (16:44 +0200)
For most of the panels, we need to provide delays during various stages
of panel power up and power down. Add a structure to hold those delay
values and use them in corresponding functions.

Signed-off-by: Ajay Kumar <ajaykumar.rs@samsung.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/panel/panel-simple.c

index 806beae779388d3176ded4d8b95e10ce2af35e13..7798bdc9da546122bb605cb97a9aa3b06467b7ce 100644 (file)
@@ -43,6 +43,24 @@ struct panel_desc {
                unsigned int width;
                unsigned int height;
        } size;
+
+       /**
+        * @prepare: the time (in milliseconds) that it takes for the panel to
+        *           become ready and start receiving video data
+        * @enable: the time (in milliseconds) that it takes for the panel to
+        *          display the first valid frame after starting to receive
+        *          video data
+        * @disable: the time (in milliseconds) that it takes for the panel to
+        *           turn the display off (no content is visible)
+        * @unprepare: the time (in milliseconds) that it takes for the panel
+        *             to power itself down completely
+        */
+       struct {
+               unsigned int prepare;
+               unsigned int enable;
+               unsigned int disable;
+               unsigned int unprepare;
+       } delay;
 };
 
 struct panel_simple {
@@ -109,6 +127,9 @@ static int panel_simple_disable(struct drm_panel *panel)
                backlight_update_status(p->backlight);
        }
 
+       if (p->desc->delay.disable)
+               msleep(p->desc->delay.disable);
+
        p->enabled = false;
 
        return 0;
@@ -126,6 +147,9 @@ static int panel_simple_unprepare(struct drm_panel *panel)
 
        regulator_disable(p->supply);
 
+       if (p->desc->delay.unprepare)
+               msleep(p->desc->delay.unprepare);
+
        p->prepared = false;
 
        return 0;
@@ -148,6 +172,9 @@ static int panel_simple_prepare(struct drm_panel *panel)
        if (p->enable_gpio)
                gpiod_set_value_cansleep(p->enable_gpio, 1);
 
+       if (p->desc->delay.prepare)
+               msleep(p->desc->delay.prepare);
+
        p->prepared = true;
 
        return 0;
@@ -160,6 +187,9 @@ static int panel_simple_enable(struct drm_panel *panel)
        if (p->enabled)
                return 0;
 
+       if (p->desc->delay.enable)
+               msleep(p->desc->delay.enable);
+
        if (p->backlight) {
                p->backlight->props.power = FB_BLANK_UNBLANK;
                backlight_update_status(p->backlight);