Commit | Line | Data |
---|---|---|
88017bda RM |
1 | ================================ |
2 | Driver for EP93xx LCD controller | |
3 | ================================ | |
4 | ||
5 | The EP93xx LCD controller can drive both standard desktop monitors and | |
6 | embedded LCD displays. If you have a standard desktop monitor then you | |
7 | can use the standard Linux video mode database. In your board file: | |
8 | ||
9 | static struct ep93xxfb_mach_info some_board_fb_info = { | |
10 | .num_modes = EP93XXFB_USE_MODEDB, | |
11 | .bpp = 16, | |
12 | }; | |
13 | ||
14 | If you have an embedded LCD display then you need to define a video | |
15 | mode for it as follows: | |
16 | ||
17 | static struct fb_videomode some_board_video_modes[] = { | |
18 | { | |
19 | .name = "some_lcd_name", | |
20 | /* Pixel clock, porches, etc */ | |
21 | }, | |
22 | }; | |
23 | ||
24 | Note that the pixel clock value is in pico-seconds. You can use the | |
25 | KHZ2PICOS macro to convert the pixel clock value. Most other values | |
26 | are in pixel clocks. See Documentation/fb/framebuffer.txt for further | |
27 | details. | |
28 | ||
29 | The ep93xxfb_mach_info structure for your board should look like the | |
30 | following: | |
31 | ||
32 | static struct ep93xxfb_mach_info some_board_fb_info = { | |
33 | .num_modes = ARRAY_SIZE(some_board_video_modes), | |
34 | .modes = some_board_video_modes, | |
35 | .default_mode = &some_board_video_modes[0], | |
36 | .bpp = 16, | |
37 | }; | |
38 | ||
39 | The framebuffer device can be registered by adding the following to | |
40 | your board initialisation function: | |
41 | ||
42 | ep93xx_register_fb(&some_board_fb_info); | |
43 | ||
44 | ===================== | |
45 | Video Attribute Flags | |
46 | ===================== | |
47 | ||
48 | The ep93xxfb_mach_info structure has a flags field which can be used | |
49 | to configure the controller. The video attributes flags are fully | |
50 | documented in section 7 of the EP93xx users' guide. The following | |
51 | flags are available: | |
52 | ||
53 | EP93XXFB_PCLK_FALLING Clock data on the falling edge of the | |
54 | pixel clock. The default is to clock | |
55 | data on the rising edge. | |
56 | ||
57 | EP93XXFB_SYNC_BLANK_HIGH Blank signal is active high. By | |
58 | default the blank signal is active low. | |
59 | ||
60 | EP93XXFB_SYNC_HORIZ_HIGH Horizontal sync is active high. By | |
61 | default the horizontal sync is active low. | |
62 | ||
63 | EP93XXFB_SYNC_VERT_HIGH Vertical sync is active high. By | |
64 | default the vertical sync is active high. | |
65 | ||
66 | The physical address of the framebuffer can be controlled using the | |
67 | following flags: | |
68 | ||
69 | EP93XXFB_USE_SDCSN0 Use SDCSn[0] for the framebuffer. This | |
70 | is the default setting. | |
71 | ||
72 | EP93XXFB_USE_SDCSN1 Use SDCSn[1] for the framebuffer. | |
73 | ||
74 | EP93XXFB_USE_SDCSN2 Use SDCSn[2] for the framebuffer. | |
75 | ||
76 | EP93XXFB_USE_SDCSN3 Use SDCSn[3] for the framebuffer. | |
77 | ||
78 | ================== | |
79 | Platform callbacks | |
80 | ================== | |
81 | ||
82 | The EP93xx framebuffer driver supports three optional platform | |
83 | callbacks: setup, teardown and blank. The setup and teardown functions | |
84 | are called when the framebuffer driver is installed and removed | |
85 | respectively. The blank function is called whenever the display is | |
86 | blanked or unblanked. | |
87 | ||
88 | The setup and teardown devices pass the platform_device structure as | |
89 | an argument. The fb_info and ep93xxfb_mach_info structures can be | |
90 | obtained as follows: | |
91 | ||
92 | static int some_board_fb_setup(struct platform_device *pdev) | |
93 | { | |
94 | struct ep93xxfb_mach_info *mach_info = pdev->dev.platform_data; | |
95 | struct fb_info *fb_info = platform_get_drvdata(pdev); | |
96 | ||
97 | /* Board specific framebuffer setup */ | |
98 | } | |
99 | ||
100 | ====================== | |
101 | Setting the video mode | |
102 | ====================== | |
103 | ||
104 | The video mode is set using the following syntax: | |
105 | ||
106 | video=XRESxYRES[-BPP][@REFRESH] | |
107 | ||
108 | If the EP93xx video driver is built-in then the video mode is set on | |
109 | the Linux kernel command line, for example: | |
110 | ||
111 | video=ep93xx-fb:800x600-16@60 | |
112 | ||
113 | If the EP93xx video driver is built as a module then the video mode is | |
114 | set when the module is installed: | |
115 | ||
116 | modprobe ep93xx-fb video=320x240 | |
117 | ||
118 | ============== | |
119 | Screenpage bug | |
120 | ============== | |
121 | ||
122 | At least on the EP9315 there is a silicon bug which causes bit 27 of | |
123 | the VIDSCRNPAGE (framebuffer physical offset) to be tied low. There is | |
124 | an unofficial errata for this bug at: | |
125 | http://marc.info/?l=linux-arm-kernel&m=110061245502000&w=2 | |
126 | ||
127 | By default the EP93xx framebuffer driver checks if the allocated physical | |
128 | address has bit 27 set. If it does, then the memory is freed and an | |
129 | error is returned. The check can be disabled by adding the following | |
130 | option when loading the driver: | |
131 | ||
132 | ep93xx-fb.check_screenpage_bug=0 | |
133 | ||
134 | In some cases it may be possible to reconfigure your SDRAM layout to | |
135 | avoid this bug. See section 13 of the EP93xx users' guide for details. |