2 * board-overo.c (Gumstix Overo)
4 * Initial code: Steve Sakoman <steve@sakoman.com>
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.
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.
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
22 #include <linux/clk.h>
23 #include <linux/delay.h>
24 #include <linux/err.h>
25 #include <linux/init.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>
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>
41 #include <linux/platform_data/mtd-nand-omap2.h>
42 #include <linux/platform_data/spi-omap2-mcspi.h>
44 #include <asm/mach-types.h>
45 #include <asm/mach/arch.h>
46 #include <asm/mach/flash.h>
47 #include <asm/mach/map.h>
49 #include <video/omapdss.h>
50 #include <video/omap-panel-data.h>
54 #include "sdram-micron-mt46h32m32lf-6.h"
57 #include "board-flash.h"
58 #include "common-board-devices.h"
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
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
75 /* whether to register LCD35 instead of LCD43 */
76 static bool overo_use_lcd35
;
78 #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
79 defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
81 /* fixed regulator for ads7846 */
82 static struct regulator_consumer_supply ads7846_supply
[] = {
83 REGULATOR_SUPPLY("vcc", "spi1.0"),
86 static struct regulator_init_data vads7846_regulator
= {
88 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
90 .num_consumer_supplies
= ARRAY_SIZE(ads7846_supply
),
91 .consumer_supplies
= ads7846_supply
,
94 static struct fixed_voltage_config vads7846
= {
95 .supply_name
= "vads7846",
96 .microvolts
= 3300000, /* 3.3V */
99 .init_data
= &vads7846_regulator
,
102 static struct platform_device vads7846_device
= {
103 .name
= "reg-fixed-voltage",
106 .platform_data
= &vads7846
,
110 static void __init
overo_ads7846_init(void)
112 omap_ads7846_init(1, OVERO_GPIO_PENDOWN
, 0, NULL
);
113 platform_device_register(&vads7846_device
);
117 static inline void __init
overo_ads7846_init(void) { return; }
120 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
122 #include <linux/smsc911x.h>
123 #include "gpmc-smsc911x.h"
125 static struct omap_smsc911x_platform_data smsc911x_cfg
= {
127 .cs
= OVERO_SMSC911X_CS
,
128 .gpio_irq
= OVERO_SMSC911X_GPIO
,
129 .gpio_reset
= OVERO_SMSC911X_NRESET
,
130 .flags
= SMSC911X_USE_32BIT
,
133 static struct omap_smsc911x_platform_data smsc911x2_cfg
= {
135 .cs
= OVERO_SMSC911X2_CS
,
136 .gpio_irq
= OVERO_SMSC911X2_GPIO
,
137 .gpio_reset
= -EINVAL
,
138 .flags
= SMSC911X_USE_32BIT
,
141 static void __init
overo_init_smsc911x(void)
143 gpmc_smsc911x_init(&smsc911x_cfg
);
144 gpmc_smsc911x_init(&smsc911x2_cfg
);
148 static inline void __init
overo_init_smsc911x(void) { return; }
152 #define OVERO_GPIO_LCD_EN 144
153 #define OVERO_GPIO_LCD_BL 145
155 static struct connector_atv_platform_data overo_tv_pdata
= {
158 .connector_type
= OMAP_DSS_VENC_TYPE_SVIDEO
,
159 .invert_polarity
= false,
162 static struct platform_device overo_tv_connector_device
= {
163 .name
= "connector-analog-tv",
165 .dev
.platform_data
= &overo_tv_pdata
,
168 static const struct display_timing overo_lcd43_videomode
= {
169 .pixelclock
= { 0, 9200000, 0 },
171 .hactive
= { 0, 480, 0 },
172 .hfront_porch
= { 0, 8, 0 },
173 .hback_porch
= { 0, 4, 0 },
174 .hsync_len
= { 0, 41, 0 },
176 .vactive
= { 0, 272, 0 },
177 .vfront_porch
= { 0, 4, 0 },
178 .vback_porch
= { 0, 2, 0 },
179 .vsync_len
= { 0, 10, 0 },
181 .flags
= DISPLAY_FLAGS_HSYNC_LOW
| DISPLAY_FLAGS_VSYNC_LOW
|
182 DISPLAY_FLAGS_DE_HIGH
| DISPLAY_FLAGS_PIXDATA_POSEDGE
,
185 static struct panel_dpi_platform_data overo_lcd43_pdata
= {
191 .display_timing
= &overo_lcd43_videomode
,
193 .enable_gpio
= OVERO_GPIO_LCD_EN
,
194 .backlight_gpio
= OVERO_GPIO_LCD_BL
,
197 static struct platform_device overo_lcd43_device
= {
200 .dev
.platform_data
= &overo_lcd43_pdata
,
203 static struct connector_dvi_platform_data overo_dvi_connector_pdata
= {
205 .source
= "tfp410.0",
209 static struct platform_device overo_dvi_connector_device
= {
210 .name
= "connector-dvi",
212 .dev
.platform_data
= &overo_dvi_connector_pdata
,
215 static struct encoder_tfp410_platform_data overo_tfp410_pdata
= {
219 .power_down_gpio
= -1,
222 static struct platform_device overo_tfp410_device
= {
225 .dev
.platform_data
= &overo_tfp410_pdata
,
228 static struct omap_dss_board_info overo_dss_data
= {
229 .default_display_name
= "lcd43",
232 static void __init
overo_display_init(void)
234 omap_display_init(&overo_dss_data
);
236 if (!overo_use_lcd35
)
237 platform_device_register(&overo_lcd43_device
);
238 platform_device_register(&overo_tfp410_device
);
239 platform_device_register(&overo_dvi_connector_device
);
240 platform_device_register(&overo_tv_connector_device
);
243 static struct mtd_partition overo_nand_partitions
[] = {
246 .offset
= 0, /* Offset = 0x00000 */
247 .size
= 4 * NAND_BLOCK_SIZE
,
248 .mask_flags
= MTD_WRITEABLE
252 .offset
= MTDPART_OFS_APPEND
, /* Offset = 0x80000 */
253 .size
= 14 * NAND_BLOCK_SIZE
,
256 .name
= "uboot environment",
257 .offset
= MTDPART_OFS_APPEND
, /* Offset = 0x240000 */
258 .size
= 2 * NAND_BLOCK_SIZE
,
262 .offset
= MTDPART_OFS_APPEND
, /* Offset = 0x280000 */
263 .size
= 32 * NAND_BLOCK_SIZE
,
267 .offset
= MTDPART_OFS_APPEND
, /* Offset = 0x680000 */
268 .size
= MTDPART_SIZ_FULL
,
272 static struct omap2_hsmmc_info mmc
[] = {
275 .caps
= MMC_CAP_4_BIT_DATA
,
281 .caps
= MMC_CAP_4_BIT_DATA
,
285 .ocr_mask
= 0x00100000, /* 3.3V */
290 static struct regulator_consumer_supply overo_vmmc1_supply
[] = {
291 REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
294 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
295 #include <linux/leds.h>
297 static struct gpio_led gpio_leds
[] = {
299 .name
= "overo:red:gpio21",
300 .default_trigger
= "heartbeat",
305 .name
= "overo:blue:gpio22",
306 .default_trigger
= "none",
311 .name
= "overo:blue:COM",
312 .default_trigger
= "mmc0",
313 .gpio
= -EINVAL
, /* gets replaced */
318 static struct gpio_led_platform_data gpio_leds_pdata
= {
320 .num_leds
= ARRAY_SIZE(gpio_leds
),
323 static struct platform_device gpio_leds_device
= {
327 .platform_data
= &gpio_leds_pdata
,
331 static void __init
overo_init_led(void)
333 platform_device_register(&gpio_leds_device
);
337 static inline void __init
overo_init_led(void) { return; }
340 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
341 #include <linux/input.h>
342 #include <linux/gpio_keys.h>
344 static struct gpio_keys_button gpio_buttons
[] = {
359 static struct gpio_keys_platform_data gpio_keys_pdata
= {
360 .buttons
= gpio_buttons
,
361 .nbuttons
= ARRAY_SIZE(gpio_buttons
),
364 static struct platform_device gpio_keys_device
= {
368 .platform_data
= &gpio_keys_pdata
,
372 static void __init
overo_init_keys(void)
374 platform_device_register(&gpio_keys_device
);
378 static inline void __init
overo_init_keys(void) { return; }
381 static int overo_twl_gpio_setup(struct device
*dev
,
382 unsigned gpio
, unsigned ngpio
)
384 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
385 /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
386 gpio_leds
[2].gpio
= gpio
+ TWL4030_GPIO_MAX
+ 1;
392 static struct twl4030_gpio_platform_data overo_gpio_data
= {
394 .setup
= overo_twl_gpio_setup
,
397 static struct regulator_init_data overo_vmmc1
= {
401 .valid_modes_mask
= REGULATOR_MODE_NORMAL
402 | REGULATOR_MODE_STANDBY
,
403 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
404 | REGULATOR_CHANGE_MODE
405 | REGULATOR_CHANGE_STATUS
,
407 .num_consumer_supplies
= ARRAY_SIZE(overo_vmmc1_supply
),
408 .consumer_supplies
= overo_vmmc1_supply
,
411 static struct twl4030_platform_data overo_twldata
= {
412 .gpio
= &overo_gpio_data
,
413 .vmmc1
= &overo_vmmc1
,
416 static int __init
overo_i2c_init(void)
418 omap3_pmic_get_config(&overo_twldata
,
419 TWL_COMMON_PDATA_USB
| TWL_COMMON_PDATA_AUDIO
,
420 TWL_COMMON_REGULATOR_VDAC
| TWL_COMMON_REGULATOR_VPLL2
);
422 overo_twldata
.vpll2
->constraints
.name
= "VDVI";
424 omap3_pmic_init("tps65950", &overo_twldata
);
425 /* i2c2 pins are used for gpio */
426 omap_register_i2c_bus(3, 400, NULL
, 0);
430 static struct panel_lb035q02_platform_data overo_lcd35_pdata
= {
436 .enable_gpio
= OVERO_GPIO_LCD_EN
,
437 .backlight_gpio
= OVERO_GPIO_LCD_BL
,
441 * NOTE: We need to add either the lgphilips panel, or the lcd43 panel. The
442 * selection is done based on the overo_use_lcd35 field. If new SPI
443 * devices are added here, extra work is needed to make only the lgphilips panel
444 * affected by the overo_use_lcd35 field.
446 static struct spi_board_info overo_spi_board_info
[] __initdata
= {
448 .modalias
= "panel_lgphilips_lb035q02",
451 .max_speed_hz
= 500000,
453 .platform_data
= &overo_lcd35_pdata
,
457 static int __init
overo_spi_init(void)
459 overo_ads7846_init();
461 if (overo_use_lcd35
) {
462 spi_register_board_info(overo_spi_board_info
,
463 ARRAY_SIZE(overo_spi_board_info
));
468 static struct usbhs_phy_data phy_data
[] __initdata
= {
471 .reset_gpio
= OVERO_GPIO_USBH_NRESET
,
476 static struct usbhs_omap_platform_data usbhs_bdata __initdata
= {
477 .port_mode
[1] = OMAP_EHCI_PORT_MODE_PHY
,
480 #ifdef CONFIG_OMAP_MUX
481 static struct omap_board_mux board_mux
[] __initdata
= {
482 { .reg_offset
= OMAP_MUX_TERMINATOR
},
486 static struct gpio overo_bt_gpios
[] __initdata
= {
487 { OVERO_GPIO_BT_XGATE
, GPIOF_OUT_INIT_LOW
, "lcd enable" },
488 { OVERO_GPIO_BT_NRESET
, GPIOF_OUT_INIT_HIGH
, "lcd bl enable" },
491 static struct regulator_consumer_supply dummy_supplies
[] = {
492 REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
493 REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
494 REGULATOR_SUPPLY("vddvario", "smsc911x.1"),
495 REGULATOR_SUPPLY("vdd33a", "smsc911x.1"),
498 static void __init
overo_init(void)
502 if (strstr(boot_command_line
, "omapdss.def_disp=lcd35"))
503 overo_use_lcd35
= true;
505 regulator_register_fixed(0, dummy_supplies
, ARRAY_SIZE(dummy_supplies
));
506 omap3_mux_init(board_mux
, OMAP_PACKAGE_CBB
);
508 omap_hsmmc_init(mmc
);
510 omap_sdrc_init(mt46h32m32lf6_sdrc_params
,
511 mt46h32m32lf6_sdrc_params
);
512 board_nand_init(overo_nand_partitions
,
513 ARRAY_SIZE(overo_nand_partitions
), NAND_CS
, 0, NULL
);
514 usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
517 usbhs_init_phys(phy_data
, ARRAY_SIZE(phy_data
));
518 usbhs_init(&usbhs_bdata
);
520 overo_init_smsc911x();
523 omap_twl4030_audio_init("overo", NULL
);
525 overo_display_init();
527 /* Ensure SDRC pins are mux'd for self-refresh */
528 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT
);
529 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT
);
531 ret
= gpio_request_one(OVERO_GPIO_W2W_NRESET
, GPIOF_OUT_INIT_HIGH
,
532 "OVERO_GPIO_W2W_NRESET");
534 gpio_export(OVERO_GPIO_W2W_NRESET
, 0);
535 gpio_set_value(OVERO_GPIO_W2W_NRESET
, 0);
537 gpio_set_value(OVERO_GPIO_W2W_NRESET
, 1);
539 pr_err("could not obtain gpio for OVERO_GPIO_W2W_NRESET\n");
542 ret
= gpio_request_array(overo_bt_gpios
, ARRAY_SIZE(overo_bt_gpios
));
544 pr_err("%s: could not obtain BT gpios\n", __func__
);
546 gpio_export(OVERO_GPIO_BT_XGATE
, 0);
547 gpio_export(OVERO_GPIO_BT_NRESET
, 0);
548 gpio_set_value(OVERO_GPIO_BT_NRESET
, 0);
550 gpio_set_value(OVERO_GPIO_BT_NRESET
, 1);
553 ret
= gpio_request_one(OVERO_GPIO_USBH_CPEN
, GPIOF_OUT_INIT_HIGH
,
554 "OVERO_GPIO_USBH_CPEN");
556 gpio_export(OVERO_GPIO_USBH_CPEN
, 0);
558 pr_err("could not obtain gpio for OVERO_GPIO_USBH_CPEN\n");
561 MACHINE_START(OVERO
, "Gumstix Overo")
562 .atag_offset
= 0x100,
563 .reserve
= omap_reserve
,
564 .map_io
= omap3_map_io
,
565 .init_early
= omap35xx_init_early
,
566 .init_irq
= omap3_init_irq
,
567 .handle_irq
= omap3_intc_handle_irq
,
568 .init_machine
= overo_init
,
569 .init_late
= omap35xx_init_late
,
570 .init_time
= omap3_sync32k_timer_init
,
571 .restart
= omap3xxx_restart
,