summaryrefslogtreecommitdiffstats
path: root/extras/recipes-kernel/linux/linux-omap-psp-2.6.32/0026-board-overo-add-PM-code-and-sync-with-http-www.sakom.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap-psp-2.6.32/0026-board-overo-add-PM-code-and-sync-with-http-www.sakom.patch')
-rw-r--r--extras/recipes-kernel/linux/linux-omap-psp-2.6.32/0026-board-overo-add-PM-code-and-sync-with-http-www.sakom.patch373
1 files changed, 373 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap-psp-2.6.32/0026-board-overo-add-PM-code-and-sync-with-http-www.sakom.patch b/extras/recipes-kernel/linux/linux-omap-psp-2.6.32/0026-board-overo-add-PM-code-and-sync-with-http-www.sakom.patch
new file mode 100644
index 00000000..53bfbe0d
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-psp-2.6.32/0026-board-overo-add-PM-code-and-sync-with-http-www.sakom.patch
@@ -0,0 +1,373 @@
1From 1f91f7f6dea0268e23d5e3e78b6c8dc5ed245313 Mon Sep 17 00:00:00 2001
2From: Koen Kooi <koen@dominion.thruhere.net>
3Date: Sun, 14 Feb 2010 12:52:02 +0100
4Subject: [PATCH 26/45] board-overo: add PM code and sync with http://www.sakoman.com/cgi-bin/gitweb.cgi?p=linux-omap-2.6.git;a=shortlog;h=refs/heads/omap3-2.6.32
5
6---
7 arch/arm/mach-omap2/board-overo.c | 274 ++++++++++++++++++++++++++++++++-----
8 1 files changed, 242 insertions(+), 32 deletions(-)
9
10diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
11index 9c76588..2595f81 100644
12--- a/arch/arm/mach-omap2/board-overo.c
13+++ b/arch/arm/mach-omap2/board-overo.c
14@@ -28,6 +28,7 @@
15 #include <linux/platform_device.h>
16 #include <linux/i2c/twl.h>
17 #include <linux/regulator/machine.h>
18+#include <linux/spi/spi.h>
19
20 #include <linux/mtd/mtd.h>
21 #include <linux/mtd/nand.h>
22@@ -40,16 +41,24 @@
23
24 #include <plat/board.h>
25 #include <plat/common.h>
26+#include <plat/display.h>
27 #include <mach/gpio.h>
28 #include <plat/gpmc.h>
29 #include <mach/hardware.h>
30 #include <plat/nand.h>
31+#include <plat/mcspi.h>
32 #include <plat/usb.h>
33-
34-#include "mux.h"
35+#include <plat/clock.h>
36+#include <plat/omap-pm.h>
37+
38 #include "sdram-micron-mt46h32m32lf-6.h"
39 #include "mmc-twl4030.h"
40
41+#include "mux.h"
42+
43+#include "pm.h"
44+#include "omap3-opp.h"
45+
46 #define OVERO_GPIO_BT_XGATE 15
47 #define OVERO_GPIO_W2W_NRESET 16
48 #define OVERO_GPIO_PENDOWN 114
49@@ -95,18 +104,6 @@ static struct ads7846_platform_data ads7846_config = {
50 .keep_vref_on = 1,
51 };
52
53-static struct spi_board_info overo_spi_board_info[] __initdata = {
54- {
55- .modalias = "ads7846",
56- .bus_num = 1,
57- .chip_select = 0,
58- .max_speed_hz = 1500000,
59- .controller_data = &ads7846_mcspi_config,
60- .irq = OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN),
61- .platform_data = &ads7846_config,
62- }
63-};
64-
65 static void __init overo_ads7846_init(void)
66 {
67 if ((gpio_request(OVERO_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) &&
68@@ -116,9 +113,6 @@ static void __init overo_ads7846_init(void)
69 printk(KERN_ERR "could not obtain gpio for ADS7846_PENDOWN\n");
70 return;
71 }
72-
73- spi_register_board_info(overo_spi_board_info,
74- ARRAY_SIZE(overo_spi_board_info));
75 }
76
77 #else
78@@ -234,6 +228,169 @@ static inline void __init overo_init_smsc911x(void)
79 static inline void __init overo_init_smsc911x(void) { return; }
80 #endif
81
82+/* DSS */
83+static int lcd_enabled;
84+static int dvi_enabled;
85+
86+#define OVERO_GPIO_LCD_EN 144
87+#define OVERO_GPIO_LCD_BL 145
88+
89+static void __init overo_display_init(void)
90+{
91+ if ((gpio_request(OVERO_GPIO_LCD_EN, "OVERO_GPIO_LCD_EN") == 0) &&
92+ (gpio_direction_output(OVERO_GPIO_LCD_EN, 1) == 0))
93+ gpio_export(OVERO_GPIO_LCD_EN, 0);
94+ else
95+ printk(KERN_ERR "could not obtain gpio for "
96+ "OVERO_GPIO_LCD_EN\n");
97+
98+ if ((gpio_request(OVERO_GPIO_LCD_BL, "OVERO_GPIO_LCD_BL") == 0) &&
99+ (gpio_direction_output(OVERO_GPIO_LCD_BL, 1) == 0))
100+ gpio_export(OVERO_GPIO_LCD_BL, 0);
101+ else
102+ printk(KERN_ERR "could not obtain gpio for "
103+ "OVERO_GPIO_LCD_BL\n");
104+}
105+
106+static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
107+{
108+ if (lcd_enabled) {
109+ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
110+ return -EINVAL;
111+ }
112+ dvi_enabled = 1;
113+
114+ return 0;
115+}
116+
117+static void overo_panel_disable_dvi(struct omap_dss_device *dssdev)
118+{
119+ dvi_enabled = 0;
120+}
121+
122+static struct omap_dss_device overo_dvi_device = {
123+ .type = OMAP_DISPLAY_TYPE_DPI,
124+ .name = "dvi",
125+ .driver_name = "generic_panel",
126+ .phy.dpi.data_lines = 24,
127+ .platform_enable = overo_panel_enable_dvi,
128+ .platform_disable = overo_panel_disable_dvi,
129+};
130+
131+static int overo_panel_enable_tv(struct omap_dss_device *dssdev)
132+{
133+#define ENABLE_VDAC_DEDICATED 0x03
134+#define ENABLE_VDAC_DEV_GRP 0x20
135+
136+ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
137+ ENABLE_VDAC_DEDICATED,
138+ TWL4030_VDAC_DEDICATED);
139+ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
140+ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP);
141+
142+ return 0;
143+}
144+
145+static void overo_panel_disable_tv(struct omap_dss_device *dssdev)
146+{
147+ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
148+ TWL4030_VDAC_DEDICATED);
149+ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
150+ TWL4030_VDAC_DEV_GRP);
151+}
152+
153+static struct omap_dss_device overo_tv_device = {
154+ .name = "tv",
155+ .driver_name = "venc",
156+ .type = OMAP_DISPLAY_TYPE_VENC,
157+ .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
158+ .platform_enable = overo_panel_enable_tv,
159+ .platform_disable = overo_panel_disable_tv,
160+};
161+
162+static int overo_panel_enable_lcd(struct omap_dss_device *dssdev)
163+{
164+ if (dvi_enabled) {
165+ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
166+ return -EINVAL;
167+ }
168+
169+ gpio_set_value(OVERO_GPIO_LCD_EN, 1);
170+ gpio_set_value(OVERO_GPIO_LCD_BL, 1);
171+ lcd_enabled = 1;
172+ return 0;
173+}
174+
175+static void overo_panel_disable_lcd(struct omap_dss_device *dssdev)
176+{
177+ gpio_set_value(OVERO_GPIO_LCD_EN, 0);
178+ gpio_set_value(OVERO_GPIO_LCD_BL, 0);
179+ lcd_enabled = 0;
180+}
181+
182+#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
183+ defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
184+static struct omap_dss_device overo_lcd35_device = {
185+ .type = OMAP_DISPLAY_TYPE_DPI,
186+ .name = "lcd35",
187+ .driver_name = "lgphilips_lb035q02_panel",
188+ .phy.dpi.data_lines = 24,
189+ .panel.recommended_bpp = 16,
190+ .platform_enable = overo_panel_enable_lcd,
191+ .platform_disable = overo_panel_disable_lcd,
192+};
193+#endif
194+
195+#if defined(CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C) || \
196+ defined(CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C_MODULE)
197+static struct omap_dss_device overo_lcd43_device = {
198+ .type = OMAP_DISPLAY_TYPE_DPI,
199+ .name = "lcd43",
200+ .driver_name = "samsung_lte_panel",
201+ .phy.dpi.data_lines = 24,
202+ .panel.recommended_bpp = 16,
203+ .platform_enable = overo_panel_enable_lcd,
204+ .platform_disable = overo_panel_disable_lcd,
205+};
206+#endif
207+
208+static struct omap_dss_device *overo_dss_devices[] = {
209+ &overo_dvi_device,
210+ &overo_tv_device,
211+#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
212+ defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
213+ &overo_lcd35_device,
214+#endif
215+#if defined(CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C) || \
216+ defined(CONFIG_PANEL_SAMSUNG_LTE430WQ_F0C_MODULE)
217+ &overo_lcd43_device,
218+#endif
219+};
220+
221+static struct omap_dss_board_info overo_dss_data = {
222+ .num_devices = ARRAY_SIZE(overo_dss_devices),
223+ .devices = overo_dss_devices,
224+ .default_device = &overo_dvi_device,
225+};
226+
227+static struct platform_device overo_dss_device = {
228+ .name = "omapdss",
229+ .id = -1,
230+ .dev = {
231+ .platform_data = &overo_dss_data,
232+ },
233+};
234+
235+static struct regulator_consumer_supply overo_vdda_dac_supply = {
236+ .supply = "vdda_dac",
237+ .dev = &overo_dss_device.dev,
238+};
239+
240+static struct regulator_consumer_supply overo_vdds_dsi_supply = {
241+ .supply = "vdds_dsi",
242+ .dev = &overo_dss_device.dev,
243+};
244+
245 static struct mtd_partition overo_nand_partitions[] = {
246 {
247 .name = "xloader",
248@@ -379,6 +536,37 @@ static struct regulator_init_data overo_vmmc1 = {
249 .consumer_supplies = &overo_vmmc1_supply,
250 };
251
252+/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
253+static struct regulator_init_data overo_vdac = {
254+ .constraints = {
255+ .min_uV = 1800000,
256+ .max_uV = 1800000,
257+ .valid_modes_mask = REGULATOR_MODE_NORMAL
258+ | REGULATOR_MODE_STANDBY,
259+ .valid_ops_mask = REGULATOR_CHANGE_MODE
260+ | REGULATOR_CHANGE_STATUS,
261+ },
262+ .num_consumer_supplies = 1,
263+ .consumer_supplies = &overo_vdda_dac_supply,
264+};
265+
266+/* VPLL2 for digital video outputs */
267+static struct regulator_init_data overo_vpll2 = {
268+ .constraints = {
269+ .name = "VDVI",
270+ .min_uV = 1800000,
271+ .max_uV = 1800000,
272+ .valid_modes_mask = REGULATOR_MODE_NORMAL
273+ | REGULATOR_MODE_STANDBY,
274+ .valid_ops_mask = REGULATOR_CHANGE_MODE
275+ | REGULATOR_CHANGE_STATUS,
276+ },
277+ .num_consumer_supplies = 1,
278+ .consumer_supplies = &overo_vdds_dsi_supply,
279+};
280+
281+/* mmc2 (WLAN) and Bluetooth don't use twl4030 regulators */
282+
283 static struct twl4030_codec_audio_data overo_audio_data = {
284 .audio_mclk = 26000000,
285 };
286@@ -402,6 +590,8 @@ static struct twl4030_platform_data overo_twldata = {
287 .usb = &overo_usb_data,
288 .codec = &overo_codec_data,
289 .vmmc1 = &overo_vmmc1,
290+ .vdac = &overo_vdac,
291+ .vpll2 = &overo_vpll2,
292 };
293
294 static struct i2c_board_info __initdata overo_i2c_boardinfo[] = {
295@@ -422,31 +612,50 @@ static int __init overo_i2c_init(void)
296 return 0;
297 }
298
299-static struct platform_device overo_lcd_device = {
300- .name = "overo_lcd",
301- .id = -1,
302-};
303-
304-static struct omap_lcd_config overo_lcd_config __initdata = {
305- .ctrl_name = "internal",
306+static struct spi_board_info overo_spi_board_info[] __initdata = {
307+#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
308+ defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
309+ {
310+ .modalias = "ads7846",
311+ .bus_num = 1,
312+ .chip_select = 0,
313+ .max_speed_hz = 1500000,
314+ .controller_data = &ads7846_mcspi_config,
315+ .irq = OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN),
316+ .platform_data = &ads7846_config,
317+ },
318+#endif
319+#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
320+ defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
321+ {
322+ .modalias = "lgphilips_lb035q02_panel-spi",
323+ .bus_num = 1,
324+ .chip_select = 1,
325+ .max_speed_hz = 500000,
326+ .mode = SPI_MODE_3,
327+ },
328+#endif
329 };
330
331-static struct omap_board_config_kernel overo_config[] __initdata = {
332- { OMAP_TAG_LCD, &overo_lcd_config },
333-};
334+static int __init overo_spi_init(void)
335+{
336+ overo_ads7846_init();
337+ spi_register_board_info(overo_spi_board_info,
338+ ARRAY_SIZE(overo_spi_board_info));
339+ return 0;
340+}
341
342 static void __init overo_init_irq(void)
343 {
344- omap_board_config = overo_config;
345- omap_board_config_size = ARRAY_SIZE(overo_config);
346 omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
347- mt46h32m32lf6_sdrc_params, NULL, NULL, NULL);
348+ NULL, omap35x_mpu_rate_table,
349+ omap35x_dsp_rate_table, omap35x_l3_rate_table);
350 omap_init_irq();
351 omap_gpio_init();
352 }
353
354 static struct platform_device *overo_devices[] __initdata = {
355- &overo_lcd_device,
356+ &overo_dss_device,
357 };
358
359 static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
360@@ -477,8 +686,9 @@ static void __init overo_init(void)
361 overo_flash_init();
362 usb_musb_init();
363 usb_ehci_init(&ehci_pdata);
364- overo_ads7846_init();
365+ overo_spi_init();
366 overo_init_smsc911x();
367+ overo_display_init();
368
369 /* Ensure SDRC pins are mux'd for self-refresh */
370 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
371--
3721.6.6.1
373