162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Freescale MPC5200 Audio DMA driver 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __SOUND_SOC_FSL_MPC5200_DMA_H__ 762306a36Sopenharmony_ci#define __SOUND_SOC_FSL_MPC5200_DMA_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#define PSC_STREAM_NAME_LEN 32 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/** 1262306a36Sopenharmony_ci * psc_ac97_stream - Data specific to a single stream (playback or capture) 1362306a36Sopenharmony_ci * @active: flag indicating if the stream is active 1462306a36Sopenharmony_ci * @psc_dma: pointer back to parent psc_dma data structure 1562306a36Sopenharmony_ci * @bcom_task: bestcomm task structure 1662306a36Sopenharmony_ci * @irq: irq number for bestcomm task 1762306a36Sopenharmony_ci * @period_end: physical address of end of DMA region 1862306a36Sopenharmony_ci * @period_next_pt: physical address of next DMA buffer to enqueue 1962306a36Sopenharmony_ci * @period_bytes: size of DMA period in bytes 2062306a36Sopenharmony_ci * @ac97_slot_bits: Enable bits for turning on the correct AC97 slot 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_cistruct psc_dma_stream { 2362306a36Sopenharmony_ci struct snd_pcm_runtime *runtime; 2462306a36Sopenharmony_ci int active; 2562306a36Sopenharmony_ci struct psc_dma *psc_dma; 2662306a36Sopenharmony_ci struct bcom_task *bcom_task; 2762306a36Sopenharmony_ci int irq; 2862306a36Sopenharmony_ci struct snd_pcm_substream *stream; 2962306a36Sopenharmony_ci int period_next; 3062306a36Sopenharmony_ci int period_current; 3162306a36Sopenharmony_ci int period_bytes; 3262306a36Sopenharmony_ci int period_count; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci /* AC97 state */ 3562306a36Sopenharmony_ci u32 ac97_slot_bits; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/** 3962306a36Sopenharmony_ci * psc_dma - Private driver data 4062306a36Sopenharmony_ci * @name: short name for this device ("PSC0", "PSC1", etc) 4162306a36Sopenharmony_ci * @psc_regs: pointer to the PSC's registers 4262306a36Sopenharmony_ci * @fifo_regs: pointer to the PSC's FIFO registers 4362306a36Sopenharmony_ci * @irq: IRQ of this PSC 4462306a36Sopenharmony_ci * @dev: struct device pointer 4562306a36Sopenharmony_ci * @dai: the CPU DAI for this device 4662306a36Sopenharmony_ci * @sicr: Base value used in serial interface control register; mode is ORed 4762306a36Sopenharmony_ci * with this value. 4862306a36Sopenharmony_ci * @playback: Playback stream context data 4962306a36Sopenharmony_ci * @capture: Capture stream context data 5062306a36Sopenharmony_ci */ 5162306a36Sopenharmony_cistruct psc_dma { 5262306a36Sopenharmony_ci char name[32]; 5362306a36Sopenharmony_ci struct mpc52xx_psc __iomem *psc_regs; 5462306a36Sopenharmony_ci struct mpc52xx_psc_fifo __iomem *fifo_regs; 5562306a36Sopenharmony_ci unsigned int irq; 5662306a36Sopenharmony_ci struct device *dev; 5762306a36Sopenharmony_ci spinlock_t lock; 5862306a36Sopenharmony_ci struct mutex mutex; 5962306a36Sopenharmony_ci u32 sicr; 6062306a36Sopenharmony_ci uint sysclk; 6162306a36Sopenharmony_ci int imr; 6262306a36Sopenharmony_ci int id; 6362306a36Sopenharmony_ci unsigned int slots; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci /* per-stream data */ 6662306a36Sopenharmony_ci struct psc_dma_stream playback; 6762306a36Sopenharmony_ci struct psc_dma_stream capture; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci /* Statistics */ 7062306a36Sopenharmony_ci struct { 7162306a36Sopenharmony_ci unsigned long overrun_count; 7262306a36Sopenharmony_ci unsigned long underrun_count; 7362306a36Sopenharmony_ci } stats; 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* Utility for retrieving psc_dma_stream structure from a substream */ 7762306a36Sopenharmony_cistatic inline struct psc_dma_stream * 7862306a36Sopenharmony_cito_psc_dma_stream(struct snd_pcm_substream *substream, struct psc_dma *psc_dma) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) 8162306a36Sopenharmony_ci return &psc_dma->capture; 8262306a36Sopenharmony_ci return &psc_dma->playback; 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ciint mpc5200_audio_dma_create(struct platform_device *op); 8662306a36Sopenharmony_ciint mpc5200_audio_dma_destroy(struct platform_device *op); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#endif /* __SOUND_SOC_FSL_MPC5200_DMA_H__ */ 89