1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include "qemu/osdep.h"
19#include "qapi/error.h"
20#include "qemu/module.h"
21#include "hw/qdev-properties.h"
22#include "hw/sd/sdhci.h"
23#include "sdhci-internal.h"
24
25static Property sdhci_pci_properties[] = {
26 DEFINE_SDHCI_COMMON_PROPERTIES(SDHCIState),
27 DEFINE_PROP_END_OF_LIST(),
28};
29
30static void sdhci_pci_realize(PCIDevice *dev, Error **errp)
31{
32 ERRP_GUARD();
33 SDHCIState *s = PCI_SDHCI(dev);
34
35 sdhci_initfn(s);
36 sdhci_common_realize(s, errp);
37 if (*errp) {
38 return;
39 }
40
41 dev->config[PCI_CLASS_PROG] = 0x01;
42 dev->config[PCI_INTERRUPT_PIN] = 0x01;
43 s->irq = pci_allocate_irq(dev);
44 s->dma_as = pci_get_address_space(dev);
45 pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->iomem);
46}
47
48static void sdhci_pci_exit(PCIDevice *dev)
49{
50 SDHCIState *s = PCI_SDHCI(dev);
51
52 sdhci_common_unrealize(s);
53 sdhci_uninitfn(s);
54}
55
56static void sdhci_pci_class_init(ObjectClass *klass, void *data)
57{
58 DeviceClass *dc = DEVICE_CLASS(klass);
59 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
60
61 k->realize = sdhci_pci_realize;
62 k->exit = sdhci_pci_exit;
63 k->vendor_id = PCI_VENDOR_ID_REDHAT;
64 k->device_id = PCI_DEVICE_ID_REDHAT_SDHCI;
65 k->class_id = PCI_CLASS_SYSTEM_SDHCI;
66 device_class_set_props(dc, sdhci_pci_properties);
67
68 sdhci_common_class_init(klass, data);
69}
70
71static const TypeInfo sdhci_pci_info = {
72 .name = TYPE_PCI_SDHCI,
73 .parent = TYPE_PCI_DEVICE,
74 .instance_size = sizeof(SDHCIState),
75 .class_init = sdhci_pci_class_init,
76 .interfaces = (InterfaceInfo[]) {
77 { INTERFACE_CONVENTIONAL_PCI_DEVICE },
78 { },
79 },
80};
81
82static void sdhci_pci_register_type(void)
83{
84 type_register_static(&sdhci_pci_info);
85}
86
87type_init(sdhci_pci_register_type)
88