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_SMSC911X2_CS 4
72 #define OVERO_SMSC911X2_GPIO 65
74 #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
75 defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
77 /* fixed regulator for ads7846 */
78 static struct regulator_consumer_supply ads7846_supply
[] = {
79 REGULATOR_SUPPLY("vcc", "spi1.0"),
82 static struct regulator_init_data vads7846_regulator
= {
84 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
86 .num_consumer_supplies
= ARRAY_SIZE(ads7846_supply
),
87 .consumer_supplies
= ads7846_supply
,
90 static struct fixed_voltage_config vads7846
= {
91 .supply_name
= "vads7846",
92 .microvolts
= 3300000, /* 3.3V */
95 .init_data
= &vads7846_regulator
,
98 static struct platform_device vads7846_device
= {
99 .name
= "reg-fixed-voltage",
102 .platform_data
= &vads7846
,
106 static void __init
overo_ads7846_init(void)
108 omap_ads7846_init(1, OVERO_GPIO_PENDOWN
, 0, NULL
);
109 platform_device_register(&vads7846_device
);
113 static inline void __init
overo_ads7846_init(void) { return; }
116 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
118 #include <linux/smsc911x.h>
119 #include "gpmc-smsc911x.h"
121 static struct omap_smsc911x_platform_data smsc911x_cfg
= {
123 .cs
= OVERO_SMSC911X_CS
,
124 .gpio_irq
= OVERO_SMSC911X_GPIO
,
125 .gpio_reset
= -EINVAL
,
126 .flags
= SMSC911X_USE_32BIT
,
129 static struct omap_smsc911x_platform_data smsc911x2_cfg
= {
131 .cs
= OVERO_SMSC911X2_CS
,
132 .gpio_irq
= OVERO_SMSC911X2_GPIO
,
133 .gpio_reset
= -EINVAL
,
134 .flags
= SMSC911X_USE_32BIT
,
137 static void __init
overo_init_smsc911x(void)
139 gpmc_smsc911x_init(&smsc911x_cfg
);
140 gpmc_smsc911x_init(&smsc911x2_cfg
);
144 static inline void __init
overo_init_smsc911x(void) { return; }
148 #define OVERO_GPIO_LCD_EN 144
149 #define OVERO_GPIO_LCD_BL 145
151 static struct tfp410_platform_data dvi_panel
= {
153 .power_down_gpio
= -1,
156 static struct omap_dss_device overo_dvi_device
= {
158 .type
= OMAP_DISPLAY_TYPE_DPI
,
159 .driver_name
= "tfp410",
161 .phy
.dpi
.data_lines
= 24,
164 static struct omap_dss_device overo_tv_device
= {
166 .driver_name
= "venc",
167 .type
= OMAP_DISPLAY_TYPE_VENC
,
168 .phy
.venc
.type
= OMAP_DSS_VENC_TYPE_SVIDEO
,
171 static struct panel_generic_dpi_data lcd43_panel
= {
172 .name
= "samsung_lte430wq_f0c",
180 static struct omap_dss_device overo_lcd43_device
= {
182 .type
= OMAP_DISPLAY_TYPE_DPI
,
183 .driver_name
= "generic_dpi_panel",
184 .data
= &lcd43_panel
,
185 .phy
.dpi
.data_lines
= 24,
188 #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
189 defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
190 static struct panel_generic_dpi_data lcd35_panel
= {
198 static struct omap_dss_device overo_lcd35_device
= {
199 .type
= OMAP_DISPLAY_TYPE_DPI
,
201 .driver_name
= "lgphilips_lb035q02_panel",
202 .phy
.dpi
.data_lines
= 24,
203 .data
= &lcd35_panel
,
207 static struct omap_dss_device
*overo_dss_devices
[] = {
210 #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
211 defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
217 static struct omap_dss_board_info overo_dss_data
= {
218 .num_devices
= ARRAY_SIZE(overo_dss_devices
),
219 .devices
= overo_dss_devices
,
220 .default_device
= &overo_dvi_device
,
223 static struct mtd_partition overo_nand_partitions
[] = {
226 .offset
= 0, /* Offset = 0x00000 */
227 .size
= 4 * NAND_BLOCK_SIZE
,
228 .mask_flags
= MTD_WRITEABLE
232 .offset
= MTDPART_OFS_APPEND
, /* Offset = 0x80000 */
233 .size
= 14 * NAND_BLOCK_SIZE
,
236 .name
= "uboot environment",
237 .offset
= MTDPART_OFS_APPEND
, /* Offset = 0x240000 */
238 .size
= 2 * NAND_BLOCK_SIZE
,
242 .offset
= MTDPART_OFS_APPEND
, /* Offset = 0x280000 */
243 .size
= 32 * NAND_BLOCK_SIZE
,
247 .offset
= MTDPART_OFS_APPEND
, /* Offset = 0x680000 */
248 .size
= MTDPART_SIZ_FULL
,
252 static struct omap2_hsmmc_info mmc
[] = {
255 .caps
= MMC_CAP_4_BIT_DATA
,
261 .caps
= MMC_CAP_4_BIT_DATA
,
265 .ocr_mask
= 0x00100000, /* 3.3V */
270 static struct regulator_consumer_supply overo_vmmc1_supply
[] = {
271 REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
274 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
275 #include <linux/leds.h>
277 static struct gpio_led gpio_leds
[] = {
279 .name
= "overo:red:gpio21",
280 .default_trigger
= "heartbeat",
285 .name
= "overo:blue:gpio22",
286 .default_trigger
= "none",
291 .name
= "overo:blue:COM",
292 .default_trigger
= "mmc0",
293 .gpio
= -EINVAL
, /* gets replaced */
298 static struct gpio_led_platform_data gpio_leds_pdata
= {
300 .num_leds
= ARRAY_SIZE(gpio_leds
),
303 static struct platform_device gpio_leds_device
= {
307 .platform_data
= &gpio_leds_pdata
,
311 static void __init
overo_init_led(void)
313 platform_device_register(&gpio_leds_device
);
317 static inline void __init
overo_init_led(void) { return; }
320 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
321 #include <linux/input.h>
322 #include <linux/gpio_keys.h>
324 static struct gpio_keys_button gpio_buttons
[] = {
339 static struct gpio_keys_platform_data gpio_keys_pdata
= {
340 .buttons
= gpio_buttons
,
341 .nbuttons
= ARRAY_SIZE(gpio_buttons
),
344 static struct platform_device gpio_keys_device
= {
348 .platform_data
= &gpio_keys_pdata
,
352 static void __init
overo_init_keys(void)
354 platform_device_register(&gpio_keys_device
);
358 static inline void __init
overo_init_keys(void) { return; }
361 static int overo_twl_gpio_setup(struct device
*dev
,
362 unsigned gpio
, unsigned ngpio
)
364 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
365 /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
366 gpio_leds
[2].gpio
= gpio
+ TWL4030_GPIO_MAX
+ 1;
372 static struct twl4030_gpio_platform_data overo_gpio_data
= {
374 .setup
= overo_twl_gpio_setup
,
377 static struct regulator_init_data overo_vmmc1
= {
381 .valid_modes_mask
= REGULATOR_MODE_NORMAL
382 | REGULATOR_MODE_STANDBY
,
383 .valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE
384 | REGULATOR_CHANGE_MODE
385 | REGULATOR_CHANGE_STATUS
,
387 .num_consumer_supplies
= ARRAY_SIZE(overo_vmmc1_supply
),
388 .consumer_supplies
= overo_vmmc1_supply
,
391 static struct twl4030_platform_data overo_twldata
= {
392 .gpio
= &overo_gpio_data
,
393 .vmmc1
= &overo_vmmc1
,
396 static int __init
overo_i2c_init(void)
398 omap3_pmic_get_config(&overo_twldata
,
399 TWL_COMMON_PDATA_USB
| TWL_COMMON_PDATA_AUDIO
,
400 TWL_COMMON_REGULATOR_VDAC
| TWL_COMMON_REGULATOR_VPLL2
);
402 overo_twldata
.vpll2
->constraints
.name
= "VDVI";
404 omap3_pmic_init("tps65950", &overo_twldata
);
405 /* i2c2 pins are used for gpio */
406 omap_register_i2c_bus(3, 400, NULL
, 0);
410 static struct spi_board_info overo_spi_board_info
[] __initdata
= {
411 #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
412 defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
414 .modalias
= "lgphilips_lb035q02_panel-spi",
417 .max_speed_hz
= 500000,
423 static int __init
overo_spi_init(void)
425 overo_ads7846_init();
426 spi_register_board_info(overo_spi_board_info
,
427 ARRAY_SIZE(overo_spi_board_info
));
431 static struct usbhs_phy_data phy_data
[] __initdata
= {
434 .reset_gpio
= OVERO_GPIO_USBH_NRESET
,
439 static struct usbhs_omap_platform_data usbhs_bdata __initdata
= {
440 .port_mode
[1] = OMAP_EHCI_PORT_MODE_PHY
,
443 #ifdef CONFIG_OMAP_MUX
444 static struct omap_board_mux board_mux
[] __initdata
= {
445 { .reg_offset
= OMAP_MUX_TERMINATOR
},
449 static struct gpio overo_bt_gpios
[] __initdata
= {
450 { OVERO_GPIO_BT_XGATE
, GPIOF_OUT_INIT_LOW
, "lcd enable" },
451 { OVERO_GPIO_BT_NRESET
, GPIOF_OUT_INIT_HIGH
, "lcd bl enable" },
454 static struct regulator_consumer_supply dummy_supplies
[] = {
455 REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
456 REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
457 REGULATOR_SUPPLY("vddvario", "smsc911x.1"),
458 REGULATOR_SUPPLY("vdd33a", "smsc911x.1"),
461 static void __init
overo_init(void)
465 regulator_register_fixed(0, dummy_supplies
, ARRAY_SIZE(dummy_supplies
));
466 omap3_mux_init(board_mux
, OMAP_PACKAGE_CBB
);
468 omap_hsmmc_init(mmc
);
469 omap_display_init(&overo_dss_data
);
471 omap_sdrc_init(mt46h32m32lf6_sdrc_params
,
472 mt46h32m32lf6_sdrc_params
);
473 board_nand_init(overo_nand_partitions
,
474 ARRAY_SIZE(overo_nand_partitions
), NAND_CS
, 0, NULL
);
475 usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
478 usbhs_init_phys(phy_data
, ARRAY_SIZE(phy_data
));
479 usbhs_init(&usbhs_bdata
);
481 overo_init_smsc911x();
484 omap_twl4030_audio_init("overo", NULL
);
486 /* Ensure SDRC pins are mux'd for self-refresh */
487 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT
);
488 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT
);
490 ret
= gpio_request_one(OVERO_GPIO_W2W_NRESET
, GPIOF_OUT_INIT_HIGH
,
491 "OVERO_GPIO_W2W_NRESET");
493 gpio_export(OVERO_GPIO_W2W_NRESET
, 0);
494 gpio_set_value(OVERO_GPIO_W2W_NRESET
, 0);
496 gpio_set_value(OVERO_GPIO_W2W_NRESET
, 1);
498 pr_err("could not obtain gpio for OVERO_GPIO_W2W_NRESET\n");
501 ret
= gpio_request_array(overo_bt_gpios
, ARRAY_SIZE(overo_bt_gpios
));
503 pr_err("%s: could not obtain BT gpios\n", __func__
);
505 gpio_export(OVERO_GPIO_BT_XGATE
, 0);
506 gpio_export(OVERO_GPIO_BT_NRESET
, 0);
507 gpio_set_value(OVERO_GPIO_BT_NRESET
, 0);
509 gpio_set_value(OVERO_GPIO_BT_NRESET
, 1);
512 ret
= gpio_request_one(OVERO_GPIO_USBH_CPEN
, GPIOF_OUT_INIT_HIGH
,
513 "OVERO_GPIO_USBH_CPEN");
515 gpio_export(OVERO_GPIO_USBH_CPEN
, 0);
517 pr_err("could not obtain gpio for OVERO_GPIO_USBH_CPEN\n");
520 MACHINE_START(OVERO
, "Gumstix Overo")
521 .atag_offset
= 0x100,
522 .reserve
= omap_reserve
,
523 .map_io
= omap3_map_io
,
524 .init_early
= omap35xx_init_early
,
525 .init_irq
= omap3_init_irq
,
526 .handle_irq
= omap3_intc_handle_irq
,
527 .init_machine
= overo_init
,
528 .init_late
= omap35xx_init_late
,
529 .init_time
= omap3_sync32k_timer_init
,
530 .restart
= omap3xxx_restart
,