]> Pileus Git - ~andy/linux/blob - arch/arm/mach-omap2/board-overo.c
Merge remote-tracking branch 'asoc/fix/dapm' into asoc-linus
[~andy/linux] / arch / arm / mach-omap2 / board-overo.c
1 /*
2  * board-overo.c (Gumstix Overo)
3  *
4  * Initial code: Steve Sakoman <steve@sakoman.com>
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * version 2 as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18  * 02110-1301 USA
19  *
20  */
21
22 #include <linux/clk.h>
23 #include <linux/delay.h>
24 #include <linux/err.h>
25 #include <linux/init.h>
26 #include <linux/io.h>
27 #include <linux/gpio.h>
28 #include <linux/kernel.h>
29 #include <linux/platform_device.h>
30 #include <linux/i2c/twl.h>
31 #include <linux/regulator/machine.h>
32 #include <linux/regulator/fixed.h>
33 #include <linux/spi/spi.h>
34
35 #include <linux/mtd/mtd.h>
36 #include <linux/mtd/nand.h>
37 #include <linux/mtd/partitions.h>
38 #include <linux/mmc/host.h>
39 #include <linux/usb/phy.h>
40
41 #include <linux/platform_data/mtd-nand-omap2.h>
42 #include <linux/platform_data/spi-omap2-mcspi.h>
43
44 #include <asm/mach-types.h>
45 #include <asm/mach/arch.h>
46 #include <asm/mach/flash.h>
47 #include <asm/mach/map.h>
48
49 #include <video/omapdss.h>
50 #include <video/omap-panel-data.h>
51
52 #include "common.h"
53 #include "mux.h"
54 #include "sdram-micron-mt46h32m32lf-6.h"
55 #include "gpmc.h"
56 #include "hsmmc.h"
57 #include "board-flash.h"
58 #include "common-board-devices.h"
59
60 #define NAND_CS                 0
61
62 #define OVERO_GPIO_BT_XGATE     15
63 #define OVERO_GPIO_W2W_NRESET   16
64 #define OVERO_GPIO_PENDOWN      114
65 #define OVERO_GPIO_BT_NRESET    164
66 #define OVERO_GPIO_USBH_CPEN    168
67 #define OVERO_GPIO_USBH_NRESET  183
68
69 #define OVERO_SMSC911X_CS      5
70 #define OVERO_SMSC911X_GPIO    176
71 #define OVERO_SMSC911X_NRESET  64
72 #define OVERO_SMSC911X2_CS     4
73 #define OVERO_SMSC911X2_GPIO   65
74
75 #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
76         defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
77
78 /* fixed regulator for ads7846 */
79 static struct regulator_consumer_supply ads7846_supply[] = {
80         REGULATOR_SUPPLY("vcc", "spi1.0"),
81 };
82
83 static struct regulator_init_data vads7846_regulator = {
84         .constraints = {
85                 .valid_ops_mask         = REGULATOR_CHANGE_STATUS,
86         },
87         .num_consumer_supplies  = ARRAY_SIZE(ads7846_supply),
88         .consumer_supplies      = ads7846_supply,
89 };
90
91 static struct fixed_voltage_config vads7846 = {
92         .supply_name            = "vads7846",
93         .microvolts             = 3300000, /* 3.3V */
94         .gpio                   = -EINVAL,
95         .startup_delay          = 0,
96         .init_data              = &vads7846_regulator,
97 };
98
99 static struct platform_device vads7846_device = {
100         .name           = "reg-fixed-voltage",
101         .id             = 1,
102         .dev = {
103                 .platform_data = &vads7846,
104         },
105 };
106
107 static void __init overo_ads7846_init(void)
108 {
109         omap_ads7846_init(1, OVERO_GPIO_PENDOWN, 0, NULL);
110         platform_device_register(&vads7846_device);
111 }
112
113 #else
114 static inline void __init overo_ads7846_init(void) { return; }
115 #endif
116
117 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
118
119 #include <linux/smsc911x.h>
120 #include "gpmc-smsc911x.h"
121
122 static struct omap_smsc911x_platform_data smsc911x_cfg = {
123         .id             = 0,
124         .cs             = OVERO_SMSC911X_CS,
125         .gpio_irq       = OVERO_SMSC911X_GPIO,
126         .gpio_reset     = OVERO_SMSC911X_NRESET,
127         .flags          = SMSC911X_USE_32BIT,
128 };
129
130 static struct omap_smsc911x_platform_data smsc911x2_cfg = {
131         .id             = 1,
132         .cs             = OVERO_SMSC911X2_CS,
133         .gpio_irq       = OVERO_SMSC911X2_GPIO,
134         .gpio_reset     = -EINVAL,
135         .flags          = SMSC911X_USE_32BIT,
136 };
137
138 static void __init overo_init_smsc911x(void)
139 {
140         gpmc_smsc911x_init(&smsc911x_cfg);
141         gpmc_smsc911x_init(&smsc911x2_cfg);
142 }
143
144 #else
145 static inline void __init overo_init_smsc911x(void) { return; }
146 #endif
147
148 /* DSS */
149 #define OVERO_GPIO_LCD_EN 144
150 #define OVERO_GPIO_LCD_BL 145
151
152 static struct tfp410_platform_data dvi_panel = {
153         .i2c_bus_num            = 3,
154         .power_down_gpio        = -1,
155 };
156
157 static struct omap_dss_device overo_dvi_device = {
158         .name                   = "dvi",
159         .type                   = OMAP_DISPLAY_TYPE_DPI,
160         .driver_name            = "tfp410",
161         .data                   = &dvi_panel,
162         .phy.dpi.data_lines     = 24,
163 };
164
165 static struct omap_dss_device overo_tv_device = {
166         .name = "tv",
167         .driver_name = "venc",
168         .type = OMAP_DISPLAY_TYPE_VENC,
169         .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
170 };
171
172 static struct panel_generic_dpi_data lcd43_panel = {
173         .name                   = "samsung_lte430wq_f0c",
174         .num_gpios              = 2,
175         .gpios                  = {
176                 OVERO_GPIO_LCD_EN,
177                 OVERO_GPIO_LCD_BL
178         },
179 };
180
181 static struct omap_dss_device overo_lcd43_device = {
182         .name                   = "lcd43",
183         .type                   = OMAP_DISPLAY_TYPE_DPI,
184         .driver_name            = "generic_dpi_panel",
185         .data                   = &lcd43_panel,
186         .phy.dpi.data_lines     = 24,
187 };
188
189 #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
190         defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
191 static struct panel_generic_dpi_data lcd35_panel = {
192         .num_gpios              = 2,
193         .gpios                  = {
194                 OVERO_GPIO_LCD_EN,
195                 OVERO_GPIO_LCD_BL
196         },
197 };
198
199 static struct omap_dss_device overo_lcd35_device = {
200         .type                   = OMAP_DISPLAY_TYPE_DPI,
201         .name                   = "lcd35",
202         .driver_name            = "lgphilips_lb035q02_panel",
203         .phy.dpi.data_lines     = 24,
204         .data                   = &lcd35_panel,
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         &overo_lcd43_device,
216 };
217
218 static struct omap_dss_board_info overo_dss_data = {
219         .num_devices    = ARRAY_SIZE(overo_dss_devices),
220         .devices        = overo_dss_devices,
221         .default_device = &overo_dvi_device,
222 };
223
224 static struct mtd_partition overo_nand_partitions[] = {
225         {
226                 .name           = "xloader",
227                 .offset         = 0,                    /* Offset = 0x00000 */
228                 .size           = 4 * NAND_BLOCK_SIZE,
229                 .mask_flags     = MTD_WRITEABLE
230         },
231         {
232                 .name           = "uboot",
233                 .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x80000 */
234                 .size           = 14 * NAND_BLOCK_SIZE,
235         },
236         {
237                 .name           = "uboot environment",
238                 .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x240000 */
239                 .size           = 2 * NAND_BLOCK_SIZE,
240         },
241         {
242                 .name           = "linux",
243                 .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x280000 */
244                 .size           = 32 * NAND_BLOCK_SIZE,
245         },
246         {
247                 .name           = "rootfs",
248                 .offset         = MTDPART_OFS_APPEND,   /* Offset = 0x680000 */
249                 .size           = MTDPART_SIZ_FULL,
250         },
251 };
252
253 static struct omap2_hsmmc_info mmc[] = {
254         {
255                 .mmc            = 1,
256                 .caps           = MMC_CAP_4_BIT_DATA,
257                 .gpio_cd        = -EINVAL,
258                 .gpio_wp        = -EINVAL,
259         },
260         {
261                 .mmc            = 2,
262                 .caps           = MMC_CAP_4_BIT_DATA,
263                 .gpio_cd        = -EINVAL,
264                 .gpio_wp        = -EINVAL,
265                 .transceiver    = true,
266                 .ocr_mask       = 0x00100000,   /* 3.3V */
267         },
268         {}      /* Terminator */
269 };
270
271 static struct regulator_consumer_supply overo_vmmc1_supply[] = {
272         REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
273 };
274
275 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
276 #include <linux/leds.h>
277
278 static struct gpio_led gpio_leds[] = {
279         {
280                 .name                   = "overo:red:gpio21",
281                 .default_trigger        = "heartbeat",
282                 .gpio                   = 21,
283                 .active_low             = true,
284         },
285         {
286                 .name                   = "overo:blue:gpio22",
287                 .default_trigger        = "none",
288                 .gpio                   = 22,
289                 .active_low             = true,
290         },
291         {
292                 .name                   = "overo:blue:COM",
293                 .default_trigger        = "mmc0",
294                 .gpio                   = -EINVAL,      /* gets replaced */
295                 .active_low             = true,
296         },
297 };
298
299 static struct gpio_led_platform_data gpio_leds_pdata = {
300         .leds           = gpio_leds,
301         .num_leds       = ARRAY_SIZE(gpio_leds),
302 };
303
304 static struct platform_device gpio_leds_device = {
305         .name   = "leds-gpio",
306         .id     = -1,
307         .dev    = {
308                 .platform_data  = &gpio_leds_pdata,
309         },
310 };
311
312 static void __init overo_init_led(void)
313 {
314         platform_device_register(&gpio_leds_device);
315 }
316
317 #else
318 static inline void __init overo_init_led(void) { return; }
319 #endif
320
321 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
322 #include <linux/input.h>
323 #include <linux/gpio_keys.h>
324
325 static struct gpio_keys_button gpio_buttons[] = {
326         {
327                 .code                   = BTN_0,
328                 .gpio                   = 23,
329                 .desc                   = "button0",
330                 .wakeup                 = 1,
331         },
332         {
333                 .code                   = BTN_1,
334                 .gpio                   = 14,
335                 .desc                   = "button1",
336                 .wakeup                 = 1,
337         },
338 };
339
340 static struct gpio_keys_platform_data gpio_keys_pdata = {
341         .buttons        = gpio_buttons,
342         .nbuttons       = ARRAY_SIZE(gpio_buttons),
343 };
344
345 static struct platform_device gpio_keys_device = {
346         .name   = "gpio-keys",
347         .id     = -1,
348         .dev    = {
349                 .platform_data  = &gpio_keys_pdata,
350         },
351 };
352
353 static void __init overo_init_keys(void)
354 {
355         platform_device_register(&gpio_keys_device);
356 }
357
358 #else
359 static inline void __init overo_init_keys(void) { return; }
360 #endif
361
362 static int overo_twl_gpio_setup(struct device *dev,
363                 unsigned gpio, unsigned ngpio)
364 {
365 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
366         /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
367         gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
368 #endif
369
370         return 0;
371 }
372
373 static struct twl4030_gpio_platform_data overo_gpio_data = {
374         .use_leds       = true,
375         .setup          = overo_twl_gpio_setup,
376 };
377
378 static struct regulator_init_data overo_vmmc1 = {
379         .constraints = {
380                 .min_uV                 = 1850000,
381                 .max_uV                 = 3150000,
382                 .valid_modes_mask       = REGULATOR_MODE_NORMAL
383                                         | REGULATOR_MODE_STANDBY,
384                 .valid_ops_mask         = REGULATOR_CHANGE_VOLTAGE
385                                         | REGULATOR_CHANGE_MODE
386                                         | REGULATOR_CHANGE_STATUS,
387         },
388         .num_consumer_supplies  = ARRAY_SIZE(overo_vmmc1_supply),
389         .consumer_supplies      = overo_vmmc1_supply,
390 };
391
392 static struct twl4030_platform_data overo_twldata = {
393         .gpio           = &overo_gpio_data,
394         .vmmc1          = &overo_vmmc1,
395 };
396
397 static int __init overo_i2c_init(void)
398 {
399         omap3_pmic_get_config(&overo_twldata,
400                         TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
401                         TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
402
403         overo_twldata.vpll2->constraints.name = "VDVI";
404
405         omap3_pmic_init("tps65950", &overo_twldata);
406         /* i2c2 pins are used for gpio */
407         omap_register_i2c_bus(3, 400, NULL, 0);
408         return 0;
409 }
410
411 static struct spi_board_info overo_spi_board_info[] __initdata = {
412 #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
413         defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
414         {
415                 .modalias               = "lgphilips_lb035q02_panel-spi",
416                 .bus_num                = 1,
417                 .chip_select            = 1,
418                 .max_speed_hz           = 500000,
419                 .mode                   = SPI_MODE_3,
420         },
421 #endif
422 };
423
424 static int __init overo_spi_init(void)
425 {
426         overo_ads7846_init();
427         spi_register_board_info(overo_spi_board_info,
428                         ARRAY_SIZE(overo_spi_board_info));
429         return 0;
430 }
431
432 static struct usbhs_phy_data phy_data[] __initdata = {
433         {
434                 .port = 2,
435                 .reset_gpio = OVERO_GPIO_USBH_NRESET,
436                 .vcc_gpio = -EINVAL,
437         },
438 };
439
440 static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
441         .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
442 };
443
444 #ifdef CONFIG_OMAP_MUX
445 static struct omap_board_mux board_mux[] __initdata = {
446         { .reg_offset = OMAP_MUX_TERMINATOR },
447 };
448 #endif
449
450 static struct gpio overo_bt_gpios[] __initdata = {
451         { OVERO_GPIO_BT_XGATE,  GPIOF_OUT_INIT_LOW,     "lcd enable"    },
452         { OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH,    "lcd bl enable" },
453 };
454
455 static struct regulator_consumer_supply dummy_supplies[] = {
456         REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
457         REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
458         REGULATOR_SUPPLY("vddvario", "smsc911x.1"),
459         REGULATOR_SUPPLY("vdd33a", "smsc911x.1"),
460 };
461
462 static void __init overo_init(void)
463 {
464         int ret;
465
466         regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
467         omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
468         overo_i2c_init();
469         omap_hsmmc_init(mmc);
470         omap_display_init(&overo_dss_data);
471         omap_serial_init();
472         omap_sdrc_init(mt46h32m32lf6_sdrc_params,
473                                   mt46h32m32lf6_sdrc_params);
474         board_nand_init(overo_nand_partitions,
475                         ARRAY_SIZE(overo_nand_partitions), NAND_CS, 0, NULL);
476         usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
477         usb_musb_init(NULL);
478
479         usbhs_init_phys(phy_data, ARRAY_SIZE(phy_data));
480         usbhs_init(&usbhs_bdata);
481         overo_spi_init();
482         overo_init_smsc911x();
483         overo_init_led();
484         overo_init_keys();
485         omap_twl4030_audio_init("overo", NULL);
486
487         /* Ensure SDRC pins are mux'd for self-refresh */
488         omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
489         omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
490
491         ret = gpio_request_one(OVERO_GPIO_W2W_NRESET, GPIOF_OUT_INIT_HIGH,
492                                "OVERO_GPIO_W2W_NRESET");
493         if (ret == 0) {
494                 gpio_export(OVERO_GPIO_W2W_NRESET, 0);
495                 gpio_set_value(OVERO_GPIO_W2W_NRESET, 0);
496                 udelay(10);
497                 gpio_set_value(OVERO_GPIO_W2W_NRESET, 1);
498         } else {
499                 pr_err("could not obtain gpio for OVERO_GPIO_W2W_NRESET\n");
500         }
501
502         ret = gpio_request_array(overo_bt_gpios, ARRAY_SIZE(overo_bt_gpios));
503         if (ret) {
504                 pr_err("%s: could not obtain BT gpios\n", __func__);
505         } else {
506                 gpio_export(OVERO_GPIO_BT_XGATE, 0);
507                 gpio_export(OVERO_GPIO_BT_NRESET, 0);
508                 gpio_set_value(OVERO_GPIO_BT_NRESET, 0);
509                 mdelay(6);
510                 gpio_set_value(OVERO_GPIO_BT_NRESET, 1);
511         }
512
513         ret = gpio_request_one(OVERO_GPIO_USBH_CPEN, GPIOF_OUT_INIT_HIGH,
514                                "OVERO_GPIO_USBH_CPEN");
515         if (ret == 0)
516                 gpio_export(OVERO_GPIO_USBH_CPEN, 0);
517         else
518                 pr_err("could not obtain gpio for OVERO_GPIO_USBH_CPEN\n");
519 }
520
521 MACHINE_START(OVERO, "Gumstix Overo")
522         .atag_offset    = 0x100,
523         .reserve        = omap_reserve,
524         .map_io         = omap3_map_io,
525         .init_early     = omap35xx_init_early,
526         .init_irq       = omap3_init_irq,
527         .handle_irq     = omap3_intc_handle_irq,
528         .init_machine   = overo_init,
529         .init_late      = omap35xx_init_late,
530         .init_time      = omap3_sync32k_timer_init,
531         .restart        = omap3xxx_restart,
532 MACHINE_END