xref: /openbmc/linux/sound/x86/intel_hdmi_audio.h (revision 313d9f28c1d5e0254ca16f2df0f1b737e30c0993)
15dab11d8SJerome Anand /*
25dab11d8SJerome Anand  * Copyright (C) 2016 Intel Corporation
35dab11d8SJerome Anand  *  Authors:	Sailaja Bandarupalli <sailaja.bandarupalli@intel.com>
45dab11d8SJerome Anand  *		Ramesh Babu K V	<ramesh.babu@intel.com>
55dab11d8SJerome Anand  *		Vaibhav Agarwal <vaibhav.agarwal@intel.com>
65dab11d8SJerome Anand  *		Jerome Anand <jerome.anand@intel.com>
75dab11d8SJerome Anand  *
85dab11d8SJerome Anand  * Permission is hereby granted, free of charge, to any person obtaining
95dab11d8SJerome Anand  * a copy of this software and associated documentation files
105dab11d8SJerome Anand  * (the "Software"), to deal in the Software without restriction,
115dab11d8SJerome Anand  * including without limitation the rights to use, copy, modify, merge,
125dab11d8SJerome Anand  * publish, distribute, sublicense, and/or sell copies of the Software,
135dab11d8SJerome Anand  * and to permit persons to whom the Software is furnished to do so,
145dab11d8SJerome Anand  * subject to the following conditions:
155dab11d8SJerome Anand  *
165dab11d8SJerome Anand  * The above copyright notice and this permission notice (including the
175dab11d8SJerome Anand  * next paragraph) shall be included in all copies or substantial
185dab11d8SJerome Anand  * portions of the Software.
195dab11d8SJerome Anand  *
205dab11d8SJerome Anand  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
215dab11d8SJerome Anand  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
225dab11d8SJerome Anand  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
235dab11d8SJerome Anand  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
245dab11d8SJerome Anand  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
255dab11d8SJerome Anand  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
265dab11d8SJerome Anand  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
275dab11d8SJerome Anand  * SOFTWARE.
285dab11d8SJerome Anand  */
295dab11d8SJerome Anand 
305dab11d8SJerome Anand #ifndef _INTEL_HDMI_AUDIO_H_
315dab11d8SJerome Anand #define _INTEL_HDMI_AUDIO_H_
325dab11d8SJerome Anand 
335dab11d8SJerome Anand #include <linux/types.h>
345dab11d8SJerome Anand #include <sound/initval.h>
355dab11d8SJerome Anand #include <linux/version.h>
365dab11d8SJerome Anand #include <linux/pm_runtime.h>
375dab11d8SJerome Anand #include <sound/asoundef.h>
385dab11d8SJerome Anand #include <sound/control.h>
395dab11d8SJerome Anand #include <sound/pcm.h>
405dab11d8SJerome Anand #include "intel_hdmi_lpe_audio.h"
415dab11d8SJerome Anand 
425dab11d8SJerome Anand #define PCM_INDEX		0
435dab11d8SJerome Anand #define MAX_PB_STREAMS		1
445dab11d8SJerome Anand #define MAX_CAP_STREAMS		0
455dab11d8SJerome Anand #define HDMI_AUDIO_DRIVER	"hdmi-audio"
465dab11d8SJerome Anand 
47964ca808SPierre-Louis Bossart #define HDMI_INFO_FRAME_WORD1	0x000a0184
48964ca808SPierre-Louis Bossart #define DP_INFO_FRAME_WORD1	0x00441b84
495dab11d8SJerome Anand #define FIFO_THRESHOLD		0xFE
505dab11d8SJerome Anand #define DMA_FIFO_THRESHOLD	0x7
515dab11d8SJerome Anand #define BYTES_PER_WORD		0x4
525dab11d8SJerome Anand 
535dab11d8SJerome Anand /* Sampling rate as per IEC60958 Ver 3 */
545dab11d8SJerome Anand #define CH_STATUS_MAP_32KHZ	0x3
555dab11d8SJerome Anand #define CH_STATUS_MAP_44KHZ	0x0
565dab11d8SJerome Anand #define CH_STATUS_MAP_48KHZ	0x2
575dab11d8SJerome Anand #define CH_STATUS_MAP_88KHZ	0x8
585dab11d8SJerome Anand #define CH_STATUS_MAP_96KHZ	0xA
595dab11d8SJerome Anand #define CH_STATUS_MAP_176KHZ	0xC
605dab11d8SJerome Anand #define CH_STATUS_MAP_192KHZ	0xE
615dab11d8SJerome Anand 
625dab11d8SJerome Anand #define MAX_SMPL_WIDTH_20	0x0
635dab11d8SJerome Anand #define MAX_SMPL_WIDTH_24	0x1
645dab11d8SJerome Anand #define SMPL_WIDTH_16BITS	0x1
655dab11d8SJerome Anand #define SMPL_WIDTH_24BITS	0x5
665dab11d8SJerome Anand #define CHANNEL_ALLOCATION	0x1F
675dab11d8SJerome Anand #define MASK_BYTE0		0x000000FF
685dab11d8SJerome Anand #define VALID_DIP_WORDS		3
695dab11d8SJerome Anand #define LAYOUT0			0
705dab11d8SJerome Anand #define LAYOUT1			1
715dab11d8SJerome Anand #define SWAP_LFE_CENTER		0x00fac4c8
724151ee84STakashi Iwai #define AUD_CONFIG_CH_MASK	0x70
735dab11d8SJerome Anand 
745dab11d8SJerome Anand struct pcm_stream_info {
75*313d9f28STakashi Iwai 	struct snd_pcm_substream *substream;
765dab11d8SJerome Anand 	u64		buffer_rendered;
775dab11d8SJerome Anand 	u32		ring_buf_size;
78*313d9f28STakashi Iwai 	int substream_refcount;
795dab11d8SJerome Anand };
805dab11d8SJerome Anand 
815dab11d8SJerome Anand struct ring_buf_info {
825dab11d8SJerome Anand 	u32	buf_addr;
835dab11d8SJerome Anand 	u32	buf_size;
845dab11d8SJerome Anand 	u8	is_valid;
855dab11d8SJerome Anand };
865dab11d8SJerome Anand 
875647aec2STakashi Iwai struct had_stream_data {
885dab11d8SJerome Anand 	enum had_status_stream		stream_type;
895dab11d8SJerome Anand };
905dab11d8SJerome Anand 
915dab11d8SJerome Anand /**
925dab11d8SJerome Anand  * struct snd_intelhad - intelhad driver structure
935dab11d8SJerome Anand  *
945dab11d8SJerome Anand  * @card: ptr to hold card details
955dab11d8SJerome Anand  * @drv_status: driver status
965dab11d8SJerome Anand  * @buf_info: ring buffer info
975dab11d8SJerome Anand  * @stream_info: stream information
98da864809STakashi Iwai  * @eld: holds ELD info
995dab11d8SJerome Anand  * @curr_buf: pointer to hold current active ring buf
1005dab11d8SJerome Anand  * @valid_buf_cnt: ring buffer count for stream
1015dab11d8SJerome Anand  * @had_spinlock: driver lock
1025dab11d8SJerome Anand  * @aes_bits: IEC958 status bits
1035dab11d8SJerome Anand  * @buff_done: id of current buffer done intr
1045dab11d8SJerome Anand  * @dev: platoform device handle
1055dab11d8SJerome Anand  * @chmap: holds channel map info
1066ddb3ab6STakashi Iwai  * @underrun_count: PCM stream underrun counter
1075dab11d8SJerome Anand  */
1085dab11d8SJerome Anand struct snd_intelhad {
1095dab11d8SJerome Anand 	struct snd_card	*card;
1105dab11d8SJerome Anand 	enum had_drv_status	drv_status;
1115dab11d8SJerome Anand 	struct		ring_buf_info buf_info[HAD_NUM_OF_RING_BUFS];
1125dab11d8SJerome Anand 	struct		pcm_stream_info stream_info;
113da864809STakashi Iwai 	union otm_hdmi_eld_t	eld;
114964ca808SPierre-Louis Bossart 	bool dp_output;
1155dab11d8SJerome Anand 	enum		intel_had_aud_buf_type curr_buf;
1165dab11d8SJerome Anand 	int		valid_buf_cnt;
1175dab11d8SJerome Anand 	unsigned int	aes_bits;
1185647aec2STakashi Iwai 	struct had_stream_data stream_data;
1195dab11d8SJerome Anand 	spinlock_t had_spinlock;
1205dab11d8SJerome Anand 	enum		intel_had_aud_buf_type buff_done;
1215dab11d8SJerome Anand 	struct device *dev;
1225dab11d8SJerome Anand 	struct snd_pcm_chmap *chmap;
1236ddb3ab6STakashi Iwai 	int underrun_count;
124da864809STakashi Iwai 	int tmds_clock_speed;
125da864809STakashi Iwai 	int link_rate;
126da864809STakashi Iwai 
127da864809STakashi Iwai 	/* internal stuff */
128da864809STakashi Iwai 	int irq;
129da864809STakashi Iwai 	void __iomem *mmio_start;
130da864809STakashi Iwai 	unsigned int had_config_offset;
131da864809STakashi Iwai 	struct work_struct hdmi_audio_wq;
1320e9c67d7STakashi Iwai 	struct mutex mutex; /* for protecting chmap and eld */
1335dab11d8SJerome Anand };
1345dab11d8SJerome Anand 
1355dab11d8SJerome Anand #endif /* _INTEL_HDMI_AUDIO_ */
136