Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
evklcd10x.c
Go to the documentation of this file.
1 /*
2  * Board-specific setup code for the ATEVKLCD10X addon board to the ATNGW100
3  * Network Gateway
4  *
5  * Copyright (C) 2008 Atmel Corporation
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License version 2 as published by
9  * the Free Software Foundation.
10  */
11 
12 #include <linux/init.h>
13 #include <linux/linkage.h>
14 #include <linux/gpio.h>
15 #include <linux/fb.h>
16 #include <linux/platform_device.h>
17 
18 #include <video/atmel_lcdc.h>
19 
20 #include <asm/setup.h>
21 
22 #include <mach/at32ap700x.h>
23 #include <mach/portmux.h>
24 #include <mach/board.h>
25 
26 #include <sound/atmel-ac97c.h>
27 
28 static struct ac97c_platform_data __initdata ac97c0_data = {
29  .reset_pin = GPIO_PIN_PB(19),
30 };
31 
32 #ifdef CONFIG_BOARD_ATNGW100_EVKLCD10X_VGA
33 static struct fb_videomode __initdata tcg057vglad_modes[] = {
34  {
35  .name = "640x480 @ 50",
36  .refresh = 50,
37  .xres = 640, .yres = 480,
38  .pixclock = KHZ2PICOS(25180),
39 
40  .left_margin = 64, .right_margin = 96,
41  .upper_margin = 34, .lower_margin = 11,
42  .hsync_len = 64, .vsync_len = 15,
43 
44  .sync = 0,
45  .vmode = FB_VMODE_NONINTERLACED,
46  },
47 };
48 
49 static struct fb_monspecs __initdata atevklcd10x_default_monspecs = {
50  .manufacturer = "KYO",
51  .monitor = "TCG057VGLAD",
52  .modedb = tcg057vglad_modes,
53  .modedb_len = ARRAY_SIZE(tcg057vglad_modes),
54  .hfmin = 19948,
55  .hfmax = 31478,
56  .vfmin = 50,
57  .vfmax = 67,
58  .dclkmax = 28330000,
59 };
60 
61 static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = {
62  .default_bpp = 16,
63  .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
64  .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
67  .default_monspecs = &atevklcd10x_default_monspecs,
68  .guard_time = 2,
69 };
70 #elif CONFIG_BOARD_ATNGW100_EVKLCD10X_QVGA
71 static struct fb_videomode __initdata tcg057qvlad_modes[] = {
72  {
73  .name = "320x240 @ 50",
74  .refresh = 50,
75  .xres = 320, .yres = 240,
76  .pixclock = KHZ2PICOS(6300),
77 
78  .left_margin = 34, .right_margin = 46,
79  .upper_margin = 7, .lower_margin = 15,
80  .hsync_len = 64, .vsync_len = 12,
81 
82  .sync = 0,
83  .vmode = FB_VMODE_NONINTERLACED,
84  },
85 };
86 
87 static struct fb_monspecs __initdata atevklcd10x_default_monspecs = {
88  .manufacturer = "KYO",
89  .monitor = "TCG057QVLAD",
90  .modedb = tcg057qvlad_modes,
91  .modedb_len = ARRAY_SIZE(tcg057qvlad_modes),
92  .hfmin = 19948,
93  .hfmax = 31478,
94  .vfmin = 50,
95  .vfmax = 67,
96  .dclkmax = 7000000,
97 };
98 
99 static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = {
100  .default_bpp = 16,
101  .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
102  .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
105  .default_monspecs = &atevklcd10x_default_monspecs,
106  .guard_time = 2,
107 };
108 #elif CONFIG_BOARD_ATNGW100_EVKLCD10X_POW_QVGA
109 static struct fb_videomode __initdata ph320240t_modes[] = {
110  {
111  .name = "320x240 @ 60",
112  .refresh = 60,
113  .xres = 320, .yres = 240,
114  .pixclock = KHZ2PICOS(6300),
115 
116  .left_margin = 38, .right_margin = 20,
117  .upper_margin = 15, .lower_margin = 5,
118  .hsync_len = 30, .vsync_len = 3,
119 
120  .sync = 0,
121  .vmode = FB_VMODE_NONINTERLACED,
122  },
123 };
124 
125 static struct fb_monspecs __initdata atevklcd10x_default_monspecs = {
126  .manufacturer = "POW",
127  .monitor = "PH320240T",
128  .modedb = ph320240t_modes,
129  .modedb_len = ARRAY_SIZE(ph320240t_modes),
130  .hfmin = 14400,
131  .hfmax = 21600,
132  .vfmin = 50,
133  .vfmax = 90,
134  .dclkmax = 6400000,
135 };
136 
137 static struct atmel_lcdfb_info __initdata atevklcd10x_lcdc_data = {
138  .default_bpp = 16,
139  .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
140  .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
143  .default_monspecs = &atevklcd10x_default_monspecs,
144  .guard_time = 2,
145 };
146 #endif
147 
148 static void atevklcd10x_lcdc_power_control(int on)
149 {
150  gpio_set_value(GPIO_PIN_PB(15), on);
151 }
152 
153 static int __init atevklcd10x_init(void)
154 {
155  /* PB15 is connected to the enable line on the boost regulator
156  * controlling the backlight for the LCD panel.
157  */
159  gpio_request(GPIO_PIN_PB(15), "backlight");
161 
162  atevklcd10x_lcdc_data.atmel_lcdfb_power_control =
163  atevklcd10x_lcdc_power_control;
164 
165  at32_add_device_lcdc(0, &atevklcd10x_lcdc_data,
167 #ifdef CONFIG_BOARD_ATNGW100_MKII
169 #else
171 #endif
172  );
173 
174  at32_add_device_ac97c(0, &ac97c0_data, AC97C_BOTH);
175 
176  return 0;
177 }
178 postcore_initcall(atevklcd10x_init);