1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Freescale MPC5200 Audio DMA driver 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef __SOUND_SOC_FSL_MPC5200_DMA_H__ 7*4882a593Smuzhiyun #define __SOUND_SOC_FSL_MPC5200_DMA_H__ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define PSC_STREAM_NAME_LEN 32 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /** 12*4882a593Smuzhiyun * psc_ac97_stream - Data specific to a single stream (playback or capture) 13*4882a593Smuzhiyun * @active: flag indicating if the stream is active 14*4882a593Smuzhiyun * @psc_dma: pointer back to parent psc_dma data structure 15*4882a593Smuzhiyun * @bcom_task: bestcomm task structure 16*4882a593Smuzhiyun * @irq: irq number for bestcomm task 17*4882a593Smuzhiyun * @period_end: physical address of end of DMA region 18*4882a593Smuzhiyun * @period_next_pt: physical address of next DMA buffer to enqueue 19*4882a593Smuzhiyun * @period_bytes: size of DMA period in bytes 20*4882a593Smuzhiyun * @ac97_slot_bits: Enable bits for turning on the correct AC97 slot 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun struct psc_dma_stream { 23*4882a593Smuzhiyun struct snd_pcm_runtime *runtime; 24*4882a593Smuzhiyun int active; 25*4882a593Smuzhiyun struct psc_dma *psc_dma; 26*4882a593Smuzhiyun struct bcom_task *bcom_task; 27*4882a593Smuzhiyun int irq; 28*4882a593Smuzhiyun struct snd_pcm_substream *stream; 29*4882a593Smuzhiyun int period_next; 30*4882a593Smuzhiyun int period_current; 31*4882a593Smuzhiyun int period_bytes; 32*4882a593Smuzhiyun int period_count; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* AC97 state */ 35*4882a593Smuzhiyun u32 ac97_slot_bits; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /** 39*4882a593Smuzhiyun * psc_dma - Private driver data 40*4882a593Smuzhiyun * @name: short name for this device ("PSC0", "PSC1", etc) 41*4882a593Smuzhiyun * @psc_regs: pointer to the PSC's registers 42*4882a593Smuzhiyun * @fifo_regs: pointer to the PSC's FIFO registers 43*4882a593Smuzhiyun * @irq: IRQ of this PSC 44*4882a593Smuzhiyun * @dev: struct device pointer 45*4882a593Smuzhiyun * @dai: the CPU DAI for this device 46*4882a593Smuzhiyun * @sicr: Base value used in serial interface control register; mode is ORed 47*4882a593Smuzhiyun * with this value. 48*4882a593Smuzhiyun * @playback: Playback stream context data 49*4882a593Smuzhiyun * @capture: Capture stream context data 50*4882a593Smuzhiyun */ 51*4882a593Smuzhiyun struct psc_dma { 52*4882a593Smuzhiyun char name[32]; 53*4882a593Smuzhiyun struct mpc52xx_psc __iomem *psc_regs; 54*4882a593Smuzhiyun struct mpc52xx_psc_fifo __iomem *fifo_regs; 55*4882a593Smuzhiyun unsigned int irq; 56*4882a593Smuzhiyun struct device *dev; 57*4882a593Smuzhiyun spinlock_t lock; 58*4882a593Smuzhiyun struct mutex mutex; 59*4882a593Smuzhiyun u32 sicr; 60*4882a593Smuzhiyun uint sysclk; 61*4882a593Smuzhiyun int imr; 62*4882a593Smuzhiyun int id; 63*4882a593Smuzhiyun unsigned int slots; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* per-stream data */ 66*4882a593Smuzhiyun struct psc_dma_stream playback; 67*4882a593Smuzhiyun struct psc_dma_stream capture; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* Statistics */ 70*4882a593Smuzhiyun struct { 71*4882a593Smuzhiyun unsigned long overrun_count; 72*4882a593Smuzhiyun unsigned long underrun_count; 73*4882a593Smuzhiyun } stats; 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* Utility for retrieving psc_dma_stream structure from a substream */ 77*4882a593Smuzhiyun static inline struct psc_dma_stream * to_psc_dma_stream(struct snd_pcm_substream * substream,struct psc_dma * psc_dma)78*4882a593Smuzhiyunto_psc_dma_stream(struct snd_pcm_substream *substream, struct psc_dma *psc_dma) 79*4882a593Smuzhiyun { 80*4882a593Smuzhiyun if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) 81*4882a593Smuzhiyun return &psc_dma->capture; 82*4882a593Smuzhiyun return &psc_dma->playback; 83*4882a593Smuzhiyun } 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun int mpc5200_audio_dma_create(struct platform_device *op); 86*4882a593Smuzhiyun int mpc5200_audio_dma_destroy(struct platform_device *op); 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ 89