[ARM] pxa/colibri270: Refactor board definition file
[pandora-kernel.git] / 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  *  Marek Vasut <marek.vasut@gmail.com>
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License version 2 as
10  *  published by the Free Software Foundation.
11  */
12
13 #include <linux/init.h>
14 #include <linux/kernel.h>
15 #include <linux/platform_device.h>
16 #include <linux/sysdev.h>
17 #include <linux/interrupt.h>
18 #include <linux/bitops.h>
19 #include <linux/ioport.h>
20 #include <linux/delay.h>
21 #include <linux/mtd/mtd.h>
22 #include <linux/mtd/partitions.h>
23 #include <linux/mtd/physmap.h>
24 #include <linux/gpio.h>
25 #include <asm/mach-types.h>
26 #include <mach/hardware.h>
27 #include <asm/irq.h>
28 #include <asm/sizes.h>
29 #include <asm/mach/arch.h>
30 #include <asm/mach/map.h>
31 #include <asm/mach/irq.h>
32 #include <asm/mach/flash.h>
33
34 #include <mach/pxa27x.h>
35 #include <mach/colibri.h>
36
37 #include "generic.h"
38 #include "devices.h"
39
40 /******************************************************************************
41  * Pin configuration
42  ******************************************************************************/
43 static mfp_cfg_t colibri_pxa270_pin_config[] __initdata = {
44         /* Ethernet */
45         GPIO78_nCS_2,   /* Ethernet CS */
46         GPIO114_GPIO,   /* Ethernet IRQ */
47 };
48
49 /******************************************************************************
50  * NOR Flash
51  ******************************************************************************/
52 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
53 static struct mtd_partition colibri_partitions[] = {
54         {
55                 .name =         "Bootloader",
56                 .offset =       0x00000000,
57                 .size =         0x00040000,
58                 .mask_flags =   MTD_WRITEABLE   /* force read-only */
59         }, {
60                 .name =         "Kernel",
61                 .offset =       0x00040000,
62                 .size =         0x00400000,
63                 .mask_flags =   0
64         }, {
65                 .name =         "Rootfs",
66                 .offset =       0x00440000,
67                 .size =         MTDPART_SIZ_FULL,
68                 .mask_flags =   0
69         }
70 };
71
72 static struct physmap_flash_data colibri_flash_data[] = {
73         {
74                 .width          = 4,                    /* bankwidth in bytes */
75                 .parts          = colibri_partitions,
76                 .nr_parts       = ARRAY_SIZE(colibri_partitions)
77         }
78 };
79
80 static struct resource colibri_pxa270_flash_resource = {
81         .start  = PXA_CS0_PHYS,
82         .end    = PXA_CS0_PHYS + SZ_32M - 1,
83         .flags  = IORESOURCE_MEM,
84 };
85
86 static struct platform_device colibri_pxa270_flash_device = {
87         .name   = "physmap-flash",
88         .id     = 0,
89         .dev    = {
90                 .platform_data = colibri_flash_data,
91         },
92         .resource = &colibri_pxa270_flash_resource,
93         .num_resources = 1,
94 };
95
96 static void __init colibri_pxa270_nor_init(void)
97 {
98         platform_device_register(&colibri_pxa270_flash_device);
99 }
100 #else
101 static inline void colibri_pxa270_nor_init(void) {}
102 #endif
103
104 /******************************************************************************
105  * Ethernet
106  ******************************************************************************/
107 #if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
108 static struct resource colibri_pxa270_dm9000_resources[] = {
109         [0] = {
110                 .start  = PXA_CS2_PHYS,
111                 .end    = PXA_CS2_PHYS + 3,
112                 .flags  = IORESOURCE_MEM,
113         },
114         [1] = {
115                 .start  = PXA_CS2_PHYS + 4,
116                 .end    = PXA_CS2_PHYS + 4 + 500,
117                 .flags  = IORESOURCE_MEM,
118         },
119         [2] = {
120                 .start  = gpio_to_irq(GPIO114_COLIBRI_PXA270_ETH_IRQ),
121                 .end    = gpio_to_irq(GPIO114_COLIBRI_PXA270_ETH_IRQ),
122                 .flags  = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
123         },
124 };
125
126 static struct platform_device colibri_pxa270_dm9000_device = {
127         .name           = "dm9000",
128         .id             = -1,
129         .num_resources  = ARRAY_SIZE(colibri_pxa270_dm9000_resources),
130         .resource       = colibri_pxa270_dm9000_resources,
131 };
132
133 static void __init colibri_pxa270_eth_init(void)
134 {
135         platform_device_register(&colibri_pxa270_dm9000_device);
136 }
137 #else
138 static inline void colibri_pxa270_eth_init(void) {}
139 #endif
140
141 static void __init colibri_pxa270_init(void)
142 {
143         pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config));
144         pxa_set_ffuart_info(NULL);
145         pxa_set_btuart_info(NULL);
146         pxa_set_stuart_info(NULL);
147
148         colibri_pxa270_nor_init();
149         colibri_pxa270_eth_init();
150 }
151
152 MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
153         .phys_io        = 0x40000000,
154         .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
155         .boot_params    = COLIBRI_SDRAM_BASE + 0x100,
156         .init_machine   = colibri_pxa270_init,
157         .map_io         = pxa_map_io,
158         .init_irq       = pxa27x_init_irq,
159         .timer          = &pxa_timer,
160 MACHINE_END
161