Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  1/*
  2 * linux/arch/arm/mach-at91/board-cpu9krea.c
  3 *
  4 *  Copyright (C) 2005 SAN People
  5 *  Copyright (C) 2006 Atmel
  6 *  Copyright (C) 2009 Eric Benard - eric@eukrea.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 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/clk.h>
 30#include <linux/gpio_keys.h>
 31#include <linux/input.h>
 32#include <linux/mtd/physmap.h>
 33
 34#include <asm/setup.h>
 35#include <asm/mach-types.h>
 36#include <asm/irq.h>
 37
 38#include <asm/mach/arch.h>
 39#include <asm/mach/map.h>
 40#include <asm/mach/irq.h>
 41
 42#include <mach/hardware.h>
 43#include <mach/board.h>
 44#include <mach/at91sam9_smc.h>
 45#include <mach/at91sam9260_matrix.h>
 46#include <mach/at91_matrix.h>
 47
 48#include "sam9_smc.h"
 49#include "generic.h"
 50
 51static void __init cpu9krea_init_early(void)
 52{
 53	/* Initialize processor: 18.432 MHz crystal */
 54	at91_initialize(18432000);
 55}
 56
 57/*
 58 * USB Host port
 59 */
 60static struct at91_usbh_data __initdata cpu9krea_usbh_data = {
 61	.ports		= 2,
 62	.vbus_pin	= {-EINVAL, -EINVAL},
 63	.overcurrent_pin= {-EINVAL, -EINVAL},
 64};
 65
 66/*
 67 * USB Device port
 68 */
 69static struct at91_udc_data __initdata cpu9krea_udc_data = {
 70	.vbus_pin	= AT91_PIN_PC8,
 71	.pullup_pin	= -EINVAL,		/* pull-up driven by UDC */
 72};
 73
 74/*
 75 * MACB Ethernet device
 76 */
 77static struct macb_platform_data __initdata cpu9krea_macb_data = {
 78	.phy_irq_pin	= -EINVAL,
 79	.is_rmii	= 1,
 80};
 81
 82/*
 83 * NAND flash
 84 */
 85static struct atmel_nand_data __initdata cpu9krea_nand_data = {
 86	.ale		= 21,
 87	.cle		= 22,
 88	.rdy_pin	= AT91_PIN_PC13,
 89	.enable_pin	= AT91_PIN_PC14,
 90	.bus_width_16	= 0,
 91	.det_pin	= -EINVAL,
 92	.ecc_mode	= NAND_ECC_SOFT,
 93};
 94
 95#ifdef CONFIG_MACH_CPU9260
 96static struct sam9_smc_config __initdata cpu9krea_nand_smc_config = {
 97	.ncs_read_setup		= 0,
 98	.nrd_setup		= 1,
 99	.ncs_write_setup	= 0,
100	.nwe_setup		= 1,
101
102	.ncs_read_pulse		= 3,
103	.nrd_pulse		= 3,
104	.ncs_write_pulse	= 3,
105	.nwe_pulse		= 3,
106
107	.read_cycle		= 5,
108	.write_cycle		= 5,
109
110	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE
111		| AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
112	.tdf_cycles		= 2,
113};
114#else
115static struct sam9_smc_config __initdata cpu9krea_nand_smc_config = {
116	.ncs_read_setup		= 0,
117	.nrd_setup		= 2,
118	.ncs_write_setup	= 0,
119	.nwe_setup		= 2,
120
121	.ncs_read_pulse		= 4,
122	.nrd_pulse		= 4,
123	.ncs_write_pulse	= 4,
124	.nwe_pulse		= 4,
125
126	.read_cycle		= 7,
127	.write_cycle		= 7,
128
129	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE
130		| AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
131	.tdf_cycles		= 3,
132};
133#endif
134
135static void __init cpu9krea_add_device_nand(void)
136{
137	sam9_smc_configure(0, 3, &cpu9krea_nand_smc_config);
138	at91_add_device_nand(&cpu9krea_nand_data);
139}
140
141/*
142 * NOR flash
143 */
144static struct physmap_flash_data cpuat9260_nor_data = {
145	.width		= 2,
146};
147
148#define NOR_BASE	AT91_CHIPSELECT_0
149#define NOR_SIZE	SZ_64M
150
151static struct resource nor_flash_resources[] = {
152	{
153		.start	= NOR_BASE,
154		.end	= NOR_BASE + NOR_SIZE - 1,
155		.flags	= IORESOURCE_MEM,
156	}
157};
158
159static struct platform_device cpu9krea_nor_flash = {
160	.name		= "physmap-flash",
161	.id		= 0,
162	.dev		= {
163		.platform_data	= &cpuat9260_nor_data,
164	},
165	.resource	= nor_flash_resources,
166	.num_resources	= ARRAY_SIZE(nor_flash_resources),
167};
168
169#ifdef CONFIG_MACH_CPU9260
170static struct sam9_smc_config __initdata cpu9krea_nor_smc_config = {
171	.ncs_read_setup		= 0,
172	.nrd_setup		= 1,
173	.ncs_write_setup	= 0,
174	.nwe_setup		= 1,
175
176	.ncs_read_pulse		= 10,
177	.nrd_pulse		= 10,
178	.ncs_write_pulse	= 6,
179	.nwe_pulse		= 6,
180
181	.read_cycle		= 12,
182	.write_cycle		= 8,
183
184	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE
185			| AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE
186			| AT91_SMC_DBW_16,
187	.tdf_cycles		= 2,
188};
189#else
190static struct sam9_smc_config __initdata cpu9krea_nor_smc_config = {
191	.ncs_read_setup		= 0,
192	.nrd_setup		= 1,
193	.ncs_write_setup	= 0,
194	.nwe_setup		= 1,
195
196	.ncs_read_pulse		= 13,
197	.nrd_pulse		= 13,
198	.ncs_write_pulse	= 8,
199	.nwe_pulse		= 8,
200
201	.read_cycle		= 15,
202	.write_cycle		= 10,
203
204	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE
205			| AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE
206			| AT91_SMC_DBW_16,
207	.tdf_cycles		= 2,
208};
209#endif
210
211static __init void cpu9krea_add_device_nor(void)
212{
213	unsigned long csa;
214
215	csa = at91_matrix_read(AT91_MATRIX_EBICSA);
216	at91_matrix_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_VDDIOMSEL_3_3V);
217
218	/* configure chip-select 0 (NOR) */
219	sam9_smc_configure(0, 0, &cpu9krea_nor_smc_config);
220
221	platform_device_register(&cpu9krea_nor_flash);
222}
223
224/*
225 * LEDs
226 */
227static struct gpio_led cpu9krea_leds[] = {
228	{	/* LED1 */
229		.name			= "LED1",
230		.gpio			= AT91_PIN_PC11,
231		.active_low		= 1,
232		.default_trigger	= "timer",
233	},
234	{	/* LED2 */
235		.name			= "LED2",
236		.gpio			= AT91_PIN_PC12,
237		.active_low		= 1,
238		.default_trigger	= "heartbeat",
239	},
240	{	/* LED3 */
241		.name			= "LED3",
242		.gpio			= AT91_PIN_PC7,
243		.active_low		= 1,
244		.default_trigger	= "none",
245	},
246	{	/* LED4 */
247		.name			= "LED4",
248		.gpio			= AT91_PIN_PC9,
249		.active_low		= 1,
250		.default_trigger	= "none",
251	}
252};
253
254static struct i2c_board_info __initdata cpu9krea_i2c_devices[] = {
255	{
256		I2C_BOARD_INFO("rtc-ds1307", 0x68),
257		.type	= "ds1339",
258	},
259};
260
261/*
262 * GPIO Buttons
263 */
264#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
265static struct gpio_keys_button cpu9krea_buttons[] = {
266	{
267		.gpio		= AT91_PIN_PC3,
268		.code		= BTN_0,
269		.desc		= "BP1",
270		.active_low	= 1,
271		.wakeup		= 1,
272	},
273	{
274		.gpio		= AT91_PIN_PB20,
275		.code		= BTN_1,
276		.desc		= "BP2",
277		.active_low	= 1,
278		.wakeup		= 1,
279	}
280};
281
282static struct gpio_keys_platform_data cpu9krea_button_data = {
283	.buttons	= cpu9krea_buttons,
284	.nbuttons	= ARRAY_SIZE(cpu9krea_buttons),
285};
286
287static struct platform_device cpu9krea_button_device = {
288	.name		= "gpio-keys",
289	.id		= -1,
290	.num_resources	= 0,
291	.dev		= {
292		.platform_data	= &cpu9krea_button_data,
293	}
294};
295
296static void __init cpu9krea_add_device_buttons(void)
297{
298	at91_set_gpio_input(AT91_PIN_PC3, 1);	/* BP1 */
299	at91_set_deglitch(AT91_PIN_PC3, 1);
300	at91_set_gpio_input(AT91_PIN_PB20, 1);	/* BP2 */
301	at91_set_deglitch(AT91_PIN_PB20, 1);
302
303	platform_device_register(&cpu9krea_button_device);
304}
305#else
306static void __init cpu9krea_add_device_buttons(void)
307{
308}
309#endif
310
311/*
312 * MCI (SD/MMC)
313 */
314static struct at91_mmc_data __initdata cpu9krea_mmc_data = {
315	.slot_b		= 0,
316	.wire4		= 1,
317	.det_pin	= AT91_PIN_PA29,
318	.wp_pin		= -EINVAL,
319	.vcc_pin	= -EINVAL,
320};
321
322static void __init cpu9krea_board_init(void)
323{
324	/* NOR */
325	cpu9krea_add_device_nor();
326	/* Serial */
327	/* DGBU on ttyS0. (Rx & Tx only) */
328	at91_register_uart(0, 0, 0);
329
330	/* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
331	at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS |
332		ATMEL_UART_RTS | ATMEL_UART_DTR | ATMEL_UART_DSR |
333		ATMEL_UART_DCD | ATMEL_UART_RI);
334
335	/* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */
336	at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS |
337		ATMEL_UART_RTS);
338
339	/* USART2 on ttyS3. (Rx, Tx, RTS, CTS) */
340	at91_register_uart(AT91SAM9260_ID_US2, 3, ATMEL_UART_CTS |
341		ATMEL_UART_RTS);
342
343	/* USART3 on ttyS4. (Rx, Tx) */
344	at91_register_uart(AT91SAM9260_ID_US3, 4, 0);
345
346	/* USART4 on ttyS5. (Rx, Tx) */
347	at91_register_uart(AT91SAM9260_ID_US4, 5, 0);
348
349	/* USART5 on ttyS6. (Rx, Tx) */
350	at91_register_uart(AT91SAM9260_ID_US5, 6, 0);
351	at91_add_device_serial();
352	/* USB Host */
353	at91_add_device_usbh(&cpu9krea_usbh_data);
354	/* USB Device */
355	at91_add_device_udc(&cpu9krea_udc_data);
356	/* NAND */
357	cpu9krea_add_device_nand();
358	/* Ethernet */
359	at91_add_device_eth(&cpu9krea_macb_data);
360	/* MMC */
361	at91_add_device_mmc(0, &cpu9krea_mmc_data);
362	/* I2C */
363	at91_add_device_i2c(cpu9krea_i2c_devices,
364		ARRAY_SIZE(cpu9krea_i2c_devices));
365	/* LEDs */
366	at91_gpio_leds(cpu9krea_leds, ARRAY_SIZE(cpu9krea_leds));
367	/* Push Buttons */
368	cpu9krea_add_device_buttons();
369}
370
371#ifdef CONFIG_MACH_CPU9260
372MACHINE_START(CPUAT9260, "Eukrea CPU9260")
373#else
374MACHINE_START(CPUAT9G20, "Eukrea CPU9G20")
375#endif
376	/* Maintainer: Eric Benard - EUKREA Electromatique */
377	.timer		= &at91sam926x_timer,
378	.map_io		= at91_map_io,
379	.init_early	= cpu9krea_init_early,
380	.init_irq	= at91_init_irq_default,
381	.init_machine	= cpu9krea_board_init,
382MACHINE_END