162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Audio support for PS3 462306a36Sopenharmony_ci * Copyright (C) 2007 Sony Computer Entertainment Inc. 562306a36Sopenharmony_ci * All rights reserved. 662306a36Sopenharmony_ci * Copyright 2006, 2007 Sony Corporation 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#if !defined(_SND_PS3_H_) 1062306a36Sopenharmony_ci#define _SND_PS3_H_ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/irqreturn.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define SND_PS3_DRIVER_NAME "snd_ps3" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cienum snd_ps3_out_channel { 1762306a36Sopenharmony_ci SND_PS3_OUT_SPDIF_0, 1862306a36Sopenharmony_ci SND_PS3_OUT_SPDIF_1, 1962306a36Sopenharmony_ci SND_PS3_OUT_SERIAL_0, 2062306a36Sopenharmony_ci SND_PS3_OUT_DEVS 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cienum snd_ps3_dma_filltype { 2462306a36Sopenharmony_ci SND_PS3_DMA_FILLTYPE_FIRSTFILL, 2562306a36Sopenharmony_ci SND_PS3_DMA_FILLTYPE_RUNNING, 2662306a36Sopenharmony_ci SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL, 2762306a36Sopenharmony_ci SND_PS3_DMA_FILLTYPE_SILENT_RUNNING 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cienum snd_ps3_ch { 3162306a36Sopenharmony_ci SND_PS3_CH_L = 0, 3262306a36Sopenharmony_ci SND_PS3_CH_R = 1, 3362306a36Sopenharmony_ci SND_PS3_CH_MAX = 2 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistruct snd_ps3_avsetting_info { 3762306a36Sopenharmony_ci uint32_t avs_audio_ch; /* fixed */ 3862306a36Sopenharmony_ci uint32_t avs_audio_rate; 3962306a36Sopenharmony_ci uint32_t avs_audio_width; 4062306a36Sopenharmony_ci uint32_t avs_audio_format; /* fixed */ 4162306a36Sopenharmony_ci uint32_t avs_audio_source; /* fixed */ 4262306a36Sopenharmony_ci unsigned char avs_cs_info[8]; 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci/* 4562306a36Sopenharmony_ci * PS3 audio 'card' instance 4662306a36Sopenharmony_ci * there should be only ONE hardware. 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_cistruct snd_ps3_card_info { 4962306a36Sopenharmony_ci struct ps3_system_bus_device *ps3_dev; 5062306a36Sopenharmony_ci struct snd_card *card; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci struct snd_pcm *pcm; 5362306a36Sopenharmony_ci struct snd_pcm_substream *substream; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* hvc info */ 5662306a36Sopenharmony_ci u64 audio_lpar_addr; 5762306a36Sopenharmony_ci u64 audio_lpar_size; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci /* registers */ 6062306a36Sopenharmony_ci void __iomem *mapped_mmio_vaddr; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci /* irq */ 6362306a36Sopenharmony_ci u64 audio_irq_outlet; 6462306a36Sopenharmony_ci unsigned int irq_no; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci /* remember avsetting */ 6762306a36Sopenharmony_ci struct snd_ps3_avsetting_info avs; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci /* dma buffer management */ 7062306a36Sopenharmony_ci spinlock_t dma_lock; 7162306a36Sopenharmony_ci /* dma_lock start */ 7262306a36Sopenharmony_ci void * dma_start_vaddr[2]; /* 0 for L, 1 for R */ 7362306a36Sopenharmony_ci dma_addr_t dma_start_bus_addr[2]; 7462306a36Sopenharmony_ci size_t dma_buffer_size; 7562306a36Sopenharmony_ci void * dma_last_transfer_vaddr[2]; 7662306a36Sopenharmony_ci void * dma_next_transfer_vaddr[2]; 7762306a36Sopenharmony_ci int silent; 7862306a36Sopenharmony_ci /* dma_lock end */ 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci int running; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci /* null buffer */ 8362306a36Sopenharmony_ci void *null_buffer_start_vaddr; 8462306a36Sopenharmony_ci dma_addr_t null_buffer_start_dma_addr; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci /* start delay */ 8762306a36Sopenharmony_ci unsigned int start_delay; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci/* PS3 audio DMAC block size in bytes */ 9362306a36Sopenharmony_ci#define PS3_AUDIO_DMAC_BLOCK_SIZE (128) 9462306a36Sopenharmony_ci/* one stage (stereo) of audio FIFO in bytes */ 9562306a36Sopenharmony_ci#define PS3_AUDIO_FIFO_STAGE_SIZE (256) 9662306a36Sopenharmony_ci/* how many stages the fifo have */ 9762306a36Sopenharmony_ci#define PS3_AUDIO_FIFO_STAGE_COUNT (8) 9862306a36Sopenharmony_ci/* fifo size 128 bytes * 8 stages * stereo (2ch) */ 9962306a36Sopenharmony_ci#define PS3_AUDIO_FIFO_SIZE \ 10062306a36Sopenharmony_ci (PS3_AUDIO_FIFO_STAGE_SIZE * PS3_AUDIO_FIFO_STAGE_COUNT) 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* PS3 audio DMAC max block count in one dma shot = 128 (0x80) blocks*/ 10362306a36Sopenharmony_ci#define PS3_AUDIO_DMAC_MAX_BLOCKS (PS3_AUDIO_DMASIZE_BLOCKS_MASK + 1) 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci#define PS3_AUDIO_NORMAL_DMA_START_CH (0) 10662306a36Sopenharmony_ci#define PS3_AUDIO_NORMAL_DMA_COUNT (8) 10762306a36Sopenharmony_ci#define PS3_AUDIO_NULL_DMA_START_CH \ 10862306a36Sopenharmony_ci (PS3_AUDIO_NORMAL_DMA_START_CH + PS3_AUDIO_NORMAL_DMA_COUNT) 10962306a36Sopenharmony_ci#define PS3_AUDIO_NULL_DMA_COUNT (2) 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define SND_PS3_MAX_VOL (0x0F) 11262306a36Sopenharmony_ci#define SND_PS3_MIN_VOL (0x00) 11362306a36Sopenharmony_ci#define SND_PS3_MIN_ATT SND_PS3_MIN_VOL 11462306a36Sopenharmony_ci#define SND_PS3_MAX_ATT SND_PS3_MAX_VOL 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#define SND_PS3_PCM_PREALLOC_SIZE \ 11762306a36Sopenharmony_ci (PS3_AUDIO_DMAC_BLOCK_SIZE * PS3_AUDIO_DMAC_MAX_BLOCKS * 4) 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci#define SND_PS3_DMA_REGION_SIZE \ 12062306a36Sopenharmony_ci (SND_PS3_PCM_PREALLOC_SIZE + PAGE_SIZE) 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#define PS3_AUDIO_IOID (1UL) 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#endif /* _SND_PS3_H_ */ 125