18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Freescale MPC5200 Audio DMA driver 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#ifndef __SOUND_SOC_FSL_MPC5200_DMA_H__ 78c2ecf20Sopenharmony_ci#define __SOUND_SOC_FSL_MPC5200_DMA_H__ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#define PSC_STREAM_NAME_LEN 32 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci/** 128c2ecf20Sopenharmony_ci * psc_ac97_stream - Data specific to a single stream (playback or capture) 138c2ecf20Sopenharmony_ci * @active: flag indicating if the stream is active 148c2ecf20Sopenharmony_ci * @psc_dma: pointer back to parent psc_dma data structure 158c2ecf20Sopenharmony_ci * @bcom_task: bestcomm task structure 168c2ecf20Sopenharmony_ci * @irq: irq number for bestcomm task 178c2ecf20Sopenharmony_ci * @period_end: physical address of end of DMA region 188c2ecf20Sopenharmony_ci * @period_next_pt: physical address of next DMA buffer to enqueue 198c2ecf20Sopenharmony_ci * @period_bytes: size of DMA period in bytes 208c2ecf20Sopenharmony_ci * @ac97_slot_bits: Enable bits for turning on the correct AC97 slot 218c2ecf20Sopenharmony_ci */ 228c2ecf20Sopenharmony_cistruct psc_dma_stream { 238c2ecf20Sopenharmony_ci struct snd_pcm_runtime *runtime; 248c2ecf20Sopenharmony_ci int active; 258c2ecf20Sopenharmony_ci struct psc_dma *psc_dma; 268c2ecf20Sopenharmony_ci struct bcom_task *bcom_task; 278c2ecf20Sopenharmony_ci int irq; 288c2ecf20Sopenharmony_ci struct snd_pcm_substream *stream; 298c2ecf20Sopenharmony_ci int period_next; 308c2ecf20Sopenharmony_ci int period_current; 318c2ecf20Sopenharmony_ci int period_bytes; 328c2ecf20Sopenharmony_ci int period_count; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci /* AC97 state */ 358c2ecf20Sopenharmony_ci u32 ac97_slot_bits; 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci/** 398c2ecf20Sopenharmony_ci * psc_dma - Private driver data 408c2ecf20Sopenharmony_ci * @name: short name for this device ("PSC0", "PSC1", etc) 418c2ecf20Sopenharmony_ci * @psc_regs: pointer to the PSC's registers 428c2ecf20Sopenharmony_ci * @fifo_regs: pointer to the PSC's FIFO registers 438c2ecf20Sopenharmony_ci * @irq: IRQ of this PSC 448c2ecf20Sopenharmony_ci * @dev: struct device pointer 458c2ecf20Sopenharmony_ci * @dai: the CPU DAI for this device 468c2ecf20Sopenharmony_ci * @sicr: Base value used in serial interface control register; mode is ORed 478c2ecf20Sopenharmony_ci * with this value. 488c2ecf20Sopenharmony_ci * @playback: Playback stream context data 498c2ecf20Sopenharmony_ci * @capture: Capture stream context data 508c2ecf20Sopenharmony_ci */ 518c2ecf20Sopenharmony_cistruct psc_dma { 528c2ecf20Sopenharmony_ci char name[32]; 538c2ecf20Sopenharmony_ci struct mpc52xx_psc __iomem *psc_regs; 548c2ecf20Sopenharmony_ci struct mpc52xx_psc_fifo __iomem *fifo_regs; 558c2ecf20Sopenharmony_ci unsigned int irq; 568c2ecf20Sopenharmony_ci struct device *dev; 578c2ecf20Sopenharmony_ci spinlock_t lock; 588c2ecf20Sopenharmony_ci struct mutex mutex; 598c2ecf20Sopenharmony_ci u32 sicr; 608c2ecf20Sopenharmony_ci uint sysclk; 618c2ecf20Sopenharmony_ci int imr; 628c2ecf20Sopenharmony_ci int id; 638c2ecf20Sopenharmony_ci unsigned int slots; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci /* per-stream data */ 668c2ecf20Sopenharmony_ci struct psc_dma_stream playback; 678c2ecf20Sopenharmony_ci struct psc_dma_stream capture; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci /* Statistics */ 708c2ecf20Sopenharmony_ci struct { 718c2ecf20Sopenharmony_ci unsigned long overrun_count; 728c2ecf20Sopenharmony_ci unsigned long underrun_count; 738c2ecf20Sopenharmony_ci } stats; 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* Utility for retrieving psc_dma_stream structure from a substream */ 778c2ecf20Sopenharmony_cistatic inline struct psc_dma_stream * 788c2ecf20Sopenharmony_cito_psc_dma_stream(struct snd_pcm_substream *substream, struct psc_dma *psc_dma) 798c2ecf20Sopenharmony_ci{ 808c2ecf20Sopenharmony_ci if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) 818c2ecf20Sopenharmony_ci return &psc_dma->capture; 828c2ecf20Sopenharmony_ci return &psc_dma->playback; 838c2ecf20Sopenharmony_ci} 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ciint mpc5200_audio_dma_create(struct platform_device *op); 868c2ecf20Sopenharmony_ciint mpc5200_audio_dma_destroy(struct platform_device *op); 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ 89