• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (C) 2008 Sascha Hauer, Pengutronix
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18 
19 #include <linux/types.h>
20 #include <linux/init.h>
21 
22 #include <linux/platform_device.h>
23 #include <linux/mtd/physmap.h>
24 #include <linux/mtd/plat-ram.h>
25 #include <linux/memory.h>
26 #include <linux/gpio.h>
27 #include <linux/smc911x.h>
28 #include <linux/interrupt.h>
29 
30 #include <mach/hardware.h>
31 #include <asm/mach-types.h>
32 #include <asm/mach/arch.h>
33 #include <asm/mach/time.h>
34 #include <asm/mach/map.h>
35 #include <mach/common.h>
36 #include <mach/imx-uart.h>
37 #include <mach/iomux-mx3.h>
38 #include <mach/board-pcm037.h>
39 #include <mach/mxc_nand.h>
40 
41 #include "devices.h"
42 
43 static struct physmap_flash_data pcm037_flash_data = {
44 	.width  = 2,
45 };
46 
47 static struct resource pcm037_flash_resource = {
48 	.start	= 0xa0000000,
49 	.end	= 0xa1ffffff,
50 	.flags	= IORESOURCE_MEM,
51 };
52 
53 static struct platform_device pcm037_flash = {
54 	.name	= "physmap-flash",
55 	.id	= 0,
56 	.dev	= {
57 		.platform_data  = &pcm037_flash_data,
58 	},
59 	.resource = &pcm037_flash_resource,
60 	.num_resources = 1,
61 };
62 
63 static struct imxuart_platform_data uart_pdata = {
64 	.flags = IMXUART_HAVE_RTSCTS,
65 };
66 
67 static struct resource smc911x_resources[] = {
68 	[0] = {
69 		.start		= CS1_BASE_ADDR + 0x300,
70 		.end		= CS1_BASE_ADDR + 0x300 + SZ_64K - 1,
71 		.flags		= IORESOURCE_MEM,
72 	},
73 	[1] = {
74 		.start		= IOMUX_TO_IRQ(MX31_PIN_GPIO3_1),
75 		.end		= IOMUX_TO_IRQ(MX31_PIN_GPIO3_1),
76 		.flags		= IORESOURCE_IRQ,
77 	},
78 };
79 
80 static struct smc911x_platdata smc911x_info = {
81 	.flags		= SMC911X_USE_32BIT,
82 	.irq_flags	= IRQF_SHARED | IRQF_TRIGGER_LOW,
83 };
84 
85 static struct platform_device pcm037_eth = {
86 	.name		= "smc911x",
87 	.id		= -1,
88 	.num_resources	= ARRAY_SIZE(smc911x_resources),
89 	.resource	= smc911x_resources,
90 	.dev		= {
91 		.platform_data = &smc911x_info,
92 	},
93 };
94 
95 static struct platdata_mtd_ram pcm038_sram_data = {
96 	.bankwidth = 2,
97 };
98 
99 static struct resource pcm038_sram_resource = {
100 	.start = CS4_BASE_ADDR,
101 	.end   = CS4_BASE_ADDR + 512 * 1024 - 1,
102 	.flags = IORESOURCE_MEM,
103 };
104 
105 static struct platform_device pcm037_sram_device = {
106 	.name = "mtd-ram",
107 	.id = 0,
108 	.dev = {
109 		.platform_data = &pcm038_sram_data,
110 	},
111 	.num_resources = 1,
112 	.resource = &pcm038_sram_resource,
113 };
114 
115 static struct mxc_nand_platform_data pcm037_nand_board_info = {
116 	.width = 1,
117 	.hw_ecc = 1,
118 };
119 
120 static struct platform_device *devices[] __initdata = {
121 	&pcm037_flash,
122 	&pcm037_eth,
123 	&pcm037_sram_device,
124 };
125 
126 /*
127  * Board specific initialization.
128  */
mxc_board_init(void)129 static void __init mxc_board_init(void)
130 {
131 	platform_add_devices(devices, ARRAY_SIZE(devices));
132 
133 	mxc_iomux_mode(MX31_PIN_CTS1__CTS1);
134 	mxc_iomux_mode(MX31_PIN_RTS1__RTS1);
135 	mxc_iomux_mode(MX31_PIN_TXD1__TXD1);
136 	mxc_iomux_mode(MX31_PIN_RXD1__RXD1);
137 
138 	mxc_register_device(&mxc_uart_device0, &uart_pdata);
139 
140 	mxc_iomux_mode(MX31_PIN_CSPI3_MOSI__RXD3);
141 	mxc_iomux_mode(MX31_PIN_CSPI3_MISO__TXD3);
142 
143 	mxc_register_device(&mxc_uart_device2, &uart_pdata);
144 
145 	mxc_iomux_mode(MX31_PIN_BATT_LINE__OWIRE);
146 	mxc_register_device(&mxc_w1_master_device, NULL);
147 
148 	/* SMSC9215 IRQ pin */
149 	mxc_iomux_mode(IOMUX_MODE(MX31_PIN_GPIO3_1, IOMUX_CONFIG_GPIO));
150 	if (!gpio_request(MX31_PIN_GPIO3_1, "pcm037-eth"))
151 		gpio_direction_input(MX31_PIN_GPIO3_1);
152 
153 	mxc_register_device(&mxc_nand_device, &pcm037_nand_board_info);
154 }
155 
156 /*
157  * This structure defines static mappings for the pcm037 board.
158  */
159 static struct map_desc pcm037_io_desc[] __initdata = {
160 	{
161 		.virtual	= AIPS1_BASE_ADDR_VIRT,
162 		.pfn		= __phys_to_pfn(AIPS1_BASE_ADDR),
163 		.length		= AIPS1_SIZE,
164 		.type		= MT_DEVICE_NONSHARED
165 	}, {
166 		.virtual	= AIPS2_BASE_ADDR_VIRT,
167 		.pfn		= __phys_to_pfn(AIPS2_BASE_ADDR),
168 		.length		= AIPS2_SIZE,
169 		.type		= MT_DEVICE_NONSHARED
170 	},
171 };
172 
173 /*
174  * Set up static virtual mappings.
175  */
pcm037_map_io(void)176 void __init pcm037_map_io(void)
177 {
178 	mxc_map_io();
179 	iotable_init(pcm037_io_desc, ARRAY_SIZE(pcm037_io_desc));
180 }
181 
pcm037_timer_init(void)182 static void __init pcm037_timer_init(void)
183 {
184 	mxc_clocks_init(26000000);
185 	mxc_timer_init("ipg_clk.0");
186 }
187 
188 struct sys_timer pcm037_timer = {
189 	.init	= pcm037_timer_init,
190 };
191 
192 MACHINE_START(PCM037, "Phytec Phycore pcm037")
193 	/* Maintainer: Pengutronix */
194 	.phys_io	= AIPS1_BASE_ADDR,
195 	.io_pg_offst	= ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc,
196 	.boot_params    = PHYS_OFFSET + 0x100,
197 	.map_io         = pcm037_map_io,
198 	.init_irq       = mxc_init_irq,
199 	.init_machine   = mxc_board_init,
200 	.timer          = &pcm037_timer,
201 MACHINE_END
202 
203