147b43a1fSPaolo Bonzini #ifndef HW_INTEL_HDA_H 247b43a1fSPaolo Bonzini #define HW_INTEL_HDA_H 347b43a1fSPaolo Bonzini 447b43a1fSPaolo Bonzini #include "hw/qdev.h" 547b43a1fSPaolo Bonzini 647b43a1fSPaolo Bonzini /* --------------------------------------------------------------------- */ 747b43a1fSPaolo Bonzini /* hda bus */ 847b43a1fSPaolo Bonzini 947b43a1fSPaolo Bonzini #define TYPE_HDA_CODEC_DEVICE "hda-codec" 1047b43a1fSPaolo Bonzini #define HDA_CODEC_DEVICE(obj) \ 1147b43a1fSPaolo Bonzini OBJECT_CHECK(HDACodecDevice, (obj), TYPE_HDA_CODEC_DEVICE) 1247b43a1fSPaolo Bonzini #define HDA_CODEC_DEVICE_CLASS(klass) \ 1347b43a1fSPaolo Bonzini OBJECT_CLASS_CHECK(HDACodecDeviceClass, (klass), TYPE_HDA_CODEC_DEVICE) 1447b43a1fSPaolo Bonzini #define HDA_CODEC_DEVICE_GET_CLASS(obj) \ 1547b43a1fSPaolo Bonzini OBJECT_GET_CLASS(HDACodecDeviceClass, (obj), TYPE_HDA_CODEC_DEVICE) 1647b43a1fSPaolo Bonzini 1747b43a1fSPaolo Bonzini #define TYPE_HDA_BUS "HDA" 1847b43a1fSPaolo Bonzini #define HDA_BUS(obj) OBJECT_CHECK(HDACodecBus, (obj), TYPE_HDA_BUS) 1947b43a1fSPaolo Bonzini 2047b43a1fSPaolo Bonzini typedef struct HDACodecBus HDACodecBus; 2147b43a1fSPaolo Bonzini typedef struct HDACodecDevice HDACodecDevice; 2247b43a1fSPaolo Bonzini 2347b43a1fSPaolo Bonzini typedef void (*hda_codec_response_func)(HDACodecDevice *dev, 2447b43a1fSPaolo Bonzini bool solicited, uint32_t response); 2547b43a1fSPaolo Bonzini typedef bool (*hda_codec_xfer_func)(HDACodecDevice *dev, 2647b43a1fSPaolo Bonzini uint32_t stnr, bool output, 2747b43a1fSPaolo Bonzini uint8_t *buf, uint32_t len); 2847b43a1fSPaolo Bonzini 2947b43a1fSPaolo Bonzini struct HDACodecBus { 3047b43a1fSPaolo Bonzini BusState qbus; 3147b43a1fSPaolo Bonzini uint32_t next_cad; 3247b43a1fSPaolo Bonzini hda_codec_response_func response; 3347b43a1fSPaolo Bonzini hda_codec_xfer_func xfer; 3447b43a1fSPaolo Bonzini }; 3547b43a1fSPaolo Bonzini 3647b43a1fSPaolo Bonzini typedef struct HDACodecDeviceClass 3747b43a1fSPaolo Bonzini { 3847b43a1fSPaolo Bonzini DeviceClass parent_class; 3947b43a1fSPaolo Bonzini 4047b43a1fSPaolo Bonzini int (*init)(HDACodecDevice *dev); 41*5eaa8e1eSZihan Yang void (*exit)(HDACodecDevice *dev); 4247b43a1fSPaolo Bonzini void (*command)(HDACodecDevice *dev, uint32_t nid, uint32_t data); 4347b43a1fSPaolo Bonzini void (*stream)(HDACodecDevice *dev, uint32_t stnr, bool running, bool output); 4447b43a1fSPaolo Bonzini } HDACodecDeviceClass; 4547b43a1fSPaolo Bonzini 4647b43a1fSPaolo Bonzini struct HDACodecDevice { 4747b43a1fSPaolo Bonzini DeviceState qdev; 4847b43a1fSPaolo Bonzini uint32_t cad; /* codec address */ 4947b43a1fSPaolo Bonzini }; 5047b43a1fSPaolo Bonzini 51ab809e84SAndreas Färber void hda_codec_bus_init(DeviceState *dev, HDACodecBus *bus, size_t bus_size, 5247b43a1fSPaolo Bonzini hda_codec_response_func response, 5347b43a1fSPaolo Bonzini hda_codec_xfer_func xfer); 5447b43a1fSPaolo Bonzini HDACodecDevice *hda_codec_find(HDACodecBus *bus, uint32_t cad); 5547b43a1fSPaolo Bonzini 5647b43a1fSPaolo Bonzini void hda_codec_response(HDACodecDevice *dev, bool solicited, uint32_t response); 5747b43a1fSPaolo Bonzini bool hda_codec_xfer(HDACodecDevice *dev, uint32_t stnr, bool output, 5847b43a1fSPaolo Bonzini uint8_t *buf, uint32_t len); 5947b43a1fSPaolo Bonzini 6047b43a1fSPaolo Bonzini /* --------------------------------------------------------------------- */ 6147b43a1fSPaolo Bonzini 6247b43a1fSPaolo Bonzini #define dprint(_dev, _level, _fmt, ...) \ 6347b43a1fSPaolo Bonzini do { \ 6447b43a1fSPaolo Bonzini if (_dev->debug >= _level) { \ 6547b43a1fSPaolo Bonzini fprintf(stderr, "%s: ", _dev->name); \ 6647b43a1fSPaolo Bonzini fprintf(stderr, _fmt, ## __VA_ARGS__); \ 6747b43a1fSPaolo Bonzini } \ 6847b43a1fSPaolo Bonzini } while (0) 6947b43a1fSPaolo Bonzini 7047b43a1fSPaolo Bonzini /* --------------------------------------------------------------------- */ 7147b43a1fSPaolo Bonzini 7247b43a1fSPaolo Bonzini #endif 73