195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman/* 295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * DM355 leopard board support 395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * 495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * Based on board-dm355-evm.c 595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * 695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * This file is licensed under the terms of the GNU General Public 795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * License version 2. This program is licensed "as is" without any 895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * warranty of any kind, whether express or implied. 995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman */ 1095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/kernel.h> 1195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/init.h> 1242d399e4189346b495fec8a9a267e8b7f744ee48Sergei Shtylyov#include <linux/err.h> 1395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/platform_device.h> 1495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/mtd/mtd.h> 1595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/mtd/partitions.h> 1695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/mtd/nand.h> 1795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/i2c.h> 1895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/gpio.h> 1995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/clk.h> 2095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/spi/spi.h> 2195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <linux/spi/eeprom.h> 22834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash#include <linux/platform_data/i2c-davinci.h> 23834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash#include <linux/platform_data/mmc-davinci.h> 24834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash#include <linux/platform_data/mtd-davinci.h> 25834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash#include <linux/platform_data/usb-davinci.h> 2695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 2795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <asm/mach-types.h> 2895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <asm/mach/arch.h> 2995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 30834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash#include <mach/common.h> 3195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#include <mach/serial.h> 3295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 3339c6d2d1d743b8c925abae7043acc35e6cdc0051Manjunath Hadli#include "davinci.h" 3439c6d2d1d743b8c925abae7043acc35e6cdc0051Manjunath Hadli 3595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman/* NOTE: this is geared for the standard config, with a socketed 3695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * 2 GByte Micron NAND (MT29F16G08FAA) using 128KB sectors. If you 3795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * swap chips, maybe with a different block size, partitioning may 3895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * need to be changed. 3995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman */ 4095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#define NAND_BLOCK_SIZE SZ_128K 4195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 4295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct mtd_partition davinci_nand_partitions[] = { 4395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman { 4495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* UBL (a few copies) plus U-Boot */ 4595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .name = "bootloader", 4695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .offset = 0, 4795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .size = 15 * NAND_BLOCK_SIZE, 4895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .mask_flags = MTD_WRITEABLE, /* force read-only */ 4995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, { 5095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* U-Boot environment */ 5195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .name = "params", 5295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .offset = MTDPART_OFS_APPEND, 5395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .size = 1 * NAND_BLOCK_SIZE, 5495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .mask_flags = 0, 5595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, { 5695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .name = "kernel", 5795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .offset = MTDPART_OFS_APPEND, 5895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .size = SZ_4M, 5995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .mask_flags = 0, 6095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, { 6195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .name = "filesystem1", 6295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .offset = MTDPART_OFS_APPEND, 6395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .size = SZ_512M, 6495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .mask_flags = 0, 6595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, { 6695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .name = "filesystem2", 6795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .offset = MTDPART_OFS_APPEND, 6895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .size = MTDPART_SIZ_FULL, 6995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .mask_flags = 0, 7095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman } 7195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* two blocks with bad block table (and mirror) at the end */ 7295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 7395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 7495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct davinci_nand_pdata davinci_nand_data = { 7595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .mask_chipsel = BIT(14), 7695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .parts = davinci_nand_partitions, 7795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .nr_parts = ARRAY_SIZE(davinci_nand_partitions), 7895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .ecc_mode = NAND_ECC_HW_SYNDROME, 79acd36357edc08649e85ff15dc4ed62353c912effSekhar Nori .ecc_bits = 4, 80bb9ebd4e714385a2592a482845865ef2d58b2868Brian Norris .bbt_options = NAND_BBT_USE_FLASH, 8195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 8295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 8395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct resource davinci_nand_resources[] = { 8495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman { 857034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .start = DM355_ASYNC_EMIF_DATA_CE0_BASE, 867034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .end = DM355_ASYNC_EMIF_DATA_CE0_BASE + SZ_32M - 1, 8795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .flags = IORESOURCE_MEM, 8895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, { 897034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .start = DM355_ASYNC_EMIF_CONTROL_BASE, 907034217467abe91b5bc63fc2993bb8eec1cf3c9fSergei Shtylyov .end = DM355_ASYNC_EMIF_CONTROL_BASE + SZ_4K - 1, 9195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .flags = IORESOURCE_MEM, 9295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, 9395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 9495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 9595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct platform_device davinci_nand_device = { 9695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .name = "davinci_nand", 9795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .id = 0, 9895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 9995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .num_resources = ARRAY_SIZE(davinci_nand_resources), 10095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .resource = davinci_nand_resources, 10195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 10295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .dev = { 10395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .platform_data = &davinci_nand_data, 10495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, 10595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 10695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 10795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct davinci_i2c_platform_data i2c_pdata = { 10895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .bus_freq = 400 /* kHz */, 10995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .bus_delay = 0 /* usec */, 11095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 11195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 11295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic int leopard_mmc_gpio = -EINVAL; 11395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 11495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic void dm355leopard_mmcsd_gpios(unsigned gpio) 11595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman{ 11695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_request(gpio + 0, "mmc0_ro"); 11795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_request(gpio + 1, "mmc0_cd"); 11895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_request(gpio + 2, "mmc1_ro"); 11995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_request(gpio + 3, "mmc1_cd"); 12095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 12195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* we "know" these are input-only so we don't 12295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * need to call gpio_direction_input() 12395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman */ 12495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 12595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman leopard_mmc_gpio = gpio; 12695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman} 12795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 12895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct i2c_board_info dm355leopard_i2c_info[] = { 12995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman { I2C_BOARD_INFO("dm355leopard_msp", 0x25), 13095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .platform_data = dm355leopard_mmcsd_gpios, 13195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* plus irq */ }, 13295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* { I2C_BOARD_INFO("tlv320aic3x", 0x1b), }, */ 13395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* { I2C_BOARD_INFO("tvp5146", 0x5d), }, */ 13495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 13595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 13695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic void __init leopard_init_i2c(void) 13795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman{ 13895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman davinci_init_i2c(&i2c_pdata); 13995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 14095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_request(5, "dm355leopard_msp"); 14195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_direction_input(5); 14295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman dm355leopard_i2c_info[0].irq = gpio_to_irq(5); 14395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 14495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman i2c_register_board_info(1, dm355leopard_i2c_info, 14595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman ARRAY_SIZE(dm355leopard_i2c_info)); 14695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman} 14795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 14895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct resource dm355leopard_dm9000_rsrc[] = { 14995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman { 15095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* addr */ 15195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .start = 0x04000000, 15295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .end = 0x04000001, 15395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .flags = IORESOURCE_MEM, 15495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, { 15595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* data */ 15695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .start = 0x04000016, 15795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .end = 0x04000017, 15895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .flags = IORESOURCE_MEM, 15995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, { 16095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .flags = IORESOURCE_IRQ 16195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman | IORESOURCE_IRQ_HIGHEDGE /* rising (active high) */, 16295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, 16395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 16495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 16595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct platform_device dm355leopard_dm9000 = { 16695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .name = "dm9000", 16795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .id = -1, 16895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .resource = dm355leopard_dm9000_rsrc, 16995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .num_resources = ARRAY_SIZE(dm355leopard_dm9000_rsrc), 17095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 17195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 17295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct platform_device *davinci_leopard_devices[] __initdata = { 17395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman &dm355leopard_dm9000, 17495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman &davinci_nand_device, 17595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 17695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 17795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic void __init dm355_leopard_map_io(void) 17895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman{ 17995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman dm355_init(); 18095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman} 18195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 1822dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilmanstatic int dm355leopard_mmc_get_cd(int module) 1832dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman{ 1842dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman if (!gpio_is_valid(leopard_mmc_gpio)) 1852dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman return -ENXIO; 1862dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman /* low == card present */ 1872dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman return !gpio_get_value_cansleep(leopard_mmc_gpio + 2 * module + 1); 1882dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman} 1892dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 1902dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilmanstatic int dm355leopard_mmc_get_ro(int module) 1912dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman{ 1922dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman if (!gpio_is_valid(leopard_mmc_gpio)) 1932dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman return -ENXIO; 1942dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman /* high == card's write protect switch active */ 1952dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman return gpio_get_value_cansleep(leopard_mmc_gpio + 2 * module + 0); 1962dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman} 1972dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 1982dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilmanstatic struct davinci_mmc_config dm355leopard_mmc_config = { 1992dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman .get_cd = dm355leopard_mmc_get_cd, 2002dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman .get_ro = dm355leopard_mmc_get_ro, 2012dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman .wires = 4, 2022dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman .max_freq = 50000000, 2032dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman .caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED, 2042dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman}; 2052dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 20695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman/* Don't connect anything to J10 unless you're only using USB host 20795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * mode *and* have to do so with some kind of gender-bender. If 20895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * you have proper Mini-B or Mini-A cables (or Mini-A adapters) 20995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * the ID pin won't need any help. 21095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman */ 21195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman#define USB_ID_VALUE 1 /* ID pulled low */ 21295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 21395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct spi_eeprom at25640a = { 21495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .byte_len = SZ_64K / 8, 21595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .name = "at25640a", 21695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .page_size = 32, 21795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .flags = EE_ADDR2, 21895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 21995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 22095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic struct spi_board_info dm355_leopard_spi_info[] __initconst = { 22195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman { 22295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .modalias = "at25", 22395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .platform_data = &at25640a, 22495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .max_speed_hz = 10 * 1000 * 1000, /* at 3v3 */ 22595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .bus_num = 0, 22695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .chip_select = 0, 22795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .mode = SPI_MODE_0, 22895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman }, 22995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman}; 23095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 23195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilmanstatic __init void dm355_leopard_init(void) 23295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman{ 23395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman struct clk *aemif; 234834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash int ret; 235834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash 236834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash ret = dm355_gpio_register(); 237834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash if (ret) 238834acb2af6e8255a026c754fac3d1bc3f32b0c1aPhilip Avinash pr_warn("%s: GPIO init failed: %d\n", __func__, ret); 23995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 24095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_request(9, "dm9000"); 24195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_direction_input(9); 24295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman dm355leopard_dm9000_rsrc[2].start = gpio_to_irq(9); 24395a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 24495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman aemif = clk_get(&dm355leopard_dm9000.dev, "aemif"); 24595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman if (IS_ERR(aemif)) 24695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman WARN("%s: unable to get AEMIF clock\n", __func__); 24795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman else 248b6f1ffed9d8a830ab94fd3fc6182e2fc8c77cba0m-karicheri clk_prepare_enable(aemif); 24995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 25095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman platform_add_devices(davinci_leopard_devices, 25195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman ARRAY_SIZE(davinci_leopard_devices)); 25295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman leopard_init_i2c(); 253fcf7157ba3b50e57653544421250ebbe81a33d81Manjunathappa, Prakash davinci_serial_init(dm355_serial_device); 25495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 25595a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* NOTE: NAND flash timings set by the UBL are slower than 25695a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204 25795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman * but could be 0x0400008c for about 25% faster page reads. 25895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman */ 25995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 26095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_request(2, "usb_id_toggle"); 26195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman gpio_direction_output(2, USB_ID_VALUE); 26295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman /* irlml6401 switches over 1A in under 8 msec */ 263355fb4e3ea590976819c03070bf2c9491aede258Sergei Shtylyov davinci_setup_usb(1000, 8); 26495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 2652dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman davinci_setup_mmc(0, &dm355leopard_mmc_config); 2662dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman davinci_setup_mmc(1, &dm355leopard_mmc_config); 2672dbf56aeb7986b54651c93ed171877e8179289bcKevin Hilman 26895a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman dm355_init_spi0(BIT(0), dm355_leopard_spi_info, 26995a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman ARRAY_SIZE(dm355_leopard_spi_info)); 27095a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman} 27195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman 27295a3477fe57e0669dcb531516f2930fe1cf27e6bKevin HilmanMACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard") 273e7e5601458a49fdcb1b49b4696e7530c25f86f25Nicolas Pitre .atag_offset = 0x100, 27495a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .map_io = dm355_leopard_map_io, 275bd808947040ba53b2b0e52dde598a9414fb27bbaCyril Chemparathy .init_irq = davinci_irq_init, 2766bb27d7349db51b50c40534710fe164ca0d58902Stephen Warren .init_time = davinci_timer_init, 27795a3477fe57e0669dcb531516f2930fe1cf27e6bKevin Hilman .init_machine = dm355_leopard_init, 2783aa3e8407ae9023c5ff59bf5c81fc2553c31eb70Shawn Guo .init_late = davinci_init_late, 279f68deabf3dc6c13fb80ec28575d0153c59f7ecceNicolas Pitre .dma_zone_size = SZ_128M, 280c6121ddd1f75278ab77504af2914d07831558672Sekhar Nori .restart = davinci_restart, 28195a3477fe57e0669dcb531516f2930fe1cf27e6bKevin HilmanMACHINE_END 282