^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Audio support for PS3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2007 Sony Computer Entertainment Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright 2006, 2007 Sony Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #if !defined(_SND_PS3_H_)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define _SND_PS3_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/irqreturn.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define SND_PS3_DRIVER_NAME "snd_ps3"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) enum snd_ps3_out_channel {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) SND_PS3_OUT_SPDIF_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) SND_PS3_OUT_SPDIF_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) SND_PS3_OUT_SERIAL_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) SND_PS3_OUT_DEVS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) enum snd_ps3_dma_filltype {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) SND_PS3_DMA_FILLTYPE_FIRSTFILL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) SND_PS3_DMA_FILLTYPE_RUNNING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) SND_PS3_DMA_FILLTYPE_SILENT_FIRSTFILL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) SND_PS3_DMA_FILLTYPE_SILENT_RUNNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) enum snd_ps3_ch {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) SND_PS3_CH_L = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) SND_PS3_CH_R = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) SND_PS3_CH_MAX = 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct snd_ps3_avsetting_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) uint32_t avs_audio_ch; /* fixed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) uint32_t avs_audio_rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) uint32_t avs_audio_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) uint32_t avs_audio_format; /* fixed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) uint32_t avs_audio_source; /* fixed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) unsigned char avs_cs_info[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * PS3 audio 'card' instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * there should be only ONE hardware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct snd_ps3_card_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct ps3_system_bus_device *ps3_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct snd_card *card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct snd_pcm *pcm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct snd_pcm_substream *substream;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /* hvc info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) u64 audio_lpar_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) u64 audio_lpar_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) void __iomem *mapped_mmio_vaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* irq */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) u64 audio_irq_outlet;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) unsigned int irq_no;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* remember avsetting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct snd_ps3_avsetting_info avs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* dma buffer management */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) spinlock_t dma_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) /* dma_lock start */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) void * dma_start_vaddr[2]; /* 0 for L, 1 for R */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) dma_addr_t dma_start_bus_addr[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) size_t dma_buffer_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) void * dma_last_transfer_vaddr[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) void * dma_next_transfer_vaddr[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) int silent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* dma_lock end */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) int running;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* null buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) void *null_buffer_start_vaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) dma_addr_t null_buffer_start_dma_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /* start delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned int start_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* PS3 audio DMAC block size in bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define PS3_AUDIO_DMAC_BLOCK_SIZE (128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /* one stage (stereo) of audio FIFO in bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #define PS3_AUDIO_FIFO_STAGE_SIZE (256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* how many stages the fifo have */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define PS3_AUDIO_FIFO_STAGE_COUNT (8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* fifo size 128 bytes * 8 stages * stereo (2ch) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define PS3_AUDIO_FIFO_SIZE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) (PS3_AUDIO_FIFO_STAGE_SIZE * PS3_AUDIO_FIFO_STAGE_COUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* PS3 audio DMAC max block count in one dma shot = 128 (0x80) blocks*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define PS3_AUDIO_DMAC_MAX_BLOCKS (PS3_AUDIO_DMASIZE_BLOCKS_MASK + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define PS3_AUDIO_NORMAL_DMA_START_CH (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define PS3_AUDIO_NORMAL_DMA_COUNT (8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define PS3_AUDIO_NULL_DMA_START_CH \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) (PS3_AUDIO_NORMAL_DMA_START_CH + PS3_AUDIO_NORMAL_DMA_COUNT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define PS3_AUDIO_NULL_DMA_COUNT (2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define SND_PS3_MAX_VOL (0x0F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define SND_PS3_MIN_VOL (0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define SND_PS3_MIN_ATT SND_PS3_MIN_VOL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define SND_PS3_MAX_ATT SND_PS3_MAX_VOL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define SND_PS3_PCM_PREALLOC_SIZE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) (PS3_AUDIO_DMAC_BLOCK_SIZE * PS3_AUDIO_DMAC_MAX_BLOCKS * 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define SND_PS3_DMA_REGION_SIZE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) (SND_PS3_PCM_PREALLOC_SIZE + PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define PS3_AUDIO_IOID (1UL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #endif /* _SND_PS3_H_ */