]> git.karo-electronics.de Git - karo-tx-linux.git/blob - sound/x86/intel_hdmi_lpe_audio.h
f9c184960b34803b5942e879824a0038f5fe70b2
[karo-tx-linux.git] / sound / x86 / intel_hdmi_lpe_audio.h
1 /*
2  *   intel_hdmi_lpe_audio.h - Intel HDMI LPE audio driver
3  *
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  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11  *
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.
15  *
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.
20  *
21  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22  */
23 #ifndef __INTEL_HDMI_LPE_AUDIO_H
24 #define __INTEL_HDMI_LPE_AUDIO_H
25
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>
34
35 #define AUD_CONFIG_VALID_BIT                    (1<<9)
36 #define AUD_CONFIG_DP_MODE                      (1<<15)
37 #define AUD_CONFIG_BLOCK_BIT                    (1<<7)
38
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
44
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
54
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
62
63 #define HAD_MIN_RATE            AUD_SAMPLE_RATE_32
64 #define HAD_MAX_RATE            AUD_SAMPLE_RATE_192
65
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"
75
76 /* DP Link Rates */
77 #define DP_2_7_GHZ                      270000
78 #define DP_1_62_GHZ                     162000
79
80 /* Maud Values */
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
95
96 /* Naud Value */
97 #define DP_NAUD_VAL                                     32768
98
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
103
104 #define MAX_CNT                 0xFF
105 #define HAD_SUSPEND_DELAY       1000
106
107 enum had_drv_status {
108         HAD_DRV_CONNECTED,
109         HAD_DRV_RUNNING,
110         HAD_DRV_DISCONNECTED,
111         HAD_DRV_SUSPENDED,
112         HAD_DRV_ERR,
113 };
114
115 /* enum intel_had_aud_buf_type - HDMI controller ring buffer types */
116 enum intel_had_aud_buf_type {
117         HAD_BUF_TYPE_A = 0,
118         HAD_BUF_TYPE_B = 1,
119         HAD_BUF_TYPE_C = 2,
120         HAD_BUF_TYPE_D = 3,
121 };
122
123 enum num_aud_ch {
124         CH_STEREO = 0,
125         CH_THREE_FOUR = 1,
126         CH_FIVE_SIX = 2,
127         CH_SEVEN_EIGHT = 3
128 };
129
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,
136 };
137 /* HDMI controller register offsets */
138 enum hdmi_ctrl_reg_offset {
139         AUD_CONFIG              = 0x0,
140         AUD_CH_STATUS_0         = 0x08,
141         AUD_CH_STATUS_1         = 0x0C,
142         AUD_HDMI_CTS            = 0x10,
143         AUD_N_ENABLE            = 0x14,
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,
155         AUD_CNTL_ST             = 0x60,
156         AUD_HDMI_STATUS         = 0x64, /* v2 */
157         AUD_HDMIW_INFOFR        = 0x68, /* v2 */
158 };
159
160 /*
161  *      CEA speaker placement:
162  *
163  *      FL  FLC   FC   FRC   FR
164  *
165  *                                              LFE
166  *
167  *      RL  RLC   RC   RRC   RR
168  *
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.
172  */
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 */
185 };
186
187 struct cea_channel_speaker_allocation {
188         int ca_index;
189         int speakers[8];
190
191         /* derived values, just for convenience */
192         int channels;
193         int spk_mask;
194 };
195
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 */
200 };
201
202 /**
203  * union aud_cfg - Audio configuration
204  *
205  * @cfg_regx: individual register bits
206  * @cfg_regval: full register value
207  *
208  */
209 union aud_cfg {
210         struct {
211                 u32 aud_en:1;
212                 u32 layout:1;
213                 u32 fmt:2;
214                 u32 num_ch:3;
215                 u32 set:1;
216                 u32 flat:1;
217                 u32 val_bit:1;
218                 u32 user_bit:1;
219                 u32 underrun:1;
220                 u32 packet_mode:1;
221                 u32 left_align:1;
222                 u32 bogus_sample:1;
223                 u32 dp_modei:1;
224                 u32 rsvd:16;
225         } cfg_regx;
226         u32 cfg_regval;
227 };
228
229 /**
230  * union aud_ch_status_0 - Audio Channel Status 0 Attributes
231  *
232  * @status_0_regx:individual register bits
233  * @status_0_regval:full register value
234  *
235  */
236 union aud_ch_status_0 {
237         struct {
238                 u32 ch_status:1;
239                 u32 lpcm_id:1;
240                 u32 cp_info:1;
241                 u32 format:3;
242                 u32 mode:2;
243                 u32 ctg_code:8;
244                 u32 src_num:4;
245                 u32 ch_num:4;
246                 u32 samp_freq:4;
247                 u32 clk_acc:2;
248                 u32 rsvd:2;
249         } status_0_regx;
250         u32 status_0_regval;
251 };
252
253 /**
254  * union aud_ch_status_1 - Audio Channel Status 1 Attributes
255  *
256  * @status_1_regx: individual register bits
257  * @status_1_regval: full register value
258  *
259  */
260 union aud_ch_status_1 {
261         struct {
262                 u32 max_wrd_len:1;
263                 u32 wrd_len:3;
264                 u32 rsvd:28;
265                 } status_1_regx;
266         u32 status_1_regval;
267 };
268
269 /**
270  * union aud_hdmi_cts - CTS register
271  *
272  * @cts_regx: individual register bits
273  * @cts_regval: full register value
274  *
275  */
276 union aud_hdmi_cts {
277         struct {
278                 u32 cts_val:24;
279                 u32 en_cts_prog:1;
280                 u32 rsvd:7;
281         } cts_regx;
282         u32 cts_regval;
283 };
284
285 /**
286  * union aud_hdmi_n_enable - N register
287  *
288  * @n_regx: individual register bits
289  * @n_regval: full register value
290  *
291  */
292 union aud_hdmi_n_enable {
293         struct {
294                 u32 n_val:24;
295                 u32 en_n_prog:1;
296                 u32 rsvd:7;
297         } n_regx;
298         u32 n_regval;
299 };
300
301 /**
302  * union aud_buf_config -  Audio Buffer configurations
303  *
304  * @buf_cfg_regx: individual register bits
305  * @buf_cfgval: full register value
306  *
307  */
308 union aud_buf_config {
309         struct {
310                 u32 audio_fifo_watermark:8;
311                 u32 dma_fifo_watermark:3;
312                 u32 rsvd0:5;
313                 u32 aud_delay:8;
314                 u32 rsvd1:8;
315         } buf_cfg_regx;
316         u32 buf_cfgval;
317 };
318
319 /**
320  * union aud_buf_ch_swap - Audio Sample Swapping offset
321  *
322  * @buf_ch_swap_regx: individual register bits
323  * @buf_ch_swap_val: full register value
324  *
325  */
326 union aud_buf_ch_swap {
327         struct {
328                 u32 first_0:3;
329                 u32 second_0:3;
330                 u32 first_1:3;
331                 u32 second_1:3;
332                 u32 first_2:3;
333                 u32 second_2:3;
334                 u32 first_3:3;
335                 u32 second_3:3;
336                 u32 rsvd:8;
337         } buf_ch_swap_regx;
338         u32 buf_ch_swap_val;
339 };
340
341 /**
342  * union aud_buf_addr - Address for Audio Buffer
343  *
344  * @buf_addr_regx: individual register bits
345  * @buf_addr_val: full register value
346  *
347  */
348 union aud_buf_addr {
349         struct {
350                 u32 valid:1;
351                 u32 intr_en:1;
352                 u32 rsvd:4;
353                 u32 addr:26;
354         } buf_addr_regx;
355         u32 buf_addr_val;
356 };
357
358 /**
359  * union aud_buf_len - Length of Audio Buffer
360  *
361  * @buf_len_regx: individual register bits
362  * @buf_len_val: full register value
363  *
364  */
365 union aud_buf_len {
366         struct {
367                 u32 buf_len:20;
368                 u32 rsvd:12;
369         } buf_len_regx;
370         u32 buf_len_val;
371 };
372
373 /**
374  * union aud_ctrl_st - Audio Control State Register offset
375  *
376  * @ctrl_regx: individual register bits
377  * @ctrl_val: full register value
378  *
379  */
380 union aud_ctrl_st {
381         struct {
382                 u32 ram_addr:4;
383                 u32 eld_ack:1;
384                 u32 eld_addr:4;
385                 u32 eld_buf_size:5;
386                 u32 eld_valid:1;
387                 u32 cp_ready:1;
388                 u32 dip_freq:2;
389                 u32 dip_idx:3;
390                 u32 dip_en_sta:4;
391                 u32 rsvd:7;
392         } ctrl_regx;
393         u32 ctrl_val;
394 };
395
396 /**
397  * union aud_info_frame1 - Audio HDMI Widget Data Island Packet offset
398  *
399  * @fr1_regx: individual register bits
400  * @fr1_val: full register value
401  *
402  */
403 union aud_info_frame1 {
404         struct {
405                 u32 pkt_type:8;
406                 u32 ver_num:8;
407                 u32 len:5;
408                 u32 rsvd:11;
409         } fr1_regx;
410         u32 fr1_val;
411 };
412
413 /**
414  * union aud_info_frame2 - DIP frame 2
415  *
416  * @fr2_regx: individual register bits
417  * @fr2_val: full register value
418  *
419  */
420 union aud_info_frame2 {
421         struct {
422                 u32 chksum:8;
423                 u32 chnl_cnt:3;
424                 u32 rsvd0:1;
425                 u32 coding_type:4;
426                 u32 smpl_size:2;
427                 u32 smpl_freq:3;
428                 u32 rsvd1:3;
429                 u32 format:8;
430         } fr2_regx;
431         u32 fr2_val;
432 };
433
434 /**
435  * union aud_info_frame3 - DIP frame 3
436  *
437  * @fr3_regx: individual register bits
438  * @fr3_val: full register value
439  *
440  */
441 union aud_info_frame3 {
442         struct {
443                 u32 chnl_alloc:8;
444                 u32 rsvd0:3;
445                 u32 lsv:4;
446                 u32 dm_inh:1;
447                 u32 rsvd1:16;
448         } fr3_regx;
449         u32 fr3_val;
450 };
451
452 #define HDMI_AUDIO_UNDERRUN     (1UL<<31)
453 #define HDMI_AUDIO_BUFFER_DONE  (1UL<<29)
454
455
456 #define PORT_ENABLE                     (1 << 31)
457 #define SDVO_AUDIO_ENABLE       (1 << 6)
458
459 enum had_caps_list {
460         HAD_GET_ELD = 1,
461         HAD_GET_DISPLAY_RATE,
462         HAD_GET_DP_OUTPUT,
463         HAD_GET_LINK_RATE,
464         HAD_SET_ENABLE_AUDIO,
465         HAD_SET_DISABLE_AUDIO,
466         HAD_SET_ENABLE_AUDIO_INT,
467         HAD_SET_DISABLE_AUDIO_INT,
468 };
469
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,
478 };
479
480 #endif