7d2be0749a
This is a driver for the MMC controller on the AP7000 chips from Atmel. It should in theory work on AT91 systems too with some tweaking, but since the DMA interface is quite different, it's not entirely clear if it's worth merging this with the at91_mci driver. This driver has been around for a while in BSPs and kernel sources provided by Atmel, but this particular version uses the generic DMA Engine framework (with the slave extensions) instead of an avr32-only DMA controller framework. This driver can also use PIO transfers when no DMA channels are available, and for transfers where using DMA may be difficult or impractical for some reason (e.g. the DMA setup overhead is usually not worth it for very short transfers, and badly aligned buffers or lengths are difficult to handle.) Currently, the driver only support PIO transfers. DMA support has been split out to a separate patch to hopefully make it easier to review. The driver has been tested using mmc-block and ext3fs on several SD, SDHC and MMC+ cards. Reads and writes work fine, with read transfer rates up to 3.5 MiB/s on fast cards with debugging disabled. The driver has also been tested using the mmc_test module on the same cards. All tests except 7, 9, 15 and 17 succeed. The first two are unsupported by all the cards I have, so I don't know if the driver handles this correctly. The last two fail because the hardware flags a Data CRC Error instead of a Data Timeout error. I'm not sure how to deal with that. Documentation for this controller can be found in many data sheets from Atmel, including the AT32AP7000 data sheet which can be found here: http://www.atmel.com/dyn/products/datasheets.asp?family_id=682 Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com> Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
101 lines
2.8 KiB
C
101 lines
2.8 KiB
C
/*
|
|
* Platform data definitions.
|
|
*/
|
|
#ifndef __ASM_ARCH_BOARD_H
|
|
#define __ASM_ARCH_BOARD_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
#define GPIO_PIN_NONE (-1)
|
|
|
|
/*
|
|
* Clock rates for various on-board oscillators. The number of entries
|
|
* in this array is chip-dependent.
|
|
*/
|
|
extern unsigned long at32_board_osc_rates[];
|
|
|
|
/* Add basic devices: system manager, interrupt controller, portmuxes, etc. */
|
|
void at32_add_system_devices(void);
|
|
|
|
#define ATMEL_MAX_UART 4
|
|
extern struct platform_device *atmel_default_console_device;
|
|
|
|
struct atmel_uart_data {
|
|
short use_dma_tx; /* use transmit DMA? */
|
|
short use_dma_rx; /* use receive DMA? */
|
|
void __iomem *regs; /* virtual base address, if any */
|
|
};
|
|
void at32_map_usart(unsigned int hw_id, unsigned int line);
|
|
struct platform_device *at32_add_device_usart(unsigned int id);
|
|
|
|
struct eth_platform_data {
|
|
u32 phy_mask;
|
|
u8 is_rmii;
|
|
};
|
|
struct platform_device *
|
|
at32_add_device_eth(unsigned int id, struct eth_platform_data *data);
|
|
|
|
struct spi_board_info;
|
|
struct platform_device *
|
|
at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n);
|
|
|
|
struct atmel_lcdfb_info;
|
|
struct platform_device *
|
|
at32_add_device_lcdc(unsigned int id, struct atmel_lcdfb_info *data,
|
|
unsigned long fbmem_start, unsigned long fbmem_len,
|
|
unsigned int pin_config);
|
|
|
|
struct usba_platform_data;
|
|
struct platform_device *
|
|
at32_add_device_usba(unsigned int id, struct usba_platform_data *data);
|
|
|
|
struct ide_platform_data {
|
|
u8 cs;
|
|
};
|
|
struct platform_device *
|
|
at32_add_device_ide(unsigned int id, unsigned int extint,
|
|
struct ide_platform_data *data);
|
|
|
|
/* mask says which PWM channels to mux */
|
|
struct platform_device *at32_add_device_pwm(u32 mask);
|
|
|
|
/* depending on what's hooked up, not all SSC pins will be used */
|
|
#define ATMEL_SSC_TK 0x01
|
|
#define ATMEL_SSC_TF 0x02
|
|
#define ATMEL_SSC_TD 0x04
|
|
#define ATMEL_SSC_TX (ATMEL_SSC_TK | ATMEL_SSC_TF | ATMEL_SSC_TD)
|
|
|
|
#define ATMEL_SSC_RK 0x10
|
|
#define ATMEL_SSC_RF 0x20
|
|
#define ATMEL_SSC_RD 0x40
|
|
#define ATMEL_SSC_RX (ATMEL_SSC_RK | ATMEL_SSC_RF | ATMEL_SSC_RD)
|
|
|
|
struct platform_device *
|
|
at32_add_device_ssc(unsigned int id, unsigned int flags);
|
|
|
|
struct i2c_board_info;
|
|
struct platform_device *at32_add_device_twi(unsigned int id,
|
|
struct i2c_board_info *b,
|
|
unsigned int n);
|
|
|
|
struct mci_platform_data;
|
|
struct platform_device *
|
|
at32_add_device_mci(unsigned int id, struct mci_platform_data *data);
|
|
|
|
struct platform_device *at32_add_device_ac97c(unsigned int id);
|
|
struct platform_device *at32_add_device_abdac(unsigned int id);
|
|
struct platform_device *at32_add_device_psif(unsigned int id);
|
|
|
|
struct cf_platform_data {
|
|
int detect_pin;
|
|
int reset_pin;
|
|
int vcc_pin;
|
|
int ready_pin;
|
|
u8 cs;
|
|
};
|
|
struct platform_device *
|
|
at32_add_device_cf(unsigned int id, unsigned int extint,
|
|
struct cf_platform_data *data);
|
|
|
|
#endif /* __ASM_ARCH_BOARD_H */
|