1 #ifndef __SOUND_HDAUDIO_EXT_H 2 #define __SOUND_HDAUDIO_EXT_H 3 4 #include <sound/hdaudio.h> 5 6 /** 7 * hdac_ext_bus: HDAC extended bus for extended HDA caps 8 * 9 * @bus: hdac bus 10 * @num_streams: streams supported 11 * @ppcap: pp capabilities pointer 12 * @spbcap: SPIB capabilities pointer 13 * @mlcap: MultiLink capabilities pointer 14 * @gtscap: gts capabilities pointer 15 * @hlink_list: link list of HDA links 16 */ 17 struct hdac_ext_bus { 18 struct hdac_bus bus; 19 int num_streams; 20 int idx; 21 22 void __iomem *ppcap; 23 void __iomem *spbcap; 24 void __iomem *mlcap; 25 void __iomem *gtscap; 26 27 struct list_head hlink_list; 28 }; 29 30 int snd_hdac_ext_bus_init(struct hdac_ext_bus *sbus, struct device *dev, 31 const struct hdac_bus_ops *ops, 32 const struct hdac_io_ops *io_ops); 33 34 void snd_hdac_ext_bus_exit(struct hdac_ext_bus *sbus); 35 int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *sbus, int addr); 36 void snd_hdac_ext_bus_device_exit(struct hdac_device *hdev); 37 38 #define ebus_to_hbus(ebus) (&(ebus)->bus) 39 #define hbus_to_ebus(_bus) \ 40 container_of(_bus, struct hdac_ext_bus, bus) 41 42 int snd_hdac_ext_bus_parse_capabilities(struct hdac_ext_bus *sbus); 43 void snd_hdac_ext_bus_ppcap_enable(struct hdac_ext_bus *chip, bool enable); 44 void snd_hdac_ext_bus_ppcap_int_enable(struct hdac_ext_bus *chip, bool enable); 45 46 void snd_hdac_ext_stream_spbcap_enable(struct hdac_ext_bus *chip, 47 bool enable, int index); 48 49 int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *bus); 50 struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *bus, 51 const char *codec_name); 52 53 enum hdac_ext_stream_type { 54 HDAC_EXT_STREAM_TYPE_COUPLED = 0, 55 HDAC_EXT_STREAM_TYPE_HOST, 56 HDAC_EXT_STREAM_TYPE_LINK 57 }; 58 59 /** 60 * hdac_ext_stream: HDAC extended stream for extended HDA caps 61 * 62 * @hstream: hdac_stream 63 * @pphc_addr: processing pipe host stream pointer 64 * @pplc_addr: processing pipe link stream pointer 65 * @decoupled: stream host and link is decoupled 66 * @link_locked: link is locked 67 * @link_prepared: link is prepared 68 * link_substream: link substream 69 */ 70 struct hdac_ext_stream { 71 struct hdac_stream hstream; 72 73 void __iomem *pphc_addr; 74 void __iomem *pplc_addr; 75 76 bool decoupled:1; 77 bool link_locked:1; 78 bool link_prepared; 79 80 struct snd_pcm_substream *link_substream; 81 }; 82 83 #define hdac_stream(s) (&(s)->hstream) 84 #define stream_to_hdac_ext_stream(s) \ 85 container_of(s, struct hdac_ext_stream, hstream) 86 87 void snd_hdac_ext_stream_init(struct hdac_ext_bus *bus, 88 struct hdac_ext_stream *stream, int idx, 89 int direction, int tag); 90 int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx, 91 int num_stream, int dir); 92 void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus); 93 void snd_hdac_link_free_all(struct hdac_ext_bus *ebus); 94 struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_ext_bus *bus, 95 struct snd_pcm_substream *substream, 96 int type); 97 void snd_hdac_ext_stream_release(struct hdac_ext_stream *azx_dev, int type); 98 void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *bus, 99 struct hdac_ext_stream *azx_dev, bool decouple); 100 void snd_hdac_ext_stop_streams(struct hdac_ext_bus *sbus); 101 102 void snd_hdac_ext_link_stream_start(struct hdac_ext_stream *hstream); 103 void snd_hdac_ext_link_stream_clear(struct hdac_ext_stream *hstream); 104 void snd_hdac_ext_link_stream_reset(struct hdac_ext_stream *hstream); 105 int snd_hdac_ext_link_stream_setup(struct hdac_ext_stream *stream, int fmt); 106 107 struct hdac_ext_link { 108 struct hdac_bus *bus; 109 int index; 110 void __iomem *ml_addr; /* link output stream reg pointer */ 111 u32 lcaps; /* link capablities */ 112 u16 lsdiid; /* link sdi identifier */ 113 struct list_head list; 114 }; 115 116 int snd_hdac_ext_bus_link_power_up(struct hdac_ext_link *link); 117 int snd_hdac_ext_bus_link_power_down(struct hdac_ext_link *link); 118 void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link, 119 int stream); 120 void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link, 121 int stream); 122 123 /* update register macro */ 124 #define snd_hdac_updatel(addr, reg, mask, val) \ 125 writel(((readl(addr + reg) & ~(mask)) | (val)), \ 126 addr + reg) 127 128 #define snd_hdac_updatew(addr, reg, mask, val) \ 129 writew(((readw(addr + reg) & ~(mask)) | (val)), \ 130 addr + reg) 131 132 #endif /* __SOUND_HDAUDIO_EXT_H */ 133