2 * File: drivers/video/omap/lcd-p2.c
4 * LCD panel support for the TI OMAP P2 board
7 * jekyll <jekyll@mail.jekyll.idv.tw>
8 * B Jp <lastjp_fr@yahoo.fr>
9 * Brian Swetland <swetland@android.com>
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.
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.
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.
26 #include <linux/module.h>
27 #include <linux/delay.h>
29 #include <asm/arch/mux.h>
30 #include <asm/arch/gpio.h>
31 #include <asm/arch/omapfb.h>
34 * File: epson-md-tft.h
36 * This file contains definitions for Epsons MD-TF LCD Module
38 * Copyright (C) 2004 MPC-Data Limited (http://www.mpc-data.co.uk)
39 * Author: Dave Peverley <dpeverley at mpc-data.co.uk>
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.
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.
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.
61 * Please report all bugs and problems to the author.
65 /* LCD uWire commands & params
66 * All values from Epson
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
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
97 #define INIT_3500KSET 0x45
98 #define INIT_14MSET 0x4B
99 #define INIT_DATCTL 0x08 /* 6.6.6 bits for D-Sample */
101 #define INIT_OSCISEL 0x05
103 #define INIT_VOLCTL 0x77 /* Nominel "volume" */
105 #define INIT_VOLCTL_Ton 0x98 /* Activate power-IC timer */
106 #define INIT_GSSET 0x00
108 const unsigned short INIT_DISCTL[11] =
110 0xDE, 0x01, 0x64, 0x00, 0x1B, 0xF4, 0x00, 0xDC, 0x00, 0x02, 0x00
113 const unsigned short INIT_GCP64[126] =
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
133 const unsigned short INIT_GCP16[15] =
135 0x1A,0x31,0x48,0x54,0x5F,0x67,0x70,0x76,0x7C,0x80,0x83,0x84,0x85,0x87,0x96
138 const unsigned short INIT_MD_PSET[4] = { 0, 0, 219, 0 };
139 const unsigned short INIT_MD_CSET[4] = { 2, 0, 177, 0 };
141 const unsigned short INIT_SD_PSET[4] = { 0x00, 0x01, 0x00, 0x01 };
142 const unsigned short INIT_SD_CSET[4] = { 0x00, 0x02, 0x00, 0x02 };
144 const unsigned short INIT_ASCSET[7] = { 0x00, 0x00, 0xDB, 0x00, 0xDC, 0x00, 0x01 };
145 const unsigned short INIT_SCSTART[2] = { 0x00, 0x00 };
147 /* ----- end of epson_md_tft.h ----- */
151 #include "../drivers/ssi/omap-uwire.h"
153 #define LCD_UWIRE_CS 0
155 static int p2_panel_init(struct omapfb_device *fbdev)
162 static void p2_panel_cleanup(void)
168 static int p2_panel_enable(void)
174 /* thwack the reset line */
175 omap_set_gpio_direction(19, 0);
176 omap_set_gpio_dataout(19, 0);
178 omap_set_gpio_dataout(19, 1);
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);
184 /* bits 19:0 -> 0 LCD_VSYNC, AC, PXL_0, PCLK, HSYNC,
185 ** PXL_9..1, PXL_10, PXL_11
187 value = omap_readl(OMAP730_IO_CONF_4) & 0xFFF00000;
188 omap_writel(value, OMAP730_IO_CONF_4);
190 omap_uwire_configure_mode(0,16);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
246 omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_14MEND, 9, 0,NULL,1);
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);
253 omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_3500KEND, 9, 0,NULL,1);
255 omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_SLPOUT, 9, 0,NULL,1);
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);
260 omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_VOLCTL, 9, 0,NULL,1);
262 omap_uwire_data_transfer(LCD_UWIRE_CS, (INIT_VOLCTL | 0x100), 9, 0,NULL,1);
264 omap_uwire_data_transfer(LCD_UWIRE_CS, LCD_DISON, 9, 0,NULL,1);
266 /* enable backlight */
267 omap_set_gpio_direction(134, 0);
268 omap_set_gpio_dataout(134, 1);
274 static void p2_panel_disable(void)
280 static unsigned long p2_panel_get_caps(void)
285 struct lcd_panel p2_panel = {
287 .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_PIX_CLOCK,
293 .pixel_clock = 12500,
301 .init = p2_panel_init,
302 .cleanup = p2_panel_cleanup,
303 .enable = p2_panel_enable,
304 .disable = p2_panel_disable,
305 .get_caps = p2_panel_get_caps,