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