aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2025-01-28 10:45:11 +0000
committerPhilippe Mathieu-Daudé <philmd@linaro.org>2025-01-31 19:36:44 +0100
commit68b48857640e4ffce96bdf691de5cb68e96595bf (patch)
tree0ef19664b44073eeb056f1756862f0044084dc2b
parent408ccf5fd60a281b90f846d48d1cf36a14c04232 (diff)
downloadqemu-68b48857640e4ffce96bdf691de5cb68e96595bf.zip
qemu-68b48857640e4ffce96bdf691de5cb68e96595bf.tar.gz
qemu-68b48857640e4ffce96bdf691de5cb68e96595bf.tar.bz2
hw/sd/omap_mmc: Convert output qemu_irqs to gpio and sysbus IRQ APIs
The omap_mmc device has three outbound qemu_irq lines: * one actual interrupt line * two which connect to the DMA controller and are signalled for TX and RX DMA Convert these to a sysbus IRQ and two named GPIO outputs. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20250128104519.3981448-4-peter.maydell@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
-rw-r--r--hw/sd/omap_mmc.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/hw/sd/omap_mmc.c b/hw/sd/omap_mmc.c
index 0f17479..43203a7 100644
--- a/hw/sd/omap_mmc.c
+++ b/hw/sd/omap_mmc.c
@@ -31,7 +31,8 @@ typedef struct OMAPMMCState {
SysBusDevice parent_obj;
qemu_irq irq;
- qemu_irq *dma;
+ qemu_irq dma_tx_gpio;
+ qemu_irq dma_rx_gpio;
qemu_irq coverswitch;
MemoryRegion iomem;
omap_clk clk;
@@ -87,22 +88,22 @@ static void omap_mmc_fifolevel_update(OMAPMMCState *host)
if (host->fifo_len > host->af_level && host->ddir) {
if (host->rx_dma) {
host->status &= 0xfbff;
- qemu_irq_raise(host->dma[1]);
+ qemu_irq_raise(host->dma_rx_gpio);
} else
host->status |= 0x0400;
} else {
host->status &= 0xfbff;
- qemu_irq_lower(host->dma[1]);
+ qemu_irq_lower(host->dma_rx_gpio);
}
if (host->fifo_len < host->ae_level && !host->ddir) {
if (host->tx_dma) {
host->status &= 0xf7ff;
- qemu_irq_raise(host->dma[0]);
+ qemu_irq_raise(host->dma_tx_gpio);
} else
host->status |= 0x0800;
} else {
- qemu_irq_lower(host->dma[0]);
+ qemu_irq_lower(host->dma_tx_gpio);
host->status &= 0xf7ff;
}
}
@@ -601,12 +602,13 @@ DeviceState *omap_mmc_init(hwaddr base,
s = OMAP_MMC(dev);
sysbus_realize_and_unref(SYS_BUS_DEVICE(s), &error_fatal);
- s->irq = irq;
- s->dma = dma;
s->clk = clk;
memory_region_add_subregion(sysmem, base,
sysbus_mmio_get_region(SYS_BUS_DEVICE(s), 0));
+ qdev_connect_gpio_out_named(dev, "dma-tx", 0, dma[0]);
+ qdev_connect_gpio_out_named(dev, "dma-rx", 0, dma[1]);
+ sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq);
/* Instantiate the storage */
s->card = sd_init(blk, false);
@@ -633,6 +635,10 @@ static void omap_mmc_initfn(Object *obj)
memory_region_init_io(&s->iomem, obj, &omap_mmc_ops, s, "omap.mmc", 0x800);
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem);
+
+ sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
+ qdev_init_gpio_out_named(DEVICE(obj), &s->dma_tx_gpio, "dma-tx", 1);
+ qdev_init_gpio_out_named(DEVICE(obj), &s->dma_rx_gpio, "dma-rx", 1);
}
static void omap_mmc_class_init(ObjectClass *oc, void *data)