1*d61a4ce8SGerd Hoffmann #ifndef HW_INTEL_HDA_H 2*d61a4ce8SGerd Hoffmann #define HW_INTEL_HDA_H 3*d61a4ce8SGerd Hoffmann 4*d61a4ce8SGerd Hoffmann #include "qdev.h" 5*d61a4ce8SGerd Hoffmann 6*d61a4ce8SGerd Hoffmann /* --------------------------------------------------------------------- */ 7*d61a4ce8SGerd Hoffmann /* hda bus */ 8*d61a4ce8SGerd Hoffmann 9*d61a4ce8SGerd Hoffmann typedef struct HDACodecBus HDACodecBus; 10*d61a4ce8SGerd Hoffmann typedef struct HDACodecDevice HDACodecDevice; 11*d61a4ce8SGerd Hoffmann typedef struct HDACodecDeviceInfo HDACodecDeviceInfo; 12*d61a4ce8SGerd Hoffmann 13*d61a4ce8SGerd Hoffmann typedef void (*hda_codec_response_func)(HDACodecDevice *dev, 14*d61a4ce8SGerd Hoffmann bool solicited, uint32_t response); 15*d61a4ce8SGerd Hoffmann typedef bool (*hda_codec_xfer_func)(HDACodecDevice *dev, 16*d61a4ce8SGerd Hoffmann uint32_t stnr, bool output, 17*d61a4ce8SGerd Hoffmann uint8_t *buf, uint32_t len); 18*d61a4ce8SGerd Hoffmann 19*d61a4ce8SGerd Hoffmann struct HDACodecBus { 20*d61a4ce8SGerd Hoffmann BusState qbus; 21*d61a4ce8SGerd Hoffmann uint32_t next_cad; 22*d61a4ce8SGerd Hoffmann hda_codec_response_func response; 23*d61a4ce8SGerd Hoffmann hda_codec_xfer_func xfer; 24*d61a4ce8SGerd Hoffmann }; 25*d61a4ce8SGerd Hoffmann 26*d61a4ce8SGerd Hoffmann struct HDACodecDevice { 27*d61a4ce8SGerd Hoffmann DeviceState qdev; 28*d61a4ce8SGerd Hoffmann HDACodecDeviceInfo *info; 29*d61a4ce8SGerd Hoffmann uint32_t cad; /* codec address */ 30*d61a4ce8SGerd Hoffmann }; 31*d61a4ce8SGerd Hoffmann 32*d61a4ce8SGerd Hoffmann struct HDACodecDeviceInfo { 33*d61a4ce8SGerd Hoffmann DeviceInfo qdev; 34*d61a4ce8SGerd Hoffmann int (*init)(HDACodecDevice *dev); 35*d61a4ce8SGerd Hoffmann void (*command)(HDACodecDevice *dev, uint32_t nid, uint32_t data); 36*d61a4ce8SGerd Hoffmann void (*stream)(HDACodecDevice *dev, uint32_t stnr, bool running); 37*d61a4ce8SGerd Hoffmann }; 38*d61a4ce8SGerd Hoffmann 39*d61a4ce8SGerd Hoffmann void hda_codec_bus_init(DeviceState *dev, HDACodecBus *bus, 40*d61a4ce8SGerd Hoffmann hda_codec_response_func response, 41*d61a4ce8SGerd Hoffmann hda_codec_xfer_func xfer); 42*d61a4ce8SGerd Hoffmann void hda_codec_register(HDACodecDeviceInfo *info); 43*d61a4ce8SGerd Hoffmann HDACodecDevice *hda_codec_find(HDACodecBus *bus, uint32_t cad); 44*d61a4ce8SGerd Hoffmann 45*d61a4ce8SGerd Hoffmann void hda_codec_response(HDACodecDevice *dev, bool solicited, uint32_t response); 46*d61a4ce8SGerd Hoffmann bool hda_codec_xfer(HDACodecDevice *dev, uint32_t stnr, bool output, 47*d61a4ce8SGerd Hoffmann uint8_t *buf, uint32_t len); 48*d61a4ce8SGerd Hoffmann 49*d61a4ce8SGerd Hoffmann /* --------------------------------------------------------------------- */ 50*d61a4ce8SGerd Hoffmann 51*d61a4ce8SGerd Hoffmann #define dprint(_dev, _level, _fmt, ...) \ 52*d61a4ce8SGerd Hoffmann do { \ 53*d61a4ce8SGerd Hoffmann if (_dev->debug >= _level) { \ 54*d61a4ce8SGerd Hoffmann fprintf(stderr, "%s: ", _dev->name); \ 55*d61a4ce8SGerd Hoffmann fprintf(stderr, _fmt, ## __VA_ARGS__); \ 56*d61a4ce8SGerd Hoffmann } \ 57*d61a4ce8SGerd Hoffmann } while (0) 58*d61a4ce8SGerd Hoffmann 59*d61a4ce8SGerd Hoffmann /* --------------------------------------------------------------------- */ 60*d61a4ce8SGerd Hoffmann 61*d61a4ce8SGerd Hoffmann #endif 62