aboutsummaryrefslogtreecommitdiffstats
path: root/include/sound/hdaudio_ext.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/sound/hdaudio_ext.h')
-rw-r--r--include/sound/hdaudio_ext.h123
1 files changed, 29 insertions, 94 deletions
diff --git a/include/sound/hdaudio_ext.h b/include/sound/hdaudio_ext.h
index 9c14e21dda85..f34aced69ca8 100644
--- a/include/sound/hdaudio_ext.h
+++ b/include/sound/hdaudio_ext.h
@@ -4,38 +4,16 @@
4 4
5#include <sound/hdaudio.h> 5#include <sound/hdaudio.h>
6 6
7/** 7int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev,
8 * hdac_ext_bus: HDAC extended bus for extended HDA caps
9 *
10 * @bus: hdac bus
11 * @num_streams: streams supported
12 * @hlink_list: link list of HDA links
13 * @lock: lock for link mgmt
14 * @cmd_dma_state: state of cmd DMAs: CORB and RIRB
15 */
16struct hdac_ext_bus {
17 struct hdac_bus bus;
18 int num_streams;
19 int idx;
20
21 struct list_head hlink_list;
22
23 struct mutex lock;
24 bool cmd_dma_state;
25};
26
27int snd_hdac_ext_bus_init(struct hdac_ext_bus *sbus, struct device *dev,
28 const struct hdac_bus_ops *ops, 8 const struct hdac_bus_ops *ops,
29 const struct hdac_io_ops *io_ops); 9 const struct hdac_io_ops *io_ops,
10 const struct hdac_ext_bus_ops *ext_ops);
30 11
31void snd_hdac_ext_bus_exit(struct hdac_ext_bus *sbus); 12void snd_hdac_ext_bus_exit(struct hdac_bus *bus);
32int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *sbus, int addr); 13int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr,
14 struct hdac_device *hdev);
33void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev); 15void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev);
34void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus); 16void snd_hdac_ext_bus_device_remove(struct hdac_bus *bus);
35
36#define ebus_to_hbus(ebus) (&(ebus)->bus)
37#define hbus_to_ebus(_bus) \
38 container_of(_bus, struct hdac_ext_bus, bus)
39 17
40#define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \ 18#define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \
41 { .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \ 19 { .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \
@@ -44,14 +22,14 @@ void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus);
44#define HDA_CODEC_EXT_ENTRY(_vid, _revid, _name, _drv_data) \ 22#define HDA_CODEC_EXT_ENTRY(_vid, _revid, _name, _drv_data) \
45 HDA_CODEC_REV_EXT_ENTRY(_vid, _revid, _name, _drv_data) 23 HDA_CODEC_REV_EXT_ENTRY(_vid, _revid, _name, _drv_data)
46 24
47void snd_hdac_ext_bus_ppcap_enable(struct hdac_ext_bus *chip, bool enable); 25void snd_hdac_ext_bus_ppcap_enable(struct hdac_bus *chip, bool enable);
48void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_ext_bus *chip, bool enable); 26void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_bus *chip, bool enable);
49 27
50void snd_hdac_ext_stream_spbcap_enable(struct hdac_ext_bus *chip, 28void snd_hdac_ext_stream_spbcap_enable(struct hdac_bus *chip,
51 bool enable, int index); 29 bool enable, int index);
52 30
53int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *bus); 31int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_bus *bus);
54struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *bus, 32struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_bus *bus,
55 const char *codec_name); 33 const char *codec_name);
56 34
57enum hdac_ext_stream_type { 35enum hdac_ext_stream_type {
@@ -100,28 +78,28 @@ struct hdac_ext_stream {
100#define stream_to_hdac_ext_stream(s) \ 78#define stream_to_hdac_ext_stream(s) \
101 container_of(s, struct hdac_ext_stream, hstream) 79 container_of(s, struct hdac_ext_stream, hstream)
102 80
103void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus, 81void snd_hdac_ext_stream_init(struct hdac_bus *bus,
104 struct hdac_ext_stream *stream, int idx, 82 struct hdac_ext_stream *stream, int idx,
105 int direction, int tag); 83 int direction, int tag);
106int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx, 84int snd_hdac_ext_stream_init_all(struct hdac_bus *bus, int start_idx,
107 int num_stream, int dir); 85 int num_stream, int dir);
108void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus); 86void snd_hdac_stream_free_all(struct hdac_bus *bus);
109void snd_hdac_link_free_all(struct hdac_ext_bus *ebus); 87void snd_hdac_link_free_all(struct hdac_bus *bus);
110struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus, 88struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_bus *bus,
111 struct snd_pcm_substream *substream, 89 struct snd_pcm_substream *substream,
112 int type); 90 int type);
113void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, int type); 91void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, int type);
114void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *bus, 92void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
115 struct hdac_ext_stream *azx_dev, bool decouple); 93 struct hdac_ext_stream *azx_dev, bool decouple);
116void snd_hdac_ext_stop_streams(struct hdac_ext_bus *sbus); 94void snd_hdac_ext_stop_streams(struct hdac_bus *bus);
117 95
118int snd_hdac_ext_stream_set_spib(struct hdac_ext_bus *ebus, 96int snd_hdac_ext_stream_set_spib(struct hdac_bus *bus,
119 struct hdac_ext_stream *stream, u32 value); 97 struct hdac_ext_stream *stream, u32 value);
120int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus, 98int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_bus *bus,
121 struct hdac_ext_stream *stream); 99 struct hdac_ext_stream *stream);
122void snd_hdac_ext_stream_drsm_enable(struct hdac_ext_bus *ebus, 100void snd_hdac_ext_stream_drsm_enable(struct hdac_bus *bus,
123 bool enable, int index); 101 bool enable, int index);
124int snd_hdac_ext_stream_set_dpibr(struct hdac_ext_bus *ebus, 102int snd_hdac_ext_stream_set_dpibr(struct hdac_bus *bus,
125 struct hdac_ext_stream *stream, u32 value); 103 struct hdac_ext_stream *stream, u32 value);
126int snd_hdac_ext_stream_set_lpib(struct hdac_ext_stream *stream, u32 value); 104int snd_hdac_ext_stream_set_lpib(struct hdac_ext_stream *stream, u32 value);
127 105
@@ -144,17 +122,15 @@ struct hdac_ext_link {
144 122
145int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link); 123int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link);
146int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link); 124int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link);
147int snd_hdac_ext_bus_link_power_up_all(struct hdac_ext_bus *ebus); 125int snd_hdac_ext_bus_link_power_up_all(struct hdac_bus *bus);
148int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus); 126int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus);
149void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link, 127void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link,
150 int stream); 128 int stream);
151void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link, 129void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
152 int stream); 130 int stream);
153 131
154int snd_hdac_ext_bus_link_get(struct hdac_ext_bus *ebus, 132int snd_hdac_ext_bus_link_get(struct hdac_bus *bus, struct hdac_ext_link *link);
155 struct hdac_ext_link *link); 133int snd_hdac_ext_bus_link_put(struct hdac_bus *bus, struct hdac_ext_link *link);
156int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
157 struct hdac_ext_link *link);
158 134
159/* update register macro */ 135/* update register macro */
160#define snd_hdac_updatel(addr, reg, mask, val) \ 136#define snd_hdac_updatel(addr, reg, mask, val) \
@@ -181,53 +157,12 @@ struct hda_dai_map {
181 u32 maxbps; 157 u32 maxbps;
182}; 158};
183 159
184#define HDA_MAX_NIDS 16
185
186/**
187 * struct hdac_ext_device - HDAC Ext device
188 *
189 * @hdac: hdac core device
190 * @nid_list - the dai map which matches the dai-name with the nid
191 * @map_cur_idx - the idx in use in dai_map
192 * @ops - the hda codec ops common to all codec drivers
193 * @pvt_data - private data, for asoc contains asoc codec object
194 */
195struct hdac_ext_device {
196 struct hdac_device hdev;
197 struct hdac_ext_bus *ebus;
198
199 /* soc-dai to nid map */
200 struct hda_dai_map nid_list[HDA_MAX_NIDS];
201 unsigned int map_cur_idx;
202
203 /* codec ops */
204 struct hdac_ext_codec_ops ops;
205
206 struct snd_card *card;
207 void *scodec;
208 void *private_data;
209};
210
211struct hdac_ext_dma_params { 160struct hdac_ext_dma_params {
212 u32 format; 161 u32 format;
213 u8 stream_tag; 162 u8 stream_tag;
214}; 163};
215#define to_ehdac_device(dev) (container_of((dev), \
216 struct hdac_ext_device, hdev))
217/*
218 * HD-audio codec base driver
219 */
220struct hdac_ext_driver {
221 struct hdac_driver hdac;
222
223 int (*probe)(struct hdac_ext_device *dev);
224 int (*remove)(struct hdac_ext_device *dev);
225 void (*shutdown)(struct hdac_ext_device *dev);
226};
227
228int snd_hda_ext_driver_register(struct hdac_ext_driver *drv);
229void snd_hda_ext_driver_unregister(struct hdac_ext_driver *drv);
230 164
231#define to_ehdac_driver(_drv) container_of(_drv, struct hdac_ext_driver, hdac) 165int snd_hda_ext_driver_register(struct hdac_driver *drv);
166void snd_hda_ext_driver_unregister(struct hdac_driver *drv);
232 167
233#endif /* __SOUND_HDAUDIO_EXT_H */ 168#endif /* __SOUND_HDAUDIO_EXT_H */