Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
67b90cb8 SP |
2 | /* |
3 | * For multichannel support | |
4 | */ | |
5 | ||
6 | #ifndef __SOUND_HDA_CHMAP_H | |
7 | #define __SOUND_HDA_CHMAP_H | |
8 | ||
2f6e8a85 | 9 | #include <sound/pcm.h> |
67b90cb8 SP |
10 | #include <sound/hdaudio.h> |
11 | ||
828cb4ed SP |
12 | |
13 | #define SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE 80 | |
14 | ||
f302240d | 15 | struct hdac_cea_channel_speaker_allocation { |
67b90cb8 SP |
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, | |
f302240d | 31 | struct hdac_cea_channel_speaker_allocation *cap, int channels); |
828cb4ed SP |
32 | void (*cea_alloc_to_tlv_chmap)(struct hdac_chmap *hchmap, |
33 | struct hdac_cea_channel_speaker_allocation *cap, | |
67b90cb8 SP |
34 | unsigned int *chmap, int channels); |
35 | ||
36 | /* check that the user-given chmap is supported */ | |
828cb4ed SP |
37 | int (*chmap_validate)(struct hdac_chmap *hchmap, int ca, |
38 | int channels, unsigned char *chmap); | |
9b3dc8aa | 39 | |
44fde3b8 SP |
40 | int (*get_spk_alloc)(struct hdac_device *hdac, int pcm_idx); |
41 | ||
9b3dc8aa SP |
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); | |
739ffee9 SP |
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); | |
67b90cb8 SP |
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 | ||
739ffee9 SP |
63 | void snd_hdac_register_chmap_ops(struct hdac_device *hdac, |
64 | struct hdac_chmap *chmap); | |
bb63f726 | 65 | int snd_hdac_channel_allocation(struct hdac_device *hdac, int spk_alloc, |
2f6e8a85 SP |
66 | int channels, bool chmap_set, |
67 | bool non_pcm, unsigned char *map); | |
bb63f726 SP |
68 | int snd_hdac_get_active_channels(int ca); |
69 | void snd_hdac_setup_channel_mapping(struct hdac_chmap *chmap, | |
2f6e8a85 SP |
70 | hda_nid_t pin_nid, bool non_pcm, int ca, |
71 | int channels, unsigned char *map, | |
72 | bool chmap_set); | |
bb63f726 SP |
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); | |
2f6e8a85 SP |
77 | int snd_hdac_add_chmap_ctls(struct snd_pcm *pcm, int pcm_idx, |
78 | struct hdac_chmap *chmap); | |
67b90cb8 | 79 | #endif /* __SOUND_HDA_CHMAP_H */ |