]>
Commit | Line | Data |
---|---|---|
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 */ |