diff options
Diffstat (limited to 'include/sound/hdaudio_ext.h')
| -rw-r--r-- | include/sound/hdaudio_ext.h | 123 |
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 | /** | 7 | int 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 | */ | ||
| 16 | struct 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 | |||
| 27 | int 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 | ||
| 31 | void snd_hdac_ext_bus_exit(struct hdac_ext_bus *sbus); | 12 | void snd_hdac_ext_bus_exit(struct hdac_bus *bus); |
| 32 | int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *sbus, int addr); | 13 | int snd_hdac_ext_bus_device_init(struct hdac_bus *bus, int addr, |
| 14 | struct hdac_device *hdev); | ||
| 33 | void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev); | 15 | void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev); |
| 34 | void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus); | 16 | void 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 | ||
| 47 | void snd_hdac_ext_bus_ppcap_enable(struct hdac_ext_bus *chip, bool enable); | 25 | void snd_hdac_ext_bus_ppcap_enable(struct hdac_bus *chip, bool enable); |
| 48 | void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_ext_bus *chip, bool enable); | 26 | void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_bus *chip, bool enable); |
| 49 | 27 | ||
| 50 | void snd_hdac_ext_stream_spbcap_enable(struct hdac_ext_bus *chip, | 28 | void snd_hdac_ext_stream_spbcap_enable(struct hdac_bus *chip, |
| 51 | bool enable, int index); | 29 | bool enable, int index); |
| 52 | 30 | ||
| 53 | int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *bus); | 31 | int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_bus *bus); |
| 54 | struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *bus, | 32 | struct 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 | ||
| 57 | enum hdac_ext_stream_type { | 35 | enum 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 | ||
| 103 | void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus, | 81 | void 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); |
| 106 | int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx, | 84 | int 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); |
| 108 | void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus); | 86 | void snd_hdac_stream_free_all(struct hdac_bus *bus); |
| 109 | void snd_hdac_link_free_all(struct hdac_ext_bus *ebus); | 87 | void snd_hdac_link_free_all(struct hdac_bus *bus); |
| 110 | struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus, | 88 | struct 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); |
| 113 | void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, int type); | 91 | void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, int type); |
| 114 | void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *bus, | 92 | void 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); |
| 116 | void snd_hdac_ext_stop_streams(struct hdac_ext_bus *sbus); | 94 | void snd_hdac_ext_stop_streams(struct hdac_bus *bus); |
| 117 | 95 | ||
| 118 | int snd_hdac_ext_stream_set_spib(struct hdac_ext_bus *ebus, | 96 | int 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); |
| 120 | int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus, | 98 | int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_bus *bus, |
| 121 | struct hdac_ext_stream *stream); | 99 | struct hdac_ext_stream *stream); |
| 122 | void snd_hdac_ext_stream_drsm_enable(struct hdac_ext_bus *ebus, | 100 | void snd_hdac_ext_stream_drsm_enable(struct hdac_bus *bus, |
| 123 | bool enable, int index); | 101 | bool enable, int index); |
| 124 | int snd_hdac_ext_stream_set_dpibr(struct hdac_ext_bus *ebus, | 102 | int 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); |
| 126 | int snd_hdac_ext_stream_set_lpib(struct hdac_ext_stream *stream, u32 value); | 104 | int 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 | ||
| 145 | int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link); | 123 | int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link); |
| 146 | int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link); | 124 | int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link); |
| 147 | int snd_hdac_ext_bus_link_power_up_all(struct hdac_ext_bus *ebus); | 125 | int snd_hdac_ext_bus_link_power_up_all(struct hdac_bus *bus); |
| 148 | int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus); | 126 | int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus); |
| 149 | void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link, | 127 | void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link, |
| 150 | int stream); | 128 | int stream); |
| 151 | void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link, | 129 | void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link, |
| 152 | int stream); | 130 | int stream); |
| 153 | 131 | ||
| 154 | int snd_hdac_ext_bus_link_get(struct hdac_ext_bus *ebus, | 132 | int snd_hdac_ext_bus_link_get(struct hdac_bus *bus, struct hdac_ext_link *link); |
| 155 | struct hdac_ext_link *link); | 133 | int snd_hdac_ext_bus_link_put(struct hdac_bus *bus, struct hdac_ext_link *link); |
| 156 | int 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 | */ | ||
| 195 | struct 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 | |||
| 211 | struct hdac_ext_dma_params { | 160 | struct 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 | */ | ||
| 220 | struct 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 | |||
| 228 | int snd_hda_ext_driver_register(struct hdac_ext_driver *drv); | ||
| 229 | void 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) | 165 | int snd_hda_ext_driver_register(struct hdac_driver *drv); |
| 166 | void snd_hda_ext_driver_unregister(struct hdac_driver *drv); | ||
| 232 | 167 | ||
| 233 | #endif /* __SOUND_HDAUDIO_EXT_H */ | 168 | #endif /* __SOUND_HDAUDIO_EXT_H */ |
