Patchwork [RFC,v3,34/56] es1370: convert to memory API

login
register
mail settings
Submitter Avi Kivity
Date July 10, 2011, 6:14 p.m.
Message ID <1310321709-30770-35-git-send-email-avi@redhat.com>
Download mbox | patch
Permalink /patch/104095/
State New
Headers show

Comments

Avi Kivity - July 10, 2011, 6:14 p.m.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
 hw/es1370.c |   62 ++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 43 insertions(+), 19 deletions(-)

Patch

diff --git a/hw/es1370.c b/hw/es1370.c
index 1ed62b7..a696eb2 100644
--- a/hw/es1370.c
+++ b/hw/es1370.c
@@ -268,6 +268,7 @@  struct chan {
 typedef struct ES1370State {
     PCIDevice dev;
     QEMUSoundCard card;
+    MemoryRegion io;
     struct chan chan[NB_CHANNELS];
     SWVoiceOut *dac_voice[2];
     SWVoiceIn *adc_voice;
@@ -775,6 +776,37 @@  IO_READ_PROTO (es1370_readl)
     return val;
 }
 
+static uint64_t es1370_read(void *opaque, target_phys_addr_t addr,
+                            unsigned size)
+{
+    ES1370State *s = opaque;
+
+    switch (addr) {
+    case 1: return es1370_readb(s, addr);
+    case 2: return es1370_readw(s, addr);
+    case 4: return es1370_readl(s, addr);
+    default: abort();
+    }
+}
+
+static void es1370_write(void *opaque, target_phys_addr_t addr,
+                         uint64_t data, unsigned size)
+{
+    ES1370State *s = opaque;
+
+    switch (addr) {
+    case 1: return es1370_writeb(s, addr, data);
+    case 2: return es1370_writew(s, addr, data);
+    case 4: return es1370_writel(s, addr, data);
+    default: abort();
+    }
+}
+
+static MemoryRegionOps es1370_io_ops = {
+    .read = es1370_read,
+    .write = es1370_write,
+    .endianness = DEVICE_LITTLE_ENDIAN,
+};
 
 static void es1370_transfer_audio (ES1370State *s, struct chan *d, int loop_sel,
                                    int max, int *irq)
@@ -906,24 +938,6 @@  static void es1370_adc_callback (void *opaque, int avail)
     es1370_run_channel (s, ADC_CHANNEL, avail);
 }
 
-static void es1370_map (PCIDevice *pci_dev, int region_num,
-                        pcibus_t addr, pcibus_t size, int type)
-{
-    ES1370State *s = DO_UPCAST (ES1370State, dev, pci_dev);
-
-    (void) region_num;
-    (void) size;
-    (void) type;
-
-    register_ioport_write (addr, 0x40 * 4, 1, es1370_writeb, s);
-    register_ioport_write (addr, 0x40 * 2, 2, es1370_writew, s);
-    register_ioport_write (addr, 0x40, 4, es1370_writel, s);
-
-    register_ioport_read (addr, 0x40 * 4, 1, es1370_readb, s);
-    register_ioport_read (addr, 0x40 * 2, 2, es1370_readw, s);
-    register_ioport_read (addr, 0x40, 4, es1370_readl, s);
-}
-
 static const VMStateDescription vmstate_es1370_channel = {
     .name = "es1370_channel",
     .version_id = 2,
@@ -1011,7 +1025,8 @@  static int es1370_initfn (PCIDevice *dev)
     c[PCI_MIN_GNT] = 0x0c;
     c[PCI_MAX_LAT] = 0x80;
 
-    pci_register_bar (&s->dev, 0, 256, PCI_BASE_ADDRESS_SPACE_IO, es1370_map);
+    memory_region_init_io(&s->io, &es1370_io_ops, s, "es1370", 256);
+    pci_register_bar_region(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
     qemu_register_reset (es1370_on_reset, s);
 
     AUD_register_card ("es1370", &s->card);
@@ -1019,6 +1034,14 @@  static int es1370_initfn (PCIDevice *dev)
     return 0;
 }
 
+static int es1370_exitfn(PCIDevice *dev)
+{
+    ES1370State *s = DO_UPCAST (ES1370State, dev, dev);
+
+    memory_region_destroy(&s->io);
+    return 0;
+}
+
 int es1370_init (PCIBus *bus)
 {
     pci_create_simple (bus, -1, "ES1370");
@@ -1031,6 +1054,7 @@  static PCIDeviceInfo es1370_info = {
     .qdev.size    = sizeof (ES1370State),
     .qdev.vmsd    = &vmstate_es1370,
     .init         = es1370_initfn,
+    .exit         = es1370_exitfn,
     .vendor_id    = PCI_VENDOR_ID_ENSONIQ,
     .device_id    = PCI_DEVICE_ID_ENSONIQ_ES1370,
     .class_id     = PCI_CLASS_MULTIMEDIA_AUDIO,