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/init.h> 25#include <linux/mm.h> 26#include <linux/module.h> 27#include <linux/platform_device.h> 28#include <linux/spi/spi.h> 29#include <linux/spi/flash.h> 30 31#include <mach/hardware.h> 32#include <asm/setup.h> 33#include <asm/mach-types.h> 34#include <asm/irq.h> 35 36#include <asm/mach/arch.h> 37#include <asm/mach/map.h> 38#include <asm/mach/irq.h> 39 40#include <mach/board.h> 41#include <mach/gpio.h> 42#include <mach/at91sam9_smc.h> 43 44#include "sam9_smc.h" 45#include "generic.h" 46 47 48static void __init cam60_map_io(void) 49{ 50 /* Initialize processor: 10 MHz crystal */ 51 at91sam9260_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 60static void __init cam60_init_irq(void) 61{ 62 at91sam9260_init_interrupts(NULL); 63} 64 65 66/* 67 * USB Host 68 */ 69static struct at91_usbh_data __initdata cam60_usbh_data = { 70 .ports = 1, 71}; 72 73 74/* 75 * SPI devices. 76 */ 77#if defined(CONFIG_MTD_DATAFLASH) 78static struct mtd_partition cam60_spi_partitions[] = { 79 { 80 .name = "BOOT1", 81 .offset = 0, 82 .size = 4 * 1056, 83 }, 84 { 85 .name = "BOOT2", 86 .offset = MTDPART_OFS_NXTBLK, 87 .size = 256 * 1056, 88 }, 89 { 90 .name = "kernel", 91 .offset = MTDPART_OFS_NXTBLK, 92 .size = 2222 * 1056, 93 }, 94 { 95 .name = "file system", 96 .offset = MTDPART_OFS_NXTBLK, 97 .size = MTDPART_SIZ_FULL, 98 }, 99}; 100 101static struct flash_platform_data cam60_spi_flash_platform_data = { 102 .name = "spi_flash", 103 .parts = cam60_spi_partitions, 104 .nr_parts = ARRAY_SIZE(cam60_spi_partitions) 105}; 106#endif 107 108static struct spi_board_info cam60_spi_devices[] __initdata = { 109#if defined(CONFIG_MTD_DATAFLASH) 110 { /* DataFlash chip */ 111 .modalias = "mtd_dataflash", 112 .chip_select = 0, 113 .max_speed_hz = 15 * 1000 * 1000, 114 .bus_num = 0, 115 .platform_data = &cam60_spi_flash_platform_data 116 }, 117#endif 118}; 119 120 121/* 122 * MACB Ethernet device 123 */ 124static struct __initdata at91_eth_data cam60_macb_data = { 125 .phy_irq_pin = AT91_PIN_PB5, 126 .is_rmii = 0, 127}; 128 129 130/* 131 * NAND Flash 132 */ 133static struct mtd_partition __initdata cam60_nand_partition[] = { 134 { 135 .name = "nand_fs", 136 .offset = 0, 137 .size = MTDPART_SIZ_FULL, 138 }, 139}; 140 141static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) 142{ 143 *num_partitions = ARRAY_SIZE(cam60_nand_partition); 144 return cam60_nand_partition; 145} 146 147static struct atmel_nand_data __initdata cam60_nand_data = { 148 .ale = 21, 149 .cle = 22, 150 // .det_pin = ... not there 151 .rdy_pin = AT91_PIN_PA9, 152 .enable_pin = AT91_PIN_PA7, 153 .partition_info = nand_partitions, 154}; 155 156static struct sam9_smc_config __initdata cam60_nand_smc_config = { 157 .ncs_read_setup = 0, 158 .nrd_setup = 1, 159 .ncs_write_setup = 0, 160 .nwe_setup = 1, 161 162 .ncs_read_pulse = 3, 163 .nrd_pulse = 3, 164 .ncs_write_pulse = 3, 165 .nwe_pulse = 3, 166 167 .read_cycle = 5, 168 .write_cycle = 5, 169 170 .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8, 171 .tdf_cycles = 2, 172}; 173 174static void __init cam60_add_device_nand(void) 175{ 176 /* configure chip-select 3 (NAND) */ 177 sam9_smc_configure(3, &cam60_nand_smc_config); 178 179 at91_add_device_nand(&cam60_nand_data); 180} 181 182 183static void __init cam60_board_init(void) 184{ 185 /* Serial */ 186 at91_add_device_serial(); 187 /* SPI */ 188 at91_add_device_spi(cam60_spi_devices, ARRAY_SIZE(cam60_spi_devices)); 189 /* Ethernet */ 190 at91_add_device_eth(&cam60_macb_data); 191 /* USB Host */ 192 /* enable USB power supply circuit */ 193 at91_set_gpio_output(AT91_PIN_PB18, 1); 194 at91_add_device_usbh(&cam60_usbh_data); 195 /* NAND */ 196 cam60_add_device_nand(); 197} 198 199MACHINE_START(CAM60, "KwikByte CAM60") 200 /* Maintainer: KwikByte */ 201 .phys_io = AT91_BASE_SYS, 202 .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, 203 .boot_params = AT91_SDRAM_BASE + 0x100, 204 .timer = &at91sam926x_timer, 205 .map_io = cam60_map_io, 206 .init_irq = cam60_init_irq, 207 .init_machine = cam60_board_init, 208MACHINE_END 209