ARM: OMAP2+: Remove hardcoded twl4030 gpio_base, irq_base and irq_end
[cascardo/linux.git] / arch / arm / mach-omap2 / board-ldp.c
1 /*
2  * linux/arch/arm/mach-omap2/board-ldp.c
3  *
4  * Copyright (C) 2008 Texas Instruments Inc.
5  * Nishant Kamat <nskamat@ti.com>
6  *
7  * Modified from mach-omap2/board-3430sdp.c
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13 #include <linux/gpio.h>
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/platform_device.h>
17 #include <linux/delay.h>
18 #include <linux/input.h>
19 #include <linux/input/matrix_keypad.h>
20 #include <linux/gpio_keys.h>
21 #include <linux/workqueue.h>
22 #include <linux/err.h>
23 #include <linux/clk.h>
24 #include <linux/spi/spi.h>
25 #include <linux/regulator/fixed.h>
26 #include <linux/regulator/machine.h>
27 #include <linux/i2c/twl.h>
28 #include <linux/io.h>
29 #include <linux/smsc911x.h>
30 #include <linux/mmc/host.h>
31
32 #include <mach/hardware.h>
33 #include <asm/mach-types.h>
34 #include <asm/mach/arch.h>
35 #include <asm/mach/map.h>
36
37 #include <plat/mcspi.h>
38 #include "common.h"
39 #include <plat/gpmc.h>
40 #include <mach/board-zoom.h>
41
42 #include <asm/delay.h>
43 #include <plat/usb.h>
44 #include <plat/gpmc-smsc911x.h>
45
46 #include <video/omapdss.h>
47 #include <video/omap-panel-generic-dpi.h>
48
49 #include "board-flash.h"
50 #include "mux.h"
51 #include "hsmmc.h"
52 #include "control.h"
53 #include "common-board-devices.h"
54
55 #define LDP_SMSC911X_CS         1
56 #define LDP_SMSC911X_GPIO       152
57 #define DEBUG_BASE              0x08000000
58 #define LDP_ETHR_START          DEBUG_BASE
59
60 static uint32_t board_keymap[] = {
61         KEY(0, 0, KEY_1),
62         KEY(1, 0, KEY_2),
63         KEY(2, 0, KEY_3),
64         KEY(0, 1, KEY_4),
65         KEY(1, 1, KEY_5),
66         KEY(2, 1, KEY_6),
67         KEY(3, 1, KEY_F5),
68         KEY(0, 2, KEY_7),
69         KEY(1, 2, KEY_8),
70         KEY(2, 2, KEY_9),
71         KEY(3, 2, KEY_F6),
72         KEY(0, 3, KEY_F7),
73         KEY(1, 3, KEY_0),
74         KEY(2, 3, KEY_F8),
75         PERSISTENT_KEY(4, 5),
76         KEY(4, 4, KEY_VOLUMEUP),
77         KEY(5, 5, KEY_VOLUMEDOWN),
78         0
79 };
80
81 static struct matrix_keymap_data board_map_data = {
82         .keymap                 = board_keymap,
83         .keymap_size            = ARRAY_SIZE(board_keymap),
84 };
85
86 static struct twl4030_keypad_data ldp_kp_twl4030_data = {
87         .keymap_data    = &board_map_data,
88         .rows           = 6,
89         .cols           = 6,
90         .rep            = 1,
91 };
92
93 static struct gpio_keys_button ldp_gpio_keys_buttons[] = {
94         [0] = {
95                 .code                   = KEY_ENTER,
96                 .gpio                   = 101,
97                 .desc                   = "enter sw",
98                 .active_low             = 1,
99                 .debounce_interval      = 30,
100         },
101         [1] = {
102                 .code                   = KEY_F1,
103                 .gpio                   = 102,
104                 .desc                   = "func 1",
105                 .active_low             = 1,
106                 .debounce_interval      = 30,
107         },
108         [2] = {
109                 .code                   = KEY_F2,
110                 .gpio                   = 103,
111                 .desc                   = "func 2",
112                 .active_low             = 1,
113                 .debounce_interval      = 30,
114         },
115         [3] = {
116                 .code                   = KEY_F3,
117                 .gpio                   = 104,
118                 .desc                   = "func 3",
119                 .active_low             = 1,
120                 .debounce_interval      = 30,
121         },
122         [4] = {
123                 .code                   = KEY_F4,
124                 .gpio                   = 105,
125                 .desc                   = "func 4",
126                 .active_low             = 1,
127                 .debounce_interval      = 30,
128         },
129         [5] = {
130                 .code                   = KEY_LEFT,
131                 .gpio                   = 106,
132                 .desc                   = "left sw",
133                 .active_low             = 1,
134                 .debounce_interval      = 30,
135         },
136         [6] = {
137                 .code                   = KEY_RIGHT,
138                 .gpio                   = 107,
139                 .desc                   = "right sw",
140                 .active_low             = 1,
141                 .debounce_interval      = 30,
142         },
143         [7] = {
144                 .code                   = KEY_UP,
145                 .gpio                   = 108,
146                 .desc                   = "up sw",
147                 .active_low             = 1,
148                 .debounce_interval      = 30,
149         },
150         [8] = {
151                 .code                   = KEY_DOWN,
152                 .gpio                   = 109,
153                 .desc                   = "down sw",
154                 .active_low             = 1,
155                 .debounce_interval      = 30,
156         },
157 };
158
159 static struct gpio_keys_platform_data ldp_gpio_keys = {
160         .buttons                = ldp_gpio_keys_buttons,
161         .nbuttons               = ARRAY_SIZE(ldp_gpio_keys_buttons),
162         .rep                    = 1,
163 };
164
165 static struct platform_device ldp_gpio_keys_device = {
166         .name           = "gpio-keys",
167         .id             = -1,
168         .dev            = {
169                 .platform_data  = &ldp_gpio_keys,
170         },
171 };
172
173 static struct omap_smsc911x_platform_data smsc911x_cfg = {
174         .cs             = LDP_SMSC911X_CS,
175         .gpio_irq       = LDP_SMSC911X_GPIO,
176         .gpio_reset     = -EINVAL,
177         .flags          = SMSC911X_USE_32BIT,
178 };
179
180 static inline void __init ldp_init_smsc911x(void)
181 {
182         gpmc_smsc911x_init(&smsc911x_cfg);
183 }
184
185 /* LCD */
186
187 static int ldp_backlight_gpio;
188 static int ldp_lcd_enable_gpio;
189
190 #define LCD_PANEL_RESET_GPIO            55
191 #define LCD_PANEL_QVGA_GPIO             56
192
193 static int ldp_panel_enable_lcd(struct omap_dss_device *dssdev)
194 {
195         if (gpio_is_valid(ldp_lcd_enable_gpio))
196                 gpio_direction_output(ldp_lcd_enable_gpio, 1);
197         if (gpio_is_valid(ldp_backlight_gpio))
198                 gpio_direction_output(ldp_backlight_gpio, 1);
199
200         return 0;
201 }
202
203 static void ldp_panel_disable_lcd(struct omap_dss_device *dssdev)
204 {
205         if (gpio_is_valid(ldp_lcd_enable_gpio))
206                 gpio_direction_output(ldp_lcd_enable_gpio, 0);
207         if (gpio_is_valid(ldp_backlight_gpio))
208                 gpio_direction_output(ldp_backlight_gpio, 0);
209 }
210
211 static struct panel_generic_dpi_data ldp_panel_data = {
212         .name                   = "nec_nl2432dr22-11b",
213         .platform_enable        = ldp_panel_enable_lcd,
214         .platform_disable       = ldp_panel_disable_lcd,
215 };
216
217 static struct omap_dss_device ldp_lcd_device = {
218         .name                   = "lcd",
219         .driver_name            = "generic_dpi_panel",
220         .type                   = OMAP_DISPLAY_TYPE_DPI,
221         .phy.dpi.data_lines     = 18,
222         .data                   = &ldp_panel_data,
223 };
224
225 static struct omap_dss_device *ldp_dss_devices[] = {
226         &ldp_lcd_device,
227 };
228
229 static struct omap_dss_board_info ldp_dss_data = {
230         .num_devices    = ARRAY_SIZE(ldp_dss_devices),
231         .devices        = ldp_dss_devices,
232         .default_device = &ldp_lcd_device,
233 };
234
235 static void __init ldp_display_init(void)
236 {
237         int r;
238
239         static struct gpio gpios[] __initdata = {
240                 {LCD_PANEL_RESET_GPIO, GPIOF_OUT_INIT_HIGH, "LCD RESET"},
241                 {LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "LCD QVGA"},
242         };
243
244         r = gpio_request_array(gpios, ARRAY_SIZE(gpios));
245         if (r) {
246                 pr_err("Cannot request LCD GPIOs, error %d\n", r);
247                 return;
248         }
249
250         omap_display_init(&ldp_dss_data);
251 }
252
253 static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio)
254 {
255         int r;
256
257         struct gpio gpios[] = {
258                 {gpio + 7 , GPIOF_OUT_INIT_LOW, "LCD ENABLE"},
259                 {gpio + 15, GPIOF_OUT_INIT_LOW, "LCD BACKLIGHT"},
260         };
261
262         r = gpio_request_array(gpios, ARRAY_SIZE(gpios));
263         if (r) {
264                 pr_err("Cannot request LCD GPIOs, error %d\n", r);
265                 ldp_backlight_gpio = -EINVAL;
266                 ldp_lcd_enable_gpio = -EINVAL;
267                 return r;
268         }
269
270         ldp_backlight_gpio = gpio + 15;
271         ldp_lcd_enable_gpio = gpio + 7;
272
273         return 0;
274 }
275
276 static struct twl4030_gpio_platform_data ldp_gpio_data = {
277         .setup          = ldp_twl_gpio_setup,
278 };
279
280 static struct regulator_consumer_supply ldp_vmmc1_supply[] = {
281         REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
282 };
283
284 /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
285 static struct regulator_init_data ldp_vmmc1 = {
286         .constraints = {
287                 .min_uV                 = 1850000,
288                 .max_uV                 = 3150000,
289                 .valid_modes_mask       = REGULATOR_MODE_NORMAL
290                                         | REGULATOR_MODE_STANDBY,
291                 .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
292                                         | REGULATOR_CHANGE_MODE
293                                         | REGULATOR_CHANGE_STATUS,
294         },
295         .num_consumer_supplies  = ARRAY_SIZE(ldp_vmmc1_supply),
296         .consumer_supplies      = ldp_vmmc1_supply,
297 };
298
299 /* ads7846 on SPI */
300 static struct regulator_consumer_supply ldp_vaux1_supplies[] = {
301         REGULATOR_SUPPLY("vcc", "spi1.0"),
302 };
303
304 /* VAUX1 */
305 static struct regulator_init_data ldp_vaux1 = {
306         .constraints = {
307                 .min_uV                 = 3000000,
308                 .max_uV                 = 3000000,
309                 .apply_uV               = true,
310                 .valid_modes_mask       = REGULATOR_MODE_NORMAL
311                                         | REGULATOR_MODE_STANDBY,
312                 .valid_ops_mask         = REGULATOR_CHANGE_MODE
313                                         | REGULATOR_CHANGE_STATUS,
314         },
315         .num_consumer_supplies          = ARRAY_SIZE(ldp_vaux1_supplies),
316         .consumer_supplies              = ldp_vaux1_supplies,
317 };
318
319 static struct regulator_consumer_supply ldp_vpll2_supplies[] = {
320         REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
321         REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
322 };
323
324 static struct regulator_init_data ldp_vpll2 = {
325         .constraints = {
326                 .name                   = "VDVI",
327                 .min_uV                 = 1800000,
328                 .max_uV                 = 1800000,
329                 .apply_uV               = true,
330                 .valid_modes_mask       = REGULATOR_MODE_NORMAL
331                                         | REGULATOR_MODE_STANDBY,
332                 .valid_ops_mask         = REGULATOR_CHANGE_MODE
333                                         | REGULATOR_CHANGE_STATUS,
334         },
335         .num_consumer_supplies  = ARRAY_SIZE(ldp_vpll2_supplies),
336         .consumer_supplies      = ldp_vpll2_supplies,
337 };
338
339 static struct twl4030_platform_data ldp_twldata = {
340         /* platform_data for children goes here */
341         .vmmc1          = &ldp_vmmc1,
342         .vaux1          = &ldp_vaux1,
343         .vpll2          = &ldp_vpll2,
344         .gpio           = &ldp_gpio_data,
345         .keypad         = &ldp_kp_twl4030_data,
346 };
347
348 static int __init omap_i2c_init(void)
349 {
350         omap3_pmic_get_config(&ldp_twldata,
351                           TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC, 0);
352         omap3_pmic_init("twl4030", &ldp_twldata);
353         omap_register_i2c_bus(2, 400, NULL, 0);
354         omap_register_i2c_bus(3, 400, NULL, 0);
355         return 0;
356 }
357
358 static struct omap2_hsmmc_info mmc[] __initdata = {
359         {
360                 .mmc            = 1,
361                 .caps           = MMC_CAP_4_BIT_DATA,
362                 .gpio_cd        = -EINVAL,
363                 .gpio_wp        = -EINVAL,
364         },
365         {}      /* Terminator */
366 };
367
368 static struct platform_device *ldp_devices[] __initdata = {
369         &ldp_gpio_keys_device,
370 };
371
372 #ifdef CONFIG_OMAP_MUX
373 static struct omap_board_mux board_mux[] __initdata = {
374         { .reg_offset = OMAP_MUX_TERMINATOR },
375 };
376 #endif
377
378 static struct mtd_partition ldp_nand_partitions[] = {
379         /* All the partition sizes are listed in terms of NAND block size */
380         {
381                 .name           = "X-Loader-NAND",
382                 .offset         = 0,
383                 .size           = 4 * (64 * 2048),      /* 512KB, 0x80000 */
384                 .mask_flags     = MTD_WRITEABLE,        /* force read-only */
385         },
386         {
387                 .name           = "U-Boot-NAND",
388                 .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x80000 */
389                 .size           = 10 * (64 * 2048),     /* 1.25MB, 0x140000 */
390                 .mask_flags     = MTD_WRITEABLE,        /* force read-only */
391         },
392         {
393                 .name           = "Boot Env-NAND",
394                 .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x1c0000 */
395                 .size           = 2 * (64 * 2048),      /* 256KB, 0x40000 */
396         },
397         {
398                 .name           = "Kernel-NAND",
399                 .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x0200000*/
400                 .size           = 240 * (64 * 2048),    /* 30M, 0x1E00000 */
401         },
402         {
403                 .name           = "File System - NAND",
404                 .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x2000000 */
405                 .size           = MTDPART_SIZ_FULL,     /* 96MB, 0x6000000 */
406         },
407
408 };
409
410 static struct regulator_consumer_supply dummy_supplies[] = {
411         REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
412         REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
413 };
414
415 static void __init omap_ldp_init(void)
416 {
417         regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
418         omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
419         ldp_init_smsc911x();
420         omap_i2c_init();
421         platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
422         omap_ads7846_init(1, 54, 310, NULL);
423         omap_serial_init();
424         omap_sdrc_init(NULL, NULL);
425         usb_musb_init(NULL);
426         board_nand_init(ldp_nand_partitions,
427                 ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
428
429         omap_hsmmc_init(mmc);
430         ldp_display_init();
431 }
432
433 MACHINE_START(OMAP_LDP, "OMAP LDP board")
434         .atag_offset    = 0x100,
435         .reserve        = omap_reserve,
436         .map_io         = omap3_map_io,
437         .init_early     = omap3430_init_early,
438         .init_irq       = omap3_init_irq,
439         .handle_irq     = omap3_intc_handle_irq,
440         .init_machine   = omap_ldp_init,
441         .init_late      = omap3430_init_late,
442         .timer          = &omap3_timer,
443         .restart        = omap_prcm_restart,
444 MACHINE_END