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