1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-12-02 00:34:38 +02:00
openwrt-xburst/target/linux/xburst/files-2.6.27/drivers/mmc/host/jz4750_mmc.h

164 lines
3.8 KiB
C
Raw Normal View History

#ifndef __JZ4750_MMC_H__
#define __JZ4750_MMC_H__
#define MMC_CLOCK_SLOW 400000 /* 400 kHz for initial setup */
#define MMC_CLOCK_FAST 20000000 /* 20 MHz for maximum for normal operation */
#define SD_CLOCK_FAST 24000000 /* 24 MHz for SD Cards */
#define SD_CLOCK_HIGH 24000000 /* 24 MHz for SD Cards */
#define MMC_NO_ERROR 0
#define NR_SG 1
#ifdef CONFIG_MSC0_JZ4750
#define MSC_ID 0
#define MSC_HOTPLUG_IRQ MSC0_HOTPLUG_IRQ
#define IRQ_MSC IRQ_MSC0
#define DMA_ID_MSC_RX DMA_ID_MSC0_RX
#define DMA_ID_MSC_TX DMA_ID_MSC0_TX
#define MSC_HOTPLUG_PIN MSC0_HOTPLUG_PIN
#define ACTIVE_LOW_MSC_CD ACTIVE_LOW_MSC0_CD
#else
#define MSC_ID 1
#define MSC_HOTPLUG_IRQ MSC1_HOTPLUG_IRQ
#define IRQ_MSC IRQ_MSC1
#define DMA_ID_MSC_RX DMA_ID_MSC1_RX
#define DMA_ID_MSC_TX DMA_ID_MSC1_TX
#define MSC_HOTPLUG_PIN MSC1_HOTPLUG_PIN
#define ACTIVE_LOW_MSC_CD ACTIVE_LOW_MSC1_CD
#endif
#define MSC_1BIT_BUS 0
#define MSC_4BIT_BUS 1
#define MSC_8BIT_BUS 2
#define SZ_4K 0x00001000
#ifdef CONFIG_MSC0_JZ4750
#define __msc0_init_io() \
do { \
__gpio_as_output(GPIO_SD0_VCC_EN_N); \
__gpio_as_input(GPIO_SD0_CD_N); \
} while (0)
#define __msc0_enable_power() \
do { \
__gpio_clear_pin(GPIO_SD0_VCC_EN_N); \
} while (0)
#define __msc0_disable_power() \
do { \
__gpio_set_pin(GPIO_SD0_VCC_EN_N); \
} while (0)
#if ACTIVE_LOW_MSC0_CD == 1 /* work when cd is low */
#define __msc0_card_detected(s) \
({ \
int detected = 1; \
if (__gpio_get_pin(GPIO_SD0_CD_N)) \
detected = 0; \
detected; \
})
#else
#define __msc0_card_detected(s) \
({ \
int detected = 0; \
if (__gpio_get_pin(GPIO_SD0_CD_N)) \
detected = 1; \
detected; \
})
#endif /*ACTIVE_LOW_MSC0_CD*/
#endif
#ifdef CONFIG_MSC1_JZ4750
#define __msc1_init_io() \
do { \
__gpio_as_output(GPIO_SD1_VCC_EN_N); \
/* __gpio_as_input(GPIO_SD1_CD_N);*/ \
} while (0)
#define __msc1_enable_power() \
do { \
__gpio_clear_pin(GPIO_SD1_VCC_EN_N); \
} while (0)
#define __msc1_disable_power() \
do { \
__gpio_set_pin(GPIO_SD1_VCC_EN_N); \
} while (0)
#if ACTIVE_LOW_MSC1_CD == 1 /* work when cd is low */
#define __msc1_card_detected(s) \
({ \
int detected = 1; \
if (__gpio_get_pin(GPIO_SD1_CD_N)) \
detected = 0; \
detected; \
})
#else
#define __msc1_card_detected(s) \
({ \
int detected = 0; \
if (__gpio_get_pin(GPIO_SD1_CD_N)) \
detected = 1; \
detected; \
})
#endif /*ACTIVE_LOW_MSC1_CD*/
#endif
struct jz_mmc_host {
struct mmc_host *mmc;
spinlock_t lock;
struct {
int len;
int dir;
} dma;
struct {
int index;
int offset;
int len;
} pio;
int irq;
unsigned int clkrt;
unsigned int cmdat;
unsigned int imask;
unsigned int power_mode;
struct jz_mmc_platform_data *pdata;
struct mmc_request *mrq;
struct mmc_command *cmd;
struct mmc_data *data;
dma_addr_t sg_dma;
struct jzsoc_dma_desc *sg_cpu;
unsigned int dma_len;
unsigned int dma_dir;
};
#define MMC_IRQ_MASK() \
do { \
REG_MSC_IMASK(MSC_ID) = 0xffff; \
REG_MSC_IREG(MSC_ID) = 0xffff; \
} while (0)
typedef struct jzsoc_dma_desc {
volatile u32 ddadr; /* Points to the next descriptor + flags */
volatile u32 dsadr; /* DSADR value for the current transfer */
volatile u32 dtadr; /* DTADR value for the current transfer */
volatile u32 dcmd; /* DCMD value for the current transfer */
} jzsoc_dma_desc;
#include <linux/interrupt.h>
struct device;
struct mmc_host;
struct jz_mmc_platform_data {
unsigned int ocr_mask; /* available voltages */
unsigned long detect_delay; /* delay in jiffies before detecting cards after interrupt */
int (*init)(struct device *, irq_handler_t , void *);
int (*get_ro)(struct device *);
void (*setpower)(struct device *, unsigned int);
void (*exit)(struct device *, void *);
};
#endif /* __JZ4750_MMC_H__ */