Merge tag 'omap-pm-v3.10/cleanup/pm' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / arch / arm / mach-imx / eukrea_mbimx27-baseboard.c
1 /*
2  * Copyright (C) 2009-2010 Eric Benard - eric@eukrea.com
3  *
4  * Based on pcm970-baseboard.c which is :
5  * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  */
21
22 #include <linux/gpio.h>
23 #include <linux/irq.h>
24 #include <linux/platform_device.h>
25 #include <linux/spi/spi.h>
26 #include <linux/spi/ads7846.h>
27 #include <linux/backlight.h>
28 #include <video/platform_lcd.h>
29
30 #include <asm/mach/arch.h>
31
32 #include "common.h"
33 #include "devices-imx27.h"
34 #include "hardware.h"
35 #include "iomux-mx27.h"
36
37 static const int eukrea_mbimx27_pins[] __initconst = {
38         /* UART2 */
39         PE3_PF_UART2_CTS,
40         PE4_PF_UART2_RTS,
41         PE6_PF_UART2_TXD,
42         PE7_PF_UART2_RXD,
43         /* UART3 */
44         PE8_PF_UART3_TXD,
45         PE9_PF_UART3_RXD,
46         PE10_PF_UART3_CTS,
47         PE11_PF_UART3_RTS,
48         /* UART4 */
49 #if !defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4)
50         PB26_AF_UART4_RTS,
51         PB28_AF_UART4_TXD,
52         PB29_AF_UART4_CTS,
53         PB31_AF_UART4_RXD,
54 #endif
55         /* SDHC1*/
56         PE18_PF_SD1_D0,
57         PE19_PF_SD1_D1,
58         PE20_PF_SD1_D2,
59         PE21_PF_SD1_D3,
60         PE22_PF_SD1_CMD,
61         PE23_PF_SD1_CLK,
62         /* display */
63         PA5_PF_LSCLK,
64         PA6_PF_LD0,
65         PA7_PF_LD1,
66         PA8_PF_LD2,
67         PA9_PF_LD3,
68         PA10_PF_LD4,
69         PA11_PF_LD5,
70         PA12_PF_LD6,
71         PA13_PF_LD7,
72         PA14_PF_LD8,
73         PA15_PF_LD9,
74         PA16_PF_LD10,
75         PA17_PF_LD11,
76         PA18_PF_LD12,
77         PA19_PF_LD13,
78         PA20_PF_LD14,
79         PA21_PF_LD15,
80         PA22_PF_LD16,
81         PA23_PF_LD17,
82         PA28_PF_HSYNC,
83         PA29_PF_VSYNC,
84         PA30_PF_CONTRAST,
85         PA31_PF_OE_ACD,
86         /* SPI1 */
87         PD29_PF_CSPI1_SCLK,
88         PD30_PF_CSPI1_MISO,
89         PD31_PF_CSPI1_MOSI,
90         /* SSI4 */
91 #if defined(CONFIG_SND_SOC_EUKREA_TLV320) \
92         || defined(CONFIG_SND_SOC_EUKREA_TLV320_MODULE)
93         PC16_PF_SSI4_FS,
94         PC17_PF_SSI4_RXD | GPIO_PUEN,
95         PC18_PF_SSI4_TXD | GPIO_PUEN,
96         PC19_PF_SSI4_CLK,
97 #endif
98 };
99
100 static const uint32_t eukrea_mbimx27_keymap[] = {
101         KEY(0, 0, KEY_UP),
102         KEY(0, 1, KEY_DOWN),
103         KEY(1, 0, KEY_RIGHT),
104         KEY(1, 1, KEY_LEFT),
105 };
106
107 static const struct matrix_keymap_data
108 eukrea_mbimx27_keymap_data __initconst = {
109         .keymap         = eukrea_mbimx27_keymap,
110         .keymap_size    = ARRAY_SIZE(eukrea_mbimx27_keymap),
111 };
112
113 static const struct gpio_led eukrea_mbimx27_gpio_leds[] __initconst = {
114         {
115                 .name                   = "led1",
116                 .default_trigger        = "heartbeat",
117                 .active_low             = 1,
118                 .gpio                   = GPIO_PORTF | 16,
119         },
120         {
121                 .name                   = "led2",
122                 .default_trigger        = "none",
123                 .active_low             = 1,
124                 .gpio                   = GPIO_PORTF | 19,
125         },
126 };
127
128 static const struct gpio_led_platform_data
129                 eukrea_mbimx27_gpio_led_info __initconst = {
130         .leds           = eukrea_mbimx27_gpio_leds,
131         .num_leds       = ARRAY_SIZE(eukrea_mbimx27_gpio_leds),
132 };
133
134 static struct imx_fb_videomode eukrea_mbimx27_modes[] = {
135         {
136                 .mode = {
137                         .name           = "CMO-QVGA",
138                         .refresh        = 60,
139                         .xres           = 320,
140                         .yres           = 240,
141                         .pixclock       = 156000,
142                         .hsync_len      = 30,
143                         .left_margin    = 38,
144                         .right_margin   = 20,
145                         .vsync_len      = 3,
146                         .upper_margin   = 15,
147                         .lower_margin   = 4,
148                 },
149                 .pcr            = 0xFAD08B80,
150                 .bpp            = 16,
151         }, {
152                 .mode = {
153                         .name           = "DVI-VGA",
154                         .refresh        = 60,
155                         .xres           = 640,
156                         .yres           = 480,
157                         .pixclock       = 32000,
158                         .hsync_len      = 1,
159                         .left_margin    = 35,
160                         .right_margin   = 0,
161                         .vsync_len      = 1,
162                         .upper_margin   = 7,
163                         .lower_margin   = 0,
164                 },
165                 .pcr            = 0xFA208B80,
166                 .bpp            = 16,
167         }, {
168                 .mode = {
169                         .name           = "DVI-SVGA",
170                         .refresh        = 60,
171                         .xres           = 800,
172                         .yres           = 600,
173                         .pixclock       = 25000,
174                         .hsync_len      = 1,
175                         .left_margin    = 35,
176                         .right_margin   = 0,
177                         .vsync_len      = 1,
178                         .upper_margin   = 7,
179                         .lower_margin   = 0,
180                 },
181                 .pcr            = 0xFA208B80,
182                 .bpp            = 16,
183         },
184 };
185
186 static const struct imx_fb_platform_data eukrea_mbimx27_fb_data __initconst = {
187         .mode = eukrea_mbimx27_modes,
188         .num_modes = ARRAY_SIZE(eukrea_mbimx27_modes),
189
190         .pwmr           = 0x00A903FF,
191         .lscr1          = 0x00120300,
192         .dmacr          = 0x00040060,
193 };
194
195 static void eukrea_mbimx27_bl_set_intensity(int intensity)
196 {
197         if (intensity)
198                 gpio_direction_output(GPIO_PORTE | 5, 1);
199         else
200                 gpio_direction_output(GPIO_PORTE | 5, 0);
201 }
202
203 static struct generic_bl_info eukrea_mbimx27_bl_info = {
204         .name                   = "eukrea_mbimx27-bl",
205         .max_intensity          = 0xff,
206         .default_intensity      = 0xff,
207         .set_bl_intensity       = eukrea_mbimx27_bl_set_intensity,
208 };
209
210 static struct platform_device eukrea_mbimx27_bl_dev = {
211         .name                   = "generic-bl",
212         .id                     = 1,
213         .dev = {
214                 .platform_data  = &eukrea_mbimx27_bl_info,
215         },
216 };
217
218 static void eukrea_mbimx27_lcd_power_set(struct plat_lcd_data *pd,
219                                    unsigned int power)
220 {
221         if (power)
222                 gpio_direction_output(GPIO_PORTA | 25, 1);
223         else
224                 gpio_direction_output(GPIO_PORTA | 25, 0);
225 }
226
227 static struct plat_lcd_data eukrea_mbimx27_lcd_power_data = {
228         .set_power              = eukrea_mbimx27_lcd_power_set,
229 };
230
231 static struct platform_device eukrea_mbimx27_lcd_powerdev = {
232         .name                   = "platform-lcd",
233         .dev.platform_data      = &eukrea_mbimx27_lcd_power_data,
234 };
235
236 static const struct imxuart_platform_data uart_pdata __initconst = {
237         .flags = IMXUART_HAVE_RTSCTS,
238 };
239
240 #define ADS7846_PENDOWN (GPIO_PORTD | 25)
241
242 static void __maybe_unused ads7846_dev_init(void)
243 {
244         if (gpio_request(ADS7846_PENDOWN, "ADS7846 pendown") < 0) {
245                 printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
246                 return;
247         }
248         gpio_direction_input(ADS7846_PENDOWN);
249 }
250
251 static int ads7846_get_pendown_state(void)
252 {
253         return !gpio_get_value(ADS7846_PENDOWN);
254 }
255
256 static struct ads7846_platform_data ads7846_config __initdata = {
257         .get_pendown_state      = ads7846_get_pendown_state,
258         .keep_vref_on           = 1,
259 };
260
261 static struct spi_board_info __maybe_unused
262                 eukrea_mbimx27_spi_board_info[] __initdata = {
263         [0] = {
264                 .modalias       = "ads7846",
265                 .bus_num        = 0,
266                 .chip_select    = 0,
267                 .max_speed_hz   = 1500000,
268                 /* irq number is run-time assigned */
269                 .platform_data  = &ads7846_config,
270                 .mode           = SPI_MODE_2,
271         },
272 };
273
274 static int eukrea_mbimx27_spi_cs[] = {GPIO_PORTD | 28};
275
276 static const struct spi_imx_master eukrea_mbimx27_spi0_data __initconst = {
277         .chipselect     = eukrea_mbimx27_spi_cs,
278         .num_chipselect = ARRAY_SIZE(eukrea_mbimx27_spi_cs),
279 };
280
281 static struct i2c_board_info eukrea_mbimx27_i2c_devices[] = {
282         {
283                 I2C_BOARD_INFO("tlv320aic23", 0x1a),
284         },
285 };
286
287 static const struct imxmmc_platform_data sdhc_pdata __initconst = {
288         .dat3_card_detect = 1,
289 };
290
291 static const
292 struct imx_ssi_platform_data eukrea_mbimx27_ssi_pdata __initconst = {
293         .flags = IMX_SSI_DMA | IMX_SSI_USE_I2S_SLAVE,
294 };
295
296 /*
297  * system init for baseboard usage. Will be called by cpuimx27 init.
298  *
299  * Add platform devices present on this baseboard and init
300  * them from CPU side as far as required to use them later on
301  */
302 void __init eukrea_mbimx27_baseboard_init(void)
303 {
304         mxc_gpio_setup_multiple_pins(eukrea_mbimx27_pins,
305                 ARRAY_SIZE(eukrea_mbimx27_pins), "MBIMX27");
306
307         imx27_add_imx_uart1(&uart_pdata);
308         imx27_add_imx_uart2(&uart_pdata);
309 #if !defined(CONFIG_MACH_EUKREA_CPUIMX27_USEUART4)
310         imx27_add_imx_uart3(&uart_pdata);
311 #endif
312
313         imx27_add_imx_fb(&eukrea_mbimx27_fb_data);
314         imx27_add_mxc_mmc(0, &sdhc_pdata);
315
316         i2c_register_board_info(0, eukrea_mbimx27_i2c_devices,
317                                 ARRAY_SIZE(eukrea_mbimx27_i2c_devices));
318
319         imx27_add_imx_ssi(0, &eukrea_mbimx27_ssi_pdata);
320
321 #if defined(CONFIG_TOUCHSCREEN_ADS7846) \
322         || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
323         /* ADS7846 Touchscreen controller init */
324         mxc_gpio_mode(GPIO_PORTD | 25 | GPIO_GPIO | GPIO_IN);
325         ads7846_dev_init();
326 #endif
327
328         /* SPI_CS0 init */
329         mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT);
330         imx27_add_spi_imx0(&eukrea_mbimx27_spi0_data);
331         eukrea_mbimx27_spi_board_info[0].irq = gpio_to_irq(IMX_GPIO_NR(4, 25));
332         spi_register_board_info(eukrea_mbimx27_spi_board_info,
333                         ARRAY_SIZE(eukrea_mbimx27_spi_board_info));
334
335         /* Leds configuration */
336         mxc_gpio_mode(GPIO_PORTF | 16 | GPIO_GPIO | GPIO_OUT);
337         mxc_gpio_mode(GPIO_PORTF | 19 | GPIO_GPIO | GPIO_OUT);
338         /* Backlight */
339         mxc_gpio_mode(GPIO_PORTE | 5 | GPIO_GPIO | GPIO_OUT);
340         gpio_request(GPIO_PORTE | 5, "backlight");
341         platform_device_register(&eukrea_mbimx27_bl_dev);
342         /* LCD Reset */
343         mxc_gpio_mode(GPIO_PORTA | 25 | GPIO_GPIO | GPIO_OUT);
344         gpio_request(GPIO_PORTA | 25, "lcd_enable");
345         platform_device_register(&eukrea_mbimx27_lcd_powerdev);
346
347         imx27_add_imx_keypad(&eukrea_mbimx27_keymap_data);
348
349         gpio_led_register_device(-1, &eukrea_mbimx27_gpio_led_info);
350         imx_add_platform_device("eukrea_tlv320", 0, NULL, 0, NULL, 0);
351 }