|
@@ -250,6 +250,7 @@ struct fsi_clk {
|
|
|
|
|
|
|
|
struct fsi_priv {
|
|
struct fsi_priv {
|
|
|
void __iomem *base;
|
|
void __iomem *base;
|
|
|
|
|
+ phys_addr_t phys;
|
|
|
struct fsi_master *master;
|
|
struct fsi_master *master;
|
|
|
|
|
|
|
|
struct fsi_stream playback;
|
|
struct fsi_stream playback;
|
|
@@ -1374,9 +1375,15 @@ static int fsi_dma_probe(struct fsi_priv *fsi, struct fsi_stream *io, struct dev
|
|
|
struct dma_slave_config cfg = {};
|
|
struct dma_slave_config cfg = {};
|
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
|
|
- cfg.dst_addr = 0; /* use default addr */
|
|
|
|
|
- cfg.src_addr = 0; /* use default addr */
|
|
|
|
|
- cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
|
|
|
|
|
|
|
+ if (is_play) {
|
|
|
|
|
+ cfg.dst_addr = fsi->phys + REG_DODT;
|
|
|
|
|
+ cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
|
|
|
|
+ cfg.direction = DMA_MEM_TO_DEV;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ cfg.src_addr = fsi->phys + REG_DIDT;
|
|
|
|
|
+ cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
|
|
|
|
+ cfg.direction = DMA_DEV_TO_MEM;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
ret = dmaengine_slave_config(io->chan, &cfg);
|
|
ret = dmaengine_slave_config(io->chan, &cfg);
|
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
@@ -1940,6 +1947,7 @@ static int fsi_probe(struct platform_device *pdev)
|
|
|
/* FSI A setting */
|
|
/* FSI A setting */
|
|
|
fsi = &master->fsia;
|
|
fsi = &master->fsia;
|
|
|
fsi->base = master->base;
|
|
fsi->base = master->base;
|
|
|
|
|
+ fsi->phys = res->start;
|
|
|
fsi->master = master;
|
|
fsi->master = master;
|
|
|
fsi_port_info_init(fsi, &info.port_a);
|
|
fsi_port_info_init(fsi, &info.port_a);
|
|
|
fsi_handler_init(fsi, &info.port_a);
|
|
fsi_handler_init(fsi, &info.port_a);
|
|
@@ -1952,6 +1960,7 @@ static int fsi_probe(struct platform_device *pdev)
|
|
|
/* FSI B setting */
|
|
/* FSI B setting */
|
|
|
fsi = &master->fsib;
|
|
fsi = &master->fsib;
|
|
|
fsi->base = master->base + 0x40;
|
|
fsi->base = master->base + 0x40;
|
|
|
|
|
+ fsi->phys = res->start + 0x40;
|
|
|
fsi->master = master;
|
|
fsi->master = master;
|
|
|
fsi_port_info_init(fsi, &info.port_b);
|
|
fsi_port_info_init(fsi, &info.port_b);
|
|
|
fsi_handler_init(fsi, &info.port_b);
|
|
fsi_handler_init(fsi, &info.port_b);
|