|  | @@ -144,3 +144,166 @@ static struct pca953x_platform_data pca953x_77_gpio_data = {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /*************************************************************************
 | 
	
		
			
				|  |  |   * I2C Bus
 | 
	
		
			
				|  |  | + *************************************************************************/
 | 
	
		
			
				|  |  | +static struct i2c_gpio_platform_data vision_i2c_gpio_data __initdata = {
 | 
	
		
			
				|  |  | +	.sda_pin		= EP93XX_GPIO_LINE_EEDAT,
 | 
	
		
			
				|  |  | +	.scl_pin		= EP93XX_GPIO_LINE_EECLK,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct i2c_board_info vision_i2c_info[] __initdata = {
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		I2C_BOARD_INFO("isl1208", 0x6f),
 | 
	
		
			
				|  |  | +		.irq		= IRQ_EP93XX_EXT1,
 | 
	
		
			
				|  |  | +	}, {
 | 
	
		
			
				|  |  | +		I2C_BOARD_INFO("pca9539", 0x74),
 | 
	
		
			
				|  |  | +		.platform_data	= &pca953x_74_gpio_data,
 | 
	
		
			
				|  |  | +	}, {
 | 
	
		
			
				|  |  | +		I2C_BOARD_INFO("pca9539", 0x75),
 | 
	
		
			
				|  |  | +		.platform_data	= &pca953x_75_gpio_data,
 | 
	
		
			
				|  |  | +	}, {
 | 
	
		
			
				|  |  | +		I2C_BOARD_INFO("pca9539", 0x76),
 | 
	
		
			
				|  |  | +		.platform_data	= &pca953x_76_gpio_data,
 | 
	
		
			
				|  |  | +	}, {
 | 
	
		
			
				|  |  | +		I2C_BOARD_INFO("pca9539", 0x77),
 | 
	
		
			
				|  |  | +		.platform_data	= &pca953x_77_gpio_data,
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*************************************************************************
 | 
	
		
			
				|  |  | + * SPI Flash
 | 
	
		
			
				|  |  | + *************************************************************************/
 | 
	
		
			
				|  |  | +#define VISION_SPI_FLASH_CS	EP93XX_GPIO_LINE_EGPIO7
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct mtd_partition vision_spi_flash_partitions[] = {
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		.name	= "SPI bootstrap",
 | 
	
		
			
				|  |  | +		.offset	= 0,
 | 
	
		
			
				|  |  | +		.size	= SZ_4K,
 | 
	
		
			
				|  |  | +	}, {
 | 
	
		
			
				|  |  | +		.name	= "Bootstrap config",
 | 
	
		
			
				|  |  | +		.offset	= MTDPART_OFS_APPEND,
 | 
	
		
			
				|  |  | +		.size	= SZ_4K,
 | 
	
		
			
				|  |  | +	}, {
 | 
	
		
			
				|  |  | +		.name	= "System config",
 | 
	
		
			
				|  |  | +		.offset	= MTDPART_OFS_APPEND,
 | 
	
		
			
				|  |  | +		.size	= MTDPART_SIZ_FULL,
 | 
	
		
			
				|  |  | +	},
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct flash_platform_data vision_spi_flash_data = {
 | 
	
		
			
				|  |  | +	.name		= "SPI Flash",
 | 
	
		
			
				|  |  | +	.parts		= vision_spi_flash_partitions,
 | 
	
		
			
				|  |  | +	.nr_parts	= ARRAY_SIZE(vision_spi_flash_partitions),
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int vision_spi_flash_hw_setup(struct spi_device *spi)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	return gpio_request_one(VISION_SPI_FLASH_CS, GPIOF_INIT_HIGH,
 | 
	
		
			
				|  |  | +				spi->modalias);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void vision_spi_flash_hw_cleanup(struct spi_device *spi)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	gpio_free(VISION_SPI_FLASH_CS);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void vision_spi_flash_hw_cs_control(struct spi_device *spi, int value)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	gpio_set_value(VISION_SPI_FLASH_CS, value);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct ep93xx_spi_chip_ops vision_spi_flash_hw = {
 | 
	
		
			
				|  |  | +	.setup		= vision_spi_flash_hw_setup,
 | 
	
		
			
				|  |  | +	.cleanup	= vision_spi_flash_hw_cleanup,
 | 
	
		
			
				|  |  | +	.cs_control	= vision_spi_flash_hw_cs_control,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*************************************************************************
 | 
	
		
			
				|  |  | + * SPI SD/MMC host
 | 
	
		
			
				|  |  | + *************************************************************************/
 | 
	
		
			
				|  |  | +#define VISION_SPI_MMC_CS	EP93XX_GPIO_LINE_G(2)
 | 
	
		
			
				|  |  | +#define VISION_SPI_MMC_WP	EP93XX_GPIO_LINE_F(0)
 | 
	
		
			
				|  |  | +#define VISION_SPI_MMC_CD	EP93XX_GPIO_LINE_EGPIO15
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct gpio vision_spi_mmc_gpios[] = {
 | 
	
		
			
				|  |  | +	{ VISION_SPI_MMC_WP, GPIOF_DIR_IN, "mmc_spi:wp" },
 | 
	
		
			
				|  |  | +	{ VISION_SPI_MMC_CD, GPIOF_DIR_IN, "mmc_spi:cd" },
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int vision_spi_mmc_init(struct device *pdev,
 | 
	
		
			
				|  |  | +			irqreturn_t (*func)(int, void *), void *pdata)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	int err;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	err = gpio_request_array(vision_spi_mmc_gpios,
 | 
	
		
			
				|  |  | +				 ARRAY_SIZE(vision_spi_mmc_gpios));
 | 
	
		
			
				|  |  | +	if (err)
 | 
	
		
			
				|  |  | +		return err;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	err = gpio_set_debounce(VISION_SPI_MMC_CD, 1);
 | 
	
		
			
				|  |  | +	if (err)
 | 
	
		
			
				|  |  | +		goto exit_err;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	err = request_irq(gpio_to_irq(VISION_SPI_MMC_CD), func,
 | 
	
		
			
				|  |  | +			IRQ_TYPE_EDGE_BOTH, "mmc_spi:cd", pdata);
 | 
	
		
			
				|  |  | +	if (err)
 | 
	
		
			
				|  |  | +		goto exit_err;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +exit_err:
 | 
	
		
			
				|  |  | +	gpio_free_array(vision_spi_mmc_gpios, ARRAY_SIZE(vision_spi_mmc_gpios));
 | 
	
		
			
				|  |  | +	return err;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void vision_spi_mmc_exit(struct device *pdev, void *pdata)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	free_irq(gpio_to_irq(VISION_SPI_MMC_CD), pdata);
 | 
	
		
			
				|  |  | +	gpio_free_array(vision_spi_mmc_gpios, ARRAY_SIZE(vision_spi_mmc_gpios));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int vision_spi_mmc_get_ro(struct device *pdev)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	return !!gpio_get_value(VISION_SPI_MMC_WP);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int vision_spi_mmc_get_cd(struct device *pdev)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	return !gpio_get_value(VISION_SPI_MMC_CD);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct mmc_spi_platform_data vision_spi_mmc_data = {
 | 
	
		
			
				|  |  | +	.init		= vision_spi_mmc_init,
 | 
	
		
			
				|  |  | +	.exit		= vision_spi_mmc_exit,
 | 
	
		
			
				|  |  | +	.get_ro		= vision_spi_mmc_get_ro,
 | 
	
		
			
				|  |  | +	.get_cd		= vision_spi_mmc_get_cd,
 | 
	
		
			
				|  |  | +	.detect_delay	= 100,
 | 
	
		
			
				|  |  | +	.powerup_msecs	= 100,
 | 
	
		
			
				|  |  | +	.ocr_mask	= MMC_VDD_32_33 | MMC_VDD_33_34,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static int vision_spi_mmc_hw_setup(struct spi_device *spi)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	return gpio_request_one(VISION_SPI_MMC_CS, GPIOF_INIT_HIGH,
 | 
	
		
			
				|  |  | +				spi->modalias);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void vision_spi_mmc_hw_cleanup(struct spi_device *spi)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	gpio_free(VISION_SPI_MMC_CS);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static void vision_spi_mmc_hw_cs_control(struct spi_device *spi, int value)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	gpio_set_value(VISION_SPI_MMC_CS, value);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static struct ep93xx_spi_chip_ops vision_spi_mmc_hw = {
 | 
	
		
			
				|  |  | +	.setup		= vision_spi_mmc_hw_setup,
 | 
	
		
			
				|  |  | +	.cleanup	= vision_spi_mmc_hw_cleanup,
 | 
	
		
			
				|  |  | +	.cs_control	= vision_spi_mmc_hw_cs_control,
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*************************************************************************
 | 
	
		
			
				|  |  | + * SPI Bus
 |