]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/video/omap/lcd_p2.c
Merged with ../linux-2.6
[linux-2.6-omap-h63xx.git] / drivers / video / omap / lcd_p2.c
1 /*
2  * File: drivers/video/omap_new/lcd-p2.c
3  *
4  * LCD panel support for the TI OMAP P2 board 
5  *
6  * Authors:
7  *   jekyll <jekyll@mail.jekyll.idv.tw>
8  *   B Jp <lastjp_fr@yahoo.fr>
9  *   Brian Swetland <swetland@android.com>
10  * 
11  * This program is free software; you can redistribute it and/or modify it
12  * under the terms of the GNU General Public License as published by the
13  * Free Software Foundation; either version 2 of the License, or (at your
14  * option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful, but
17  * WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License along
22  * with this program; if not, write to the Free Software Foundation, Inc.,
23  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  */
25
26 #include <linux/module.h>
27 #include <linux/delay.h>
28 #include <asm/arch/mux.h>
29 #include <asm/arch/gpio.h>
30
31 #include "omapfb.h"
32
33 /*
34  * File: epson-md-tft.h
35  *
36  * This file contains definitions for Epsons MD-TF LCD Module
37  *
38  * Copyright (C) 2004 MPC-Data Limited  (http://www.mpc-data.co.uk)
39  * Author: Dave Peverley <dpeverley at mpc-data.co.uk>
40  *
41  *  This program is free software; you can redistribute  it and/or modify it
42  *  under  the terms of  the GNU General  Public License as published by the
43  *  Free Software Foundation;  either version 2 of the  License, or (at your
44  *  option) any later version.
45  *
46  *  THIS  SOFTWARE  IS  PROVIDED  ``AS  IS''  AND   ANY  EXPRESS  OR IMPLIED
47  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
48  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
49  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT,  INDIRECT,
50  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
51  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
52  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
53  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
54  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
55  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56  *
57  *  You should have received a copy of the  GNU General Public License along
58  *  with this program; if not, write  to the Free Software Foundation, Inc.,
59  *  675 Mass Ave, Cambridge, MA 02139, USA.
60  *
61  * Please report all bugs and problems to the author.
62  *
63  */
64
65 /* LCD uWire commands & params
66  * All values from Epson
67  */
68 #define LCD_DISON 0xAF
69 #define LCD_DISOFF 0xAE
70 #define LCD_DISNOR 0xA6
71 #define LCD_DISINV 0xA7
72 #define LCD_DISCTL 0xCA
73 #define LCD_GCP64 0xCB
74 #define LCD_GCP16 0xCC
75 #define LCD_GSSET 0xCD
76 #define LCD_SLPIN 0x95
77 #define LCD_SLPOUT 0x94
78 #define LCD_SD_PSET 0x75
79 #define LCD_MD_PSET 0x76
80 #define LCD_SD_CSET 0x15
81 #define LCD_MD_CSET 0x16
82 #define LCD_DATCTL 0xBC
83 #define LCD_RAMWR 0x5C
84 #define LCD_RAMRD 0x5D
85 #define LCD_PTLIN 0xA8
86 #define LCD_PTLOUT 0xA9
87 #define LCD_ASCSET 0xAA
88 #define LCD_SCSTART 0xAB
89 #define LCD_VOLCTL 0xC6
90 #define LCD_NOP 0x25
91 #define LCD_OSCISEL 0x7
92 #define LCD_3500KSET 0xD1
93 #define LCD_3500KEND 0xD2
94 #define LCD_14MSET 0xD3
95 #define LCD_14MEND 0xD4
96
97 #define INIT_3500KSET 0x45
98 #define INIT_14MSET 0x4B
99 #define INIT_DATCTL 0x08 /* 6.6.6 bits for D-Sample */
100
101 #define INIT_OSCISEL 0x05
102
103 #define INIT_VOLCTL 0x77 /* Nominel "volume" */
104
105 #define INIT_VOLCTL_Ton 0x98 /* Activate power-IC timer */
106 #define INIT_GSSET 0x00
107
108 const unsigned short INIT_DISCTL[11] =
109 {
110         0xDE, 0x01, 0x64, 0x00, 0x1B, 0xF4, 0x00, 0xDC, 0x00, 0x02, 0x00
111 };
112
113 const unsigned short INIT_GCP64[126] =
114 {
115         0x3B,0x00,0x42,0x00,0x4A,0x00,0x51,0x00,
116         0x58,0x00,0x5F,0x00,0x66,0x00,0x6E,0x00,
117         0x75,0x00,0x7C,0x00,0x83,0x00,0x8A,0x00,
118         0x92,0x00,0x99,0x00,0xA0,0x00,0xA7,0x00,
119         0xAE,0x00,0xB6,0x00,0xBD,0x00,0xC4,0x00,
120         0xCB,0x00,0xD2,0x00,0xDA,0x00,0xE1,0x00,
121         0xE8,0x00,0xEF,0x00,0xF6,0x00,0xFE,0x00,
122         0x05,0x01,0x0C,0x01,0x13,0x01,0x1A,0x01,
123         0x22,0x01,0x29,0x01,0x30,0x01,0x37,0x01,
124         0x3E,0x01,0x46,0x01,0x4D,0x01,0x54,0x01,
125         0x5B,0x01,0x62,0x01,0x6A,0x01,0x71,0x01,
126         0x78,0x01,0x7F,0x01,0x86,0x01,0x8E,0x01,
127         0x95,0x01,0x9C,0x01,0xA3,0x01,0xAA,0x01,
128         0xB2,0x01,0xB9,0x01,0xC0,0x01,0xC7,0x01,
129         0xCE,0x01,0xD6,0x01,0xDD,0x01,0xE4,0x01,
130         0xEB,0x01,0xF2,0x01,0xFA,0x01
131 };
132
133 const unsigned short INIT_GCP16[15] =
134 {
135         0x1A,0x31,0x48,0x54,0x5F,0x67,0x70,0x76,0x7C,0x80,0x83,0x84,0x85,0x87,0x96
136 };
137
138 const unsigned short INIT_MD_PSET[4] = { 0, 0, 219, 0 };
139 const unsigned short INIT_MD_CSET[4] = { 2, 0, 177, 0 };
140
141 const unsigned short INIT_SD_PSET[4] = { 0x00, 0x01, 0x00, 0x01 };
142 const unsigned short INIT_SD_CSET[4] = { 0x00, 0x02, 0x00, 0x02 };
143
144 const unsigned short INIT_ASCSET[7] = { 0x00, 0x00, 0xDB, 0x00, 0xDC, 0x00, 0x01 };
145 const unsigned short INIT_SCSTART[2] = { 0x00, 0x00 };
146
147 /* ----- end of epson_md_tft.h ----- */
148
149
150 #include "debug.h"
151 #include "../drivers/ssi/omap-uwire.h"
152
153 #define LCD_UWIRE_CS 0
154
155 static int p2_panel_init(struct lcd_panel *panel)
156 {
157         DBGENTER(1);
158         DBGLEAVE(1);
159         return 0;
160 }
161
162 static void p2_panel_cleanup(struct lcd_panel *panel)
163 {
164         DBGENTER(1);
165         DBGLEAVE(1);
166 }
167
168 static int p2_panel_enable(struct lcd_panel *panel)
169 {
170         int i;
171         unsigned long value;
172         DBGENTER(1);
173
174                 /* thwack the reset line */
175         omap_set_gpio_direction(19, 0);
176         omap_set_gpio_dataout(19, 0);
177         mdelay(2);
178         omap_set_gpio_dataout(19, 1);
179
180                 /* bits 31:28 -> 0  LCD_PXL_15 .. 12 */
181         value = omap_readl(OMAP730_IO_CONF_3) & 0x0FFFFFFF;
182         omap_writel(value, OMAP730_IO_CONF_3);
183
184                 /* bits 19:0 -> 0  LCD_VSYNC, AC, PXL_0, PCLK, HSYNC,
185                 **                 PXL_9..1, PXL_10, PXL_11
186                 */
187         value = omap_readl(OMAP730_IO_CONF_4) & 0xFFF00000;
188         omap_writel(value, OMAP730_IO_CONF_4);
189
190         omap_uwire_configure_mode(0,16);
191
192         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_DISOFF, 9, 0,NULL,1);
193         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_SLPIN, 9, 0,NULL,1);
194         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_DISNOR, 9, 0,NULL,1);
195         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_GSSET, 9, 0,NULL,1);
196         omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_GSSET | 0x100), 9, 0,NULL,1);
197
198         /* DISCTL */ 
199         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_DISCTL, 9, 0,NULL,1); 
200         for (i = 0; i < (sizeof(INIT_DISCTL)/sizeof(unsigned short)); i++)
201                 omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_DISCTL[i] | 0x100), 9, 0,NULL,1);
202
203         /* GCP64 */
204         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_GCP64, 9, 0,NULL,1);
205         for (i = 0; i < (sizeof(INIT_GCP64)/sizeof(unsigned short)); i++)
206                 omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_GCP64[i] | 0x100), 9, 0,NULL,1);
207
208         /* GCP16 */
209         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_GCP16, 9, 0,NULL,1);
210         for (i = 0; i < (sizeof(INIT_GCP16)/sizeof(unsigned short)); i++)
211                 omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_GCP16[i] | 0x100), 9, 0,NULL,1);
212         
213         /* MD_CSET */
214         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_MD_CSET, 9, 0,NULL,1);
215         for (i = 0; i < (sizeof(INIT_MD_CSET)/sizeof(unsigned short)); i++)
216                 omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_MD_CSET[i] | 0x100), 9, 0,NULL,1);
217
218         /* MD_PSET */
219         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_MD_PSET, 9, 0,NULL,1);
220         for (i = 0; i < (sizeof(INIT_MD_PSET)/sizeof(unsigned short)); i++)
221                 omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_MD_PSET[i] | 0x100), 9, 0,NULL,1);
222
223         /* SD_CSET */
224         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_SD_CSET, 9, 0,NULL,1);
225         for (i = 0; i < (sizeof(INIT_SD_CSET)/sizeof(unsigned short)); i++)
226                 omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_SD_CSET[i] | 0x100), 9, 0,NULL,1);
227
228         /* SD_PSET */
229         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_SD_PSET, 9, 0,NULL,1);
230         for (i = 0; i < (sizeof(INIT_SD_PSET)/sizeof(unsigned short)); i++)
231                 omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_SD_PSET[i] | 0x100), 9, 0,NULL,1);
232
233         /* DATCTL */
234         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_DATCTL, 9, 0,NULL,1);
235         omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_DATCTL | 0x100), 9, 0,NULL,1);
236
237         /* OSSISEL = d'5 */
238         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_OSCISEL, 9, 0,NULL,1);
239         omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_OSCISEL | 0x100), 9, 0,NULL,1);
240
241         /* 14MSET = d'74 */
242         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_14MSET, 9, 0,NULL,1);
243         omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_14MSET | 0x100), 9, 0,NULL,1);
244
245         /* 14MEND */
246         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_14MEND, 9, 0,NULL,1);
247
248         /* 3500KSET = d'69 */
249         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_3500KSET, 9, 0,NULL,1);
250         omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_3500KSET | 0x100), 9, 0,NULL,1);
251
252         /* 3500KEND */
253         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_3500KEND, 9, 0,NULL,1);
254         
255         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_SLPOUT, 9, 0,NULL,1);
256         
257         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_VOLCTL, 9, 0,NULL,1);
258         omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_VOLCTL_Ton | 0x100), 9, 0,NULL,1);
259         
260         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_VOLCTL, 9, 0,NULL,1);
261
262         omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_VOLCTL | 0x100), 9, 0,NULL,1);
263         
264         omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_DISON, 9, 0,NULL,1);
265
266         /* enable backlight */
267         omap_set_gpio_direction(134, 0);
268         omap_set_gpio_dataout(134, 1);
269
270         DBGLEAVE(1);
271         return 0;
272 }
273
274 static void p2_panel_disable(struct lcd_panel *panel)
275 {
276         DBGENTER(1);
277         DBGLEAVE(1);
278 }
279
280 static unsigned long p2_panel_get_caps(struct lcd_panel *panel)
281 {
282         return 0;
283 }
284
285 static struct lcdc_video_mode mode176x220 = {
286         .x_res = 176,
287         .y_res = 220,
288         .pixel_clock = 12500,
289         .bpp = 16,
290         .hsw = 5,
291         .hfp = 1,
292         .hbp = 1,
293         .vsw = 2,
294         .vfp = 12,
295         .vbp = 1,
296         .pcd = 4,
297         .flags = OMAP_LCDC_INV_PIX_CLOCK,
298 };
299
300 struct lcd_panel p2_panel = {
301         .name       = "p2",
302         .config     = LCD_PANEL_TFT,
303         .video_mode = &mode176x220,
304         
305         .init    = p2_panel_init,
306         .cleanup = p2_panel_cleanup,
307         .enable  = p2_panel_enable,
308         .disable = p2_panel_disable,
309         .get_caps= p2_panel_get_caps,
310 };
311