Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / drivers / video / omap / lcd_overo.c
1 /*
2  * LCD panel support for the Gumstix Overo
3  *
4  * Author: Steve Sakoman <steve@sakoman.com>
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the
8  * Free Software Foundation; either version 2 of the License, or (at your
9  * option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  */
21
22 #include <linux/module.h>
23 #include <linux/platform_device.h>
24 #include <linux/i2c/twl.h>
25
26 #include <mach/gpio.h>
27 #include <plat/mux.h>
28 #include <asm/mach-types.h>
29
30 #include "omapfb.h"
31
32 #define LCD_ENABLE       144
33
34 static int overo_panel_init(struct lcd_panel *panel,
35                                 struct omapfb_device *fbdev)
36 {
37         if ((gpio_request(LCD_ENABLE, "LCD_ENABLE") == 0) &&
38             (gpio_direction_output(LCD_ENABLE, 1) == 0))
39                 gpio_export(LCD_ENABLE, 0);
40         else
41                 printk(KERN_ERR "could not obtain gpio for LCD_ENABLE\n");
42
43         return 0;
44 }
45
46 static void overo_panel_cleanup(struct lcd_panel *panel)
47 {
48         gpio_free(LCD_ENABLE);
49 }
50
51 static int overo_panel_enable(struct lcd_panel *panel)
52 {
53         gpio_set_value(LCD_ENABLE, 1);
54         return 0;
55 }
56
57 static void overo_panel_disable(struct lcd_panel *panel)
58 {
59         gpio_set_value(LCD_ENABLE, 0);
60 }
61
62 static unsigned long overo_panel_get_caps(struct lcd_panel *panel)
63 {
64         return 0;
65 }
66
67 struct lcd_panel overo_panel = {
68         .name           = "overo",
69         .config         = OMAP_LCDC_PANEL_TFT,
70         .bpp            = 16,
71         .data_lines     = 24,
72
73 #if defined CONFIG_FB_OMAP_031M3R
74
75         /* 640 x 480 @ 60 Hz  Reduced blanking VESA CVT 0.31M3-R */
76         .x_res          = 640,
77         .y_res          = 480,
78         .hfp            = 48,
79         .hsw            = 32,
80         .hbp            = 80,
81         .vfp            = 3,
82         .vsw            = 4,
83         .vbp            = 7,
84         .pixel_clock    = 23500,
85
86 #elif defined CONFIG_FB_OMAP_048M3R
87
88         /* 800 x 600 @ 60 Hz  Reduced blanking VESA CVT 0.48M3-R */
89         .x_res          = 800,
90         .y_res          = 600,
91         .hfp            = 48,
92         .hsw            = 32,
93         .hbp            = 80,
94         .vfp            = 3,
95         .vsw            = 4,
96         .vbp            = 11,
97         .pixel_clock    = 35500,
98
99 #elif defined CONFIG_FB_OMAP_079M3R
100
101         /* 1024 x 768 @ 60 Hz  Reduced blanking VESA CVT 0.79M3-R */
102         .x_res          = 1024,
103         .y_res          = 768,
104         .hfp            = 48,
105         .hsw            = 32,
106         .hbp            = 80,
107         .vfp            = 3,
108         .vsw            = 4,
109         .vbp            = 15,
110         .pixel_clock    = 56000,
111
112 #elif defined CONFIG_FB_OMAP_092M9R
113
114         /* 1280 x 720 @ 60 Hz  Reduced blanking VESA CVT 0.92M9-R */
115         .x_res          = 1280,
116         .y_res          = 720,
117         .hfp            = 48,
118         .hsw            = 32,
119         .hbp            = 80,
120         .vfp            = 3,
121         .vsw            = 5,
122         .vbp            = 13,
123         .pixel_clock    = 64000,
124
125 #else
126
127         /* use 640 x 480 if no config option */
128         /* 640 x 480 @ 60 Hz  Reduced blanking VESA CVT 0.31M3-R */
129         .x_res          = 640,
130         .y_res          = 480,
131         .hfp            = 48,
132         .hsw            = 32,
133         .hbp            = 80,
134         .vfp            = 3,
135         .vsw            = 4,
136         .vbp            = 7,
137         .pixel_clock    = 23500,
138
139 #endif
140
141         .init           = overo_panel_init,
142         .cleanup        = overo_panel_cleanup,
143         .enable         = overo_panel_enable,
144         .disable        = overo_panel_disable,
145         .get_caps       = overo_panel_get_caps,
146 };
147
148 static int overo_panel_probe(struct platform_device *pdev)
149 {
150         omapfb_register_panel(&overo_panel);
151         return 0;
152 }
153
154 static int overo_panel_remove(struct platform_device *pdev)
155 {
156         /* omapfb does not have unregister_panel */
157         return 0;
158 }
159
160 static struct platform_driver overo_panel_driver = {
161         .probe          = overo_panel_probe,
162         .remove         = overo_panel_remove,
163         .driver         = {
164                 .name   = "overo_lcd",
165                 .owner  = THIS_MODULE,
166         },
167 };
168
169 static int __init overo_panel_drv_init(void)
170 {
171         return platform_driver_register(&overo_panel_driver);
172 }
173
174 static void __exit overo_panel_drv_exit(void)
175 {
176         platform_driver_unregister(&overo_panel_driver);
177 }
178
179 module_init(overo_panel_drv_init);
180 module_exit(overo_panel_drv_exit);