1 /*
2  * Hardware definitions for Voipac PXA270
3  *
4  * Copyright (C) 2010
5  * Marek Vasut <marek.vasut@gmail.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  */
12 
13 #include <linux/platform_device.h>
14 #include <linux/delay.h>
15 #include <linux/irq.h>
16 #include <linux/gpio_keys.h>
17 #include <linux/input.h>
18 #include <linux/leds.h>
19 #include <linux/gpio.h>
20 #include <linux/usb/gpio_vbus.h>
21 #include <linux/mtd/mtd.h>
22 #include <linux/mtd/partitions.h>
23 #include <linux/mtd/physmap.h>
24 #include <linux/mtd/onenand.h>
25 #include <linux/dm9000.h>
26 #include <linux/ucb1400.h>
27 #include <linux/ata_platform.h>
28 #include <linux/regulator/machine.h>
29 #include <linux/regulator/max1586.h>
30 #include <linux/platform_data/i2c-pxa.h>
31 
32 #include <asm/mach-types.h>
33 #include <asm/mach/arch.h>
34 
35 #include "pxa27x.h"
36 #include <mach/audio.h>
37 #include <mach/vpac270.h>
38 #include <linux/platform_data/mmc-pxamci.h>
39 #include <linux/platform_data/video-pxafb.h>
40 #include <linux/platform_data/usb-ohci-pxa27x.h>
41 #include "pxa27x-udc.h"
42 #include "udc.h"
43 #include <linux/platform_data/ata-pxa.h>
44 
45 #include "generic.h"
46 #include "devices.h"
47 
48 /******************************************************************************
49  * Pin configuration
50  ******************************************************************************/
51 static unsigned long vpac270_pin_config[] __initdata = {
52 	/* MMC */
53 	GPIO32_MMC_CLK,
54 	GPIO92_MMC_DAT_0,
55 	GPIO109_MMC_DAT_1,
56 	GPIO110_MMC_DAT_2,
57 	GPIO111_MMC_DAT_3,
58 	GPIO112_MMC_CMD,
59 	GPIO53_GPIO,	/* SD detect */
60 	GPIO52_GPIO,	/* SD r/o switch */
61 
62 	/* GPIO KEYS */
63 	GPIO1_GPIO,	/* USER BTN */
64 
65 	/* LEDs */
66 	GPIO15_GPIO,	/* orange led */
67 
68 	/* FFUART */
69 	GPIO34_FFUART_RXD,
70 	GPIO39_FFUART_TXD,
71 	GPIO27_FFUART_RTS,
72 	GPIO100_FFUART_CTS,
73 	GPIO33_FFUART_DSR,
74 	GPIO40_FFUART_DTR,
75 	GPIO10_FFUART_DCD,
76 	GPIO38_FFUART_RI,
77 
78 	/* LCD */
79 	GPIO58_LCD_LDD_0,
80 	GPIO59_LCD_LDD_1,
81 	GPIO60_LCD_LDD_2,
82 	GPIO61_LCD_LDD_3,
83 	GPIO62_LCD_LDD_4,
84 	GPIO63_LCD_LDD_5,
85 	GPIO64_LCD_LDD_6,
86 	GPIO65_LCD_LDD_7,
87 	GPIO66_LCD_LDD_8,
88 	GPIO67_LCD_LDD_9,
89 	GPIO68_LCD_LDD_10,
90 	GPIO69_LCD_LDD_11,
91 	GPIO70_LCD_LDD_12,
92 	GPIO71_LCD_LDD_13,
93 	GPIO72_LCD_LDD_14,
94 	GPIO73_LCD_LDD_15,
95 	GPIO86_LCD_LDD_16,
96 	GPIO87_LCD_LDD_17,
97 	GPIO74_LCD_FCLK,
98 	GPIO75_LCD_LCLK,
99 	GPIO76_LCD_PCLK,
100 	GPIO77_LCD_BIAS,
101 
102 	/* PCMCIA */
103 	GPIO48_nPOE,
104 	GPIO49_nPWE,
105 	GPIO50_nPIOR,
106 	GPIO51_nPIOW,
107 	GPIO85_nPCE_1,
108 	GPIO54_nPCE_2,
109 	GPIO55_nPREG,
110 	GPIO57_nIOIS16,
111 	GPIO56_nPWAIT,
112 	GPIO104_PSKTSEL,
113 	GPIO84_GPIO,	/* PCMCIA CD */
114 	GPIO35_GPIO,	/* PCMCIA RDY */
115 	GPIO107_GPIO,	/* PCMCIA PPEN */
116 	GPIO11_GPIO,	/* PCMCIA RESET */
117 	GPIO17_GPIO,	/* CF CD */
118 	GPIO12_GPIO,	/* CF RDY */
119 	GPIO16_GPIO,	/* CF RESET */
120 
121 	/* UHC */
122 	GPIO88_USBH1_PWR,
123 	GPIO89_USBH1_PEN,
124 	GPIO119_USBH2_PWR,
125 	GPIO120_USBH2_PEN,
126 
127 	/* UDC */
128 	GPIO41_GPIO,
129 
130 	/* Ethernet */
131 	GPIO114_GPIO,	/* IRQ */
132 
133 	/* AC97 */
134 	GPIO28_AC97_BITCLK,
135 	GPIO29_AC97_SDATA_IN_0,
136 	GPIO30_AC97_SDATA_OUT,
137 	GPIO31_AC97_SYNC,
138 	GPIO95_AC97_nRESET,
139 	GPIO98_AC97_SYSCLK,
140 	GPIO113_GPIO,	/* TS IRQ */
141 
142 	/* I2C */
143 	GPIO117_I2C_SCL,
144 	GPIO118_I2C_SDA,
145 
146 	/* IDE */
147 	GPIO36_GPIO,	/* IDE IRQ */
148 	GPIO80_DREQ_1,
149 };
150 
151 /******************************************************************************
152  * NOR Flash
153  ******************************************************************************/
154 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
155 static struct mtd_partition vpac270_nor_partitions[] = {
156 	{
157 		.name		= "Flash",
158 		.offset		= 0x00000000,
159 		.size		= MTDPART_SIZ_FULL,
160 	}
161 };
162 
163 static struct physmap_flash_data vpac270_flash_data[] = {
164 	{
165 		.width		= 2,	/* bankwidth in bytes */
166 		.parts		= vpac270_nor_partitions,
167 		.nr_parts	= ARRAY_SIZE(vpac270_nor_partitions)
168 	}
169 };
170 
171 static struct resource vpac270_flash_resource = {
172 	.start	= PXA_CS0_PHYS,
173 	.end	= PXA_CS0_PHYS + SZ_64M - 1,
174 	.flags	= IORESOURCE_MEM,
175 };
176 
177 static struct platform_device vpac270_flash = {
178 	.name		= "physmap-flash",
179 	.id		= 0,
180 	.resource	= &vpac270_flash_resource,
181 	.num_resources	= 1,
182 	.dev 		= {
183 		.platform_data = vpac270_flash_data,
184 	},
185 };
vpac270_nor_init(void)186 static void __init vpac270_nor_init(void)
187 {
188 	platform_device_register(&vpac270_flash);
189 }
190 #else
vpac270_nor_init(void)191 static inline void vpac270_nor_init(void) {}
192 #endif
193 
194 /******************************************************************************
195  * OneNAND Flash
196  ******************************************************************************/
197 #if defined(CONFIG_MTD_ONENAND) || defined(CONFIG_MTD_ONENAND_MODULE)
198 static struct mtd_partition vpac270_onenand_partitions[] = {
199 	{
200 		.name		= "Flash",
201 		.offset		= 0x00000000,
202 		.size		= MTDPART_SIZ_FULL,
203 	}
204 };
205 
206 static struct onenand_platform_data vpac270_onenand_info = {
207 	.parts		= vpac270_onenand_partitions,
208 	.nr_parts	= ARRAY_SIZE(vpac270_onenand_partitions),
209 };
210 
211 static struct resource vpac270_onenand_resources[] = {
212 	[0] = {
213 		.start	= PXA_CS0_PHYS,
214 		.end	= PXA_CS0_PHYS + SZ_1M,
215 		.flags	= IORESOURCE_MEM,
216 	},
217 };
218 
219 static struct platform_device vpac270_onenand = {
220 	.name		= "onenand-flash",
221 	.id		= -1,
222 	.resource	= vpac270_onenand_resources,
223 	.num_resources	= ARRAY_SIZE(vpac270_onenand_resources),
224 	.dev		= {
225 		.platform_data	= &vpac270_onenand_info,
226 	},
227 };
228 
vpac270_onenand_init(void)229 static void __init vpac270_onenand_init(void)
230 {
231 	platform_device_register(&vpac270_onenand);
232 }
233 #else
vpac270_onenand_init(void)234 static void __init vpac270_onenand_init(void) {}
235 #endif
236 
237 /******************************************************************************
238  * SD/MMC card controller
239  ******************************************************************************/
240 #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
241 static struct pxamci_platform_data vpac270_mci_platform_data = {
242 	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34,
243 	.gpio_power		= -1,
244 	.gpio_card_detect	= GPIO53_VPAC270_SD_DETECT_N,
245 	.gpio_card_ro		= GPIO52_VPAC270_SD_READONLY,
246 	.detect_delay_ms	= 200,
247 };
248 
vpac270_mmc_init(void)249 static void __init vpac270_mmc_init(void)
250 {
251 	pxa_set_mci_info(&vpac270_mci_platform_data);
252 }
253 #else
vpac270_mmc_init(void)254 static inline void vpac270_mmc_init(void) {}
255 #endif
256 
257 /******************************************************************************
258  * GPIO keys
259  ******************************************************************************/
260 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
261 static struct gpio_keys_button vpac270_pxa_buttons[] = {
262 	{KEY_POWER, GPIO1_VPAC270_USER_BTN, 0, "USER BTN"},
263 };
264 
265 static struct gpio_keys_platform_data vpac270_pxa_keys_data = {
266 	.buttons	= vpac270_pxa_buttons,
267 	.nbuttons	= ARRAY_SIZE(vpac270_pxa_buttons),
268 };
269 
270 static struct platform_device vpac270_pxa_keys = {
271 	.name	= "gpio-keys",
272 	.id	= -1,
273 	.dev	= {
274 		.platform_data = &vpac270_pxa_keys_data,
275 	},
276 };
277 
vpac270_keys_init(void)278 static void __init vpac270_keys_init(void)
279 {
280 	platform_device_register(&vpac270_pxa_keys);
281 }
282 #else
vpac270_keys_init(void)283 static inline void vpac270_keys_init(void) {}
284 #endif
285 
286 /******************************************************************************
287  * LED
288  ******************************************************************************/
289 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
290 struct gpio_led vpac270_gpio_leds[] = {
291 {
292 	.name			= "vpac270:orange:user",
293 	.default_trigger	= "none",
294 	.gpio			= GPIO15_VPAC270_LED_ORANGE,
295 	.active_low		= 1,
296 }
297 };
298 
299 static struct gpio_led_platform_data vpac270_gpio_led_info = {
300 	.leds		= vpac270_gpio_leds,
301 	.num_leds	= ARRAY_SIZE(vpac270_gpio_leds),
302 };
303 
304 static struct platform_device vpac270_leds = {
305 	.name	= "leds-gpio",
306 	.id	= -1,
307 	.dev	= {
308 		.platform_data	= &vpac270_gpio_led_info,
309 	}
310 };
311 
vpac270_leds_init(void)312 static void __init vpac270_leds_init(void)
313 {
314 	platform_device_register(&vpac270_leds);
315 }
316 #else
vpac270_leds_init(void)317 static inline void vpac270_leds_init(void) {}
318 #endif
319 
320 /******************************************************************************
321  * USB Host
322  ******************************************************************************/
323 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
vpac270_ohci_init(struct device * dev)324 static int vpac270_ohci_init(struct device *dev)
325 {
326 	UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
327 	return 0;
328 }
329 
330 static struct pxaohci_platform_data vpac270_ohci_info = {
331 	.port_mode	= PMM_PERPORT_MODE,
332 	.flags		= ENABLE_PORT1 | ENABLE_PORT2 |
333 			POWER_CONTROL_LOW | POWER_SENSE_LOW,
334 	.init		= vpac270_ohci_init,
335 };
336 
vpac270_uhc_init(void)337 static void __init vpac270_uhc_init(void)
338 {
339 	pxa_set_ohci_info(&vpac270_ohci_info);
340 }
341 #else
vpac270_uhc_init(void)342 static inline void vpac270_uhc_init(void) {}
343 #endif
344 
345 /******************************************************************************
346  * USB Gadget
347  ******************************************************************************/
348 #if defined(CONFIG_USB_PXA27X)||defined(CONFIG_USB_PXA27X_MODULE)
349 static struct gpio_vbus_mach_info vpac270_gpio_vbus_info = {
350 	.gpio_vbus		= GPIO41_VPAC270_UDC_DETECT,
351 	.gpio_pullup		= -1,
352 };
353 
354 static struct platform_device vpac270_gpio_vbus = {
355 	.name	= "gpio-vbus",
356 	.id	= -1,
357 	.dev	= {
358 		.platform_data	= &vpac270_gpio_vbus_info,
359 	},
360 };
361 
vpac270_udc_command(int cmd)362 static void vpac270_udc_command(int cmd)
363 {
364 	if (cmd == PXA2XX_UDC_CMD_CONNECT)
365 		UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE;
366 	else if (cmd == PXA2XX_UDC_CMD_DISCONNECT)
367 		UP2OCR = UP2OCR_HXOE;
368 }
369 
370 static struct pxa2xx_udc_mach_info vpac270_udc_info __initdata = {
371 	.udc_command		= vpac270_udc_command,
372 	.gpio_pullup		= -1,
373 };
374 
vpac270_udc_init(void)375 static void __init vpac270_udc_init(void)
376 {
377 	pxa_set_udc_info(&vpac270_udc_info);
378 	platform_device_register(&vpac270_gpio_vbus);
379 }
380 #else
vpac270_udc_init(void)381 static inline void vpac270_udc_init(void) {}
382 #endif
383 
384 /******************************************************************************
385  * Ethernet
386  ******************************************************************************/
387 #if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
388 static struct resource vpac270_dm9000_resources[] = {
389 	[0] = {
390 		.start	= PXA_CS2_PHYS + 0x300,
391 		.end	= PXA_CS2_PHYS + 0x303,
392 		.flags	= IORESOURCE_MEM,
393 	},
394 	[1] = {
395 		.start	= PXA_CS2_PHYS + 0x304,
396 		.end	= PXA_CS2_PHYS + 0x343,
397 		.flags	= IORESOURCE_MEM,
398 	},
399 	[2] = {
400 		.start	= PXA_GPIO_TO_IRQ(GPIO114_VPAC270_ETH_IRQ),
401 		.end	= PXA_GPIO_TO_IRQ(GPIO114_VPAC270_ETH_IRQ),
402 		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
403 	},
404 };
405 
406 static struct dm9000_plat_data vpac270_dm9000_platdata = {
407 	.flags		= DM9000_PLATF_32BITONLY,
408 };
409 
410 static struct platform_device vpac270_dm9000_device = {
411 	.name		= "dm9000",
412 	.id		= -1,
413 	.num_resources	= ARRAY_SIZE(vpac270_dm9000_resources),
414 	.resource	= vpac270_dm9000_resources,
415 	.dev		= {
416 		.platform_data = &vpac270_dm9000_platdata,
417 	}
418 };
419 
vpac270_eth_init(void)420 static void __init vpac270_eth_init(void)
421 {
422 	platform_device_register(&vpac270_dm9000_device);
423 }
424 #else
vpac270_eth_init(void)425 static inline void vpac270_eth_init(void) {}
426 #endif
427 
428 /******************************************************************************
429  * Audio and Touchscreen
430  ******************************************************************************/
431 #if	defined(CONFIG_TOUCHSCREEN_UCB1400) || \
432 	defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
433 static pxa2xx_audio_ops_t vpac270_ac97_pdata = {
434 	.reset_gpio	= 95,
435 };
436 
437 static struct ucb1400_pdata vpac270_ucb1400_pdata = {
438 	.irq		= PXA_GPIO_TO_IRQ(GPIO113_VPAC270_TS_IRQ),
439 };
440 
441 static struct platform_device vpac270_ucb1400_device = {
442 	.name		= "ucb1400_core",
443 	.id		= -1,
444 	.dev		= {
445 		.platform_data = &vpac270_ucb1400_pdata,
446 	},
447 };
448 
vpac270_ts_init(void)449 static void __init vpac270_ts_init(void)
450 {
451 	pxa_set_ac97_info(&vpac270_ac97_pdata);
452 	platform_device_register(&vpac270_ucb1400_device);
453 }
454 #else
vpac270_ts_init(void)455 static inline void vpac270_ts_init(void) {}
456 #endif
457 
458 /******************************************************************************
459  * RTC
460  ******************************************************************************/
461 #if defined(CONFIG_RTC_DRV_DS1307) || defined(CONFIG_RTC_DRV_DS1307_MODULE)
462 static struct i2c_board_info __initdata vpac270_i2c_devs[] = {
463 	{
464 		I2C_BOARD_INFO("ds1339", 0x68),
465 	},
466 };
467 
vpac270_rtc_init(void)468 static void __init vpac270_rtc_init(void)
469 {
470 	i2c_register_board_info(0, ARRAY_AND_SIZE(vpac270_i2c_devs));
471 }
472 #else
vpac270_rtc_init(void)473 static inline void vpac270_rtc_init(void) {}
474 #endif
475 
476 /******************************************************************************
477  * Framebuffer
478  ******************************************************************************/
479 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
480 static struct pxafb_mode_info vpac270_lcd_modes[] = {
481 {
482 	.pixclock	= 57692,
483 	.xres		= 640,
484 	.yres		= 480,
485 	.bpp		= 32,
486 	.depth		= 18,
487 
488 	.left_margin	= 144,
489 	.right_margin	= 32,
490 	.upper_margin	= 13,
491 	.lower_margin	= 30,
492 
493 	.hsync_len	= 32,
494 	.vsync_len	= 2,
495 
496 	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
497 }, {	/* CRT 640x480 */
498 	.pixclock	= 35000,
499 	.xres		= 640,
500 	.yres		= 480,
501 	.bpp		= 16,
502 	.depth		= 16,
503 
504 	.left_margin	= 96,
505 	.right_margin	= 48,
506 	.upper_margin	= 33,
507 	.lower_margin	= 10,
508 
509 	.hsync_len	= 48,
510 	.vsync_len	= 1,
511 
512 	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
513 }, {	/* CRT 800x600 H=30kHz V=48HZ */
514 	.pixclock	= 25000,
515 	.xres		= 800,
516 	.yres		= 600,
517 	.bpp		= 16,
518 	.depth		= 16,
519 
520 	.left_margin	= 50,
521 	.right_margin	= 1,
522 	.upper_margin	= 21,
523 	.lower_margin	= 12,
524 
525 	.hsync_len	= 8,
526 	.vsync_len	= 1,
527 
528 	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
529 }, {	/* CRT 1024x768 H=40kHz V=50Hz */
530 	.pixclock	= 15000,
531 	.xres		= 1024,
532 	.yres		= 768,
533 	.bpp		= 16,
534 	.depth		= 16,
535 
536 	.left_margin	= 220,
537 	.right_margin	= 8,
538 	.upper_margin	= 33,
539 	.lower_margin	= 2,
540 
541 	.hsync_len	= 48,
542 	.vsync_len	= 1,
543 
544 	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
545 }
546 };
547 
548 static struct pxafb_mach_info vpac270_lcd_screen = {
549 	.modes		= vpac270_lcd_modes,
550 	.num_modes	= ARRAY_SIZE(vpac270_lcd_modes),
551 	.lcd_conn	= LCD_COLOR_TFT_18BPP,
552 };
553 
vpac270_lcd_power(int on,struct fb_var_screeninfo * info)554 static void vpac270_lcd_power(int on, struct fb_var_screeninfo *info)
555 {
556 	gpio_set_value(GPIO81_VPAC270_BKL_ON, on);
557 }
558 
vpac270_lcd_init(void)559 static void __init vpac270_lcd_init(void)
560 {
561 	int ret;
562 
563 	ret = gpio_request(GPIO81_VPAC270_BKL_ON, "BKL-ON");
564 	if (ret) {
565 		pr_err("Requesting BKL-ON GPIO failed!\n");
566 		goto err;
567 	}
568 
569 	ret = gpio_direction_output(GPIO81_VPAC270_BKL_ON, 1);
570 	if (ret) {
571 		pr_err("Setting BKL-ON GPIO direction failed!\n");
572 		goto err2;
573 	}
574 
575 	vpac270_lcd_screen.pxafb_lcd_power = vpac270_lcd_power;
576 	pxa_set_fb_info(NULL, &vpac270_lcd_screen);
577 	return;
578 
579 err2:
580 	gpio_free(GPIO81_VPAC270_BKL_ON);
581 err:
582 	return;
583 }
584 #else
vpac270_lcd_init(void)585 static inline void vpac270_lcd_init(void) {}
586 #endif
587 
588 /******************************************************************************
589  * PATA IDE
590  ******************************************************************************/
591 #if defined(CONFIG_PATA_PXA) || defined(CONFIG_PATA_PXA_MODULE)
592 static struct pata_pxa_pdata vpac270_pata_pdata = {
593 	.reg_shift	= 1,
594 	.dma_dreq	= 1,
595 	.irq_flags	= IRQF_TRIGGER_RISING,
596 };
597 
598 static struct resource vpac270_ide_resources[] = {
599 	[0] = {	/* I/O Base address */
600 	       .start	= PXA_CS3_PHYS + 0x120,
601 	       .end	= PXA_CS3_PHYS + 0x13f,
602 	       .flags	= IORESOURCE_MEM
603 	},
604 	[1] = {	/* CTL Base address */
605 	       .start	= PXA_CS3_PHYS + 0x15c,
606 	       .end	= PXA_CS3_PHYS + 0x15f,
607 	       .flags	= IORESOURCE_MEM
608 	},
609 	[2] = {	/* DMA Base address */
610 	       .start	= PXA_CS3_PHYS + 0x20,
611 	       .end	= PXA_CS3_PHYS + 0x2f,
612 	       .flags	= IORESOURCE_DMA
613 	},
614 	[3] = {	/* IDE IRQ pin */
615 	       .start	= PXA_GPIO_TO_IRQ(GPIO36_VPAC270_IDE_IRQ),
616 	       .end	= PXA_GPIO_TO_IRQ(GPIO36_VPAC270_IDE_IRQ),
617 	       .flags	= IORESOURCE_IRQ
618 	}
619 };
620 
621 static struct platform_device vpac270_ide_device = {
622 	.name		= "pata_pxa",
623 	.num_resources	= ARRAY_SIZE(vpac270_ide_resources),
624 	.resource	= vpac270_ide_resources,
625 	.dev		= {
626 		.platform_data	= &vpac270_pata_pdata,
627 		.coherent_dma_mask	= 0xffffffff,
628 	}
629 };
630 
vpac270_ide_init(void)631 static void __init vpac270_ide_init(void)
632 {
633 	platform_device_register(&vpac270_ide_device);
634 }
635 #else
vpac270_ide_init(void)636 static inline void vpac270_ide_init(void) {}
637 #endif
638 
639 /******************************************************************************
640  * Core power regulator
641  ******************************************************************************/
642 #if defined(CONFIG_REGULATOR_MAX1586) || \
643     defined(CONFIG_REGULATOR_MAX1586_MODULE)
644 static struct regulator_consumer_supply vpac270_max1587a_consumers[] = {
645 	REGULATOR_SUPPLY("vcc_core", NULL),
646 };
647 
648 static struct regulator_init_data vpac270_max1587a_v3_info = {
649 	.constraints = {
650 		.name		= "vcc_core range",
651 		.min_uV		= 900000,
652 		.max_uV		= 1705000,
653 		.always_on	= 1,
654 		.valid_ops_mask	= REGULATOR_CHANGE_VOLTAGE,
655 	},
656 	.consumer_supplies	= vpac270_max1587a_consumers,
657 	.num_consumer_supplies	= ARRAY_SIZE(vpac270_max1587a_consumers),
658 };
659 
660 static struct max1586_subdev_data vpac270_max1587a_subdevs[] = {
661 	{
662 		.name		= "vcc_core",
663 		.id		= MAX1586_V3,
664 		.platform_data	= &vpac270_max1587a_v3_info,
665 	}
666 };
667 
668 static struct max1586_platform_data vpac270_max1587a_info = {
669 	.subdevs     = vpac270_max1587a_subdevs,
670 	.num_subdevs = ARRAY_SIZE(vpac270_max1587a_subdevs),
671 	.v3_gain     = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
672 };
673 
674 static struct i2c_board_info __initdata vpac270_pi2c_board_info[] = {
675 	{
676 		I2C_BOARD_INFO("max1586", 0x14),
677 		.platform_data	= &vpac270_max1587a_info,
678 	},
679 };
680 
vpac270_pmic_init(void)681 static void __init vpac270_pmic_init(void)
682 {
683 	i2c_register_board_info(1, ARRAY_AND_SIZE(vpac270_pi2c_board_info));
684 }
685 #else
vpac270_pmic_init(void)686 static inline void vpac270_pmic_init(void) {}
687 #endif
688 
689 
690 /******************************************************************************
691  * Machine init
692  ******************************************************************************/
vpac270_init(void)693 static void __init vpac270_init(void)
694 {
695 	pxa2xx_mfp_config(ARRAY_AND_SIZE(vpac270_pin_config));
696 
697 	pxa_set_ffuart_info(NULL);
698 	pxa_set_btuart_info(NULL);
699 	pxa_set_stuart_info(NULL);
700 	pxa_set_i2c_info(NULL);
701 	pxa27x_set_i2c_power_info(NULL);
702 
703 	vpac270_pmic_init();
704 	vpac270_lcd_init();
705 	vpac270_mmc_init();
706 	vpac270_nor_init();
707 	vpac270_onenand_init();
708 	vpac270_leds_init();
709 	vpac270_keys_init();
710 	vpac270_uhc_init();
711 	vpac270_udc_init();
712 	vpac270_eth_init();
713 	vpac270_ts_init();
714 	vpac270_rtc_init();
715 	vpac270_ide_init();
716 
717 	regulator_has_full_constraints();
718 }
719 
720 MACHINE_START(VPAC270, "Voipac PXA270")
721 	.atag_offset	= 0x100,
722 	.map_io		= pxa27x_map_io,
723 	.nr_irqs	= PXA_NR_IRQS,
724 	.init_irq	= pxa27x_init_irq,
725 	.handle_irq	= pxa27x_handle_irq,
726 	.init_time	= pxa_timer_init,
727 	.init_machine	= vpac270_init,
728 	.restart	= pxa_restart,
729 MACHINE_END
730