blob: 0602817ebd7fbea1150f23059d247dfbf1d48af5 [file] [log] [blame]
/*
* fsl_dma_workaround.h - EDMA bits useful for DMA workaround
*
* Copyright (C) 2017 NXP
*
* Author: Daniel Baluta <daniel.baluta@nxp.com>
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*/
#ifndef _FSL_DMA_WORKAROUND_H
#define _FSL_DMA_WORKAROUND_H
#include <sound/pcm.h>
#include <linux/dmapool.h>
#include <linux/dma-mapping.h>
#include <linux/of.h>
#include <linux/of_address.h>
#define EDMA_CH_CSR 0x00
#define EDMA_CH_ES 0x04
#define EDMA_CH_INT 0x08
#define EDMA_CH_SBR 0x0C
#define EDMA_CH_PRI 0x10
#define EDMA_TCD_SADDR 0x20
#define EDMA_TCD_SOFF 0x24
#define EDMA_TCD_ATTR 0x26
#define EDMA_TCD_NBYTES 0x28
#define EDMA_TCD_SLAST 0x2C
#define EDMA_TCD_DADDR 0x30
#define EDMA_TCD_DOFF 0x34
#define EDMA_TCD_CITER_ELINK 0x36
#define EDMA_TCD_CITER 0x36
#define EDMA_TCD_DLAST_SGA 0x38
#define EDMA_TCD_CSR 0x3C
#define EDMA_TCD_BITER_ELINK 0x3E
#define EDMA_TCD_BITER 0x3E
#define GPT_CR 0x00
#define GPT_PR 0x04
#define GPT_SR 0x08
#define GPT_IR 0x0C
#define GPT5_ADDR 0x590b0000
#define GPT6_ADDR 0x590c0000
#define GPT7_ADDR 0x590d0000
#define GPT8_ADDR 0x590e0000
#define EDMA_GPT6_ADDR 0x59360000
#define EDMA_GPT8_ADDR 0x59380000
#define FSL_DMA_WORKAROUND_ESAI 0
#define FSL_DMA_WORKAROUND_SPDIF 1
struct fsl_edma3_hw_tcd {
__le32 saddr;
__le16 soff;
__le16 attr;
__le32 nbytes;
__le32 slast;
__le32 daddr;
__le16 doff;
__le16 citer;
__le32 dlast_sga;
__le16 csr;
__le16 biter;
};
struct fsl_edma3_sw_tcd {
dma_addr_t ptcd;
struct fsl_edma3_hw_tcd *vtcd;
};
struct fsl_dma_workaround_info {
struct fsl_edma3_sw_tcd tcd_sw[4];
struct dma_pool *tcd_pool;
struct snd_dma_buffer buf;
void __iomem *base_gpt0;
void __iomem *base_gpt1;
void __iomem *base_gpt2;
void __iomem *base_gpt3;
void __iomem *base_edma_gpt1;
void __iomem *base_edma_gpt3;
void __iomem *base_acm;
int iface;
};
int configure_gpt_dma(struct snd_pcm_substream *substream,
struct fsl_dma_workaround_info *info);
int clear_gpt_dma(struct snd_pcm_substream *substream,
struct fsl_dma_workaround_info *info);
struct fsl_dma_workaround_info *
fsl_dma_workaround_alloc_info(const char *pool_name, struct device *dma_dev,
const char *base_acm_compat, int iface);
void fsl_dma_workaround_free_info(struct fsl_dma_workaround_info *info,
struct device *dma_dev);
#endif /* _FSL_EDMA_H */