mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
mmc: dw_mmc: Add external dma interface support
DesignWare MMC Controller can supports two types of DMA mode: external dma and internal dma. We get a RK312x platform integrated dw_mmc and ARM pl330 dma controller. This patch add edmac ops to support these platforms. I've tested it on RK31xx platform with edmac mode and RK3288 platform with idmac mode. Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
9e4703df3a
commit
3fc7eaef44
5 changed files with 245 additions and 63 deletions
|
@ -16,6 +16,7 @@
|
|||
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/mmc/core.h>
|
||||
#include <linux/dmaengine.h>
|
||||
|
||||
#define MAX_MCI_SLOTS 2
|
||||
|
||||
|
@ -40,6 +41,17 @@ enum {
|
|||
|
||||
struct mmc_data;
|
||||
|
||||
enum {
|
||||
TRANS_MODE_PIO = 0,
|
||||
TRANS_MODE_IDMAC,
|
||||
TRANS_MODE_EDMAC
|
||||
};
|
||||
|
||||
struct dw_mci_dma_slave {
|
||||
struct dma_chan *ch;
|
||||
enum dma_transfer_direction direction;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dw_mci - MMC controller state shared between all slots
|
||||
* @lock: Spinlock protecting the queue and associated data.
|
||||
|
@ -154,7 +166,14 @@ struct dw_mci {
|
|||
dma_addr_t sg_dma;
|
||||
void *sg_cpu;
|
||||
const struct dw_mci_dma_ops *dma_ops;
|
||||
/* For idmac */
|
||||
unsigned int ring_size;
|
||||
|
||||
/* For edmac */
|
||||
struct dw_mci_dma_slave *dms;
|
||||
/* Registers's physical base address */
|
||||
void *phy_regs;
|
||||
|
||||
u32 cmd_status;
|
||||
u32 data_status;
|
||||
u32 stop_cmdr;
|
||||
|
@ -208,8 +227,8 @@ struct dw_mci {
|
|||
struct dw_mci_dma_ops {
|
||||
/* DMA Ops */
|
||||
int (*init)(struct dw_mci *host);
|
||||
void (*start)(struct dw_mci *host, unsigned int sg_len);
|
||||
void (*complete)(struct dw_mci *host);
|
||||
int (*start)(struct dw_mci *host, unsigned int sg_len);
|
||||
void (*complete)(void *host);
|
||||
void (*stop)(struct dw_mci *host);
|
||||
void (*cleanup)(struct dw_mci *host);
|
||||
void (*exit)(struct dw_mci *host);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue