1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __SOUND_HDAUDIO_EXT_H 3 #define __SOUND_HDAUDIO_EXT_H 4 5 #include <sound/hdaudio.h> 6 7 /** 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, 29 const struct hdac_io_ops *io_ops); 30 31 void snd_hdac_ext_bus_exit(struct hdac_ext_bus *sbus); 32 int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *sbus, int addr); 33 void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev); 34 void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus); 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 40 #define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \ 41 { .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \ 42 .api_version = HDA_DEV_ASOC, \ 43 .driver_data = (unsigned long)(drv_data) } 44 #define HDA_CODEC_EXT_ENTRY(_vid, _revid, _name, _drv_data) \ 45 HDA_CODEC_REV_EXT_ENTRY(_vid, _revid, _name, _drv_data) 46 47 void snd_hdac_ext_bus_ppcap_enable(struct hdac_ext_bus *chip, bool enable); 48 void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_ext_bus *chip, bool enable); 49 50 void snd_hdac_ext_stream_spbcap_enable(struct hdac_ext_bus *chip, 51 bool enable, int index); 52 53 int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *bus); 54 struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *bus, 55 const char *codec_name); 56 57 enum hdac_ext_stream_type { 58 HDAC_EXT_STREAM_TYPE_COUPLED = 0, 59 HDAC_EXT_STREAM_TYPE_HOST, 60 HDAC_EXT_STREAM_TYPE_LINK 61 }; 62 63 /** 64 * hdac_ext_stream: HDAC extended stream for extended HDA caps 65 * 66 * @hstream: hdac_stream 67 * @pphc_addr: processing pipe host stream pointer 68 * @pplc_addr: processing pipe link stream pointer 69 * @spib_addr: software position in buffers stream pointer 70 * @fifo_addr: software position Max fifos stream pointer 71 * @dpibr_addr: DMA position in buffer resume pointer 72 * @dpib: DMA position in buffer 73 * @lpib: Linear position in buffer 74 * @decoupled: stream host and link is decoupled 75 * @link_locked: link is locked 76 * @link_prepared: link is prepared 77 * link_substream: link substream 78 */ 79 struct hdac_ext_stream { 80 struct hdac_stream hstream; 81 82 void __iomem *pphc_addr; 83 void __iomem *pplc_addr; 84 85 void __iomem *spib_addr; 86 void __iomem *fifo_addr; 87 88 void __iomem *dpibr_addr; 89 90 u32 dpib; 91 u32 lpib; 92 bool decoupled:1; 93 bool link_locked:1; 94 bool link_prepared; 95 96 struct snd_pcm_substream *link_substream; 97 }; 98 99 #define hdac_stream(s) (&(s)->hstream) 100 #define stream_to_hdac_ext_stream(s) \ 101 container_of(s, struct hdac_ext_stream, hstream) 102 103 void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus, 104 struct hdac_ext_stream *stream, int idx, 105 int direction, int tag); 106 int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx, 107 int num_stream, int dir); 108 void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus); 109 void snd_hdac_link_free_all(struct hdac_ext_bus *ebus); 110 struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus, 111 struct snd_pcm_substream *substream, 112 int type); 113 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, 115 struct hdac_ext_stream *azx_dev, bool decouple); 116 void snd_hdac_ext_stop_streams(struct hdac_ext_bus *sbus); 117 118 int snd_hdac_ext_stream_set_spib(struct hdac_ext_bus *ebus, 119 struct hdac_ext_stream *stream, u32 value); 120 int snd_hdac_ext_stream_get_spbmaxfifo(struct hdac_ext_bus *ebus, 121 struct hdac_ext_stream *stream); 122 void snd_hdac_ext_stream_drsm_enable(struct hdac_ext_bus *ebus, 123 bool enable, int index); 124 int snd_hdac_ext_stream_set_dpibr(struct hdac_ext_bus *ebus, 125 struct hdac_ext_stream *stream, u32 value); 126 int snd_hdac_ext_stream_set_lpib(struct hdac_ext_stream *stream, u32 value); 127 128 void snd_hdac_ext_link_stream_start(struct hdac_ext_stream *hstream); 129 void snd_hdac_ext_link_stream_clear(struct hdac_ext_stream *hstream); 130 void snd_hdac_ext_link_stream_reset(struct hdac_ext_stream *hstream); 131 int snd_hdac_ext_link_stream_setup(struct hdac_ext_stream *stream, int fmt); 132 133 struct hdac_ext_link { 134 struct hdac_bus *bus; 135 int index; 136 void __iomem *ml_addr; /* link output stream reg pointer */ 137 u32 lcaps; /* link capablities */ 138 u16 lsdiid; /* link sdi identifier */ 139 140 int ref_count; 141 142 struct list_head list; 143 }; 144 145 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); 147 int snd_hdac_ext_bus_link_power_up_all(struct hdac_ext_bus *ebus); 148 int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus); 149 void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link, 150 int stream); 151 void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link, 152 int stream); 153 154 int snd_hdac_ext_bus_link_get(struct hdac_ext_bus *ebus, 155 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 159 /* update register macro */ 160 #define snd_hdac_updatel(addr, reg, mask, val) \ 161 writel(((readl(addr + reg) & ~(mask)) | (val)), \ 162 addr + reg) 163 164 #define snd_hdac_updatew(addr, reg, mask, val) \ 165 writew(((readw(addr + reg) & ~(mask)) | (val)), \ 166 addr + reg) 167 168 169 struct hdac_ext_device; 170 171 /* ops common to all codec drivers */ 172 struct hdac_ext_codec_ops { 173 int (*build_controls)(struct hdac_ext_device *dev); 174 int (*init)(struct hdac_ext_device *dev); 175 void (*free)(struct hdac_ext_device *dev); 176 }; 177 178 struct hda_dai_map { 179 char *dai_name; 180 hda_nid_t nid; 181 u32 maxbps; 182 }; 183 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 { 212 u32 format; 213 u8 stream_tag; 214 }; 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 231 #define to_ehdac_driver(_drv) container_of(_drv, struct hdac_ext_driver, hdac) 232 233 #endif /* __SOUND_HDAUDIO_EXT_H */ 234