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