Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/hda/codecs/hdmi/hdmi_local.h
26490 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* HD-audio HDMI codec driver
4
*/
5
6
#ifndef __HDA_HDMI_LOCAL_H
7
#define __HDA_HDMI_LOCAL_H
8
9
#include <sound/core.h>
10
#include <sound/jack.h>
11
#include <sound/hdaudio.h>
12
#include <sound/hda_i915.h>
13
#include <sound/hda_chmap.h>
14
#include <sound/hda_codec.h>
15
#include "hda_local.h"
16
17
struct hdmi_spec_per_cvt {
18
hda_nid_t cvt_nid;
19
bool assigned; /* the stream has been assigned */
20
bool silent_stream; /* silent stream activated */
21
unsigned int channels_min;
22
unsigned int channels_max;
23
u32 rates;
24
u64 formats;
25
unsigned int maxbps;
26
};
27
28
/* max. connections to a widget */
29
#define HDA_MAX_CONNECTIONS 32
30
31
struct hdmi_spec_per_pin {
32
hda_nid_t pin_nid;
33
int dev_id;
34
/* pin idx, different device entries on the same pin use the same idx */
35
int pin_nid_idx;
36
int num_mux_nids;
37
hda_nid_t mux_nids[HDA_MAX_CONNECTIONS];
38
int mux_idx;
39
hda_nid_t cvt_nid;
40
41
struct hda_codec *codec;
42
struct hdmi_eld sink_eld;
43
struct mutex lock;
44
struct delayed_work work;
45
struct hdmi_pcm *pcm; /* pointer to spec->pcm_rec[n] dynamically*/
46
int pcm_idx; /* which pcm is attached. -1 means no pcm is attached */
47
int prev_pcm_idx; /* previously assigned pcm index */
48
int repoll_count;
49
bool setup; /* the stream has been set up by prepare callback */
50
bool silent_stream;
51
int channels; /* current number of channels */
52
bool non_pcm;
53
bool chmap_set; /* channel-map override by ALSA API? */
54
unsigned char chmap[8]; /* ALSA API channel-map */
55
#ifdef CONFIG_SND_PROC_FS
56
struct snd_info_entry *proc_entry;
57
#endif
58
};
59
60
/* operations used by generic code that can be overridden by codec drivers */
61
struct hdmi_ops {
62
int (*pin_get_eld)(struct hda_codec *codec, hda_nid_t pin_nid,
63
int dev_id, unsigned char *buf, int *eld_size);
64
65
void (*pin_setup_infoframe)(struct hda_codec *codec, hda_nid_t pin_nid,
66
int dev_id,
67
int ca, int active_channels, int conn_type);
68
69
/* enable/disable HBR (HD passthrough) */
70
int (*pin_hbr_setup)(struct hda_codec *codec, hda_nid_t pin_nid,
71
int dev_id, bool hbr);
72
73
int (*setup_stream)(struct hda_codec *codec, hda_nid_t cvt_nid,
74
hda_nid_t pin_nid, int dev_id, u32 stream_tag,
75
int format);
76
77
void (*pin_cvt_fixup)(struct hda_codec *codec,
78
struct hdmi_spec_per_pin *per_pin,
79
hda_nid_t cvt_nid);
80
81
void (*silent_stream)(struct hda_codec *codec,
82
struct hdmi_spec_per_pin *per_pin,
83
bool enable);
84
};
85
86
struct hdmi_pcm {
87
struct hda_pcm *pcm;
88
struct snd_jack *jack;
89
struct snd_kcontrol *eld_ctl;
90
};
91
92
enum {
93
SILENT_STREAM_OFF = 0,
94
SILENT_STREAM_KAE, /* use standard HDA Keep-Alive */
95
SILENT_STREAM_I915, /* Intel i915 extension */
96
};
97
98
struct hdmi_spec {
99
struct hda_codec *codec;
100
int num_cvts;
101
struct snd_array cvts; /* struct hdmi_spec_per_cvt */
102
hda_nid_t cvt_nids[4]; /* only for haswell fix */
103
104
/*
105
* num_pins is the number of virtual pins
106
* for example, there are 3 pins, and each pin
107
* has 4 device entries, then the num_pins is 12
108
*/
109
int num_pins;
110
/*
111
* num_nids is the number of real pins
112
* In the above example, num_nids is 3
113
*/
114
int num_nids;
115
/*
116
* dev_num is the number of device entries
117
* on each pin.
118
* In the above example, dev_num is 4
119
*/
120
int dev_num;
121
struct snd_array pins; /* struct hdmi_spec_per_pin */
122
struct hdmi_pcm pcm_rec[8];
123
struct mutex pcm_lock;
124
struct mutex bind_lock; /* for audio component binding */
125
/* pcm_bitmap means which pcms have been assigned to pins*/
126
unsigned long pcm_bitmap;
127
int pcm_used; /* counter of pcm_rec[] */
128
/* bitmap shows whether the pcm is opened in user space
129
* bit 0 means the first playback PCM (PCM3);
130
* bit 1 means the second playback PCM, and so on.
131
*/
132
unsigned long pcm_in_use;
133
134
struct hdmi_eld temp_eld;
135
struct hdmi_ops ops;
136
137
bool dyn_pin_out;
138
bool static_pcm_mapping;
139
/* hdmi interrupt trigger control flag for Nvidia codec */
140
bool hdmi_intr_trig_ctrl;
141
bool nv_dp_workaround; /* workaround DP audio infoframe for Nvidia */
142
143
bool intel_hsw_fixup; /* apply Intel platform-specific fixups */
144
/*
145
* Non-generic VIA/NVIDIA specific
146
*/
147
struct hda_multi_out multiout;
148
struct hda_pcm_stream pcm_playback;
149
150
bool use_acomp_notifier; /* use eld_notify callback for hotplug */
151
bool acomp_registered; /* audio component registered in this driver */
152
bool force_connect; /* force connectivity */
153
struct drm_audio_component_audio_ops drm_audio_ops;
154
int (*port2pin)(struct hda_codec *codec, int port); /* reverse port/pin mapping */
155
156
struct hdac_chmap chmap;
157
hda_nid_t vendor_nid;
158
const int *port_map;
159
int port_num;
160
int silent_stream_type;
161
162
const struct snd_pcm_hw_constraint_list *hw_constraints_channels;
163
};
164
165
#ifdef CONFIG_SND_HDA_COMPONENT
166
static inline bool codec_has_acomp(struct hda_codec *codec)
167
{
168
struct hdmi_spec *spec = codec->spec;
169
170
return spec->use_acomp_notifier;
171
}
172
#else
173
#define codec_has_acomp(codec) false
174
#endif
175
176
struct hdmi_audio_infoframe {
177
u8 type; /* 0x84 */
178
u8 ver; /* 0x01 */
179
u8 len; /* 0x0a */
180
181
u8 checksum;
182
183
u8 CC02_CT47; /* CC in bits 0:2, CT in 4:7 */
184
u8 SS01_SF24;
185
u8 CXT04;
186
u8 CA;
187
u8 LFEPBL01_LSV36_DM_INH7;
188
};
189
190
struct dp_audio_infoframe {
191
u8 type; /* 0x84 */
192
u8 len; /* 0x1b */
193
u8 ver; /* 0x11 << 2 */
194
195
u8 CC02_CT47; /* match with HDMI infoframe from this on */
196
u8 SS01_SF24;
197
u8 CXT04;
198
u8 CA;
199
u8 LFEPBL01_LSV36_DM_INH7;
200
};
201
202
union audio_infoframe {
203
struct hdmi_audio_infoframe hdmi;
204
struct dp_audio_infoframe dp;
205
DECLARE_FLEX_ARRAY(u8, bytes);
206
};
207
208
#ifdef LIMITED_RATE_FMT_SUPPORT
209
/* support only the safe format and rate */
210
#define SUPPORTED_RATES SNDRV_PCM_RATE_48000
211
#define SUPPORTED_MAXBPS 16
212
#define SUPPORTED_FORMATS SNDRV_PCM_FMTBIT_S16_LE
213
#else
214
/* support all rates and formats */
215
#define SUPPORTED_RATES \
216
(SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\
217
SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\
218
SNDRV_PCM_RATE_192000)
219
#define SUPPORTED_MAXBPS 24
220
#define SUPPORTED_FORMATS \
221
(SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE)
222
#endif
223
224
/*
225
* HDMI routines
226
*/
227
228
#define get_pin(spec, idx) \
229
((struct hdmi_spec_per_pin *)snd_array_elem(&spec->pins, idx))
230
#define get_cvt(spec, idx) \
231
((struct hdmi_spec_per_cvt *)snd_array_elem(&spec->cvts, idx))
232
/* obtain hdmi_pcm object assigned to idx */
233
#define get_hdmi_pcm(spec, idx) (&(spec)->pcm_rec[idx])
234
/* obtain hda_pcm object assigned to idx */
235
#define get_pcm_rec(spec, idx) (get_hdmi_pcm(spec, idx)->pcm)
236
237
/* Generic HDMI codec support */
238
int snd_hda_hdmi_generic_alloc(struct hda_codec *codec);
239
int snd_hda_hdmi_parse_codec(struct hda_codec *codec);
240
int snd_hda_hdmi_generic_probe(struct hda_codec *codec);
241
void snd_hda_hdmi_generic_remove(struct hda_codec *codec);
242
243
int snd_hda_hdmi_generic_build_pcms(struct hda_codec *codec);
244
int snd_hda_hdmi_generic_build_controls(struct hda_codec *codec);
245
int snd_hda_hdmi_generic_init(struct hda_codec *codec);
246
int snd_hda_hdmi_generic_suspend(struct hda_codec *codec);
247
int snd_hda_hdmi_generic_resume(struct hda_codec *codec);
248
void snd_hda_hdmi_generic_unsol_event(struct hda_codec *codec, unsigned int res);
249
250
int snd_hda_hdmi_pin_id_to_pin_index(struct hda_codec *codec,
251
hda_nid_t pin_nid, int dev_id);
252
#define pin_id_to_pin_index(codec, pin, dev) \
253
snd_hda_hdmi_pin_id_to_pin_index(codec, pin, dev)
254
int snd_hda_hdmi_generic_init_per_pins(struct hda_codec *codec);
255
void snd_hda_hdmi_generic_spec_free(struct hda_codec *codec);
256
int snd_hda_hdmi_setup_stream(struct hda_codec *codec,
257
hda_nid_t cvt_nid,
258
hda_nid_t pin_nid, int dev_id,
259
u32 stream_tag, int format);
260
261
int snd_hda_hdmi_generic_pcm_prepare(struct hda_pcm_stream *hinfo,
262
struct hda_codec *codec,
263
unsigned int stream_tag,
264
unsigned int format,
265
struct snd_pcm_substream *substream);
266
int snd_hda_hdmi_generic_pcm_cleanup(struct hda_pcm_stream *hinfo,
267
struct hda_codec *codec,
268
struct snd_pcm_substream *substream);
269
270
void snd_hda_hdmi_check_presence_and_report(struct hda_codec *codec,
271
hda_nid_t nid, int dev_id);
272
void snd_hda_hdmi_setup_audio_infoframe(struct hda_codec *codec,
273
struct hdmi_spec_per_pin *per_pin,
274
bool non_pcm);
275
276
/* Audio component support */
277
void snd_hda_hdmi_setup_drm_audio_ops(struct hda_codec *codec,
278
const struct drm_audio_component_audio_ops *ops);
279
void snd_hda_hdmi_acomp_init(struct hda_codec *codec,
280
const struct drm_audio_component_audio_ops *ops,
281
int (*port2pin)(struct hda_codec *, int));
282
void snd_hda_hdmi_acomp_pin_eld_notify(void *audio_ptr, int port, int dev_id);
283
int snd_hda_hdmi_acomp_master_bind(struct device *dev,
284
struct drm_audio_component *acomp);
285
void snd_hda_hdmi_acomp_master_unbind(struct device *dev,
286
struct drm_audio_component *acomp);
287
288
/* Simple / legacy HDMI codec support */
289
int snd_hda_hdmi_simple_probe(struct hda_codec *codec,
290
hda_nid_t cvt_nid, hda_nid_t pin_nid);
291
void snd_hda_hdmi_simple_remove(struct hda_codec *codec);
292
293
int snd_hda_hdmi_simple_build_pcms(struct hda_codec *codec);
294
int snd_hda_hdmi_simple_build_controls(struct hda_codec *codec);
295
int snd_hda_hdmi_simple_init(struct hda_codec *codec);
296
void snd_hda_hdmi_simple_unsol_event(struct hda_codec *codec,
297
unsigned int res);
298
int snd_hda_hdmi_simple_pcm_open(struct hda_pcm_stream *hinfo,
299
struct hda_codec *codec,
300
struct snd_pcm_substream *substream);
301
302
#endif /* __HDA_HDMI_LOCAL_H */
303
304