1d61a4ce8SGerd Hoffmann #ifndef HW_INTEL_HDA_H 2d61a4ce8SGerd Hoffmann #define HW_INTEL_HDA_H 3d61a4ce8SGerd Hoffmann 4a27bd6c7SMarkus Armbruster #include "hw/qdev-core.h" 5db1015e9SEduardo Habkost #include "qom/object.h" 6d61a4ce8SGerd Hoffmann 7d61a4ce8SGerd Hoffmann /* --------------------------------------------------------------------- */ 8d61a4ce8SGerd Hoffmann /* hda bus */ 9d61a4ce8SGerd Hoffmann 10dbaa7904SAnthony Liguori #define TYPE_HDA_CODEC_DEVICE "hda-codec" 11c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(HDACodecDevice, HDACodecDeviceClass, 12*30b5707cSEduardo Habkost HDA_CODEC_DEVICE) 13dbaa7904SAnthony Liguori 140d936928SAnthony Liguori #define TYPE_HDA_BUS "HDA" 15db1015e9SEduardo Habkost typedef struct HDACodecBus HDACodecBus; 168110fa1dSEduardo Habkost DECLARE_INSTANCE_CHECKER(HDACodecBus, HDA_BUS, 178110fa1dSEduardo Habkost TYPE_HDA_BUS) 180d936928SAnthony Liguori 19d61a4ce8SGerd Hoffmann 20d61a4ce8SGerd Hoffmann typedef void (*hda_codec_response_func)(HDACodecDevice *dev, 21d61a4ce8SGerd Hoffmann bool solicited, uint32_t response); 22d61a4ce8SGerd Hoffmann typedef bool (*hda_codec_xfer_func)(HDACodecDevice *dev, 23d61a4ce8SGerd Hoffmann uint32_t stnr, bool output, 24d61a4ce8SGerd Hoffmann uint8_t *buf, uint32_t len); 25d61a4ce8SGerd Hoffmann 26d61a4ce8SGerd Hoffmann struct HDACodecBus { 27d61a4ce8SGerd Hoffmann BusState qbus; 28d61a4ce8SGerd Hoffmann uint32_t next_cad; 29d61a4ce8SGerd Hoffmann hda_codec_response_func response; 30d61a4ce8SGerd Hoffmann hda_codec_xfer_func xfer; 31d61a4ce8SGerd Hoffmann }; 32d61a4ce8SGerd Hoffmann 33db1015e9SEduardo Habkost struct HDACodecDeviceClass { 34dbaa7904SAnthony Liguori DeviceClass parent_class; 35d61a4ce8SGerd Hoffmann 36d61a4ce8SGerd Hoffmann int (*init)(HDACodecDevice *dev); 375eaa8e1eSZihan Yang void (*exit)(HDACodecDevice *dev); 38d61a4ce8SGerd Hoffmann void (*command)(HDACodecDevice *dev, uint32_t nid, uint32_t data); 39ba43d289SMarc-André Lureau void (*stream)(HDACodecDevice *dev, uint32_t stnr, bool running, bool output); 40db1015e9SEduardo Habkost }; 41dbaa7904SAnthony Liguori 42dbaa7904SAnthony Liguori struct HDACodecDevice { 43dbaa7904SAnthony Liguori DeviceState qdev; 44dbaa7904SAnthony Liguori uint32_t cad; /* codec address */ 45d61a4ce8SGerd Hoffmann }; 46d61a4ce8SGerd Hoffmann 47ab809e84SAndreas Färber void hda_codec_bus_init(DeviceState *dev, HDACodecBus *bus, size_t bus_size, 48d61a4ce8SGerd Hoffmann hda_codec_response_func response, 49d61a4ce8SGerd Hoffmann hda_codec_xfer_func xfer); 50d61a4ce8SGerd Hoffmann HDACodecDevice *hda_codec_find(HDACodecBus *bus, uint32_t cad); 51d61a4ce8SGerd Hoffmann 52d61a4ce8SGerd Hoffmann void hda_codec_response(HDACodecDevice *dev, bool solicited, uint32_t response); 53d61a4ce8SGerd Hoffmann bool hda_codec_xfer(HDACodecDevice *dev, uint32_t stnr, bool output, 54d61a4ce8SGerd Hoffmann uint8_t *buf, uint32_t len); 55d61a4ce8SGerd Hoffmann 56d61a4ce8SGerd Hoffmann /* --------------------------------------------------------------------- */ 57d61a4ce8SGerd Hoffmann 58d61a4ce8SGerd Hoffmann #define dprint(_dev, _level, _fmt, ...) \ 59d61a4ce8SGerd Hoffmann do { \ 60d61a4ce8SGerd Hoffmann if (_dev->debug >= _level) { \ 61d61a4ce8SGerd Hoffmann fprintf(stderr, "%s: ", _dev->name); \ 62d61a4ce8SGerd Hoffmann fprintf(stderr, _fmt, ## __VA_ARGS__); \ 63d61a4ce8SGerd Hoffmann } \ 64d61a4ce8SGerd Hoffmann } while (0) 65d61a4ce8SGerd Hoffmann 66d61a4ce8SGerd Hoffmann /* --------------------------------------------------------------------- */ 67d61a4ce8SGerd Hoffmann 68d61a4ce8SGerd Hoffmann #endif 69