-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
video: add display_timing and videomode
Add display_timing structure and the according helper functions. This allows the description of a display via its supported timing parameters. Also, add helper functions to convert from display timings to a generic videomode structure. The struct display_timing specifies all needed parameters to describe the signal properties of a display in one mode. This includes - ranges for signals that may have min-, max- and typical values - single integers for signals that can be on, off or are ignored - booleans for signals that are either on or off As a display may support multiple modes like this, a struct display_timings is added, that holds all given struct display_timing pointers and declares the native mode of the display. Although a display may state that a signal can be in a range, it is driven with fixed values that indicate a videomode. Therefore graphic drivers don't need all the information of struct display_timing, but would generate a videomode from the given set of supported signal timings and work with that. The video subsystems all define their own structs that describe a mode and work with that (e.g. fb_videomode or drm_display_mode). To slowly replace all those various structures and allow code reuse across those subsystems, add struct videomode as a generic description. This patch only includes the most basic fields in struct videomode. All missing fields that are needed to have a really generic video mode description can be added at a later stage. Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de> Reviewed-by: Thierry Reding <thierry.reding@avionic-design.de> Acked-by: Thierry Reding <thierry.reding@avionic-design.de> Tested-by: Thierry Reding <thierry.reding@avionic-design.de> Tested-by: Philipp Zabel <p.zabel@pengutronix.de> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Tested-by: Afzal Mohammed <Afzal@ti.com> Tested-by: Rob Clark <robclark@gmail.com> Tested-by: Leela Krishna Amudala <leelakrishna.a@gmail.com>
- Loading branch information
Steffen Trumtrar
committed
Jan 24, 2013
1 parent
ea4f311
commit 8714c0c
Showing
6 changed files
with
243 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* | ||
* generic display timing functions | ||
* | ||
* Copyright (c) 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>, Pengutronix | ||
* | ||
* This file is released under the GPLv2 | ||
*/ | ||
|
||
#include <linux/export.h> | ||
#include <linux/slab.h> | ||
#include <video/display_timing.h> | ||
|
||
void display_timings_release(struct display_timings *disp) | ||
{ | ||
if (disp->timings) { | ||
unsigned int i; | ||
|
||
for (i = 0; i < disp->num_timings; i++) | ||
kfree(disp->timings[i]); | ||
kfree(disp->timings); | ||
} | ||
kfree(disp); | ||
} | ||
EXPORT_SYMBOL_GPL(display_timings_release); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
/* | ||
* generic display timing functions | ||
* | ||
* Copyright (c) 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>, Pengutronix | ||
* | ||
* This file is released under the GPLv2 | ||
*/ | ||
|
||
#include <linux/errno.h> | ||
#include <linux/export.h> | ||
#include <video/display_timing.h> | ||
#include <video/videomode.h> | ||
|
||
int videomode_from_timing(const struct display_timings *disp, | ||
struct videomode *vm, unsigned int index) | ||
{ | ||
struct display_timing *dt; | ||
|
||
dt = display_timings_get(disp, index); | ||
if (!dt) | ||
return -EINVAL; | ||
|
||
vm->pixelclock = display_timing_get_value(&dt->pixelclock, TE_TYP); | ||
vm->hactive = display_timing_get_value(&dt->hactive, TE_TYP); | ||
vm->hfront_porch = display_timing_get_value(&dt->hfront_porch, TE_TYP); | ||
vm->hback_porch = display_timing_get_value(&dt->hback_porch, TE_TYP); | ||
vm->hsync_len = display_timing_get_value(&dt->hsync_len, TE_TYP); | ||
|
||
vm->vactive = display_timing_get_value(&dt->vactive, TE_TYP); | ||
vm->vfront_porch = display_timing_get_value(&dt->vfront_porch, TE_TYP); | ||
vm->vback_porch = display_timing_get_value(&dt->vback_porch, TE_TYP); | ||
vm->vsync_len = display_timing_get_value(&dt->vsync_len, TE_TYP); | ||
|
||
vm->dmt_flags = dt->dmt_flags; | ||
vm->data_flags = dt->data_flags; | ||
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL_GPL(videomode_from_timing); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
/* | ||
* Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de> | ||
* | ||
* description of display timings | ||
* | ||
* This file is released under the GPLv2 | ||
*/ | ||
|
||
#ifndef __LINUX_DISPLAY_TIMING_H | ||
#define __LINUX_DISPLAY_TIMING_H | ||
|
||
#include <linux/bitops.h> | ||
#include <linux/types.h> | ||
|
||
/* VESA display monitor timing parameters */ | ||
#define VESA_DMT_HSYNC_LOW BIT(0) | ||
#define VESA_DMT_HSYNC_HIGH BIT(1) | ||
#define VESA_DMT_VSYNC_LOW BIT(2) | ||
#define VESA_DMT_VSYNC_HIGH BIT(3) | ||
|
||
/* display specific flags */ | ||
#define DISPLAY_FLAGS_DE_LOW BIT(0) /* data enable flag */ | ||
#define DISPLAY_FLAGS_DE_HIGH BIT(1) | ||
#define DISPLAY_FLAGS_PIXDATA_POSEDGE BIT(2) /* drive data on pos. edge */ | ||
#define DISPLAY_FLAGS_PIXDATA_NEGEDGE BIT(3) /* drive data on neg. edge */ | ||
#define DISPLAY_FLAGS_INTERLACED BIT(4) | ||
#define DISPLAY_FLAGS_DOUBLESCAN BIT(5) | ||
|
||
/* | ||
* A single signal can be specified via a range of minimal and maximal values | ||
* with a typical value, that lies somewhere inbetween. | ||
*/ | ||
struct timing_entry { | ||
u32 min; | ||
u32 typ; | ||
u32 max; | ||
}; | ||
|
||
enum timing_entry_index { | ||
TE_MIN = 0, | ||
TE_TYP = 1, | ||
TE_MAX = 2, | ||
}; | ||
|
||
/* | ||
* Single "mode" entry. This describes one set of signal timings a display can | ||
* have in one setting. This struct can later be converted to struct videomode | ||
* (see include/video/videomode.h). As each timing_entry can be defined as a | ||
* range, one struct display_timing may become multiple struct videomodes. | ||
* | ||
* Example: hsync active high, vsync active low | ||
* | ||
* Active Video | ||
* Video ______________________XXXXXXXXXXXXXXXXXXXXXX_____________________ | ||
* |<- sync ->|<- back ->|<----- active ----->|<- front ->|<- sync.. | ||
* | | porch | | porch | | ||
* | ||
* HSync _|¯¯¯¯¯¯¯¯¯¯|___________________________________________|¯¯¯¯¯¯¯¯¯ | ||
* | ||
* VSync ¯|__________|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|_________ | ||
*/ | ||
struct display_timing { | ||
struct timing_entry pixelclock; | ||
|
||
struct timing_entry hactive; /* hor. active video */ | ||
struct timing_entry hfront_porch; /* hor. front porch */ | ||
struct timing_entry hback_porch; /* hor. back porch */ | ||
struct timing_entry hsync_len; /* hor. sync len */ | ||
|
||
struct timing_entry vactive; /* ver. active video */ | ||
struct timing_entry vfront_porch; /* ver. front porch */ | ||
struct timing_entry vback_porch; /* ver. back porch */ | ||
struct timing_entry vsync_len; /* ver. sync len */ | ||
|
||
unsigned int dmt_flags; /* VESA DMT flags */ | ||
unsigned int data_flags; /* video data flags */ | ||
}; | ||
|
||
/* | ||
* This describes all timing settings a display provides. | ||
* The native_mode is the default setting for this display. | ||
* Drivers that can handle multiple videomodes should work with this struct and | ||
* convert each entry to the desired end result. | ||
*/ | ||
struct display_timings { | ||
unsigned int num_timings; | ||
unsigned int native_mode; | ||
|
||
struct display_timing **timings; | ||
}; | ||
|
||
/* get value specified by index from struct timing_entry */ | ||
static inline u32 display_timing_get_value(const struct timing_entry *te, | ||
enum timing_entry_index index) | ||
{ | ||
switch (index) { | ||
case TE_MIN: | ||
return te->min; | ||
break; | ||
case TE_TYP: | ||
return te->typ; | ||
break; | ||
case TE_MAX: | ||
return te->max; | ||
break; | ||
default: | ||
return te->typ; | ||
} | ||
} | ||
|
||
/* get one entry from struct display_timings */ | ||
static inline struct display_timing *display_timings_get(const struct | ||
display_timings *disp, | ||
unsigned int index) | ||
{ | ||
if (disp->num_timings > index) | ||
return disp->timings[index]; | ||
else | ||
return NULL; | ||
} | ||
|
||
void display_timings_release(struct display_timings *disp); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
/* | ||
* Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de> | ||
* | ||
* generic videomode description | ||
* | ||
* This file is released under the GPLv2 | ||
*/ | ||
|
||
#ifndef __LINUX_VIDEOMODE_H | ||
#define __LINUX_VIDEOMODE_H | ||
|
||
#include <linux/types.h> | ||
#include <video/display_timing.h> | ||
|
||
/* | ||
* Subsystem independent description of a videomode. | ||
* Can be generated from struct display_timing. | ||
*/ | ||
struct videomode { | ||
unsigned long pixelclock; /* pixelclock in Hz */ | ||
|
||
u32 hactive; | ||
u32 hfront_porch; | ||
u32 hback_porch; | ||
u32 hsync_len; | ||
|
||
u32 vactive; | ||
u32 vfront_porch; | ||
u32 vback_porch; | ||
u32 vsync_len; | ||
|
||
unsigned int dmt_flags; /* VESA DMT flags */ | ||
unsigned int data_flags; /* video data flags */ | ||
}; | ||
|
||
/** | ||
* videomode_from_timing - convert display timing to videomode | ||
* @disp: structure with all possible timing entries | ||
* @vm: return value | ||
* @index: index into the list of display timings in devicetree | ||
* | ||
* DESCRIPTION: | ||
* This function converts a struct display_timing to a struct videomode. | ||
*/ | ||
int videomode_from_timing(const struct display_timings *disp, | ||
struct videomode *vm, unsigned int index); | ||
|
||
#endif |