1 /*
2  * Hardware definitions for the Toshiba eseries PDAs
3  *
4  * Copyright (c) 2003 Ian Molton <spyro@f2s.com>
5  *
6  * This file is licensed under
7  * the terms of the GNU General Public License version 2. This program
8  * is licensed "as is" without any warranty of any kind, whether express
9  * or implied.
10  *
11  */
12 
13 #include <linux/kernel.h>
14 #include <linux/init.h>
15 #include <linux/gpio.h>
16 #include <linux/delay.h>
17 #include <linux/platform_device.h>
18 #include <linux/mfd/tc6387xb.h>
19 #include <linux/mfd/tc6393xb.h>
20 #include <linux/mfd/t7l66xb.h>
21 #include <linux/mtd/nand.h>
22 #include <linux/mtd/partitions.h>
23 #include <linux/usb/gpio_vbus.h>
24 
25 #include <video/w100fb.h>
26 
27 #include <asm/setup.h>
28 #include <asm/mach/arch.h>
29 #include <asm/mach-types.h>
30 
31 #include <mach/pxa25x.h>
32 #include <mach/eseries-gpio.h>
33 #include <mach/eseries-irq.h>
34 #include <mach/audio.h>
35 #include <mach/pxafb.h>
36 #include <mach/udc.h>
37 #include <mach/irda.h>
38 
39 #include "devices.h"
40 #include "generic.h"
41 #include "clock.h"
42 
43 /* Only e800 has 128MB RAM */
eseries_fixup(struct tag * tags,char ** cmdline,struct meminfo * mi)44 void __init eseries_fixup(struct tag *tags, char **cmdline, struct meminfo *mi)
45 {
46 	mi->nr_banks=1;
47 	mi->bank[0].start = 0xa0000000;
48 	if (machine_is_e800())
49 		mi->bank[0].size = (128*1024*1024);
50 	else
51 		mi->bank[0].size = (64*1024*1024);
52 }
53 
54 struct gpio_vbus_mach_info e7xx_udc_info = {
55 	.gpio_vbus   = GPIO_E7XX_USB_DISC,
56 	.gpio_pullup = GPIO_E7XX_USB_PULLUP,
57 	.gpio_pullup_inverted = 1
58 };
59 
60 static struct platform_device e7xx_gpio_vbus = {
61 	.name	= "gpio-vbus",
62 	.id	= -1,
63 	.dev	= {
64 		.platform_data	= &e7xx_udc_info,
65 	},
66 };
67 
68 struct pxaficp_platform_data e7xx_ficp_platform_data = {
69 	.gpio_pwdown		= GPIO_E7XX_IR_OFF,
70 	.transceiver_cap	= IR_SIRMODE | IR_OFF,
71 };
72 
eseries_tmio_enable(struct platform_device * dev)73 int eseries_tmio_enable(struct platform_device *dev)
74 {
75 	/* Reset - bring SUSPEND high before PCLR */
76 	gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0);
77 	gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 0);
78 	msleep(1);
79 	gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 1);
80 	msleep(1);
81 	gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 1);
82 	msleep(1);
83 	return 0;
84 }
85 
eseries_tmio_disable(struct platform_device * dev)86 int eseries_tmio_disable(struct platform_device *dev)
87 {
88 	gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0);
89 	gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 0);
90 	return 0;
91 }
92 
eseries_tmio_suspend(struct platform_device * dev)93 int eseries_tmio_suspend(struct platform_device *dev)
94 {
95 	gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0);
96 	return 0;
97 }
98 
eseries_tmio_resume(struct platform_device * dev)99 int eseries_tmio_resume(struct platform_device *dev)
100 {
101 	gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 1);
102 	msleep(1);
103 	return 0;
104 }
105 
eseries_get_tmio_gpios(void)106 void eseries_get_tmio_gpios(void)
107 {
108 	gpio_request(GPIO_ESERIES_TMIO_SUSPEND, NULL);
109 	gpio_request(GPIO_ESERIES_TMIO_PCLR, NULL);
110 	gpio_direction_output(GPIO_ESERIES_TMIO_SUSPEND, 0);
111 	gpio_direction_output(GPIO_ESERIES_TMIO_PCLR, 0);
112 }
113 
114 /* TMIO controller uses the same resources on all e-series machines. */
115 struct resource eseries_tmio_resources[] = {
116 	[0] = {
117 		.start  = PXA_CS4_PHYS,
118 		.end    = PXA_CS4_PHYS + 0x1fffff,
119 		.flags  = IORESOURCE_MEM,
120 	},
121 	[1] = {
122 		.start  = PXA_GPIO_TO_IRQ(GPIO_ESERIES_TMIO_IRQ),
123 		.end    = PXA_GPIO_TO_IRQ(GPIO_ESERIES_TMIO_IRQ),
124 		.flags  = IORESOURCE_IRQ,
125 	},
126 };
127 
128 /* Some e-series hardware cannot control the 32K clock */
clk_32k_dummy(struct clk * clk)129 static void clk_32k_dummy(struct clk *clk)
130 {
131 }
132 
133 static const struct clkops clk_32k_dummy_ops = {
134 	.enable         = clk_32k_dummy,
135 	.disable        = clk_32k_dummy,
136 };
137 
138 static struct clk tmio_dummy_clk = {
139 	.ops	= &clk_32k_dummy_ops,
140 	.rate	= 32768,
141 };
142 
143 static struct clk_lookup eseries_clkregs[] = {
144 	INIT_CLKREG(&tmio_dummy_clk, NULL, "CLK_CK32K"),
145 };
146 
eseries_register_clks(void)147 static void __init eseries_register_clks(void)
148 {
149 	clkdev_add_table(eseries_clkregs, ARRAY_SIZE(eseries_clkregs));
150 }
151 
152 #ifdef CONFIG_MACH_E330
153 /* -------------------- e330 tc6387xb parameters -------------------- */
154 
155 static struct tc6387xb_platform_data e330_tc6387xb_info = {
156 	.enable   = &eseries_tmio_enable,
157 	.disable  = &eseries_tmio_disable,
158 	.suspend  = &eseries_tmio_suspend,
159 	.resume   = &eseries_tmio_resume,
160 };
161 
162 static struct platform_device e330_tc6387xb_device = {
163 	.name           = "tc6387xb",
164 	.id             = -1,
165 	.dev            = {
166 		.platform_data = &e330_tc6387xb_info,
167 	},
168 	.num_resources = 2,
169 	.resource      = eseries_tmio_resources,
170 };
171 
172 /* --------------------------------------------------------------- */
173 
174 static struct platform_device *e330_devices[] __initdata = {
175 	&e330_tc6387xb_device,
176 	&e7xx_gpio_vbus,
177 };
178 
e330_init(void)179 static void __init e330_init(void)
180 {
181 	pxa_set_ffuart_info(NULL);
182 	pxa_set_btuart_info(NULL);
183 	pxa_set_stuart_info(NULL);
184 	eseries_register_clks();
185 	eseries_get_tmio_gpios();
186 	platform_add_devices(ARRAY_AND_SIZE(e330_devices));
187 }
188 
189 MACHINE_START(E330, "Toshiba e330")
190 	/* Maintainer: Ian Molton (spyro@f2s.com) */
191 	.atag_offset	= 0x100,
192 	.map_io		= pxa25x_map_io,
193 	.nr_irqs	= ESERIES_NR_IRQS,
194 	.init_irq	= pxa25x_init_irq,
195 	.handle_irq	= pxa25x_handle_irq,
196 	.fixup		= eseries_fixup,
197 	.init_machine	= e330_init,
198 	.timer		= &pxa_timer,
199 	.restart	= pxa_restart,
200 MACHINE_END
201 #endif
202 
203 #ifdef CONFIG_MACH_E350
204 /* -------------------- e350 t7l66xb parameters -------------------- */
205 
206 static struct t7l66xb_platform_data e350_t7l66xb_info = {
207 	.irq_base               = IRQ_BOARD_START,
208 	.enable                 = &eseries_tmio_enable,
209 	.suspend                = &eseries_tmio_suspend,
210 	.resume                 = &eseries_tmio_resume,
211 };
212 
213 static struct platform_device e350_t7l66xb_device = {
214 	.name           = "t7l66xb",
215 	.id             = -1,
216 	.dev            = {
217 		.platform_data = &e350_t7l66xb_info,
218 	},
219 	.num_resources = 2,
220 	.resource      = eseries_tmio_resources,
221 };
222 
223 /* ---------------------------------------------------------- */
224 
225 static struct platform_device *e350_devices[] __initdata = {
226 	&e350_t7l66xb_device,
227 	&e7xx_gpio_vbus,
228 };
229 
e350_init(void)230 static void __init e350_init(void)
231 {
232 	pxa_set_ffuart_info(NULL);
233 	pxa_set_btuart_info(NULL);
234 	pxa_set_stuart_info(NULL);
235 	eseries_register_clks();
236 	eseries_get_tmio_gpios();
237 	platform_add_devices(ARRAY_AND_SIZE(e350_devices));
238 }
239 
240 MACHINE_START(E350, "Toshiba e350")
241 	/* Maintainer: Ian Molton (spyro@f2s.com) */
242 	.atag_offset	= 0x100,
243 	.map_io		= pxa25x_map_io,
244 	.nr_irqs	= ESERIES_NR_IRQS,
245 	.init_irq	= pxa25x_init_irq,
246 	.handle_irq	= pxa25x_handle_irq,
247 	.fixup		= eseries_fixup,
248 	.init_machine	= e350_init,
249 	.timer		= &pxa_timer,
250 	.restart	= pxa_restart,
251 MACHINE_END
252 #endif
253 
254 #ifdef CONFIG_MACH_E400
255 /* ------------------------ E400 LCD definitions ------------------------ */
256 
257 static struct pxafb_mode_info e400_pxafb_mode_info = {
258 	.pixclock       = 140703,
259 	.xres           = 240,
260 	.yres           = 320,
261 	.bpp            = 16,
262 	.hsync_len      = 4,
263 	.left_margin    = 28,
264 	.right_margin   = 8,
265 	.vsync_len      = 3,
266 	.upper_margin   = 5,
267 	.lower_margin   = 6,
268 	.sync           = 0,
269 };
270 
271 static struct pxafb_mach_info e400_pxafb_mach_info = {
272 	.modes          = &e400_pxafb_mode_info,
273 	.num_modes      = 1,
274 	.lcd_conn	= LCD_COLOR_TFT_16BPP,
275 	.lccr3          = 0,
276 	.pxafb_backlight_power  = NULL,
277 };
278 
279 /* ------------------------ E400 MFP config ----------------------------- */
280 
281 static unsigned long e400_pin_config[] __initdata = {
282 	/* Chip selects */
283 	GPIO15_nCS_1,   /* CS1 - Flash */
284 	GPIO80_nCS_4,   /* CS4 - TMIO */
285 
286 	/* Clocks */
287 	GPIO12_32KHz,
288 
289 	/* BTUART */
290 	GPIO42_BTUART_RXD,
291 	GPIO43_BTUART_TXD,
292 	GPIO44_BTUART_CTS,
293 
294 	/* TMIO controller */
295 	GPIO19_GPIO, /* t7l66xb #PCLR */
296 	GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
297 
298 	/* wakeup */
299 	GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
300 };
301 
302 /* ---------------------------------------------------------------------- */
303 
304 static struct mtd_partition partition_a = {
305 	.name = "Internal NAND flash",
306 	.offset =  0,
307 	.size =  MTDPART_SIZ_FULL,
308 };
309 
310 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
311 
312 static struct nand_bbt_descr e400_t7l66xb_nand_bbt = {
313 	.options = 0,
314 	.offs = 4,
315 	.len = 2,
316 	.pattern = scan_ff_pattern
317 };
318 
319 static struct tmio_nand_data e400_t7l66xb_nand_config = {
320 	.num_partitions = 1,
321 	.partition = &partition_a,
322 	.badblock_pattern = &e400_t7l66xb_nand_bbt,
323 };
324 
325 static struct t7l66xb_platform_data e400_t7l66xb_info = {
326 	.irq_base 		= IRQ_BOARD_START,
327 	.enable                 = &eseries_tmio_enable,
328 	.suspend                = &eseries_tmio_suspend,
329 	.resume                 = &eseries_tmio_resume,
330 
331 	.nand_data              = &e400_t7l66xb_nand_config,
332 };
333 
334 static struct platform_device e400_t7l66xb_device = {
335 	.name           = "t7l66xb",
336 	.id             = -1,
337 	.dev            = {
338 		.platform_data = &e400_t7l66xb_info,
339 	},
340 	.num_resources = 2,
341 	.resource      = eseries_tmio_resources,
342 };
343 
344 /* ---------------------------------------------------------- */
345 
346 static struct platform_device *e400_devices[] __initdata = {
347 	&e400_t7l66xb_device,
348 	&e7xx_gpio_vbus,
349 };
350 
e400_init(void)351 static void __init e400_init(void)
352 {
353 	pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
354 	pxa_set_ffuart_info(NULL);
355 	pxa_set_btuart_info(NULL);
356 	pxa_set_stuart_info(NULL);
357 	/* Fixme - e400 may have a switched clock */
358 	eseries_register_clks();
359 	eseries_get_tmio_gpios();
360 	pxa_set_fb_info(NULL, &e400_pxafb_mach_info);
361 	platform_add_devices(ARRAY_AND_SIZE(e400_devices));
362 }
363 
364 MACHINE_START(E400, "Toshiba e400")
365 	/* Maintainer: Ian Molton (spyro@f2s.com) */
366 	.atag_offset	= 0x100,
367 	.map_io		= pxa25x_map_io,
368 	.nr_irqs	= ESERIES_NR_IRQS,
369 	.init_irq	= pxa25x_init_irq,
370 	.handle_irq	= pxa25x_handle_irq,
371 	.fixup		= eseries_fixup,
372 	.init_machine	= e400_init,
373 	.timer		= &pxa_timer,
374 	.restart	= pxa_restart,
375 MACHINE_END
376 #endif
377 
378 #ifdef CONFIG_MACH_E740
379 /* ------------------------ e740 video support --------------------------- */
380 
381 static struct w100_gen_regs e740_lcd_regs = {
382 	.lcd_format =            0x00008023,
383 	.lcdd_cntl1 =            0x0f000000,
384 	.lcdd_cntl2 =            0x0003ffff,
385 	.genlcd_cntl1 =          0x00ffff03,
386 	.genlcd_cntl2 =          0x003c0f03,
387 	.genlcd_cntl3 =          0x000143aa,
388 };
389 
390 static struct w100_mode e740_lcd_mode = {
391 	.xres            = 240,
392 	.yres            = 320,
393 	.left_margin     = 20,
394 	.right_margin    = 28,
395 	.upper_margin    = 9,
396 	.lower_margin    = 8,
397 	.crtc_ss         = 0x80140013,
398 	.crtc_ls         = 0x81150110,
399 	.crtc_gs         = 0x80050005,
400 	.crtc_vpos_gs    = 0x000a0009,
401 	.crtc_rev        = 0x0040010a,
402 	.crtc_dclk       = 0xa906000a,
403 	.crtc_gclk       = 0x80050108,
404 	.crtc_goe        = 0x80050108,
405 	.pll_freq        = 57,
406 	.pixclk_divider         = 4,
407 	.pixclk_divider_rotated = 4,
408 	.pixclk_src     = CLK_SRC_XTAL,
409 	.sysclk_divider  = 1,
410 	.sysclk_src     = CLK_SRC_PLL,
411 	.crtc_ps1_active =       0x41060010,
412 };
413 
414 static struct w100_gpio_regs e740_w100_gpio_info = {
415 	.init_data1 = 0x21002103,
416 	.gpio_dir1  = 0xffffdeff,
417 	.gpio_oe1   = 0x03c00643,
418 	.init_data2 = 0x003f003f,
419 	.gpio_dir2  = 0xffffffff,
420 	.gpio_oe2   = 0x000000ff,
421 };
422 
423 static struct w100fb_mach_info e740_fb_info = {
424 	.modelist   = &e740_lcd_mode,
425 	.num_modes  = 1,
426 	.regs       = &e740_lcd_regs,
427 	.gpio       = &e740_w100_gpio_info,
428 	.xtal_freq = 14318000,
429 	.xtal_dbl   = 1,
430 };
431 
432 static struct resource e740_fb_resources[] = {
433 	[0] = {
434 		.start          = 0x0c000000,
435 		.end            = 0x0cffffff,
436 		.flags          = IORESOURCE_MEM,
437 	},
438 };
439 
440 static struct platform_device e740_fb_device = {
441 	.name           = "w100fb",
442 	.id             = -1,
443 	.dev            = {
444 		.platform_data  = &e740_fb_info,
445 	},
446 	.num_resources  = ARRAY_SIZE(e740_fb_resources),
447 	.resource       = e740_fb_resources,
448 };
449 
450 /* --------------------------- MFP Pin config -------------------------- */
451 
452 static unsigned long e740_pin_config[] __initdata = {
453 	/* Chip selects */
454 	GPIO15_nCS_1,   /* CS1 - Flash */
455 	GPIO79_nCS_3,   /* CS3 - IMAGEON */
456 	GPIO80_nCS_4,   /* CS4 - TMIO */
457 
458 	/* Clocks */
459 	GPIO12_32KHz,
460 
461 	/* BTUART */
462 	GPIO42_BTUART_RXD,
463 	GPIO43_BTUART_TXD,
464 	GPIO44_BTUART_CTS,
465 
466 	/* TMIO controller */
467 	GPIO19_GPIO, /* t7l66xb #PCLR */
468 	GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
469 
470 	/* UDC */
471 	GPIO13_GPIO,
472 	GPIO3_GPIO,
473 
474 	/* IrDA */
475 	GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
476 
477 	/* AC97 */
478 	GPIO28_AC97_BITCLK,
479 	GPIO29_AC97_SDATA_IN_0,
480 	GPIO30_AC97_SDATA_OUT,
481 	GPIO31_AC97_SYNC,
482 
483 	/* Audio power control */
484 	GPIO16_GPIO,  /* AC97 codec AVDD2 supply (analogue power) */
485 	GPIO40_GPIO,  /* Mic amp power */
486 	GPIO41_GPIO,  /* Headphone amp power */
487 
488 	/* PC Card */
489 	GPIO8_GPIO,   /* CD0 */
490 	GPIO44_GPIO,  /* CD1 */
491 	GPIO11_GPIO,  /* IRQ0 */
492 	GPIO6_GPIO,   /* IRQ1 */
493 	GPIO27_GPIO,  /* RST0 */
494 	GPIO24_GPIO,  /* RST1 */
495 	GPIO20_GPIO,  /* PWR0 */
496 	GPIO23_GPIO,  /* PWR1 */
497 	GPIO48_nPOE,
498 	GPIO49_nPWE,
499 	GPIO50_nPIOR,
500 	GPIO51_nPIOW,
501 	GPIO52_nPCE_1,
502 	GPIO53_nPCE_2,
503 	GPIO54_nPSKTSEL,
504 	GPIO55_nPREG,
505 	GPIO56_nPWAIT,
506 	GPIO57_nIOIS16,
507 
508 	/* wakeup */
509 	GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
510 };
511 
512 /* -------------------- e740 t7l66xb parameters -------------------- */
513 
514 static struct t7l66xb_platform_data e740_t7l66xb_info = {
515 	.irq_base 		= IRQ_BOARD_START,
516 	.enable                 = &eseries_tmio_enable,
517 	.suspend                = &eseries_tmio_suspend,
518 	.resume                 = &eseries_tmio_resume,
519 };
520 
521 static struct platform_device e740_t7l66xb_device = {
522 	.name           = "t7l66xb",
523 	.id             = -1,
524 	.dev            = {
525 		.platform_data = &e740_t7l66xb_info,
526 	},
527 	.num_resources = 2,
528 	.resource      = eseries_tmio_resources,
529 };
530 
531 static struct platform_device e740_audio_device = {
532 	.name		= "e740-audio",
533 	.id		= -1,
534 };
535 
536 /* ----------------------------------------------------------------------- */
537 
538 static struct platform_device *e740_devices[] __initdata = {
539 	&e740_fb_device,
540 	&e740_t7l66xb_device,
541 	&e7xx_gpio_vbus,
542 	&e740_audio_device,
543 };
544 
e740_init(void)545 static void __init e740_init(void)
546 {
547 	pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
548 	pxa_set_ffuart_info(NULL);
549 	pxa_set_btuart_info(NULL);
550 	pxa_set_stuart_info(NULL);
551 	eseries_register_clks();
552 	clk_add_alias("CLK_CK48M", e740_t7l66xb_device.name,
553 			"UDCCLK", &pxa25x_device_udc.dev),
554 	eseries_get_tmio_gpios();
555 	platform_add_devices(ARRAY_AND_SIZE(e740_devices));
556 	pxa_set_ac97_info(NULL);
557 	pxa_set_ficp_info(&e7xx_ficp_platform_data);
558 }
559 
560 MACHINE_START(E740, "Toshiba e740")
561 	/* Maintainer: Ian Molton (spyro@f2s.com) */
562 	.atag_offset	= 0x100,
563 	.map_io		= pxa25x_map_io,
564 	.nr_irqs	= ESERIES_NR_IRQS,
565 	.init_irq	= pxa25x_init_irq,
566 	.handle_irq	= pxa25x_handle_irq,
567 	.fixup		= eseries_fixup,
568 	.init_machine	= e740_init,
569 	.timer		= &pxa_timer,
570 	.restart	= pxa_restart,
571 MACHINE_END
572 #endif
573 
574 #ifdef CONFIG_MACH_E750
575 /* ---------------------- E750 LCD definitions -------------------- */
576 
577 static struct w100_gen_regs e750_lcd_regs = {
578 	.lcd_format =            0x00008003,
579 	.lcdd_cntl1 =            0x00000000,
580 	.lcdd_cntl2 =            0x0003ffff,
581 	.genlcd_cntl1 =          0x00fff003,
582 	.genlcd_cntl2 =          0x003c0f03,
583 	.genlcd_cntl3 =          0x000143aa,
584 };
585 
586 static struct w100_mode e750_lcd_mode = {
587 	.xres            = 240,
588 	.yres            = 320,
589 	.left_margin     = 21,
590 	.right_margin    = 22,
591 	.upper_margin    = 5,
592 	.lower_margin    = 4,
593 	.crtc_ss         = 0x80150014,
594 	.crtc_ls         = 0x8014000d,
595 	.crtc_gs         = 0xc1000005,
596 	.crtc_vpos_gs    = 0x00020147,
597 	.crtc_rev        = 0x0040010a,
598 	.crtc_dclk       = 0xa1700030,
599 	.crtc_gclk       = 0x80cc0015,
600 	.crtc_goe        = 0x80cc0015,
601 	.crtc_ps1_active = 0x61060017,
602 	.pll_freq        = 57,
603 	.pixclk_divider         = 4,
604 	.pixclk_divider_rotated = 4,
605 	.pixclk_src     = CLK_SRC_XTAL,
606 	.sysclk_divider  = 1,
607 	.sysclk_src     = CLK_SRC_PLL,
608 };
609 
610 static struct w100_gpio_regs e750_w100_gpio_info = {
611 	.init_data1 = 0x01192f1b,
612 	.gpio_dir1  = 0xd5ffdeff,
613 	.gpio_oe1   = 0x000020bf,
614 	.init_data2 = 0x010f010f,
615 	.gpio_dir2  = 0xffffffff,
616 	.gpio_oe2   = 0x000001cf,
617 };
618 
619 static struct w100fb_mach_info e750_fb_info = {
620 	.modelist   = &e750_lcd_mode,
621 	.num_modes  = 1,
622 	.regs       = &e750_lcd_regs,
623 	.gpio       = &e750_w100_gpio_info,
624 	.xtal_freq  = 14318000,
625 	.xtal_dbl   = 1,
626 };
627 
628 static struct resource e750_fb_resources[] = {
629 	[0] = {
630 		.start          = 0x0c000000,
631 		.end            = 0x0cffffff,
632 		.flags          = IORESOURCE_MEM,
633 	},
634 };
635 
636 static struct platform_device e750_fb_device = {
637 	.name           = "w100fb",
638 	.id             = -1,
639 	.dev            = {
640 		.platform_data  = &e750_fb_info,
641 	},
642 	.num_resources  = ARRAY_SIZE(e750_fb_resources),
643 	.resource       = e750_fb_resources,
644 };
645 
646 /* -------------------- e750 MFP parameters -------------------- */
647 
648 static unsigned long e750_pin_config[] __initdata = {
649 	/* Chip selects */
650 	GPIO15_nCS_1,   /* CS1 - Flash */
651 	GPIO79_nCS_3,   /* CS3 - IMAGEON */
652 	GPIO80_nCS_4,   /* CS4 - TMIO */
653 
654 	/* Clocks */
655 	GPIO11_3_6MHz,
656 
657 	/* BTUART */
658 	GPIO42_BTUART_RXD,
659 	GPIO43_BTUART_TXD,
660 	GPIO44_BTUART_CTS,
661 
662 	/* TMIO controller */
663 	GPIO19_GPIO, /* t7l66xb #PCLR */
664 	GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
665 
666 	/* UDC */
667 	GPIO13_GPIO,
668 	GPIO3_GPIO,
669 
670 	/* IrDA */
671 	GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
672 
673 	/* AC97 */
674 	GPIO28_AC97_BITCLK,
675 	GPIO29_AC97_SDATA_IN_0,
676 	GPIO30_AC97_SDATA_OUT,
677 	GPIO31_AC97_SYNC,
678 
679 	/* Audio power control */
680 	GPIO4_GPIO,  /* Headphone amp power */
681 	GPIO7_GPIO,  /* Speaker amp power */
682 	GPIO37_GPIO, /* Headphone detect */
683 
684 	/* PC Card */
685 	GPIO8_GPIO,   /* CD0 */
686 	GPIO44_GPIO,  /* CD1 */
687 	GPIO11_GPIO,  /* IRQ0 */
688 	GPIO6_GPIO,   /* IRQ1 */
689 	GPIO27_GPIO,  /* RST0 */
690 	GPIO24_GPIO,  /* RST1 */
691 	GPIO20_GPIO,  /* PWR0 */
692 	GPIO23_GPIO,  /* PWR1 */
693 	GPIO48_nPOE,
694 	GPIO49_nPWE,
695 	GPIO50_nPIOR,
696 	GPIO51_nPIOW,
697 	GPIO52_nPCE_1,
698 	GPIO53_nPCE_2,
699 	GPIO54_nPSKTSEL,
700 	GPIO55_nPREG,
701 	GPIO56_nPWAIT,
702 	GPIO57_nIOIS16,
703 
704 	/* wakeup */
705 	GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
706 };
707 
708 /* ----------------- e750 tc6393xb parameters ------------------ */
709 
710 static struct tc6393xb_platform_data e750_tc6393xb_info = {
711 	.irq_base       = IRQ_BOARD_START,
712 	.scr_pll2cr     = 0x0cc1,
713 	.scr_gper       = 0,
714 	.gpio_base      = -1,
715 	.suspend        = &eseries_tmio_suspend,
716 	.resume         = &eseries_tmio_resume,
717 	.enable         = &eseries_tmio_enable,
718 	.disable        = &eseries_tmio_disable,
719 };
720 
721 static struct platform_device e750_tc6393xb_device = {
722 	.name           = "tc6393xb",
723 	.id             = -1,
724 	.dev            = {
725 		.platform_data = &e750_tc6393xb_info,
726 	},
727 	.num_resources = 2,
728 	.resource      = eseries_tmio_resources,
729 };
730 
731 static struct platform_device e750_audio_device = {
732 	.name		= "e750-audio",
733 	.id		= -1,
734 };
735 
736 /* ------------------------------------------------------------- */
737 
738 static struct platform_device *e750_devices[] __initdata = {
739 	&e750_fb_device,
740 	&e750_tc6393xb_device,
741 	&e7xx_gpio_vbus,
742 	&e750_audio_device,
743 };
744 
e750_init(void)745 static void __init e750_init(void)
746 {
747 	pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config));
748 	pxa_set_ffuart_info(NULL);
749 	pxa_set_btuart_info(NULL);
750 	pxa_set_stuart_info(NULL);
751 	clk_add_alias("CLK_CK3P6MI", e750_tc6393xb_device.name,
752 			"GPIO11_CLK", NULL),
753 	eseries_get_tmio_gpios();
754 	platform_add_devices(ARRAY_AND_SIZE(e750_devices));
755 	pxa_set_ac97_info(NULL);
756 	pxa_set_ficp_info(&e7xx_ficp_platform_data);
757 }
758 
759 MACHINE_START(E750, "Toshiba e750")
760 	/* Maintainer: Ian Molton (spyro@f2s.com) */
761 	.atag_offset	= 0x100,
762 	.map_io		= pxa25x_map_io,
763 	.nr_irqs	= ESERIES_NR_IRQS,
764 	.init_irq	= pxa25x_init_irq,
765 	.handle_irq	= pxa25x_handle_irq,
766 	.fixup		= eseries_fixup,
767 	.init_machine	= e750_init,
768 	.timer		= &pxa_timer,
769 	.restart	= pxa_restart,
770 MACHINE_END
771 #endif
772 
773 #ifdef CONFIG_MACH_E800
774 /* ------------------------ e800 LCD definitions ------------------------- */
775 
776 static unsigned long e800_pin_config[] __initdata = {
777 	/* AC97 */
778 	GPIO28_AC97_BITCLK,
779 	GPIO29_AC97_SDATA_IN_0,
780 	GPIO30_AC97_SDATA_OUT,
781 	GPIO31_AC97_SYNC,
782 };
783 
784 static struct w100_gen_regs e800_lcd_regs = {
785 	.lcd_format =            0x00008003,
786 	.lcdd_cntl1 =            0x02a00000,
787 	.lcdd_cntl2 =            0x0003ffff,
788 	.genlcd_cntl1 =          0x000ff2a3,
789 	.genlcd_cntl2 =          0x000002a3,
790 	.genlcd_cntl3 =          0x000102aa,
791 };
792 
793 static struct w100_mode e800_lcd_mode[2] = {
794 	[0] = {
795 		.xres            = 480,
796 		.yres            = 640,
797 		.left_margin     = 52,
798 		.right_margin    = 148,
799 		.upper_margin    = 2,
800 		.lower_margin    = 6,
801 		.crtc_ss         = 0x80350034,
802 		.crtc_ls         = 0x802b0026,
803 		.crtc_gs         = 0x80160016,
804 		.crtc_vpos_gs    = 0x00020003,
805 		.crtc_rev        = 0x0040001d,
806 		.crtc_dclk       = 0xe0000000,
807 		.crtc_gclk       = 0x82a50049,
808 		.crtc_goe        = 0x80ee001c,
809 		.crtc_ps1_active = 0x00000000,
810 		.pll_freq        = 128,
811 		.pixclk_divider         = 4,
812 		.pixclk_divider_rotated = 6,
813 		.pixclk_src     = CLK_SRC_PLL,
814 		.sysclk_divider  = 0,
815 		.sysclk_src     = CLK_SRC_PLL,
816 	},
817 	[1] = {
818 		.xres            = 240,
819 		.yres            = 320,
820 		.left_margin     = 15,
821 		.right_margin    = 88,
822 		.upper_margin    = 0,
823 		.lower_margin    = 7,
824 		.crtc_ss         = 0xd010000f,
825 		.crtc_ls         = 0x80070003,
826 		.crtc_gs         = 0x80000000,
827 		.crtc_vpos_gs    = 0x01460147,
828 		.crtc_rev        = 0x00400003,
829 		.crtc_dclk       = 0xa1700030,
830 		.crtc_gclk       = 0x814b0008,
831 		.crtc_goe        = 0x80cc0015,
832 		.crtc_ps1_active = 0x00000000,
833 		.pll_freq        = 100,
834 		.pixclk_divider         = 6, /* Wince uses 14 which gives a */
835 		.pixclk_divider_rotated = 6, /* 7MHz Pclk. We use a 14MHz one */
836 		.pixclk_src     = CLK_SRC_PLL,
837 		.sysclk_divider  = 0,
838 		.sysclk_src     = CLK_SRC_PLL,
839 	}
840 };
841 
842 
843 static struct w100_gpio_regs e800_w100_gpio_info = {
844 	.init_data1 = 0xc13fc019,
845 	.gpio_dir1  = 0x3e40df7f,
846 	.gpio_oe1   = 0x003c3000,
847 	.init_data2 = 0x00000000,
848 	.gpio_dir2  = 0x00000000,
849 	.gpio_oe2   = 0x00000000,
850 };
851 
852 static struct w100_mem_info e800_w100_mem_info = {
853 	.ext_cntl        = 0x09640011,
854 	.sdram_mode_reg  = 0x00600021,
855 	.ext_timing_cntl = 0x10001545,
856 	.io_cntl         = 0x7ddd7333,
857 	.size            = 0x1fffff,
858 };
859 
e800_tg_change(struct w100fb_par * par)860 static void e800_tg_change(struct w100fb_par *par)
861 {
862 	unsigned long tmp;
863 
864 	tmp = w100fb_gpio_read(W100_GPIO_PORT_A);
865 	if (par->mode->xres == 480)
866 		tmp |= 0x100;
867 	else
868 		tmp &= ~0x100;
869 	w100fb_gpio_write(W100_GPIO_PORT_A, tmp);
870 }
871 
872 static struct w100_tg_info e800_tg_info = {
873 	.change = e800_tg_change,
874 };
875 
876 static struct w100fb_mach_info e800_fb_info = {
877 	.modelist   = e800_lcd_mode,
878 	.num_modes  = 2,
879 	.regs       = &e800_lcd_regs,
880 	.gpio       = &e800_w100_gpio_info,
881 	.mem        = &e800_w100_mem_info,
882 	.tg         = &e800_tg_info,
883 	.xtal_freq  = 16000000,
884 };
885 
886 static struct resource e800_fb_resources[] = {
887 	[0] = {
888 		.start          = 0x0c000000,
889 		.end            = 0x0cffffff,
890 		.flags          = IORESOURCE_MEM,
891 	},
892 };
893 
894 static struct platform_device e800_fb_device = {
895 	.name           = "w100fb",
896 	.id             = -1,
897 	.dev            = {
898 		.platform_data  = &e800_fb_info,
899 	},
900 	.num_resources  = ARRAY_SIZE(e800_fb_resources),
901 	.resource       = e800_fb_resources,
902 };
903 
904 /* --------------------------- UDC definitions --------------------------- */
905 
906 static struct gpio_vbus_mach_info e800_udc_info = {
907 	.gpio_vbus   = GPIO_E800_USB_DISC,
908 	.gpio_pullup = GPIO_E800_USB_PULLUP,
909 	.gpio_pullup_inverted = 1
910 };
911 
912 static struct platform_device e800_gpio_vbus = {
913 	.name	= "gpio-vbus",
914 	.id	= -1,
915 	.dev	= {
916 		.platform_data	= &e800_udc_info,
917 	},
918 };
919 
920 
921 /* ----------------- e800 tc6393xb parameters ------------------ */
922 
923 static struct tc6393xb_platform_data e800_tc6393xb_info = {
924 	.irq_base       = IRQ_BOARD_START,
925 	.scr_pll2cr     = 0x0cc1,
926 	.scr_gper       = 0,
927 	.gpio_base      = -1,
928 	.suspend        = &eseries_tmio_suspend,
929 	.resume         = &eseries_tmio_resume,
930 	.enable         = &eseries_tmio_enable,
931 	.disable        = &eseries_tmio_disable,
932 };
933 
934 static struct platform_device e800_tc6393xb_device = {
935 	.name           = "tc6393xb",
936 	.id             = -1,
937 	.dev            = {
938 		.platform_data = &e800_tc6393xb_info,
939 	},
940 	.num_resources = 2,
941 	.resource      = eseries_tmio_resources,
942 };
943 
944 static struct platform_device e800_audio_device = {
945 	.name		= "e800-audio",
946 	.id		= -1,
947 };
948 
949 /* ----------------------------------------------------------------------- */
950 
951 static struct platform_device *e800_devices[] __initdata = {
952 	&e800_fb_device,
953 	&e800_tc6393xb_device,
954 	&e800_gpio_vbus,
955 	&e800_audio_device,
956 };
957 
e800_init(void)958 static void __init e800_init(void)
959 {
960 	pxa2xx_mfp_config(ARRAY_AND_SIZE(e800_pin_config));
961 	pxa_set_ffuart_info(NULL);
962 	pxa_set_btuart_info(NULL);
963 	pxa_set_stuart_info(NULL);
964 	clk_add_alias("CLK_CK3P6MI", e800_tc6393xb_device.name,
965 			"GPIO11_CLK", NULL),
966 	eseries_get_tmio_gpios();
967 	platform_add_devices(ARRAY_AND_SIZE(e800_devices));
968 	pxa_set_ac97_info(NULL);
969 }
970 
971 MACHINE_START(E800, "Toshiba e800")
972 	/* Maintainer: Ian Molton (spyro@f2s.com) */
973 	.atag_offset	= 0x100,
974 	.map_io		= pxa25x_map_io,
975 	.nr_irqs	= ESERIES_NR_IRQS,
976 	.init_irq	= pxa25x_init_irq,
977 	.handle_irq	= pxa25x_handle_irq,
978 	.fixup		= eseries_fixup,
979 	.init_machine	= e800_init,
980 	.timer		= &pxa_timer,
981 	.restart	= pxa_restart,
982 MACHINE_END
983 #endif
984