Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
2 | /* |
3 | * For multichannel support |
4 | */ |
5 | |
6 | #ifndef __SOUND_HDA_CHMAP_H |
7 | #define __SOUND_HDA_CHMAP_H |
8 | |
9 | #include <sound/pcm.h> |
10 | #include <sound/hdaudio.h> |
11 | |
12 | |
13 | #define SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE 80 |
14 | |
15 | struct hdac_cea_channel_speaker_allocation { |
16 | int ca_index; |
17 | int speakers[8]; |
18 | |
19 | /* derived values, just for convenience */ |
20 | int channels; |
21 | int spk_mask; |
22 | }; |
23 | struct hdac_chmap; |
24 | |
25 | struct hdac_chmap_ops { |
26 | /* |
27 | * Helpers for producing the channel map TLVs. These can be overridden |
28 | * for devices that have non-standard mapping requirements. |
29 | */ |
30 | int (*chmap_cea_alloc_validate_get_type)(struct hdac_chmap *chmap, |
31 | struct hdac_cea_channel_speaker_allocation *cap, int channels); |
32 | void (*cea_alloc_to_tlv_chmap)(struct hdac_chmap *hchmap, |
33 | struct hdac_cea_channel_speaker_allocation *cap, |
34 | unsigned int *chmap, int channels); |
35 | |
36 | /* check that the user-given chmap is supported */ |
37 | int (*chmap_validate)(struct hdac_chmap *hchmap, int ca, |
38 | int channels, unsigned char *chmap); |
39 | |
40 | int (*get_spk_alloc)(struct hdac_device *hdac, int pcm_idx); |
41 | |
42 | void (*get_chmap)(struct hdac_device *hdac, int pcm_idx, |
43 | unsigned char *chmap); |
44 | void (*set_chmap)(struct hdac_device *hdac, int pcm_idx, |
45 | unsigned char *chmap, int prepared); |
46 | bool (*is_pcm_attached)(struct hdac_device *hdac, int pcm_idx); |
47 | |
48 | /* get and set channel assigned to each HDMI ASP (audio sample packet) slot */ |
49 | int (*pin_get_slot_channel)(struct hdac_device *codec, |
50 | hda_nid_t pin_nid, int asp_slot); |
51 | int (*pin_set_slot_channel)(struct hdac_device *codec, |
52 | hda_nid_t pin_nid, int asp_slot, int channel); |
53 | void (*set_channel_count)(struct hdac_device *codec, |
54 | hda_nid_t cvt_nid, int chs); |
55 | }; |
56 | |
57 | struct hdac_chmap { |
58 | unsigned int channels_max; /* max over all cvts */ |
59 | struct hdac_chmap_ops ops; |
60 | struct hdac_device *hdac; |
61 | }; |
62 | |
63 | void snd_hdac_register_chmap_ops(struct hdac_device *hdac, |
64 | struct hdac_chmap *chmap); |
65 | int snd_hdac_channel_allocation(struct hdac_device *hdac, int spk_alloc, |
66 | int channels, bool chmap_set, |
67 | bool non_pcm, unsigned char *map); |
68 | int snd_hdac_get_active_channels(int ca); |
69 | void snd_hdac_setup_channel_mapping(struct hdac_chmap *chmap, |
70 | hda_nid_t pin_nid, bool non_pcm, int ca, |
71 | int channels, unsigned char *map, |
72 | bool chmap_set); |
73 | void snd_hdac_print_channel_allocation(int spk_alloc, char *buf, int buflen); |
74 | struct hdac_cea_channel_speaker_allocation *snd_hdac_get_ch_alloc_from_ca(int ca); |
75 | int snd_hdac_chmap_to_spk_mask(unsigned char c); |
76 | int snd_hdac_spk_to_chmap(int spk); |
77 | int snd_hdac_add_chmap_ctls(struct snd_pcm *pcm, int pcm_idx, |
78 | struct hdac_chmap *chmap); |
79 | #endif /* __SOUND_HDA_CHMAP_H */ |
80 |
Warning: This file is not a C or C++ file. It does not have highlighting.