Linux Audio

Check our new training course

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