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, 1230b5707cSEduardo Habkost HDA_CODEC_DEVICE) 13dbaa7904SAnthony Liguori 140d936928SAnthony Liguori #define TYPE_HDA_BUS "HDA" 158063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(HDACodecBus, HDA_BUS) 160d936928SAnthony Liguori 17d61a4ce8SGerd Hoffmann 18d61a4ce8SGerd Hoffmann typedef void (*hda_codec_response_func)(HDACodecDevice *dev, 19d61a4ce8SGerd Hoffmann bool solicited, uint32_t response); 20d61a4ce8SGerd Hoffmann typedef bool (*hda_codec_xfer_func)(HDACodecDevice *dev, 21d61a4ce8SGerd Hoffmann uint32_t stnr, bool output, 22d61a4ce8SGerd Hoffmann uint8_t *buf, uint32_t len); 23d61a4ce8SGerd Hoffmann 24d61a4ce8SGerd Hoffmann struct HDACodecBus { 25d61a4ce8SGerd Hoffmann BusState qbus; 26d61a4ce8SGerd Hoffmann uint32_t next_cad; 27d61a4ce8SGerd Hoffmann hda_codec_response_func response; 28d61a4ce8SGerd Hoffmann hda_codec_xfer_func xfer; 29d61a4ce8SGerd Hoffmann }; 30d61a4ce8SGerd Hoffmann 31db1015e9SEduardo Habkost struct HDACodecDeviceClass { 32dbaa7904SAnthony Liguori DeviceClass parent_class; 33d61a4ce8SGerd Hoffmann 34*b7639b7dSMartin Kletzander void (*init)(HDACodecDevice *dev, Error **errp); 355eaa8e1eSZihan Yang void (*exit)(HDACodecDevice *dev); 36d61a4ce8SGerd Hoffmann void (*command)(HDACodecDevice *dev, uint32_t nid, uint32_t data); 37ba43d289SMarc-André Lureau void (*stream)(HDACodecDevice *dev, uint32_t stnr, bool running, bool output); 38db1015e9SEduardo Habkost }; 39dbaa7904SAnthony Liguori 40dbaa7904SAnthony Liguori struct HDACodecDevice { 41dbaa7904SAnthony Liguori DeviceState qdev; 42dbaa7904SAnthony Liguori uint32_t cad; /* codec address */ 43d61a4ce8SGerd Hoffmann }; 44d61a4ce8SGerd Hoffmann 45ab809e84SAndreas Färber void hda_codec_bus_init(DeviceState *dev, HDACodecBus *bus, size_t bus_size, 46d61a4ce8SGerd Hoffmann hda_codec_response_func response, 47d61a4ce8SGerd Hoffmann hda_codec_xfer_func xfer); 48d61a4ce8SGerd Hoffmann HDACodecDevice *hda_codec_find(HDACodecBus *bus, uint32_t cad); 49d61a4ce8SGerd Hoffmann 50d61a4ce8SGerd Hoffmann void hda_codec_response(HDACodecDevice *dev, bool solicited, uint32_t response); 51d61a4ce8SGerd Hoffmann bool hda_codec_xfer(HDACodecDevice *dev, uint32_t stnr, bool output, 52d61a4ce8SGerd Hoffmann uint8_t *buf, uint32_t len); 53d61a4ce8SGerd Hoffmann 54d61a4ce8SGerd Hoffmann /* --------------------------------------------------------------------- */ 55d61a4ce8SGerd Hoffmann 56d61a4ce8SGerd Hoffmann #define dprint(_dev, _level, _fmt, ...) \ 57d61a4ce8SGerd Hoffmann do { \ 58d61a4ce8SGerd Hoffmann if (_dev->debug >= _level) { \ 59d61a4ce8SGerd Hoffmann fprintf(stderr, "%s: ", _dev->name); \ 60d61a4ce8SGerd Hoffmann fprintf(stderr, _fmt, ## __VA_ARGS__); \ 61d61a4ce8SGerd Hoffmann } \ 62d61a4ce8SGerd Hoffmann } while (0) 63d61a4ce8SGerd Hoffmann 64d61a4ce8SGerd Hoffmann /* --------------------------------------------------------------------- */ 65d61a4ce8SGerd Hoffmann 66d61a4ce8SGerd Hoffmann #endif 67