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 <linux/platform_device.h>
31 #include <sound/asoundef.h>
32 #include <sound/control.h>
33 #include <sound/pcm.h>
35 #define AUD_CONFIG_VALID_BIT (1<<9)
36 #define AUD_CONFIG_DP_MODE (1<<15)
37 #define AUD_CONFIG_BLOCK_BIT (1<<7)
39 #define HMDI_LPE_AUDIO_DRIVER_NAME "intel-hdmi-lpe-audio"
40 #define HAD_MAX_DEVICES 1
41 #define HAD_MIN_CHANNEL 2
42 #define HAD_MAX_CHANNEL 8
43 #define HAD_NUM_OF_RING_BUFS 4
45 /* Assume 192KHz, 8channel, 25msec period */
46 #define HAD_MAX_BUFFER (600*1024)
47 #define HAD_MIN_BUFFER (32*1024)
48 #define HAD_MAX_PERIODS 4
49 #define HAD_MIN_PERIODS 4
50 #define HAD_MAX_PERIOD_BYTES (HAD_MAX_BUFFER/HAD_MIN_PERIODS)
51 #define HAD_MIN_PERIOD_BYTES 256
52 #define HAD_FIFO_SIZE 0 /* fifo not being used */
53 #define MAX_SPEAKERS 8
55 #define AUD_SAMPLE_RATE_32 32000
56 #define AUD_SAMPLE_RATE_44_1 44100
57 #define AUD_SAMPLE_RATE_48 48000
58 #define AUD_SAMPLE_RATE_88_2 88200
59 #define AUD_SAMPLE_RATE_96 96000
60 #define AUD_SAMPLE_RATE_176_4 176400
61 #define AUD_SAMPLE_RATE_192 192000
63 #define HAD_MIN_RATE AUD_SAMPLE_RATE_32
64 #define HAD_MAX_RATE AUD_SAMPLE_RATE_192
66 #define DIS_SAMPLE_RATE_25_2 25200
67 #define DIS_SAMPLE_RATE_27 27000
68 #define DIS_SAMPLE_RATE_54 54000
69 #define DIS_SAMPLE_RATE_74_25 74250
70 #define DIS_SAMPLE_RATE_148_5 148500
71 #define HAD_REG_WIDTH 0x08
72 #define HAD_MAX_HW_BUFS 0x04
73 #define HAD_MAX_DIP_WORDS 16
74 #define INTEL_HAD "IntelHdmiLpeAudio"
77 #define DP_2_7_GHZ 270000
78 #define DP_1_62_GHZ 162000
81 #define AUD_SAMPLE_RATE_32_DP_2_7_MAUD_VAL 1988
82 #define AUD_SAMPLE_RATE_44_1_DP_2_7_MAUD_VAL 2740
83 #define AUD_SAMPLE_RATE_48_DP_2_7_MAUD_VAL 2982
84 #define AUD_SAMPLE_RATE_88_2_DP_2_7_MAUD_VAL 5480
85 #define AUD_SAMPLE_RATE_96_DP_2_7_MAUD_VAL 5965
86 #define AUD_SAMPLE_RATE_176_4_DP_2_7_MAUD_VAL 10961
87 #define HAD_MAX_RATE_DP_2_7_MAUD_VAL 11930
88 #define AUD_SAMPLE_RATE_32_DP_1_62_MAUD_VAL 3314
89 #define AUD_SAMPLE_RATE_44_1_DP_1_62_MAUD_VAL 4567
90 #define AUD_SAMPLE_RATE_48_DP_1_62_MAUD_VAL 4971
91 #define AUD_SAMPLE_RATE_88_2_DP_1_62_MAUD_VAL 9134
92 #define AUD_SAMPLE_RATE_96_DP_1_62_MAUD_VAL 9942
93 #define AUD_SAMPLE_RATE_176_4_DP_1_62_MAUD_VAL 18268
94 #define HAD_MAX_RATE_DP_1_62_MAUD_VAL 19884
97 #define DP_NAUD_VAL 32768
99 /* _AUD_CONFIG register MASK */
100 #define AUD_CONFIG_MASK_UNDERRUN 0xC0000000
101 #define AUD_CONFIG_MASK_SRDBG 0x00000002
102 #define AUD_CONFIG_MASK_FUNCRST 0x00000001
105 #define HAD_SUSPEND_DELAY 1000
107 enum had_drv_status {
110 HAD_DRV_DISCONNECTED,
115 /* enum intel_had_aud_buf_type - HDMI controller ring buffer types */
116 enum intel_had_aud_buf_type {
130 /* HDMI Controller register offsets - audio domain common */
131 /* Base address for below regs = 0x65000 */
132 enum hdmi_ctrl_reg_offset_common {
133 AUDIO_HDMI_CONFIG_A = 0x000,
134 AUDIO_HDMI_CONFIG_B = 0x800,
135 AUDIO_HDMI_CONFIG_C = 0x900,
137 /* HDMI controller register offsets */
138 enum hdmi_ctrl_reg_offset {
140 AUD_CH_STATUS_0 = 0x08,
141 AUD_CH_STATUS_1 = 0x0C,
144 AUD_SAMPLE_RATE = 0x18,
145 AUD_BUF_CONFIG = 0x20,
146 AUD_BUF_CH_SWAP = 0x24,
147 AUD_BUF_A_ADDR = 0x40,
148 AUD_BUF_A_LENGTH = 0x44,
149 AUD_BUF_B_ADDR = 0x48,
150 AUD_BUF_B_LENGTH = 0x4c,
151 AUD_BUF_C_ADDR = 0x50,
152 AUD_BUF_C_LENGTH = 0x54,
153 AUD_BUF_D_ADDR = 0x58,
154 AUD_BUF_D_LENGTH = 0x5c,
156 AUD_HDMI_STATUS = 0x64, /* v2 */
157 AUD_HDMIW_INFOFR = 0x68, /* v2 */
161 * CEA speaker placement:
169 * The Left/Right Surround channel _notions_ LS/RS in SMPTE 320M
170 * corresponds to CEA RL/RR; The SMPTE channel _assignment_ C/LFE is
171 * swapped to CEA LFE/FC.
173 enum cea_speaker_placement {
174 FL = (1 << 0), /* Front Left */
175 FC = (1 << 1), /* Front Center */
176 FR = (1 << 2), /* Front Right */
177 FLC = (1 << 3), /* Front Left Center */
178 FRC = (1 << 4), /* Front Right Center */
179 RL = (1 << 5), /* Rear Left */
180 RC = (1 << 6), /* Rear Center */
181 RR = (1 << 7), /* Rear Right */
182 RLC = (1 << 8), /* Rear Left Center */
183 RRC = (1 << 9), /* Rear Right Center */
184 LFE = (1 << 10), /* Low Frequency Effect */
187 struct cea_channel_speaker_allocation {
191 /* derived values, just for convenience */
196 struct channel_map_table {
197 unsigned char map; /* ALSA API channel map position */
198 unsigned char cea_slot; /* CEA slot value */
199 int spk_mask; /* speaker position bit mask */
203 * union aud_cfg - Audio configuration
205 * @cfg_regx: individual register bits
206 * @cfg_regval: full register value
230 * union aud_ch_status_0 - Audio Channel Status 0 Attributes
232 * @status_0_regx:individual register bits
233 * @status_0_regval:full register value
236 union aud_ch_status_0 {
254 * union aud_ch_status_1 - Audio Channel Status 1 Attributes
256 * @status_1_regx: individual register bits
257 * @status_1_regval: full register value
260 union aud_ch_status_1 {
270 * union aud_hdmi_cts - CTS register
272 * @cts_regx: individual register bits
273 * @cts_regval: full register value
286 * union aud_hdmi_n_enable - N register
288 * @n_regx: individual register bits
289 * @n_regval: full register value
292 union aud_hdmi_n_enable {
302 * union aud_buf_config - Audio Buffer configurations
304 * @buf_cfg_regx: individual register bits
305 * @buf_cfgval: full register value
308 union aud_buf_config {
310 u32 audio_fifo_watermark:8;
311 u32 dma_fifo_watermark:3;
320 * union aud_buf_ch_swap - Audio Sample Swapping offset
322 * @buf_ch_swap_regx: individual register bits
323 * @buf_ch_swap_val: full register value
326 union aud_buf_ch_swap {
342 * union aud_buf_addr - Address for Audio Buffer
344 * @buf_addr_regx: individual register bits
345 * @buf_addr_val: full register value
359 * union aud_buf_len - Length of Audio Buffer
361 * @buf_len_regx: individual register bits
362 * @buf_len_val: full register value
374 * union aud_ctrl_st - Audio Control State Register offset
376 * @ctrl_regx: individual register bits
377 * @ctrl_val: full register value
397 * union aud_info_frame1 - Audio HDMI Widget Data Island Packet offset
399 * @fr1_regx: individual register bits
400 * @fr1_val: full register value
403 union aud_info_frame1 {
414 * union aud_info_frame2 - DIP frame 2
416 * @fr2_regx: individual register bits
417 * @fr2_val: full register value
420 union aud_info_frame2 {
435 * union aud_info_frame3 - DIP frame 3
437 * @fr3_regx: individual register bits
438 * @fr3_val: full register value
441 union aud_info_frame3 {
452 #define HDMI_AUDIO_UNDERRUN (1UL<<31)
453 #define HDMI_AUDIO_BUFFER_DONE (1UL<<29)
456 #define PORT_ENABLE (1 << 31)
457 #define SDVO_AUDIO_ENABLE (1 << 6)
461 HAD_GET_DISPLAY_RATE,
464 HAD_SET_ENABLE_AUDIO,
465 HAD_SET_DISABLE_AUDIO,
466 HAD_SET_ENABLE_AUDIO_INT,
467 HAD_SET_DISABLE_AUDIO_INT,
470 enum had_event_type {
471 HAD_EVENT_HOT_PLUG = 1,
472 HAD_EVENT_HOT_UNPLUG,
473 HAD_EVENT_MODE_CHANGING,
474 HAD_EVENT_AUDIO_BUFFER_DONE,
475 HAD_EVENT_AUDIO_BUFFER_UNDERRUN,
476 HAD_EVENT_QUERY_IS_AUDIO_BUSY,
477 HAD_EVENT_QUERY_IS_AUDIO_SUSPENDED,