Merge branch 'iommu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip...
[linux-2.6] / arch / arm / mach-pxa / colibri-pxa270.c
1 /*
2  *  linux/arch/arm/mach-pxa/colibri-pxa270.c
3  *
4  *  Support for Toradex PXA270 based Colibri module
5  *  Daniel Mack <daniel@caiaq.de>
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License version 2 as
9  *  published by the Free Software Foundation.
10  */
11
12 #include <linux/init.h>
13 #include <linux/kernel.h>
14 #include <linux/platform_device.h>
15 #include <linux/sysdev.h>
16 #include <linux/interrupt.h>
17 #include <linux/bitops.h>
18 #include <linux/ioport.h>
19 #include <linux/delay.h>
20 #include <linux/mtd/mtd.h>
21 #include <linux/mtd/partitions.h>
22 #include <linux/mtd/physmap.h>
23 #include <linux/gpio.h>
24 #include <asm/mach-types.h>
25 #include <mach/hardware.h>
26 #include <asm/irq.h>
27 #include <asm/sizes.h>
28 #include <asm/mach/arch.h>
29 #include <asm/mach/map.h>
30 #include <asm/mach/irq.h>
31 #include <asm/mach/flash.h>
32
33 #include <mach/pxa27x.h>
34 #include <mach/colibri.h>
35
36 #include "generic.h"
37 #include "devices.h"
38
39 /*
40  * GPIO configuration
41  */
42 static mfp_cfg_t colibri_pxa270_pin_config[] __initdata = {
43         GPIO78_nCS_2,   /* Ethernet CS */
44         GPIO114_GPIO,   /* Ethernet IRQ */
45 };
46
47 /*
48  * NOR flash
49  */
50 static struct mtd_partition colibri_partitions[] = {
51         {
52                 .name =         "Bootloader",
53                 .offset =       0x00000000,
54                 .size =         0x00040000,
55                 .mask_flags =   MTD_WRITEABLE  /* force read-only */
56         }, {
57                 .name =         "Kernel",
58                 .offset =       0x00040000,
59                 .size =         0x00400000,
60                 .mask_flags =   0
61         }, {
62                 .name =         "Rootfs",
63                 .offset =       0x00440000,
64                 .size =         MTDPART_SIZ_FULL,
65                 .mask_flags =   0
66         }
67 };
68
69 static struct physmap_flash_data colibri_flash_data[] = {
70         {
71                 .width          = 4,                    /* bankwidth in bytes */
72                 .parts          = colibri_partitions,
73                 .nr_parts       = ARRAY_SIZE(colibri_partitions)
74         }
75 };
76
77 static struct resource colibri_pxa270_flash_resource = {
78         .start  = PXA_CS0_PHYS,
79         .end    = PXA_CS0_PHYS + SZ_32M - 1,
80         .flags  = IORESOURCE_MEM,
81 };
82
83 static struct platform_device colibri_pxa270_flash_device = {
84         .name   = "physmap-flash",
85         .id     = 0,
86         .dev    = {
87                 .platform_data = colibri_flash_data,
88         },
89         .resource = &colibri_pxa270_flash_resource,
90         .num_resources = 1,
91 };
92
93 /*
94  * DM9000 Ethernet
95  */
96 #if defined(CONFIG_DM9000)
97 static struct resource dm9000_resources[] = {
98         [0] = {
99                 .start  = COLIBRI_PXA270_ETH_PHYS,
100                 .end    = COLIBRI_PXA270_ETH_PHYS + 3,
101                 .flags  = IORESOURCE_MEM,
102         },
103         [1] = {
104                 .start  = COLIBRI_PXA270_ETH_PHYS + 4,
105                 .end    = COLIBRI_PXA270_ETH_PHYS + 4 + 500,
106                 .flags  = IORESOURCE_MEM,
107         },
108         [2] = {
109                 .start  = COLIBRI_PXA270_ETH_IRQ,
110                 .end    = COLIBRI_PXA270_ETH_IRQ,
111                 .flags  = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
112         },
113 };
114
115 static struct platform_device dm9000_device = {
116         .name           = "dm9000",
117         .id             = -1,
118         .num_resources  = ARRAY_SIZE(dm9000_resources),
119         .resource       = dm9000_resources,
120 };
121 #endif /* CONFIG_DM9000 */
122
123 static struct platform_device *colibri_pxa270_devices[] __initdata = {
124         &colibri_pxa270_flash_device,
125 #if defined(CONFIG_DM9000)
126         &dm9000_device,
127 #endif
128 };
129
130 static void __init colibri_pxa270_init(void)
131 {
132         pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config));
133         platform_add_devices(ARRAY_AND_SIZE(colibri_pxa270_devices));
134 }
135
136 MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
137         .phys_io        = 0x40000000,
138         .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
139         .boot_params    = COLIBRI_SDRAM_BASE + 0x100,
140         .init_machine   = colibri_pxa270_init,
141         .map_io         = pxa_map_io,
142         .init_irq       = pxa27x_init_irq,
143         .timer          = &pxa_timer,
144 MACHINE_END
145