qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 03/10] pxa2xx_gpio: simplify by reusing wake irq fro


From: Dmitry Eremin-Solenikov
Subject: [Qemu-devel] [PATCH 03/10] pxa2xx_gpio: simplify by reusing wake irq from arm_pic
Date: Sun, 20 Feb 2011 16:50:31 +0300

We can stop messing with CPUState directly, as we have special irq in arm_pic

Signed-off-by: Dmitry Eremin-Solenikov <address@hidden>
---
 hw/pxa.h         |    2 +-
 hw/pxa2xx.c      |    6 ++++--
 hw/pxa2xx_gpio.c |   14 +++++---------
 3 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/hw/pxa.h b/hw/pxa.h
index 7c6fd44..c2dede2 100644
--- a/hw/pxa.h
+++ b/hw/pxa.h
@@ -72,7 +72,7 @@ void pxa27x_timer_init(target_phys_addr_t base, DeviceState 
*pic);
 
 /* pxa2xx_gpio.c */
 DeviceState *pxa2xx_gpio_init(target_phys_addr_t base,
-                CPUState *env, DeviceState *pic, int lines);
+                qemu_irq wake_irq, DeviceState *pic, int lines);
 void pxa2xx_gpio_read_notifier(DeviceState *dev, qemu_irq handler);
 
 /* pxa2xx_dma.c */
diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c
index 58e6e7b..bc9542e 100644
--- a/hw/pxa2xx.c
+++ b/hw/pxa2xx.c
@@ -2106,7 +2106,8 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const 
char *revision)
 
     pxa27x_timer_init(0x40a00000, s->pic);
 
-    s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 121);
+    s->gpio = pxa2xx_gpio_init(0x40e00000, arm_pic[ARM_PIC_CPU_WAKE],
+            s->pic, 121);
 
     dinfo = drive_get(IF_SD, 0, 0);
     if (!dinfo) {
@@ -2240,7 +2241,8 @@ PXA2xxState *pxa255_init(unsigned int sdram_size)
 
     pxa25x_timer_init(0x40a00000, s->pic);
 
-    s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 85);
+    s->gpio = pxa2xx_gpio_init(0x40e00000, arm_pic[ARM_PIC_CPU_WAKE],
+            s->pic, 85);
 
     dinfo = drive_get(IF_SD, 0, 0);
     if (!dinfo) {
diff --git a/hw/pxa2xx_gpio.c b/hw/pxa2xx_gpio.c
index 16a8865..61d556b 100644
--- a/hw/pxa2xx_gpio.c
+++ b/hw/pxa2xx_gpio.c
@@ -17,9 +17,8 @@ typedef struct PXA2xxGPIOInfo PXA2xxGPIOInfo;
 struct PXA2xxGPIOInfo {
     SysBusDevice busdev;
     qemu_irq irq0, irq1, irqX;
+    qemu_irq wake_irq;
     int lines;
-    int ncpu;
-    CPUState *cpu_env;
 
     /* XXX: GNU C vectors are more suitable */
     uint32_t ilevel[PXA2XX_GPIO_BANKS];
@@ -117,8 +116,7 @@ static void pxa2xx_gpio_set(void *opaque, int line, int 
level)
         pxa2xx_gpio_irq_update(s);
 
     /* Wake-up GPIOs */
-    if (s->cpu_env->halted && (mask & ~s->dir[bank] & pxa2xx_gpio_wake[bank]))
-        cpu_interrupt(s->cpu_env, CPU_INTERRUPT_EXITTB);
+    qemu_set_irq(s->wake_irq, (mask & ~s->dir[bank] & pxa2xx_gpio_wake[bank]));
 }
 
 static void pxa2xx_gpio_handler_update(PXA2xxGPIOInfo *s) {
@@ -253,13 +251,12 @@ static CPUWriteMemoryFunc * const pxa2xx_gpio_writefn[] = 
{
 };
 
 DeviceState *pxa2xx_gpio_init(target_phys_addr_t base,
-                CPUState *env, DeviceState *pic, int lines)
+                qemu_irq wake_irq, DeviceState *pic, int lines)
 {
     DeviceState *dev;
 
     dev = qdev_create(NULL, "pxa2xx-gpio");
     qdev_prop_set_int32(dev, "lines", lines);
-    qdev_prop_set_int32(dev, "ncpu", env->cpu_index);
     qdev_init_nofail(dev);
 
     sysbus_mmio_map(sysbus_from_qdev(dev), 0, base);
@@ -269,6 +266,7 @@ DeviceState *pxa2xx_gpio_init(target_phys_addr_t base,
             qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_1));
     sysbus_connect_irq(sysbus_from_qdev(dev), 2,
             qdev_get_gpio_in(pic, PXA2XX_PIC_GPIO_X));
+    sysbus_connect_irq(sysbus_from_qdev(dev), 3, wake_irq);
 
     return dev;
 }
@@ -280,8 +278,6 @@ static int pxa2xx_gpio_initfn(SysBusDevice *dev)
 
     s = FROM_SYSBUS(PXA2xxGPIOInfo, dev);
 
-    s->cpu_env = qemu_get_cpu(s->ncpu);
-
     qdev_init_gpio_in(&dev->qdev, pxa2xx_gpio_set, s->lines);
     qdev_init_gpio_out(&dev->qdev, s->handler, s->lines);
 
@@ -292,6 +288,7 @@ static int pxa2xx_gpio_initfn(SysBusDevice *dev)
     sysbus_init_irq(dev, &s->irq0);
     sysbus_init_irq(dev, &s->irq1);
     sysbus_init_irq(dev, &s->irqX);
+    sysbus_init_irq(dev, &s->wake_irq);
 
     return 0;
 }
@@ -331,7 +328,6 @@ static SysBusDeviceInfo pxa2xx_gpio_info = {
     .qdev.size  = sizeof(PXA2xxGPIOInfo),
     .qdev.props = (Property []) {
         DEFINE_PROP_INT32("lines", PXA2xxGPIOInfo, lines, 0),
-        DEFINE_PROP_INT32("ncpu", PXA2xxGPIOInfo, ncpu, 0),
         DEFINE_PROP_END_OF_LIST(),
     }
 };
-- 
1.7.2.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]