1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 *  linux/arch/arm/mach-pxa/balloon3.c
4 *
5 *  Support for Balloonboard.org Balloon3 board.
6 *
7 *  Author:	Nick Bane, Wookey, Jonathan McDowell
8 *  Created:	June, 2006
9 *  Copyright:	Toby Churchill Ltd
10 *  Derived from mainstone.c, by Nico Pitre
11 */
12
13#include <linux/export.h>
14#include <linux/init.h>
15#include <linux/platform_device.h>
16#include <linux/interrupt.h>
17#include <linux/leds.h>
18#include <linux/sched.h>
19#include <linux/bitops.h>
20#include <linux/fb.h>
21#include <linux/gpio.h>
22#include <linux/ioport.h>
23#include <linux/ucb1400.h>
24#include <linux/mtd/mtd.h>
25#include <linux/types.h>
26#include <linux/platform_data/pcf857x.h>
27#include <linux/platform_data/i2c-pxa.h>
28#include <linux/mtd/platnand.h>
29#include <linux/mtd/physmap.h>
30#include <linux/regulator/max1586.h>
31
32#include <asm/setup.h>
33#include <asm/mach-types.h>
34#include <asm/irq.h>
35#include <linux/sizes.h>
36
37#include <asm/mach/arch.h>
38#include <asm/mach/map.h>
39#include <asm/mach/irq.h>
40#include <asm/mach/flash.h>
41
42#include "pxa27x.h"
43#include <mach/balloon3.h>
44#include <mach/audio.h>
45#include <linux/platform_data/video-pxafb.h>
46#include <linux/platform_data/mmc-pxamci.h>
47#include "udc.h"
48#include "pxa27x-udc.h"
49#include <linux/platform_data/irda-pxaficp.h>
50#include <linux/platform_data/usb-ohci-pxa27x.h>
51
52#include "generic.h"
53#include "devices.h"
54
55/******************************************************************************
56 * Pin configuration
57 ******************************************************************************/
58static unsigned long balloon3_pin_config[] __initdata = {
59	/* Select BTUART 'COM1/ttyS0' as IO option for pins 42/43/44/45 */
60	GPIO42_BTUART_RXD,
61	GPIO43_BTUART_TXD,
62	GPIO44_BTUART_CTS,
63	GPIO45_BTUART_RTS,
64
65	/* Reset, configured as GPIO wakeup source */
66	GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
67};
68
69/******************************************************************************
70 * Compatibility: Parameter parsing
71 ******************************************************************************/
72static unsigned long balloon3_irq_enabled;
73
74static unsigned long balloon3_features_present =
75		(1 << BALLOON3_FEATURE_OHCI) | (1 << BALLOON3_FEATURE_CF) |
76		(1 << BALLOON3_FEATURE_AUDIO) |
77		(1 << BALLOON3_FEATURE_TOPPOLY);
78
79int balloon3_has(enum balloon3_features feature)
80{
81	return (balloon3_features_present & (1 << feature)) ? 1 : 0;
82}
83EXPORT_SYMBOL_GPL(balloon3_has);
84
85int __init parse_balloon3_features(char *arg)
86{
87	if (!arg)
88		return 0;
89
90	return kstrtoul(arg, 0, &balloon3_features_present);
91}
92early_param("balloon3_features", parse_balloon3_features);
93
94/******************************************************************************
95 * Compact Flash slot
96 ******************************************************************************/
97#if	defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
98static unsigned long balloon3_cf_pin_config[] __initdata = {
99	GPIO48_nPOE,
100	GPIO49_nPWE,
101	GPIO50_nPIOR,
102	GPIO51_nPIOW,
103	GPIO85_nPCE_1,
104	GPIO54_nPCE_2,
105	GPIO79_PSKTSEL,
106	GPIO55_nPREG,
107	GPIO56_nPWAIT,
108	GPIO57_nIOIS16,
109};
110
111static void __init balloon3_cf_init(void)
112{
113	if (!balloon3_has(BALLOON3_FEATURE_CF))
114		return;
115
116	pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_cf_pin_config));
117}
118#else
119static inline void balloon3_cf_init(void) {}
120#endif
121
122/******************************************************************************
123 * NOR Flash
124 ******************************************************************************/
125#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
126static struct mtd_partition balloon3_nor_partitions[] = {
127	{
128		.name		= "Flash",
129		.offset		= 0x00000000,
130		.size		= MTDPART_SIZ_FULL,
131	}
132};
133
134static struct physmap_flash_data balloon3_flash_data[] = {
135	{
136		.width		= 2,	/* bankwidth in bytes */
137		.parts		= balloon3_nor_partitions,
138		.nr_parts	= ARRAY_SIZE(balloon3_nor_partitions)
139	}
140};
141
142static struct resource balloon3_flash_resource = {
143	.start	= PXA_CS0_PHYS,
144	.end	= PXA_CS0_PHYS + SZ_64M - 1,
145	.flags	= IORESOURCE_MEM,
146};
147
148static struct platform_device balloon3_flash = {
149	.name		= "physmap-flash",
150	.id		= 0,
151	.resource	= &balloon3_flash_resource,
152	.num_resources	= 1,
153	.dev 		= {
154		.platform_data = balloon3_flash_data,
155	},
156};
157static void __init balloon3_nor_init(void)
158{
159	platform_device_register(&balloon3_flash);
160}
161#else
162static inline void balloon3_nor_init(void) {}
163#endif
164
165/******************************************************************************
166 * Audio and Touchscreen
167 ******************************************************************************/
168#if	defined(CONFIG_TOUCHSCREEN_UCB1400) || \
169	defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
170static unsigned long balloon3_ac97_pin_config[] __initdata = {
171	GPIO28_AC97_BITCLK,
172	GPIO29_AC97_SDATA_IN_0,
173	GPIO30_AC97_SDATA_OUT,
174	GPIO31_AC97_SYNC,
175	GPIO113_AC97_nRESET,
176	GPIO95_GPIO,
177};
178
179static struct ucb1400_pdata vpac270_ucb1400_pdata = {
180	.irq		= PXA_GPIO_TO_IRQ(BALLOON3_GPIO_CODEC_IRQ),
181};
182
183
184static struct platform_device balloon3_ucb1400_device = {
185	.name		= "ucb1400_core",
186	.id		= -1,
187	.dev		= {
188		.platform_data = &vpac270_ucb1400_pdata,
189	},
190};
191
192static void __init balloon3_ts_init(void)
193{
194	if (!balloon3_has(BALLOON3_FEATURE_AUDIO))
195		return;
196
197	pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_ac97_pin_config));
198	pxa_set_ac97_info(NULL);
199	platform_device_register(&balloon3_ucb1400_device);
200}
201#else
202static inline void balloon3_ts_init(void) {}
203#endif
204
205/******************************************************************************
206 * Framebuffer
207 ******************************************************************************/
208#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
209static unsigned long balloon3_lcd_pin_config[] __initdata = {
210	GPIOxx_LCD_TFT_16BPP,
211	GPIO99_GPIO,
212};
213
214static struct pxafb_mode_info balloon3_lcd_modes[] = {
215	{
216		.pixclock		= 38000,
217		.xres			= 480,
218		.yres			= 640,
219		.bpp			= 16,
220		.hsync_len		= 8,
221		.left_margin		= 8,
222		.right_margin		= 8,
223		.vsync_len		= 2,
224		.upper_margin		= 4,
225		.lower_margin		= 5,
226		.sync			= 0,
227	},
228};
229
230static struct pxafb_mach_info balloon3_lcd_screen = {
231	.modes			= balloon3_lcd_modes,
232	.num_modes		= ARRAY_SIZE(balloon3_lcd_modes),
233	.lcd_conn		= LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
234};
235
236static void balloon3_backlight_power(int on)
237{
238	gpio_set_value(BALLOON3_GPIO_RUN_BACKLIGHT, on);
239}
240
241static void __init balloon3_lcd_init(void)
242{
243	int ret;
244
245	if (!balloon3_has(BALLOON3_FEATURE_TOPPOLY))
246		return;
247
248	pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_lcd_pin_config));
249
250	ret = gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT, "BKL-ON");
251	if (ret) {
252		pr_err("Requesting BKL-ON GPIO failed!\n");
253		goto err;
254	}
255
256	ret = gpio_direction_output(BALLOON3_GPIO_RUN_BACKLIGHT, 1);
257	if (ret) {
258		pr_err("Setting BKL-ON GPIO direction failed!\n");
259		goto err2;
260	}
261
262	balloon3_lcd_screen.pxafb_backlight_power = balloon3_backlight_power;
263	pxa_set_fb_info(NULL, &balloon3_lcd_screen);
264	return;
265
266err2:
267	gpio_free(BALLOON3_GPIO_RUN_BACKLIGHT);
268err:
269	return;
270}
271#else
272static inline void balloon3_lcd_init(void) {}
273#endif
274
275/******************************************************************************
276 * SD/MMC card controller
277 ******************************************************************************/
278#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
279static unsigned long balloon3_mmc_pin_config[] __initdata = {
280	GPIO32_MMC_CLK,
281	GPIO92_MMC_DAT_0,
282	GPIO109_MMC_DAT_1,
283	GPIO110_MMC_DAT_2,
284	GPIO111_MMC_DAT_3,
285	GPIO112_MMC_CMD,
286};
287
288static struct pxamci_platform_data balloon3_mci_platform_data = {
289	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34,
290	.detect_delay_ms	= 200,
291};
292
293static void __init balloon3_mmc_init(void)
294{
295	pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_mmc_pin_config));
296	pxa_set_mci_info(&balloon3_mci_platform_data);
297}
298#else
299static inline void balloon3_mmc_init(void) {}
300#endif
301
302/******************************************************************************
303 * USB Gadget
304 ******************************************************************************/
305#if defined(CONFIG_USB_PXA27X)||defined(CONFIG_USB_PXA27X_MODULE)
306static void balloon3_udc_command(int cmd)
307{
308	if (cmd == PXA2XX_UDC_CMD_CONNECT)
309		UP2OCR |= UP2OCR_DPPUE | UP2OCR_DPPUBE;
310	else if (cmd == PXA2XX_UDC_CMD_DISCONNECT)
311		UP2OCR &= ~UP2OCR_DPPUE;
312}
313
314static int balloon3_udc_is_connected(void)
315{
316	return 1;
317}
318
319static struct pxa2xx_udc_mach_info balloon3_udc_info __initdata = {
320	.udc_command		= balloon3_udc_command,
321	.udc_is_connected	= balloon3_udc_is_connected,
322	.gpio_pullup		= -1,
323};
324
325static void __init balloon3_udc_init(void)
326{
327	pxa_set_udc_info(&balloon3_udc_info);
328}
329#else
330static inline void balloon3_udc_init(void) {}
331#endif
332
333/******************************************************************************
334 * IrDA
335 ******************************************************************************/
336#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
337static struct pxaficp_platform_data balloon3_ficp_platform_data = {
338	.transceiver_cap	= IR_FIRMODE | IR_SIRMODE | IR_OFF,
339};
340
341static void __init balloon3_irda_init(void)
342{
343	pxa_set_ficp_info(&balloon3_ficp_platform_data);
344}
345#else
346static inline void balloon3_irda_init(void) {}
347#endif
348
349/******************************************************************************
350 * USB Host
351 ******************************************************************************/
352#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
353static unsigned long balloon3_uhc_pin_config[] __initdata = {
354	GPIO88_USBH1_PWR,
355	GPIO89_USBH1_PEN,
356};
357
358static struct pxaohci_platform_data balloon3_ohci_info = {
359	.port_mode	= PMM_PERPORT_MODE,
360	.flags		= ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
361};
362
363static void __init balloon3_uhc_init(void)
364{
365	if (!balloon3_has(BALLOON3_FEATURE_OHCI))
366		return;
367	pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_uhc_pin_config));
368	pxa_set_ohci_info(&balloon3_ohci_info);
369}
370#else
371static inline void balloon3_uhc_init(void) {}
372#endif
373
374/******************************************************************************
375 * LEDs
376 ******************************************************************************/
377#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
378static unsigned long balloon3_led_pin_config[] __initdata = {
379	GPIO9_GPIO,	/* NAND activity LED */
380	GPIO10_GPIO,	/* Heartbeat LED */
381};
382
383struct gpio_led balloon3_gpio_leds[] = {
384	{
385		.name			= "balloon3:green:idle",
386		.default_trigger	= "heartbeat",
387		.gpio			= BALLOON3_GPIO_LED_IDLE,
388		.active_low		= 1,
389	}, {
390		.name			= "balloon3:green:nand",
391		.default_trigger	= "nand-disk",
392		.gpio			= BALLOON3_GPIO_LED_NAND,
393		.active_low		= 1,
394	},
395};
396
397static struct gpio_led_platform_data balloon3_gpio_led_info = {
398	.leds		= balloon3_gpio_leds,
399	.num_leds	= ARRAY_SIZE(balloon3_gpio_leds),
400};
401
402static struct platform_device balloon3_leds = {
403	.name	= "leds-gpio",
404	.id	= 0,
405	.dev	= {
406		.platform_data	= &balloon3_gpio_led_info,
407	}
408};
409
410struct gpio_led balloon3_pcf_gpio_leds[] = {
411	{
412		.name			= "balloon3:green:led0",
413		.gpio			= BALLOON3_PCF_GPIO_LED0,
414		.active_low		= 1,
415	}, {
416		.name			= "balloon3:green:led1",
417		.gpio			= BALLOON3_PCF_GPIO_LED1,
418		.active_low		= 1,
419	}, {
420		.name			= "balloon3:orange:led2",
421		.gpio			= BALLOON3_PCF_GPIO_LED2,
422		.active_low		= 1,
423	}, {
424		.name			= "balloon3:orange:led3",
425		.gpio			= BALLOON3_PCF_GPIO_LED3,
426		.active_low		= 1,
427	}, {
428		.name			= "balloon3:orange:led4",
429		.gpio			= BALLOON3_PCF_GPIO_LED4,
430		.active_low		= 1,
431	}, {
432		.name			= "balloon3:orange:led5",
433		.gpio			= BALLOON3_PCF_GPIO_LED5,
434		.active_low		= 1,
435	}, {
436		.name			= "balloon3:red:led6",
437		.gpio			= BALLOON3_PCF_GPIO_LED6,
438		.active_low		= 1,
439	}, {
440		.name			= "balloon3:red:led7",
441		.gpio			= BALLOON3_PCF_GPIO_LED7,
442		.active_low		= 1,
443	},
444};
445
446static struct gpio_led_platform_data balloon3_pcf_gpio_led_info = {
447	.leds		= balloon3_pcf_gpio_leds,
448	.num_leds	= ARRAY_SIZE(balloon3_pcf_gpio_leds),
449};
450
451static struct platform_device balloon3_pcf_leds = {
452	.name	= "leds-gpio",
453	.id	= 1,
454	.dev	= {
455		.platform_data	= &balloon3_pcf_gpio_led_info,
456	}
457};
458
459static void __init balloon3_leds_init(void)
460{
461	pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_led_pin_config));
462	platform_device_register(&balloon3_leds);
463	platform_device_register(&balloon3_pcf_leds);
464}
465#else
466static inline void balloon3_leds_init(void) {}
467#endif
468
469/******************************************************************************
470 * FPGA IRQ
471 ******************************************************************************/
472static void balloon3_mask_irq(struct irq_data *d)
473{
474	int balloon3_irq = (d->irq - BALLOON3_IRQ(0));
475	balloon3_irq_enabled &= ~(1 << balloon3_irq);
476	__raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG);
477}
478
479static void balloon3_unmask_irq(struct irq_data *d)
480{
481	int balloon3_irq = (d->irq - BALLOON3_IRQ(0));
482	balloon3_irq_enabled |= (1 << balloon3_irq);
483	__raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG);
484}
485
486static struct irq_chip balloon3_irq_chip = {
487	.name		= "FPGA",
488	.irq_ack	= balloon3_mask_irq,
489	.irq_mask	= balloon3_mask_irq,
490	.irq_unmask	= balloon3_unmask_irq,
491};
492
493static void balloon3_irq_handler(struct irq_desc *desc)
494{
495	unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
496					balloon3_irq_enabled;
497	do {
498		struct irq_data *d = irq_desc_get_irq_data(desc);
499		struct irq_chip *chip = irq_desc_get_chip(desc);
500		unsigned int irq;
501
502		/* clear useless edge notification */
503		if (chip->irq_ack)
504			chip->irq_ack(d);
505
506		while (pending) {
507			irq = BALLOON3_IRQ(0) + __ffs(pending);
508			generic_handle_irq(irq);
509			pending &= pending - 1;
510		}
511		pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
512				balloon3_irq_enabled;
513	} while (pending);
514}
515
516static void __init balloon3_init_irq(void)
517{
518	int irq;
519
520	pxa27x_init_irq();
521	/* setup extra Balloon3 irqs */
522	for (irq = BALLOON3_IRQ(0); irq <= BALLOON3_IRQ(7); irq++) {
523		irq_set_chip_and_handler(irq, &balloon3_irq_chip,
524					 handle_level_irq);
525		irq_clear_status_flags(irq, IRQ_NOREQUEST | IRQ_NOPROBE);
526	}
527
528	irq_set_chained_handler(BALLOON3_AUX_NIRQ, balloon3_irq_handler);
529	irq_set_irq_type(BALLOON3_AUX_NIRQ, IRQ_TYPE_EDGE_FALLING);
530
531	pr_debug("%s: chained handler installed - irq %d automatically "
532		"enabled\n", __func__, BALLOON3_AUX_NIRQ);
533}
534
535/******************************************************************************
536 * GPIO expander
537 ******************************************************************************/
538#if defined(CONFIG_GPIO_PCF857X) || defined(CONFIG_GPIO_PCF857X_MODULE)
539static struct pcf857x_platform_data balloon3_pcf857x_pdata = {
540	.gpio_base	= BALLOON3_PCF_GPIO_BASE,
541	.n_latch	= 0,
542	.setup		= NULL,
543	.teardown	= NULL,
544	.context	= NULL,
545};
546
547static struct i2c_board_info __initdata balloon3_i2c_devs[] = {
548	{
549		I2C_BOARD_INFO("pcf8574a", 0x38),
550		.platform_data	= &balloon3_pcf857x_pdata,
551	},
552};
553
554static void __init balloon3_i2c_init(void)
555{
556	pxa_set_i2c_info(NULL);
557	i2c_register_board_info(0, ARRAY_AND_SIZE(balloon3_i2c_devs));
558}
559#else
560static inline void balloon3_i2c_init(void) {}
561#endif
562
563/******************************************************************************
564 * NAND
565 ******************************************************************************/
566#if defined(CONFIG_MTD_NAND_PLATFORM)||defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
567static void balloon3_nand_cmd_ctl(struct nand_chip *this, int cmd,
568				  unsigned int ctrl)
569{
570	uint8_t balloon3_ctl_set = 0, balloon3_ctl_clr = 0;
571
572	if (ctrl & NAND_CTRL_CHANGE) {
573		if (ctrl & NAND_CLE)
574			balloon3_ctl_set |= BALLOON3_NAND_CONTROL_FLCLE;
575		else
576			balloon3_ctl_clr |= BALLOON3_NAND_CONTROL_FLCLE;
577
578		if (ctrl & NAND_ALE)
579			balloon3_ctl_set |= BALLOON3_NAND_CONTROL_FLALE;
580		else
581			balloon3_ctl_clr |= BALLOON3_NAND_CONTROL_FLALE;
582
583		if (balloon3_ctl_clr)
584			__raw_writel(balloon3_ctl_clr,
585				BALLOON3_NAND_CONTROL_REG);
586		if (balloon3_ctl_set)
587			__raw_writel(balloon3_ctl_set,
588				BALLOON3_NAND_CONTROL_REG +
589				BALLOON3_FPGA_SETnCLR);
590	}
591
592	if (cmd != NAND_CMD_NONE)
593		writeb(cmd, this->legacy.IO_ADDR_W);
594}
595
596static void balloon3_nand_select_chip(struct nand_chip *this, int chip)
597{
598	if (chip < 0 || chip > 3)
599		return;
600
601	/* Assert all nCE lines */
602	__raw_writew(
603		BALLOON3_NAND_CONTROL_FLCE0 | BALLOON3_NAND_CONTROL_FLCE1 |
604		BALLOON3_NAND_CONTROL_FLCE2 | BALLOON3_NAND_CONTROL_FLCE3,
605		BALLOON3_NAND_CONTROL_REG + BALLOON3_FPGA_SETnCLR);
606
607	/* Deassert correct nCE line */
608	__raw_writew(BALLOON3_NAND_CONTROL_FLCE0 << chip,
609		BALLOON3_NAND_CONTROL_REG);
610}
611
612static int balloon3_nand_dev_ready(struct nand_chip *this)
613{
614	return __raw_readl(BALLOON3_NAND_STAT_REG) & BALLOON3_NAND_STAT_RNB;
615}
616
617static int balloon3_nand_probe(struct platform_device *pdev)
618{
619	uint16_t ver;
620	int ret;
621
622	__raw_writew(BALLOON3_NAND_CONTROL2_16BIT,
623		BALLOON3_NAND_CONTROL2_REG + BALLOON3_FPGA_SETnCLR);
624
625	ver = __raw_readw(BALLOON3_FPGA_VER);
626	if (ver < 0x4f08)
627		pr_warn("The FPGA code, version 0x%04x, is too old. "
628			"NAND support might be broken in this version!", ver);
629
630	/* Power up the NAND chips */
631	ret = gpio_request(BALLOON3_GPIO_RUN_NAND, "NAND");
632	if (ret)
633		goto err1;
634
635	ret = gpio_direction_output(BALLOON3_GPIO_RUN_NAND, 1);
636	if (ret)
637		goto err2;
638
639	gpio_set_value(BALLOON3_GPIO_RUN_NAND, 1);
640
641	/* Deassert all nCE lines and write protect line */
642	__raw_writel(
643		BALLOON3_NAND_CONTROL_FLCE0 | BALLOON3_NAND_CONTROL_FLCE1 |
644		BALLOON3_NAND_CONTROL_FLCE2 | BALLOON3_NAND_CONTROL_FLCE3 |
645		BALLOON3_NAND_CONTROL_FLWP,
646		BALLOON3_NAND_CONTROL_REG + BALLOON3_FPGA_SETnCLR);
647	return 0;
648
649err2:
650	gpio_free(BALLOON3_GPIO_RUN_NAND);
651err1:
652	return ret;
653}
654
655static void balloon3_nand_remove(struct platform_device *pdev)
656{
657	/* Power down the NAND chips */
658	gpio_set_value(BALLOON3_GPIO_RUN_NAND, 0);
659	gpio_free(BALLOON3_GPIO_RUN_NAND);
660}
661
662static struct mtd_partition balloon3_partition_info[] = {
663	[0] = {
664		.name	= "Boot",
665		.offset	= 0,
666		.size	= SZ_4M,
667	},
668	[1] = {
669		.name	= "RootFS",
670		.offset	= MTDPART_OFS_APPEND,
671		.size	= MTDPART_SIZ_FULL
672	},
673};
674
675struct platform_nand_data balloon3_nand_pdata = {
676	.chip = {
677		.nr_chips	= 4,
678		.chip_offset	= 0,
679		.nr_partitions	= ARRAY_SIZE(balloon3_partition_info),
680		.partitions	= balloon3_partition_info,
681		.chip_delay	= 50,
682	},
683	.ctrl = {
684		.dev_ready	= balloon3_nand_dev_ready,
685		.select_chip	= balloon3_nand_select_chip,
686		.cmd_ctrl	= balloon3_nand_cmd_ctl,
687		.probe		= balloon3_nand_probe,
688		.remove		= balloon3_nand_remove,
689	},
690};
691
692static struct resource balloon3_nand_resource[] = {
693	[0] = {
694		.start = BALLOON3_NAND_BASE,
695		.end   = BALLOON3_NAND_BASE + 0x4,
696		.flags = IORESOURCE_MEM,
697	},
698};
699
700static struct platform_device balloon3_nand = {
701	.name		= "gen_nand",
702	.num_resources	= ARRAY_SIZE(balloon3_nand_resource),
703	.resource	= balloon3_nand_resource,
704	.id		= -1,
705	.dev		= {
706		.platform_data = &balloon3_nand_pdata,
707	}
708};
709
710static void __init balloon3_nand_init(void)
711{
712	platform_device_register(&balloon3_nand);
713}
714#else
715static inline void balloon3_nand_init(void) {}
716#endif
717
718/******************************************************************************
719 * Core power regulator
720 ******************************************************************************/
721#if defined(CONFIG_REGULATOR_MAX1586) || \
722    defined(CONFIG_REGULATOR_MAX1586_MODULE)
723static struct regulator_consumer_supply balloon3_max1587a_consumers[] = {
724	REGULATOR_SUPPLY("vcc_core", NULL),
725};
726
727static struct regulator_init_data balloon3_max1587a_v3_info = {
728	.constraints = {
729		.name		= "vcc_core range",
730		.min_uV		= 900000,
731		.max_uV		= 1705000,
732		.always_on	= 1,
733		.valid_ops_mask	= REGULATOR_CHANGE_VOLTAGE,
734	},
735	.consumer_supplies	= balloon3_max1587a_consumers,
736	.num_consumer_supplies	= ARRAY_SIZE(balloon3_max1587a_consumers),
737};
738
739static struct max1586_subdev_data balloon3_max1587a_subdevs[] = {
740	{
741		.name		= "vcc_core",
742		.id		= MAX1586_V3,
743		.platform_data	= &balloon3_max1587a_v3_info,
744	}
745};
746
747static struct max1586_platform_data balloon3_max1587a_info = {
748	.subdevs     = balloon3_max1587a_subdevs,
749	.num_subdevs = ARRAY_SIZE(balloon3_max1587a_subdevs),
750	.v3_gain     = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
751};
752
753static struct i2c_board_info __initdata balloon3_pi2c_board_info[] = {
754	{
755		I2C_BOARD_INFO("max1586", 0x14),
756		.platform_data	= &balloon3_max1587a_info,
757	},
758};
759
760static void __init balloon3_pmic_init(void)
761{
762	pxa27x_set_i2c_power_info(NULL);
763	i2c_register_board_info(1, ARRAY_AND_SIZE(balloon3_pi2c_board_info));
764}
765#else
766static inline void balloon3_pmic_init(void) {}
767#endif
768
769/******************************************************************************
770 * Machine init
771 ******************************************************************************/
772static void __init balloon3_init(void)
773{
774	ARB_CNTRL = ARB_CORE_PARK | 0x234;
775
776	pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
777
778	pxa_set_ffuart_info(NULL);
779	pxa_set_btuart_info(NULL);
780	pxa_set_stuart_info(NULL);
781
782	balloon3_i2c_init();
783	balloon3_irda_init();
784	balloon3_lcd_init();
785	balloon3_leds_init();
786	balloon3_mmc_init();
787	balloon3_nand_init();
788	balloon3_nor_init();
789	balloon3_pmic_init();
790	balloon3_ts_init();
791	balloon3_udc_init();
792	balloon3_uhc_init();
793	balloon3_cf_init();
794}
795
796static struct map_desc balloon3_io_desc[] __initdata = {
797	{	/* CPLD/FPGA */
798		.virtual	= (unsigned long)BALLOON3_FPGA_VIRT,
799		.pfn		= __phys_to_pfn(BALLOON3_FPGA_PHYS),
800		.length		= BALLOON3_FPGA_LENGTH,
801		.type		= MT_DEVICE,
802	},
803};
804
805static void __init balloon3_map_io(void)
806{
807	pxa27x_map_io();
808	iotable_init(balloon3_io_desc, ARRAY_SIZE(balloon3_io_desc));
809}
810
811MACHINE_START(BALLOON3, "Balloon3")
812	/* Maintainer: Nick Bane. */
813	.map_io		= balloon3_map_io,
814	.nr_irqs	= BALLOON3_NR_IRQS,
815	.init_irq	= balloon3_init_irq,
816	.handle_irq	= pxa27x_handle_irq,
817	.init_time	= pxa_timer_init,
818	.init_machine	= balloon3_init,
819	.atag_offset	= 0x100,
820	.restart	= pxa_restart,
821MACHINE_END
822