1 /*
2  * KwikByte CAM60 (KB9260)
3  *
4  * based on board-sam9260ek.c
5  *   Copyright (C) 2005 SAN People
6  *   Copyright (C) 2006 Atmel
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 as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22 
23 #include <linux/types.h>
24 #include <linux/gpio.h>
25 #include <linux/init.h>
26 #include <linux/mm.h>
27 #include <linux/module.h>
28 #include <linux/platform_device.h>
29 #include <linux/spi/spi.h>
30 #include <linux/spi/flash.h>
31 
32 #include <mach/hardware.h>
33 #include <asm/setup.h>
34 #include <asm/mach-types.h>
35 #include <asm/irq.h>
36 
37 #include <asm/mach/arch.h>
38 #include <asm/mach/map.h>
39 #include <asm/mach/irq.h>
40 
41 #include <mach/board.h>
42 #include <mach/at91sam9_smc.h>
43 
44 #include "sam9_smc.h"
45 #include "generic.h"
46 
47 
cam60_init_early(void)48 static void __init cam60_init_early(void)
49 {
50 	/* Initialize processor: 10 MHz crystal */
51 	at91_initialize(10000000);
52 
53 	/* DBGU on ttyS0. (Rx & Tx only) */
54 	at91_register_uart(0, 0, 0);
55 
56 	/* set serial console to ttyS0 (ie, DBGU) */
57 	at91_set_serial_console(0);
58 }
59 
60 /*
61  * USB Host
62  */
63 static struct at91_usbh_data __initdata cam60_usbh_data = {
64 	.ports		= 1,
65 	.vbus_pin	= {-EINVAL, -EINVAL},
66 	.overcurrent_pin= {-EINVAL, -EINVAL},
67 };
68 
69 
70 /*
71  * SPI devices.
72  */
73 #if defined(CONFIG_MTD_DATAFLASH)
74 static struct mtd_partition cam60_spi_partitions[] = {
75 	{
76 		.name	= "BOOT1",
77 		.offset	= 0,
78 		.size	= 4 * 1056,
79 	},
80 	{
81 		.name	= "BOOT2",
82 		.offset	= MTDPART_OFS_NXTBLK,
83 		.size	= 256 * 1056,
84 	},
85 	{
86 		.name	= "kernel",
87 		.offset	= MTDPART_OFS_NXTBLK,
88 		.size	= 2222 * 1056,
89 	},
90 	{
91 		.name	= "file system",
92 		.offset	= MTDPART_OFS_NXTBLK,
93 		.size	= MTDPART_SIZ_FULL,
94 	},
95 };
96 
97 static struct flash_platform_data cam60_spi_flash_platform_data = {
98 	.name		= "spi_flash",
99 	.parts		= cam60_spi_partitions,
100 	.nr_parts	= ARRAY_SIZE(cam60_spi_partitions)
101 };
102 #endif
103 
104 static struct spi_board_info cam60_spi_devices[] __initdata = {
105 #if defined(CONFIG_MTD_DATAFLASH)
106 	{	/* DataFlash chip */
107 		.modalias	= "mtd_dataflash",
108 		.chip_select	= 0,
109 		.max_speed_hz	= 15 * 1000 * 1000,
110 		.bus_num	= 0,
111 		.platform_data	= &cam60_spi_flash_platform_data
112 	},
113 #endif
114 };
115 
116 
117 /*
118  * MACB Ethernet device
119  */
120 static struct __initdata macb_platform_data cam60_macb_data = {
121 	.phy_irq_pin	= AT91_PIN_PB5,
122 	.is_rmii	= 0,
123 };
124 
125 
126 /*
127  * NAND Flash
128  */
129 static struct mtd_partition __initdata cam60_nand_partition[] = {
130 	{
131 		.name	= "nand_fs",
132 		.offset	= 0,
133 		.size	= MTDPART_SIZ_FULL,
134 	},
135 };
136 
137 static struct atmel_nand_data __initdata cam60_nand_data = {
138 	.ale		= 21,
139 	.cle		= 22,
140 	.det_pin	= -EINVAL,
141 	.rdy_pin	= AT91_PIN_PA9,
142 	.enable_pin	= AT91_PIN_PA7,
143 	.parts		= cam60_nand_partition,
144 	.num_parts	= ARRAY_SIZE(cam60_nand_partition),
145 };
146 
147 static struct sam9_smc_config __initdata cam60_nand_smc_config = {
148 	.ncs_read_setup		= 0,
149 	.nrd_setup		= 1,
150 	.ncs_write_setup	= 0,
151 	.nwe_setup		= 1,
152 
153 	.ncs_read_pulse		= 3,
154 	.nrd_pulse		= 3,
155 	.ncs_write_pulse	= 3,
156 	.nwe_pulse		= 3,
157 
158 	.read_cycle		= 5,
159 	.write_cycle		= 5,
160 
161 	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
162 	.tdf_cycles		= 2,
163 };
164 
cam60_add_device_nand(void)165 static void __init cam60_add_device_nand(void)
166 {
167 	/* configure chip-select 3 (NAND) */
168 	sam9_smc_configure(0, 3, &cam60_nand_smc_config);
169 
170 	at91_add_device_nand(&cam60_nand_data);
171 }
172 
173 
cam60_board_init(void)174 static void __init cam60_board_init(void)
175 {
176 	/* Serial */
177 	at91_add_device_serial();
178 	/* SPI */
179 	at91_add_device_spi(cam60_spi_devices, ARRAY_SIZE(cam60_spi_devices));
180 	/* Ethernet */
181 	at91_add_device_eth(&cam60_macb_data);
182 	/* USB Host */
183 	/* enable USB power supply circuit */
184 	at91_set_gpio_output(AT91_PIN_PB18, 1);
185 	at91_add_device_usbh(&cam60_usbh_data);
186 	/* NAND */
187 	cam60_add_device_nand();
188 }
189 
190 MACHINE_START(CAM60, "KwikByte CAM60")
191 	/* Maintainer: KwikByte */
192 	.timer		= &at91sam926x_timer,
193 	.map_io		= at91_map_io,
194 	.init_early	= cam60_init_early,
195 	.init_irq	= at91_init_irq_default,
196 	.init_machine	= cam60_board_init,
197 MACHINE_END
198