[PATCH V6 3/8] drm/panel: simple: Add support for auo_b133htn01 panel
Ajay kumar
ajaynumb at gmail.com
Wed Jul 30 04:32:11 PDT 2014
On Wed, Jul 30, 2014 at 4:21 PM, Thierry Reding
<thierry.reding at gmail.com> wrote:
> On Sat, Jul 26, 2014 at 12:52:05AM +0530, Ajay Kumar wrote:
>> Add panel_desc structure for auo_b133htn01 eDP panel.
>>
>> Also, modify the panel_simple routines to support timing_parameter
>> delays if mentioned in the panel_desc structure.
>>
>> Signed-off-by: Ajay Kumar <ajaykumar.rs at samsung.com>
>> ---
>> .../devicetree/bindings/panel/auo,b133htn01.txt | 7 +++
>> drivers/gpu/drm/panel/panel-simple.c | 47 ++++++++++++++++++++
>> 2 files changed, 54 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/panel/auo,b133htn01.txt
>
> I think this should be two patches, one which adds the delay parameters
> and another which adds support for the new panel.
Ok. Will split it.
>> diff --git a/Documentation/devicetree/bindings/panel/auo,b133htn01.txt b/Documentation/devicetree/bindings/panel/auo,b133htn01.txt
>> new file mode 100644
>> index 0000000..302226b
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/panel/auo,b133htn01.txt
>> @@ -0,0 +1,7 @@
>> +AU Optronics Corporation 13.3" FHD (1920x1080) color TFT-LCD panel
>> +
>> +Required properties:
>> +- compatible: should be "auo,b133htn01"
>> +
>> +This binding is compatible with the simple-panel binding, which is specified
>> +in simple-panel.txt in this directory.
>> diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
>> index fb0cfe2..cbbb1b8 100644
>> --- a/drivers/gpu/drm/panel/panel-simple.c
>> +++ b/drivers/gpu/drm/panel/panel-simple.c
>> @@ -41,6 +41,13 @@ struct panel_desc {
>> unsigned int width;
>> unsigned int height;
>> } size;
>> +
>> + struct {
>> + unsigned int prepare_stage_delay;
>> + unsigned int enable_stage_delay;
>> + unsigned int disable_stage_delay;
>> + unsigned int unprepare_stage_delay;
>> + } timing_parameter;
>
> These are overly long in my opinion, how about:
>
> struct {
> unsigned int prepare;
> unsigned int enable;
> unsigned int disable;
> unsigned int unprepare;
> } delay;
Ok, will use this.
> ? Oh, and this should probably mention that it's in milliseconds. On
> that note, do you think we'll ever need microsecond resolution? I don't
> think I've ever seen a panel datasheet mentioning that kind of
> granularity.
Nope. All in milliseconds.
>> struct panel_simple {
>> @@ -105,6 +112,8 @@ static int panel_simple_unprepare(struct drm_panel *panel)
>> gpiod_set_value_cansleep(p->enable_gpio, 0);
>>
>> regulator_disable(p->supply);
>> + if (p->desc)
>
> Should have a blank line between "regulator_disable(...)" and "if ...".
> Also it's not useful to check for p->desc, really, since it's a bug if
> that is NULL.
Well, I added this check because I used just the "simple-panel" compatible
for panel node on snow. This check won't be needed anymore.
> However I think it would be good to check for the delay being set, like
> so:
>
> if (p->desc->delay.unprepare)
> msleep(p->desc->delay.unprepare);
Ok, will change it.
> I'm not sure about the placement of the delay here, see below for more.
>
>> @@ -142,6 +154,9 @@ static int panel_simple_prepare(struct drm_panel *panel)
>> return err;
>> }
>>
>> + if (p->desc)
>> + msleep(p->desc->timing_parameter.prepare_stage_delay);
>> +
>> if (p->enable_gpio)
>> gpiod_set_value_cansleep(p->enable_gpio, 1);
>
> Should the delay not be *after* all steps in prepare have been
> performed? That way drivers can use it to specify the time that a panel
> needs to "internally" become ready after they've been power up (for
> example).
Right. I will move that delay down.
>>
>> @@ -157,6 +172,8 @@ static int panel_simple_enable(struct drm_panel *panel)
>> if (p->backlight_enabled)
>> return 0;
>>
>> + if (p->desc)
>> + msleep(p->desc->timing_parameter.enable_stage_delay);
>> if (p->backlight) {
>> p->backlight->props.power = FB_BLANK_UNBLANK;
>> backlight_update_status(p->backlight);
>
> I think here the delay makes sense where it is because it allows the
> panel driver to wait for a given amount of time (after video data has
> been sent by the display controller) until the first "good" frame is
> visible.
Exactly!
> In general I think it would be good to have a description of these in
> the struct panel_desc structure, something like this perhaps:
>
> /**
> * @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 down itself completely.
> */
> struct {
> unsigned int prepare;
> unsigned int enable;
> unsigned int disable;
> unsigned int unprepare;
> } delay;
>
> For prepare and enable delays this would mean that they should take
> effect at the very end of the .prepare() and .enable() functions,
> respectively. For disable in means that it should be at the end (for
> example to take into account the time it takes for backlight to
> completely turn off). For unprepare I have no idea what we would need it
> for. And the new panel that you're adding in this patch doesn't use it
> either, so perhaps it can just be left out (for now)?
Actually, there was a typo.
That should have been .unprepare_stage_delay = 50.
This is needed because panels need some delay before powering
them on again.
As in, assume you are doing a test to turn on/off display continuously,
Then, the delay between
(N - 1)th cycle poweroff to Nth cycle poweron should be at least 500ms.
That's what the datasheet says! And, somehow 50ms works fine for me.
Ajay
>> +static const struct panel_desc auo_b133htn01 = {
>> + .modes = &auo_b133htn01_mode,
>> + .num_modes = 1,
>> + .size = {
>> + .width = 293,
>> + .height = 165,
>> + },
>> + .timing_parameter = {
>> + .prepare_stage_delay = 105,
>> + .enable_stage_delay = 20,
>> + .prepare_stage_delay = 50,
>
> I take it that this last one was supposed to be .enable_stage_delay
> since you've already set up .prepare_stage_delay.
>
> Thierry
More information about the dri-devel
mailing list