• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
40 #include <asm/mach-types.h>
41 #include <asm/mach/arch.h>
42 #include <asm/mach/flash.h>
43 #include <asm/mach/map.h>
44 
45 #include <plat/board.h>
46 #include "common.h"
47 #include <video/omapdss.h>
48 #include <video/omap-panel-generic-dpi.h>
49 #include <video/omap-panel-dvi.h>
50 #include <plat/gpmc.h>
51 #include <mach/hardware.h>
52 #include <plat/nand.h>
53 #include <plat/mcspi.h>
54 #include <plat/mux.h>
55 #include <plat/usb.h>
56 
57 #include "mux.h"
58 #include "sdram-micron-mt46h32m32lf-6.h"
59 #include "hsmmc.h"
60 #include "common-board-devices.h"
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_SMSC911X2_CS     4
72 #define OVERO_SMSC911X2_GPIO   65
73 
74 #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
75 	defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
76 
77 /* fixed regulator for ads7846 */
78 static struct regulator_consumer_supply ads7846_supply[] = {
79 	REGULATOR_SUPPLY("vcc", "spi1.0"),
80 };
81 
82 static struct regulator_init_data vads7846_regulator = {
83 	.constraints = {
84 		.valid_ops_mask		= REGULATOR_CHANGE_STATUS,
85 	},
86 	.num_consumer_supplies	= ARRAY_SIZE(ads7846_supply),
87 	.consumer_supplies	= ads7846_supply,
88 };
89 
90 static struct fixed_voltage_config vads7846 = {
91 	.supply_name		= "vads7846",
92 	.microvolts		= 3300000, /* 3.3V */
93 	.gpio			= -EINVAL,
94 	.startup_delay		= 0,
95 	.init_data		= &vads7846_regulator,
96 };
97 
98 static struct platform_device vads7846_device = {
99 	.name		= "reg-fixed-voltage",
100 	.id		= 1,
101 	.dev = {
102 		.platform_data = &vads7846,
103 	},
104 };
105 
overo_ads7846_init(void)106 static void __init overo_ads7846_init(void)
107 {
108 	omap_ads7846_init(1, OVERO_GPIO_PENDOWN, 0, NULL);
109 	platform_device_register(&vads7846_device);
110 }
111 
112 #else
overo_ads7846_init(void)113 static inline void __init overo_ads7846_init(void) { return; }
114 #endif
115 
116 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
117 
118 #include <linux/smsc911x.h>
119 #include <plat/gpmc-smsc911x.h>
120 
121 static struct omap_smsc911x_platform_data smsc911x_cfg = {
122 	.id		= 0,
123 	.cs             = OVERO_SMSC911X_CS,
124 	.gpio_irq       = OVERO_SMSC911X_GPIO,
125 	.gpio_reset     = -EINVAL,
126 	.flags		= SMSC911X_USE_32BIT,
127 };
128 
129 static struct omap_smsc911x_platform_data smsc911x2_cfg = {
130 	.id		= 1,
131 	.cs             = OVERO_SMSC911X2_CS,
132 	.gpio_irq       = OVERO_SMSC911X2_GPIO,
133 	.gpio_reset     = -EINVAL,
134 	.flags		= SMSC911X_USE_32BIT,
135 };
136 
overo_init_smsc911x(void)137 static void __init overo_init_smsc911x(void)
138 {
139 	gpmc_smsc911x_init(&smsc911x_cfg);
140 	gpmc_smsc911x_init(&smsc911x2_cfg);
141 }
142 
143 #else
overo_init_smsc911x(void)144 static inline void __init overo_init_smsc911x(void) { return; }
145 #endif
146 
147 /* DSS */
148 static int lcd_enabled;
149 static int dvi_enabled;
150 
151 #define OVERO_GPIO_LCD_EN 144
152 #define OVERO_GPIO_LCD_BL 145
153 
154 static struct gpio overo_dss_gpios[] __initdata = {
155 	{ OVERO_GPIO_LCD_EN, GPIOF_OUT_INIT_HIGH, "OVERO_GPIO_LCD_EN" },
156 	{ OVERO_GPIO_LCD_BL, GPIOF_OUT_INIT_HIGH, "OVERO_GPIO_LCD_BL" },
157 };
158 
overo_display_init(void)159 static void __init overo_display_init(void)
160 {
161 	if (gpio_request_array(overo_dss_gpios, ARRAY_SIZE(overo_dss_gpios))) {
162 		printk(KERN_ERR "could not obtain DSS control GPIOs\n");
163 		return;
164 	}
165 
166 	gpio_export(OVERO_GPIO_LCD_EN, 0);
167 	gpio_export(OVERO_GPIO_LCD_BL, 0);
168 }
169 
overo_panel_enable_dvi(struct omap_dss_device * dssdev)170 static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
171 {
172 	if (lcd_enabled) {
173 		printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
174 		return -EINVAL;
175 	}
176 	dvi_enabled = 1;
177 
178 	return 0;
179 }
180 
overo_panel_disable_dvi(struct omap_dss_device * dssdev)181 static void overo_panel_disable_dvi(struct omap_dss_device *dssdev)
182 {
183 	dvi_enabled = 0;
184 }
185 
186 static struct panel_dvi_platform_data dvi_panel = {
187 	.platform_enable	= overo_panel_enable_dvi,
188 	.platform_disable	= overo_panel_disable_dvi,
189 	.i2c_bus_num		= 3,
190 };
191 
192 static struct omap_dss_device overo_dvi_device = {
193 	.name			= "dvi",
194 	.type			= OMAP_DISPLAY_TYPE_DPI,
195 	.driver_name		= "dvi",
196 	.data			= &dvi_panel,
197 	.phy.dpi.data_lines	= 24,
198 };
199 
200 static struct omap_dss_device overo_tv_device = {
201 	.name = "tv",
202 	.driver_name = "venc",
203 	.type = OMAP_DISPLAY_TYPE_VENC,
204 	.phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
205 };
206 
overo_panel_enable_lcd(struct omap_dss_device * dssdev)207 static int overo_panel_enable_lcd(struct omap_dss_device *dssdev)
208 {
209 	if (dvi_enabled) {
210 		printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
211 		return -EINVAL;
212 	}
213 
214 	gpio_set_value(OVERO_GPIO_LCD_EN, 1);
215 	gpio_set_value(OVERO_GPIO_LCD_BL, 1);
216 	lcd_enabled = 1;
217 	return 0;
218 }
219 
overo_panel_disable_lcd(struct omap_dss_device * dssdev)220 static void overo_panel_disable_lcd(struct omap_dss_device *dssdev)
221 {
222 	gpio_set_value(OVERO_GPIO_LCD_EN, 0);
223 	gpio_set_value(OVERO_GPIO_LCD_BL, 0);
224 	lcd_enabled = 0;
225 }
226 
227 static struct panel_generic_dpi_data lcd43_panel = {
228 	.name			= "samsung_lte430wq_f0c",
229 	.platform_enable	= overo_panel_enable_lcd,
230 	.platform_disable	= overo_panel_disable_lcd,
231 };
232 
233 static struct omap_dss_device overo_lcd43_device = {
234 	.name			= "lcd43",
235 	.type			= OMAP_DISPLAY_TYPE_DPI,
236 	.driver_name		= "generic_dpi_panel",
237 	.data			= &lcd43_panel,
238 	.phy.dpi.data_lines	= 24,
239 };
240 
241 #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
242 	defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
243 static struct omap_dss_device overo_lcd35_device = {
244 	.type			= OMAP_DISPLAY_TYPE_DPI,
245 	.name			= "lcd35",
246 	.driver_name		= "lgphilips_lb035q02_panel",
247 	.phy.dpi.data_lines	= 24,
248 	.platform_enable	= overo_panel_enable_lcd,
249 	.platform_disable	= overo_panel_disable_lcd,
250 };
251 #endif
252 
253 static struct omap_dss_device *overo_dss_devices[] = {
254 	&overo_dvi_device,
255 	&overo_tv_device,
256 #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
257 	defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
258 	&overo_lcd35_device,
259 #endif
260 	&overo_lcd43_device,
261 };
262 
263 static struct omap_dss_board_info overo_dss_data = {
264 	.num_devices	= ARRAY_SIZE(overo_dss_devices),
265 	.devices	= overo_dss_devices,
266 	.default_device	= &overo_dvi_device,
267 };
268 
269 static struct mtd_partition overo_nand_partitions[] = {
270 	{
271 		.name           = "xloader",
272 		.offset         = 0,			/* Offset = 0x00000 */
273 		.size           = 4 * NAND_BLOCK_SIZE,
274 		.mask_flags     = MTD_WRITEABLE
275 	},
276 	{
277 		.name           = "uboot",
278 		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x80000 */
279 		.size           = 14 * NAND_BLOCK_SIZE,
280 	},
281 	{
282 		.name           = "uboot environment",
283 		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x240000 */
284 		.size           = 2 * NAND_BLOCK_SIZE,
285 	},
286 	{
287 		.name           = "linux",
288 		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x280000 */
289 		.size           = 32 * NAND_BLOCK_SIZE,
290 	},
291 	{
292 		.name           = "rootfs",
293 		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x680000 */
294 		.size           = MTDPART_SIZ_FULL,
295 	},
296 };
297 
298 static struct omap2_hsmmc_info mmc[] = {
299 	{
300 		.mmc		= 1,
301 		.caps		= MMC_CAP_4_BIT_DATA,
302 		.gpio_cd	= -EINVAL,
303 		.gpio_wp	= -EINVAL,
304 	},
305 	{
306 		.mmc		= 2,
307 		.caps		= MMC_CAP_4_BIT_DATA,
308 		.gpio_cd	= -EINVAL,
309 		.gpio_wp	= -EINVAL,
310 		.transceiver	= true,
311 		.ocr_mask	= 0x00100000,	/* 3.3V */
312 	},
313 	{}	/* Terminator */
314 };
315 
316 static struct regulator_consumer_supply overo_vmmc1_supply[] = {
317 	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
318 };
319 
320 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
321 #include <linux/leds.h>
322 
323 static struct gpio_led gpio_leds[] = {
324 	{
325 		.name			= "overo:red:gpio21",
326 		.default_trigger	= "heartbeat",
327 		.gpio			= 21,
328 		.active_low		= true,
329 	},
330 	{
331 		.name			= "overo:blue:gpio22",
332 		.default_trigger	= "none",
333 		.gpio			= 22,
334 		.active_low		= true,
335 	},
336 	{
337 		.name			= "overo:blue:COM",
338 		.default_trigger	= "mmc0",
339 		.gpio			= -EINVAL,	/* gets replaced */
340 		.active_low		= true,
341 	},
342 };
343 
344 static struct gpio_led_platform_data gpio_leds_pdata = {
345 	.leds		= gpio_leds,
346 	.num_leds	= ARRAY_SIZE(gpio_leds),
347 };
348 
349 static struct platform_device gpio_leds_device = {
350 	.name	= "leds-gpio",
351 	.id	= -1,
352 	.dev	= {
353 		.platform_data	= &gpio_leds_pdata,
354 	},
355 };
356 
overo_init_led(void)357 static void __init overo_init_led(void)
358 {
359 	platform_device_register(&gpio_leds_device);
360 }
361 
362 #else
overo_init_led(void)363 static inline void __init overo_init_led(void) { return; }
364 #endif
365 
366 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
367 #include <linux/input.h>
368 #include <linux/gpio_keys.h>
369 
370 static struct gpio_keys_button gpio_buttons[] = {
371 	{
372 		.code			= BTN_0,
373 		.gpio			= 23,
374 		.desc			= "button0",
375 		.wakeup			= 1,
376 	},
377 	{
378 		.code			= BTN_1,
379 		.gpio			= 14,
380 		.desc			= "button1",
381 		.wakeup			= 1,
382 	},
383 };
384 
385 static struct gpio_keys_platform_data gpio_keys_pdata = {
386 	.buttons	= gpio_buttons,
387 	.nbuttons	= ARRAY_SIZE(gpio_buttons),
388 };
389 
390 static struct platform_device gpio_keys_device = {
391 	.name	= "gpio-keys",
392 	.id	= -1,
393 	.dev	= {
394 		.platform_data	= &gpio_keys_pdata,
395 	},
396 };
397 
overo_init_keys(void)398 static void __init overo_init_keys(void)
399 {
400 	platform_device_register(&gpio_keys_device);
401 }
402 
403 #else
overo_init_keys(void)404 static inline void __init overo_init_keys(void) { return; }
405 #endif
406 
overo_twl_gpio_setup(struct device * dev,unsigned gpio,unsigned ngpio)407 static int overo_twl_gpio_setup(struct device *dev,
408 		unsigned gpio, unsigned ngpio)
409 {
410 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
411 	/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
412 	gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
413 #endif
414 
415 	return 0;
416 }
417 
418 static struct twl4030_gpio_platform_data overo_gpio_data = {
419 	.gpio_base	= OMAP_MAX_GPIO_LINES,
420 	.irq_base	= TWL4030_GPIO_IRQ_BASE,
421 	.irq_end	= TWL4030_GPIO_IRQ_END,
422 	.use_leds	= true,
423 	.setup		= overo_twl_gpio_setup,
424 };
425 
426 static struct regulator_init_data overo_vmmc1 = {
427 	.constraints = {
428 		.min_uV			= 1850000,
429 		.max_uV			= 3150000,
430 		.valid_modes_mask	= REGULATOR_MODE_NORMAL
431 					| REGULATOR_MODE_STANDBY,
432 		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
433 					| REGULATOR_CHANGE_MODE
434 					| REGULATOR_CHANGE_STATUS,
435 	},
436 	.num_consumer_supplies	= ARRAY_SIZE(overo_vmmc1_supply),
437 	.consumer_supplies	= overo_vmmc1_supply,
438 };
439 
440 static struct twl4030_platform_data overo_twldata = {
441 	.gpio		= &overo_gpio_data,
442 	.vmmc1		= &overo_vmmc1,
443 };
444 
overo_i2c_init(void)445 static int __init overo_i2c_init(void)
446 {
447 	omap3_pmic_get_config(&overo_twldata,
448 			TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
449 			TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
450 
451 	overo_twldata.vpll2->constraints.name = "VDVI";
452 
453 	omap3_pmic_init("tps65950", &overo_twldata);
454 	/* i2c2 pins are used for gpio */
455 	omap_register_i2c_bus(3, 400, NULL, 0);
456 	return 0;
457 }
458 
459 static struct spi_board_info overo_spi_board_info[] __initdata = {
460 #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
461 	defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
462 	{
463 		.modalias		= "lgphilips_lb035q02_panel-spi",
464 		.bus_num		= 1,
465 		.chip_select		= 1,
466 		.max_speed_hz		= 500000,
467 		.mode			= SPI_MODE_3,
468 	},
469 #endif
470 };
471 
overo_spi_init(void)472 static int __init overo_spi_init(void)
473 {
474 	overo_ads7846_init();
475 	spi_register_board_info(overo_spi_board_info,
476 			ARRAY_SIZE(overo_spi_board_info));
477 	return 0;
478 }
479 
480 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
481 	.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
482 	.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
483 	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
484 	.phy_reset  = true,
485 	.reset_gpio_port[0]  = -EINVAL,
486 	.reset_gpio_port[1]  = OVERO_GPIO_USBH_NRESET,
487 	.reset_gpio_port[2]  = -EINVAL
488 };
489 
490 #ifdef CONFIG_OMAP_MUX
491 static struct omap_board_mux board_mux[] __initdata = {
492 	{ .reg_offset = OMAP_MUX_TERMINATOR },
493 };
494 #endif
495 
496 static struct gpio overo_bt_gpios[] __initdata = {
497 	{ OVERO_GPIO_BT_XGATE,	GPIOF_OUT_INIT_LOW,	"lcd enable"    },
498 	{ OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH,	"lcd bl enable" },
499 };
500 
501 static struct regulator_consumer_supply dummy_supplies[] = {
502 	REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
503 	REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
504 	REGULATOR_SUPPLY("vddvario", "smsc911x.1"),
505 	REGULATOR_SUPPLY("vdd33a", "smsc911x.1"),
506 };
507 
overo_init(void)508 static void __init overo_init(void)
509 {
510 	int ret;
511 
512 	regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
513 	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
514 	omap_hsmmc_init(mmc);
515 	overo_i2c_init();
516 	omap_display_init(&overo_dss_data);
517 	omap_serial_init();
518 	omap_sdrc_init(mt46h32m32lf6_sdrc_params,
519 				  mt46h32m32lf6_sdrc_params);
520 	omap_nand_flash_init(0, overo_nand_partitions,
521 			     ARRAY_SIZE(overo_nand_partitions));
522 	usb_musb_init(NULL);
523 	usbhs_init(&usbhs_bdata);
524 	overo_spi_init();
525 	overo_init_smsc911x();
526 	overo_display_init();
527 	overo_init_led();
528 	overo_init_keys();
529 
530 	/* Ensure SDRC pins are mux'd for self-refresh */
531 	omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
532 	omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
533 
534 	ret = gpio_request_one(OVERO_GPIO_W2W_NRESET, GPIOF_OUT_INIT_HIGH,
535 			       "OVERO_GPIO_W2W_NRESET");
536 	if (ret == 0) {
537 		gpio_export(OVERO_GPIO_W2W_NRESET, 0);
538 		gpio_set_value(OVERO_GPIO_W2W_NRESET, 0);
539 		udelay(10);
540 		gpio_set_value(OVERO_GPIO_W2W_NRESET, 1);
541 	} else {
542 		printk(KERN_ERR "could not obtain gpio for "
543 					"OVERO_GPIO_W2W_NRESET\n");
544 	}
545 
546 	ret = gpio_request_array(overo_bt_gpios, ARRAY_SIZE(overo_bt_gpios));
547 	if (ret) {
548 		pr_err("%s: could not obtain BT gpios\n", __func__);
549 	} else {
550 		gpio_export(OVERO_GPIO_BT_XGATE, 0);
551 		gpio_export(OVERO_GPIO_BT_NRESET, 0);
552 		gpio_set_value(OVERO_GPIO_BT_NRESET, 0);
553 		mdelay(6);
554 		gpio_set_value(OVERO_GPIO_BT_NRESET, 1);
555 	}
556 
557 	ret = gpio_request_one(OVERO_GPIO_USBH_CPEN, GPIOF_OUT_INIT_HIGH,
558 			       "OVERO_GPIO_USBH_CPEN");
559 	if (ret == 0)
560 		gpio_export(OVERO_GPIO_USBH_CPEN, 0);
561 	else
562 		printk(KERN_ERR "could not obtain gpio for "
563 					"OVERO_GPIO_USBH_CPEN\n");
564 }
565 
566 MACHINE_START(OVERO, "Gumstix Overo")
567 	.atag_offset	= 0x100,
568 	.reserve	= omap_reserve,
569 	.map_io		= omap3_map_io,
570 	.init_early	= omap35xx_init_early,
571 	.init_irq	= omap3_init_irq,
572 	.handle_irq	= omap3_intc_handle_irq,
573 	.init_machine	= overo_init,
574 	.timer		= &omap3_timer,
575 	.restart	= omap_prcm_restart,
576 MACHINE_END
577