|  | @@ -92,3 +92,162 @@ static struct spi_board_info ek_spi_devices[] = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /*
 | 
	
		
			
				|  |  |   * MCI (SD/MMC)
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +static struct mci_platform_data __initdata mci0_data = {
 | 
	
		
			
				|  |  | +	.slot[0] = {
 | 
	
		
			
				|  |  | +		.bus_width	= 4,
 | 
	
		
			
				|  |  | +		.detect_pin	= AT91_PIN_PD10,
 | 
	
		
			
				|  |  | +		.wp_pin		= -EINVAL,
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct mci_platform_data __initdata mci1_data = {
 | 
	
		
			
				|  |  | +	.slot[0] = {
 | 
	
		
			
				|  |  | +		.bus_width	= 4,
 | 
	
		
			
				|  |  | +		.detect_pin	= AT91_PIN_PD11,
 | 
	
		
			
				|  |  | +		.wp_pin		= AT91_PIN_PD29,
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * MACB Ethernet device
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +static struct macb_platform_data __initdata ek_macb_data = {
 | 
	
		
			
				|  |  | +	.phy_irq_pin	= AT91_PIN_PD5,
 | 
	
		
			
				|  |  | +	.is_rmii	= 1,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * NAND flash
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +static struct mtd_partition __initdata ek_nand_partition[] = {
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		.name	= "Partition 1",
 | 
	
		
			
				|  |  | +		.offset	= 0,
 | 
	
		
			
				|  |  | +		.size	= SZ_64M,
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		.name	= "Partition 2",
 | 
	
		
			
				|  |  | +		.offset	= MTDPART_OFS_NXTBLK,
 | 
	
		
			
				|  |  | +		.size	= MTDPART_SIZ_FULL,
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* det_pin is not connected */
 | 
	
		
			
				|  |  | +static struct atmel_nand_data __initdata ek_nand_data = {
 | 
	
		
			
				|  |  | +	.ale		= 21,
 | 
	
		
			
				|  |  | +	.cle		= 22,
 | 
	
		
			
				|  |  | +	.rdy_pin	= AT91_PIN_PC8,
 | 
	
		
			
				|  |  | +	.enable_pin	= AT91_PIN_PC14,
 | 
	
		
			
				|  |  | +	.det_pin	= -EINVAL,
 | 
	
		
			
				|  |  | +	.ecc_mode	= NAND_ECC_SOFT,
 | 
	
		
			
				|  |  | +	.on_flash_bbt	= 1,
 | 
	
		
			
				|  |  | +	.parts		= ek_nand_partition,
 | 
	
		
			
				|  |  | +	.num_parts	= ARRAY_SIZE(ek_nand_partition),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct sam9_smc_config __initdata ek_nand_smc_config = {
 | 
	
		
			
				|  |  | +	.ncs_read_setup		= 0,
 | 
	
		
			
				|  |  | +	.nrd_setup		= 2,
 | 
	
		
			
				|  |  | +	.ncs_write_setup	= 0,
 | 
	
		
			
				|  |  | +	.nwe_setup		= 2,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	.ncs_read_pulse		= 4,
 | 
	
		
			
				|  |  | +	.nrd_pulse		= 4,
 | 
	
		
			
				|  |  | +	.ncs_write_pulse	= 4,
 | 
	
		
			
				|  |  | +	.nwe_pulse		= 4,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	.read_cycle		= 7,
 | 
	
		
			
				|  |  | +	.write_cycle		= 7,
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
 | 
	
		
			
				|  |  | +	.tdf_cycles		= 3,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void __init ek_add_device_nand(void)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	ek_nand_data.bus_width_16 = board_have_nand_16bit();
 | 
	
		
			
				|  |  | +	/* setup bus-width (8 or 16) */
 | 
	
		
			
				|  |  | +	if (ek_nand_data.bus_width_16)
 | 
	
		
			
				|  |  | +		ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
 | 
	
		
			
				|  |  | +	else
 | 
	
		
			
				|  |  | +		ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/* configure chip-select 3 (NAND) */
 | 
	
		
			
				|  |  | +	sam9_smc_configure(0, 3, &ek_nand_smc_config);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	at91_add_device_nand(&ek_nand_data);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + *  ISI
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +static struct isi_platform_data __initdata isi_data = {
 | 
	
		
			
				|  |  | +	.frate			= ISI_CFG1_FRATE_CAPTURE_ALL,
 | 
	
		
			
				|  |  | +	/* to use codec and preview path simultaneously */
 | 
	
		
			
				|  |  | +	.full_mode		= 1,
 | 
	
		
			
				|  |  | +	.data_width_flags	= ISI_DATAWIDTH_8 | ISI_DATAWIDTH_10,
 | 
	
		
			
				|  |  | +	/* ISI_MCK is provided by programmable clock or external clock */
 | 
	
		
			
				|  |  | +	.mck_hz			= 25000000,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * soc-camera OV2640
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +#if defined(CONFIG_SOC_CAMERA_OV2640) || \
 | 
	
		
			
				|  |  | +	defined(CONFIG_SOC_CAMERA_OV2640_MODULE)
 | 
	
		
			
				|  |  | +static unsigned long isi_camera_query_bus_param(struct soc_camera_link *link)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	/* ISI board for ek using default 8-bits connection */
 | 
	
		
			
				|  |  | +	return SOCAM_DATAWIDTH_8;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int i2c_camera_power(struct device *dev, int on)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	/* enable or disable the camera */
 | 
	
		
			
				|  |  | +	pr_debug("%s: %s the camera\n", __func__, on ? "ENABLE" : "DISABLE");
 | 
	
		
			
				|  |  | +	at91_set_gpio_output(AT91_PIN_PD13, !on);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if (!on)
 | 
	
		
			
				|  |  | +		goto out;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	/* If enabled, give a reset impulse */
 | 
	
		
			
				|  |  | +	at91_set_gpio_output(AT91_PIN_PD12, 0);
 | 
	
		
			
				|  |  | +	msleep(20);
 | 
	
		
			
				|  |  | +	at91_set_gpio_output(AT91_PIN_PD12, 1);
 | 
	
		
			
				|  |  | +	msleep(100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +out:
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct i2c_board_info i2c_camera = {
 | 
	
		
			
				|  |  | +	I2C_BOARD_INFO("ov2640", 0x30),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct soc_camera_link iclink_ov2640 = {
 | 
	
		
			
				|  |  | +	.bus_id			= 0,
 | 
	
		
			
				|  |  | +	.board_info		= &i2c_camera,
 | 
	
		
			
				|  |  | +	.i2c_adapter_id		= 0,
 | 
	
		
			
				|  |  | +	.power			= i2c_camera_power,
 | 
	
		
			
				|  |  | +	.query_bus_param	= isi_camera_query_bus_param,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct platform_device isi_ov2640 = {
 | 
	
		
			
				|  |  | +	.name	= "soc-camera-pdrv",
 | 
	
		
			
				|  |  | +	.id	= 0,
 | 
	
		
			
				|  |  | +	.dev	= {
 | 
	
		
			
				|  |  | +		.platform_data = &iclink_ov2640,
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * LCD Controller
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
 |