mirror of
https://git.proxmox.com/git/qemu
synced 2025-07-20 12:08:44 +00:00
intel-hda: exit cleanup
Add pci exit callback for the intel-hda device and cleanup properly. Also add an exit callback to the HDA bus implementation and make sure it is called on qdev_free(). Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: malc <av1474@comtv.ru>
This commit is contained in:
parent
cfd07e7abb
commit
dc4b9240dc
@ -61,9 +61,20 @@ static int hda_codec_dev_init(DeviceState *qdev, DeviceInfo *base)
|
|||||||
return info->init(dev);
|
return info->init(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hda_codec_dev_exit(DeviceState *qdev)
|
||||||
|
{
|
||||||
|
HDACodecDevice *dev = DO_UPCAST(HDACodecDevice, qdev, qdev);
|
||||||
|
|
||||||
|
if (dev->info->exit) {
|
||||||
|
dev->info->exit(dev);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void hda_codec_register(HDACodecDeviceInfo *info)
|
void hda_codec_register(HDACodecDeviceInfo *info)
|
||||||
{
|
{
|
||||||
info->qdev.init = hda_codec_dev_init;
|
info->qdev.init = hda_codec_dev_init;
|
||||||
|
info->qdev.exit = hda_codec_dev_exit;
|
||||||
info->qdev.bus_info = &hda_codec_bus_info;
|
info->qdev.bus_info = &hda_codec_bus_info;
|
||||||
qdev_register(&info->qdev);
|
qdev_register(&info->qdev);
|
||||||
}
|
}
|
||||||
@ -1137,6 +1148,14 @@ static int intel_hda_init(PCIDevice *pci)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int intel_hda_exit(PCIDevice *pci)
|
||||||
|
{
|
||||||
|
IntelHDAState *d = DO_UPCAST(IntelHDAState, pci, pci);
|
||||||
|
|
||||||
|
cpu_unregister_io_memory(d->mmio_addr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int intel_hda_post_load(void *opaque, int version)
|
static int intel_hda_post_load(void *opaque, int version)
|
||||||
{
|
{
|
||||||
IntelHDAState* d = opaque;
|
IntelHDAState* d = opaque;
|
||||||
@ -1219,6 +1238,7 @@ static PCIDeviceInfo intel_hda_info = {
|
|||||||
.qdev.vmsd = &vmstate_intel_hda,
|
.qdev.vmsd = &vmstate_intel_hda,
|
||||||
.qdev.reset = intel_hda_reset,
|
.qdev.reset = intel_hda_reset,
|
||||||
.init = intel_hda_init,
|
.init = intel_hda_init,
|
||||||
|
.exit = intel_hda_exit,
|
||||||
.qdev.props = (Property[]) {
|
.qdev.props = (Property[]) {
|
||||||
DEFINE_PROP_UINT32("debug", IntelHDAState, debug, 0),
|
DEFINE_PROP_UINT32("debug", IntelHDAState, debug, 0),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
@ -32,6 +32,7 @@ struct HDACodecDevice {
|
|||||||
struct HDACodecDeviceInfo {
|
struct HDACodecDeviceInfo {
|
||||||
DeviceInfo qdev;
|
DeviceInfo qdev;
|
||||||
int (*init)(HDACodecDevice *dev);
|
int (*init)(HDACodecDevice *dev);
|
||||||
|
int (*exit)(HDACodecDevice *dev);
|
||||||
void (*command)(HDACodecDevice *dev, uint32_t nid, uint32_t data);
|
void (*command)(HDACodecDevice *dev, uint32_t nid, uint32_t data);
|
||||||
void (*stream)(HDACodecDevice *dev, uint32_t stnr, bool running);
|
void (*stream)(HDACodecDevice *dev, uint32_t stnr, bool running);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user