aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2011-02-21 20:57:53 +0000
committerAurelien Jarno <aurelien@aurel32.net>2011-03-06 19:01:31 +0100
commit26883c699eee60c6f2dd63818a9dd470f2c567fc (patch)
tree8065fde1ee3f48d9e07248fcae3d715747d7209b
parent9793212bb02b9fdc2de188a42b93b17ca2689c9a (diff)
hw/realview: Wire up the MMC card status
Instantiate the three PL061 GPIO modules the realview boards have. Connect the MMC card status outputs of the PL181 MMC controller to both the system registers and the GPIO module which handles internal devices. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r--hw/realview.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/hw/realview.c b/hw/realview.c
index 6eb6c6a1f1..466b210c32 100644
--- a/hw/realview.c
+++ b/hw/realview.c
@@ -138,10 +138,11 @@ static void realview_init(ram_addr_t ram_size,
{
CPUState *env = NULL;
ram_addr_t ram_offset;
- DeviceState *dev;
+ DeviceState *dev, *sysctl, *gpio2;
SysBusDevice *busdev;
qemu_irq *irqp;
qemu_irq pic[64];
+ qemu_irq mmc_irq[2];
PCIBus *pci_bus;
NICInfo *nd;
i2c_bus *i2c;
@@ -218,7 +219,11 @@ static void realview_init(ram_addr_t ram_size,
}
sys_id = is_pb ? 0x01780500 : 0xc1400400;
- arm_sysctl_init(0x10000000, sys_id, proc_id);
+ sysctl = qdev_create(NULL, "realview_sysctl");
+ qdev_prop_set_uint32(sysctl, "sys_id", sys_id);
+ qdev_init_nofail(sysctl);
+ qdev_prop_set_uint32(sysctl, "proc_id", proc_id);
+ sysbus_mmio_map(sysbus_from_qdev(sysctl), 0, 0x10000000);
if (is_mpcore) {
dev = qdev_create(NULL, is_pb ? "a9mpcore_priv": "realview_mpcore");
@@ -257,9 +262,27 @@ static void realview_init(ram_addr_t ram_size,
sysbus_create_simple("sp804", 0x10011000, pic[4]);
sysbus_create_simple("sp804", 0x10012000, pic[5]);
+ sysbus_create_simple("pl061", 0x10013000, pic[6]);
+ sysbus_create_simple("pl061", 0x10014000, pic[7]);
+ gpio2 = sysbus_create_simple("pl061", 0x10015000, pic[8]);
+
sysbus_create_simple("pl110_versatile", 0x10020000, pic[23]);
- sysbus_create_varargs("pl181", 0x10005000, pic[17], pic[18], NULL);
+ dev = sysbus_create_varargs("pl181", 0x10005000, pic[17], pic[18], NULL);
+ /* Wire up MMC card detect and read-only signals. These have
+ * to go to both the PL061 GPIO and the sysctl register.
+ * Note that the PL181 orders these lines (readonly,inserted)
+ * and the PL061 has them the other way about. Also the card
+ * detect line is inverted.
+ */
+ mmc_irq[0] = qemu_irq_split(
+ qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_WPROT),
+ qdev_get_gpio_in(gpio2, 1));
+ mmc_irq[1] = qemu_irq_split(
+ qdev_get_gpio_in(sysctl, ARM_SYSCTL_GPIO_MMC_CARDIN),
+ qemu_irq_invert(qdev_get_gpio_in(gpio2, 0)));
+ qdev_connect_gpio_out(dev, 0, mmc_irq[0]);
+ qdev_connect_gpio_out(dev, 1, mmc_irq[1]);
sysbus_create_simple("pl031", 0x10017000, pic[10]);