2 * intel_hdmi_lpe_audio.h - Intel HDMI LPE audio driver
4 * Copyright (C) 2016 Intel Corp
5 * Authors: Sailaja Bandarupalli <sailaja.bandarupalli@intel.com>
6 * Ramesh Babu K V <ramesh.babu@intel.com>
7 * Vaibhav Agarwal <vaibhav.agarwal@intel.com>
8 * Jerome Anand <jerome.anand@intel.com>
9 * Aravind Siddappaji <aravindx.siddappaji@intel.com>
10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; version 2 of the License.
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
21 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23 #ifndef __INTEL_HDMI_LPE_AUDIO_H
24 #define __INTEL_HDMI_LPE_AUDIO_H
26 #include <linux/types.h>
27 #include <sound/initval.h>
28 #include <linux/version.h>
29 #include <linux/pm_runtime.h>
30 #include <sound/asoundef.h>
31 #include <sound/control.h>
32 #include <sound/pcm.h>
34 #define HMDI_LPE_AUDIO_DRIVER_NAME "intel-hdmi-lpe-audio"
35 #define HAD_MAX_DEVICES 1
36 #define HAD_MIN_CHANNEL 2
37 #define HAD_MAX_CHANNEL 8
38 #define HAD_NUM_OF_RING_BUFS 4
40 /* Assume 192KHz, 8channel, 25msec period */
41 #define HAD_MAX_BUFFER (600*1024)
42 #define HAD_MIN_BUFFER (32*1024)
43 #define HAD_MAX_PERIODS 4
44 #define HAD_MIN_PERIODS 4
45 #define HAD_MAX_PERIOD_BYTES (HAD_MAX_BUFFER/HAD_MIN_PERIODS)
46 #define HAD_MIN_PERIOD_BYTES 256
47 #define HAD_FIFO_SIZE 0 /* fifo not being used */
48 #define MAX_SPEAKERS 8
50 #define AUD_SAMPLE_RATE_32 32000
51 #define AUD_SAMPLE_RATE_44_1 44100
52 #define AUD_SAMPLE_RATE_48 48000
53 #define AUD_SAMPLE_RATE_88_2 88200
54 #define AUD_SAMPLE_RATE_96 96000
55 #define AUD_SAMPLE_RATE_176_4 176400
56 #define AUD_SAMPLE_RATE_192 192000
58 #define HAD_MIN_RATE AUD_SAMPLE_RATE_32
59 #define HAD_MAX_RATE AUD_SAMPLE_RATE_192
61 #define DIS_SAMPLE_RATE_25_2 25200
62 #define DIS_SAMPLE_RATE_27 27000
63 #define DIS_SAMPLE_RATE_54 54000
64 #define DIS_SAMPLE_RATE_74_25 74250
65 #define DIS_SAMPLE_RATE_148_5 148500
66 #define HAD_REG_WIDTH 0x08
67 #define HAD_MAX_HW_BUFS 0x04
68 #define HAD_MAX_DIP_WORDS 16
69 #define INTEL_HAD "IntelHdmiLpeAudio"
71 /* _AUD_CONFIG register MASK */
72 #define AUD_CONFIG_MASK_UNDERRUN 0xC0000000
73 #define AUD_CONFIG_MASK_SRDBG 0x00000002
74 #define AUD_CONFIG_MASK_FUNCRST 0x00000001
77 #define HAD_SUSPEND_DELAY 1000
79 #define OTM_HDMI_ELD_SIZE 128
81 union otm_hdmi_eld_t
{
82 unsigned char eld_data
[OTM_HDMI_ELD_SIZE
];
84 /* Byte[0] = ELD Version Number */
88 unsigned char reserved
:3; /* Reserf */
89 unsigned char eld_ver
:5; /* ELD Version Number */
91 * 00001b - first rev, obsoleted
92 * 00010b - version 2, supporting CEA version
94 * 00011b:11111b - reserved
100 /* Byte[1] = Vendor Version Field */
102 unsigned char vendor_version
;
104 unsigned char reserved1
:3;
105 unsigned char veld_ver
:5; /* Version number of the ELD
106 * extension. This value is
107 * provisioned and unique to
113 /* Byte[2] = Baseline Length field */
114 unsigned char baseline_eld_length
; /* Length of the Baseline structure
118 /* Byte [3] = Reserved for future use */
121 /* Starting of the BaseLine EELD structure
122 * Byte[4] = Monitor Name Length
128 unsigned char cea_edid_rev_id
:3;
132 /* Byte[5] = Capabilities */
134 unsigned char capabilities
;
136 unsigned char hdcp
:1; /* HDCP support */
137 unsigned char ai_support
:1; /* AI support */
138 unsigned char connection_type
:2; /* Connection type
145 unsigned char sadc
:4; /* Indicates number of 3 bytes
146 * Short Audio Descriptors.
151 /* Byte[6] = Audio Synch Delay */
152 unsigned char audio_synch_delay
; /* Amount of time reported by the
153 * sink that the video trails audio
157 /* Byte[7] = Speaker Allocation Block */
159 unsigned char speaker_allocation_block
;
161 unsigned char flr
:1; /*Front Left and Right channels*/
162 unsigned char lfe
:1; /*Low Frequency Effect channel*/
163 unsigned char fc
:1; /*Center transmission channel*/
164 unsigned char rlr
:1; /*Rear Left and Right channels*/
165 unsigned char rc
:1; /*Rear Center channel*/
166 unsigned char flrc
:1; /*Front left and Right of Center
167 *transmission channels
169 unsigned char rlrc
:1; /*Rear left and Right of Center
170 *transmission channels
172 unsigned char reserved3
:1; /* Reserved */
176 /* Byte[8 - 15] - 8 Byte port identification value */
177 unsigned char port_id_value
[8];
179 /* Byte[16 - 17] - 2 Byte Manufacturer ID */
180 unsigned char manufacturer_id
[2];
182 /* Byte[18 - 19] - 2 Byte Product ID */
183 unsigned char product_id
[2];
185 /* Byte [20-83] - 64 Bytes of BaseLine Data */
186 unsigned char mn_sand_sads
[64]; /* This will include
187 * - ASCII string of Monitor name
188 * - List of 3 byte SADs
192 /* Vendor ELD Block should continue here!
193 * No Vendor ELD block defined as of now.
199 * enum had_status - Audio stream states
201 * @STREAM_INIT: Stream initialized
202 * @STREAM_RUNNING: Stream running
203 * @STREAM_PAUSED: Stream paused
204 * @STREAM_DROPPED: Stream dropped
206 enum had_stream_status
{
214 * enum had_status_stream - HAD stream states
216 enum had_status_stream
{
221 enum had_drv_status
{
224 HAD_DRV_DISCONNECTED
,
229 /* enum intel_had_aud_buf_type - HDMI controller ring buffer types */
230 enum intel_had_aud_buf_type
{
244 /* HDMI Controller register offsets - audio domain common */
245 /* Base address for below regs = 0x65000 */
246 enum hdmi_ctrl_reg_offset_common
{
247 AUDIO_HDMI_CONFIG_A
= 0x000,
248 AUDIO_HDMI_CONFIG_B
= 0x800,
249 AUDIO_HDMI_CONFIG_C
= 0x900,
251 /* HDMI controller register offsets */
252 enum hdmi_ctrl_reg_offset_v1
{
254 AUD_CH_STATUS_0
= 0x08,
255 AUD_CH_STATUS_1
= 0x0C,
258 AUD_SAMPLE_RATE
= 0x18,
259 AUD_BUF_CONFIG
= 0x20,
260 AUD_BUF_CH_SWAP
= 0x24,
261 AUD_BUF_A_ADDR
= 0x40,
262 AUD_BUF_A_LENGTH
= 0x44,
263 AUD_BUF_B_ADDR
= 0x48,
264 AUD_BUF_B_LENGTH
= 0x4c,
265 AUD_BUF_C_ADDR
= 0x50,
266 AUD_BUF_C_LENGTH
= 0x54,
267 AUD_BUF_D_ADDR
= 0x58,
268 AUD_BUF_D_LENGTH
= 0x5c,
270 AUD_HDMI_STATUS
= 0x68,
271 AUD_HDMIW_INFOFR
= 0x114,
275 * Delta changes in HDMI controller register offsets
276 * compare to v1 version
279 enum hdmi_ctrl_reg_offset_v2
{
280 AUD_HDMI_STATUS_v2
= 0x64,
281 AUD_HDMIW_INFOFR_v2
= 0x68,
285 * CEA speaker placement:
293 * The Left/Right Surround channel _notions_ LS/RS in SMPTE 320M
294 * corresponds to CEA RL/RR; The SMPTE channel _assignment_ C/LFE is
295 * swapped to CEA LFE/FC.
297 enum cea_speaker_placement
{
298 FL
= (1 << 0), /* Front Left */
299 FC
= (1 << 1), /* Front Center */
300 FR
= (1 << 2), /* Front Right */
301 FLC
= (1 << 3), /* Front Left Center */
302 FRC
= (1 << 4), /* Front Right Center */
303 RL
= (1 << 5), /* Rear Left */
304 RC
= (1 << 6), /* Rear Center */
305 RR
= (1 << 7), /* Rear Right */
306 RLC
= (1 << 8), /* Rear Left Center */
307 RRC
= (1 << 9), /* Rear Right Center */
308 LFE
= (1 << 10), /* Low Frequency Effect */
311 struct cea_channel_speaker_allocation
{
315 /* derived values, just for convenience */
320 struct channel_map_table
{
321 unsigned char map
; /* ALSA API channel map position */
322 unsigned char cea_slot
; /* CEA slot value */
323 int spk_mask
; /* speaker position bit mask */
327 * union aud_cfg - Audio configuration
329 * @cfg_regx: individual register bits
330 * @cfg_regval: full register value
367 * union aud_ch_status_0 - Audio Channel Status 0 Attributes
369 * @status_0_regx:individual register bits
370 * @status_0_regval:full register value
373 union aud_ch_status_0
{
391 * union aud_ch_status_1 - Audio Channel Status 1 Attributes
393 * @status_1_regx: individual register bits
394 * @status_1_regval: full register value
397 union aud_ch_status_1
{
407 * union aud_hdmi_cts - CTS register
409 * @cts_regx: individual register bits
410 * @cts_regval: full register value
428 * union aud_hdmi_n_enable - N register
430 * @n_regx: individual register bits
431 * @n_regval: full register value
434 union aud_hdmi_n_enable
{
449 * union aud_buf_config - Audio Buffer configurations
451 * @buf_cfg_regx: individual register bits
452 * @buf_cfgval: full register value
455 union aud_buf_config
{
463 u32 audio_fifo_watermark
:8;
464 u32 dma_fifo_watermark
:3;
473 * union aud_buf_ch_swap - Audio Sample Swapping offset
475 * @buf_ch_swap_regx: individual register bits
476 * @buf_ch_swap_val: full register value
479 union aud_buf_ch_swap
{
495 * union aud_buf_addr - Address for Audio Buffer
497 * @buf_addr_regx: individual register bits
498 * @buf_addr_val: full register value
512 * union aud_buf_len - Length of Audio Buffer
514 * @buf_len_regx: individual register bits
515 * @buf_len_val: full register value
527 * union aud_ctrl_st - Audio Control State Register offset
529 * @ctrl_regx: individual register bits
530 * @ctrl_val: full register value
550 * union aud_info_frame1 - Audio HDMI Widget Data Island Packet offset
552 * @fr1_regx: individual register bits
553 * @fr1_val: full register value
556 union aud_info_frame1
{
567 * union aud_info_frame2 - DIP frame 2
569 * @fr2_regx: individual register bits
570 * @fr2_val: full register value
573 union aud_info_frame2
{
588 * union aud_info_frame3 - DIP frame 3
590 * @fr3_regx: individual register bits
591 * @fr3_val: full register value
594 union aud_info_frame3
{
605 enum hdmi_connector_status
{
606 hdmi_connector_status_connected
= 1,
607 hdmi_connector_status_disconnected
= 2,
608 hdmi_connector_status_unknown
= 3,
611 #define HDMI_AUDIO_UNDERRUN (1UL<<31)
612 #define HDMI_AUDIO_BUFFER_DONE (1UL<<29)
615 #define PORT_ENABLE (1 << 31)
616 #define SDVO_AUDIO_ENABLE (1 << 6)
620 HAD_GET_DISPLAY_RATE
,
621 HAD_SET_ENABLE_AUDIO
,
622 HAD_SET_DISABLE_AUDIO
,
623 HAD_SET_ENABLE_AUDIO_INT
,
624 HAD_SET_DISABLE_AUDIO_INT
,
627 enum had_event_type
{
628 HAD_EVENT_HOT_PLUG
= 1,
629 HAD_EVENT_HOT_UNPLUG
,
630 HAD_EVENT_MODE_CHANGING
,
631 HAD_EVENT_AUDIO_BUFFER_DONE
,
632 HAD_EVENT_AUDIO_BUFFER_UNDERRUN
,
633 HAD_EVENT_QUERY_IS_AUDIO_BUSY
,
634 HAD_EVENT_QUERY_IS_AUDIO_SUSPENDED
,
638 * HDMI Display Controller Audio Interface
641 typedef int (*had_event_call_back
) (enum had_event_type event_type
,
644 struct hdmi_audio_registers_ops
{
645 int (*hdmi_audio_get_register_base
)(u32
**reg_base
,
647 int (*hdmi_audio_read_register
)(u32 reg_addr
, u32
*data
);
648 int (*hdmi_audio_write_register
)(u32 reg_addr
, u32 data
);
649 int (*hdmi_audio_read_modify
)(u32 reg_addr
, u32 data
,
653 struct hdmi_audio_query_set_ops
{
654 int (*hdmi_audio_get_caps
)(enum had_caps_list query_element
,
656 int (*hdmi_audio_set_caps
)(enum had_caps_list set_element
,
660 struct hdmi_audio_event
{
664 struct snd_intel_had_interface
{
666 int (*query
)(void *had_data
, struct hdmi_audio_event event
);
667 int (*suspend
)(void *had_data
, struct hdmi_audio_event event
);
668 int (*resume
)(void *had_data
);
671 bool mid_hdmi_audio_is_busy(void *dev
);
672 bool mid_hdmi_audio_suspend(void *dev
);
673 void mid_hdmi_audio_resume(void *dev
);
674 void mid_hdmi_audio_signal_event(enum had_event_type event
);
675 int mid_hdmi_audio_setup(
676 had_event_call_back audio_callbacks
,
677 struct hdmi_audio_registers_ops
*reg_ops
,
678 struct hdmi_audio_query_set_ops
*query_ops
);
679 int mid_hdmi_audio_register(
680 struct snd_intel_had_interface
*driver
,