]>
Commit | Line | Data |
---|---|---|
5dab11d8 JA |
1 | /* |
2 | * Copyright (C) 2016 Intel Corporation | |
3 | * Authors: Sailaja Bandarupalli <sailaja.bandarupalli@intel.com> | |
4 | * Ramesh Babu K V <ramesh.babu@intel.com> | |
5 | * Vaibhav Agarwal <vaibhav.agarwal@intel.com> | |
6 | * Jerome Anand <jerome.anand@intel.com> | |
7 | * | |
8 | * Permission is hereby granted, free of charge, to any person obtaining | |
9 | * a copy of this software and associated documentation files | |
10 | * (the "Software"), to deal in the Software without restriction, | |
11 | * including without limitation the rights to use, copy, modify, merge, | |
12 | * publish, distribute, sublicense, and/or sell copies of the Software, | |
13 | * and to permit persons to whom the Software is furnished to do so, | |
14 | * subject to the following conditions: | |
15 | * | |
16 | * The above copyright notice and this permission notice (including the | |
17 | * next paragraph) shall be included in all copies or substantial | |
18 | * portions of the Software. | |
19 | * | |
20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
21 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
22 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
23 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | |
24 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |
25 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
26 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
27 | * SOFTWARE. | |
28 | */ | |
29 | ||
30 | #ifndef _INTEL_HDMI_AUDIO_H_ | |
31 | #define _INTEL_HDMI_AUDIO_H_ | |
32 | ||
33 | #include <linux/types.h> | |
34 | #include <sound/initval.h> | |
35 | #include <linux/version.h> | |
36 | #include <linux/pm_runtime.h> | |
37 | #include <sound/asoundef.h> | |
38 | #include <sound/control.h> | |
39 | #include <sound/pcm.h> | |
40 | #include "intel_hdmi_lpe_audio.h" | |
41 | ||
79dda75a TI |
42 | struct platform_device; |
43 | ||
5dab11d8 JA |
44 | #define PCM_INDEX 0 |
45 | #define MAX_PB_STREAMS 1 | |
46 | #define MAX_CAP_STREAMS 0 | |
47 | #define HDMI_AUDIO_DRIVER "hdmi-audio" | |
48 | ||
964ca808 PLB |
49 | #define HDMI_INFO_FRAME_WORD1 0x000a0184 |
50 | #define DP_INFO_FRAME_WORD1 0x00441b84 | |
5dab11d8 JA |
51 | #define FIFO_THRESHOLD 0xFE |
52 | #define DMA_FIFO_THRESHOLD 0x7 | |
53 | #define BYTES_PER_WORD 0x4 | |
54 | ||
55 | /* Sampling rate as per IEC60958 Ver 3 */ | |
56 | #define CH_STATUS_MAP_32KHZ 0x3 | |
57 | #define CH_STATUS_MAP_44KHZ 0x0 | |
58 | #define CH_STATUS_MAP_48KHZ 0x2 | |
59 | #define CH_STATUS_MAP_88KHZ 0x8 | |
60 | #define CH_STATUS_MAP_96KHZ 0xA | |
61 | #define CH_STATUS_MAP_176KHZ 0xC | |
62 | #define CH_STATUS_MAP_192KHZ 0xE | |
63 | ||
64 | #define MAX_SMPL_WIDTH_20 0x0 | |
65 | #define MAX_SMPL_WIDTH_24 0x1 | |
66 | #define SMPL_WIDTH_16BITS 0x1 | |
67 | #define SMPL_WIDTH_24BITS 0x5 | |
68 | #define CHANNEL_ALLOCATION 0x1F | |
69 | #define MASK_BYTE0 0x000000FF | |
70 | #define VALID_DIP_WORDS 3 | |
71 | #define LAYOUT0 0 | |
72 | #define LAYOUT1 1 | |
73 | #define SWAP_LFE_CENTER 0x00fac4c8 | |
74 | #define AUD_CONFIG_CH_MASK_V2 0x70 | |
75 | ||
76 | struct pcm_stream_info { | |
77 | int str_id; | |
78 | void *had_substream; | |
79 | void (*period_elapsed)(void *had_substream); | |
80 | u32 buffer_ptr; | |
81 | u64 buffer_rendered; | |
82 | u32 ring_buf_size; | |
83 | int sfreq; | |
84 | }; | |
85 | ||
86 | struct ring_buf_info { | |
87 | u32 buf_addr; | |
88 | u32 buf_size; | |
89 | u8 is_valid; | |
90 | }; | |
91 | ||
92 | struct had_stream_pvt { | |
93 | enum had_stream_status stream_status; | |
94 | int stream_ops; | |
95 | ssize_t dbg_cum_bytes; | |
96 | }; | |
97 | ||
5647aec2 | 98 | struct had_stream_data { |
5dab11d8 JA |
99 | enum had_status_stream stream_type; |
100 | }; | |
101 | ||
5dab11d8 JA |
102 | /** |
103 | * struct snd_intelhad - intelhad driver structure | |
104 | * | |
105 | * @card: ptr to hold card details | |
106 | * @card_index: sound card index | |
107 | * @card_id: detected sound card id | |
5dab11d8 JA |
108 | * @drv_status: driver status |
109 | * @buf_info: ring buffer info | |
110 | * @stream_info: stream information | |
111 | * @eeld: holds EELD info | |
112 | * @curr_buf: pointer to hold current active ring buf | |
113 | * @valid_buf_cnt: ring buffer count for stream | |
114 | * @had_spinlock: driver lock | |
115 | * @aes_bits: IEC958 status bits | |
116 | * @buff_done: id of current buffer done intr | |
117 | * @dev: platoform device handle | |
118 | * @kctl: holds kctl ptrs used for channel map | |
119 | * @chmap: holds channel map info | |
120 | * @audio_reg_base: hdmi audio register base offset | |
6ddb3ab6 | 121 | * @underrun_count: PCM stream underrun counter |
5dab11d8 JA |
122 | */ |
123 | struct snd_intelhad { | |
124 | struct snd_card *card; | |
125 | int card_index; | |
126 | char *card_id; | |
5dab11d8 JA |
127 | enum had_drv_status drv_status; |
128 | struct ring_buf_info buf_info[HAD_NUM_OF_RING_BUFS]; | |
129 | struct pcm_stream_info stream_info; | |
130 | union otm_hdmi_eld_t eeld; | |
964ca808 | 131 | bool dp_output; |
5dab11d8 JA |
132 | enum intel_had_aud_buf_type curr_buf; |
133 | int valid_buf_cnt; | |
134 | unsigned int aes_bits; | |
135 | int flag_underrun; | |
5647aec2 | 136 | struct had_stream_data stream_data; |
5dab11d8 JA |
137 | spinlock_t had_spinlock; |
138 | enum intel_had_aud_buf_type buff_done; | |
139 | struct device *dev; | |
140 | struct snd_kcontrol *kctl; | |
141 | struct snd_pcm_chmap *chmap; | |
142 | unsigned int *audio_reg_base; | |
143 | unsigned int audio_cfg_offset; | |
6ddb3ab6 | 144 | int underrun_count; |
5dab11d8 JA |
145 | }; |
146 | ||
5dab11d8 JA |
147 | int had_event_handler(enum had_event_type event_type, void *data); |
148 | ||
6f9ecc76 | 149 | int hdmi_audio_suspend(void *drv_data); |
5dab11d8 JA |
150 | int hdmi_audio_resume(void *drv_data); |
151 | int hdmi_audio_mode_change(struct snd_pcm_substream *substream); | |
152 | extern struct snd_pcm_ops snd_intelhad_playback_ops; | |
153 | ||
154 | int snd_intelhad_init_audio_ctrl(struct snd_pcm_substream *substream, | |
155 | struct snd_intelhad *intelhaddata, | |
156 | int flag_silence); | |
157 | int snd_intelhad_prog_buffer(struct snd_intelhad *intelhaddata, | |
158 | int start, int end); | |
159 | int snd_intelhad_invd_buffer(int start, int end); | |
160 | int snd_intelhad_read_len(struct snd_intelhad *intelhaddata); | |
161 | void had_build_channel_allocation_map(struct snd_intelhad *intelhaddata); | |
162 | ||
76296ef0 TI |
163 | void snd_intelhad_enable_audio(struct snd_pcm_substream *substream, u8 enable); |
164 | void snd_intelhad_handle_underrun(struct snd_intelhad *intelhaddata); | |
165 | ||
5dab11d8 JA |
166 | /* Register access functions */ |
167 | int had_get_hwstate(struct snd_intelhad *intelhaddata); | |
79dda75a TI |
168 | int had_get_caps(struct snd_intelhad *intelhaddata, |
169 | enum had_caps_list query_element, void *capabilties); | |
170 | int had_set_caps(struct snd_intelhad *intelhaddata, | |
171 | enum had_caps_list set_element, void *capabilties); | |
172 | int had_read_register(struct snd_intelhad *intelhaddata, | |
173 | u32 reg_addr, u32 *data); | |
174 | int had_write_register(struct snd_intelhad *intelhaddata, | |
175 | u32 reg_addr, u32 data); | |
176 | int had_read_modify(struct snd_intelhad *intelhaddata, | |
177 | u32 reg_addr, u32 data, u32 mask); | |
178 | ||
179 | int hdmi_audio_probe(struct platform_device *devptr, | |
180 | struct snd_intelhad **had_ret); | |
181 | int hdmi_audio_remove(struct snd_intelhad *intelhaddata); | |
5dab11d8 JA |
182 | |
183 | #endif /* _INTEL_HDMI_AUDIO_ */ |