All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues
  2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
@ 2009-09-18 18:51 ` Jan Kiszka
  2009-10-04  6:57   ` malc
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 3/8] musicpal: Clean up typecasts Jan Kiszka
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

They likely represent invalid queues that should be skipped. We already
do this for RX queues. Wish I had a spec...

Credits go to malc for analyzing the issue and suggesting this fix.

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
---

 hw/musicpal.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/hw/musicpal.c b/hw/musicpal.c
index 1c4f17c..c8f0235 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -238,7 +238,9 @@ static void eth_send(mv88w8618_eth_state *s, int queue_index)
     uint8_t buf[2048];
     int len;
 
-
+    if (!desc_addr) {
+        return;
+    }
     do {
         eth_tx_desc_get(desc_addr, &desc);
         if (desc.cmdstat & MP_ETH_TX_OWN) {

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 0/8] Musicpal updates
@ 2009-09-18 18:51 Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues Jan Kiszka
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

This series fixes some regressions of the Musicpal emulation, refactors
the code after recent qdev conversion and adds VMState support.

Please pull from git://git.kiszka.org/qemu.git queues/musicpal

Jan Kiszka (8):
      musicpal: Catch null TX qeueues
      musicpal: Rework GPIO input events
      musicpal: Clean up typecasts
      musicpal: Coding style fixes
      musicpal: True reset support for GPIO
      musicpal: True reset support for audio device
      musicpal: Make PIT emulation more robust
      musicpal: Add VMState support

 hw/marvell_88w8618_audio.c |   69 +++++--
 hw/musicpal.c              |  454 +++++++++++++++++++++++++++++++-------------
 2 files changed, 369 insertions(+), 154 deletions(-)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 2/8] musicpal: Rework GPIO input events
  2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
                   ` (4 preceding siblings ...)
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 6/8] musicpal: True reset support for audio device Jan Kiszka
@ 2009-09-18 18:51 ` Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 4/8] musicpal: Coding style fixes Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 5/8] musicpal: True reset support for GPIO Jan Kiszka
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

The qdev_gpio conversion of 343ec8e caused come polarity mismatch of key
event pins and left an overly complex solution behind. Take this chance
and refactor the GPIO input system of the Musicpal, moving it closer to
reality:
 - Instantiate all 32 GPIO input pins and do the routing only via
   qdev_connect_gpio_out.
 - Implement IMR and IER registers. They manage the GPIO pin IRQ. IMR
   seems to enable IRQs on rising edges, IER on falling ones. At least
   this matches what the Musicpal fireware require.
 - Move key pin logic inversion from the GPIO layer to musicpal_key.

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
---

 hw/musicpal.c |  150 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 75 insertions(+), 75 deletions(-)

diff --git a/hw/musicpal.c b/hw/musicpal.c
index c8f0235..f92c442 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -935,16 +935,19 @@ static int mv88w8618_wlan_init(SysBusDevice *dev)
 #define MP_GPIO_OE_LO           0x008
 #define MP_GPIO_OUT_LO          0x00c
 #define MP_GPIO_IN_LO           0x010
+#define MP_GPIO_IER_LO          0x014
+#define MP_GPIO_IMR_LO          0x018
 #define MP_GPIO_ISR_LO          0x020
 #define MP_GPIO_OE_HI           0x508
 #define MP_GPIO_OUT_HI          0x50c
 #define MP_GPIO_IN_HI           0x510
+#define MP_GPIO_IER_HI          0x514
+#define MP_GPIO_IMR_HI          0x518
 #define MP_GPIO_ISR_HI          0x520
 
 /* GPIO bits & masks */
 #define MP_GPIO_LCD_BRIGHTNESS  0x00070000
 #define MP_GPIO_I2C_DATA_BIT    29
-#define MP_GPIO_I2C_DATA        (1 << MP_GPIO_I2C_DATA_BIT)
 #define MP_GPIO_I2C_CLOCK_BIT   30
 
 /* LCD brightness bits in GPIO_OE_HI */
@@ -955,12 +958,11 @@ typedef struct musicpal_gpio_state {
     uint32_t lcd_brightness;
     uint32_t out_state;
     uint32_t in_state;
+    uint32_t ier;
+    uint32_t imr;
     uint32_t isr;
-    uint32_t i2c_read_data;
-    uint32_t key_released;
-    uint32_t keys_event;    /* store the received key event */
     qemu_irq irq;
-    qemu_irq out[5];
+    qemu_irq out[5]; /* 3 brightness out + 2 lcd (data and clock ) */
 } musicpal_gpio_state;
 
 static void musicpal_gpio_brightness_update(musicpal_gpio_state *s) {
@@ -1007,48 +1009,21 @@ static void musicpal_gpio_brightness_update(musicpal_gpio_state *s) {
         qemu_set_irq(s->out[i], (brightness >> i) & 1);
 }
 
-static void musicpal_gpio_keys_update(musicpal_gpio_state *s)
-{
-        int gpio_mask = 0;
-
-        /* transform the key state for GPIO usage */
-        gpio_mask |= (s->keys_event & 15) << 8;
-        gpio_mask |= ((s->keys_event >> 4) & 15) << 19;
-
-        /* update GPIO state */
-        if (s->key_released) {
-            s->in_state |= gpio_mask;
-        } else {
-            s->in_state &= ~gpio_mask;
-            s->isr = gpio_mask;
-            qemu_irq_raise(s->irq);
-        }
-}
-
-static void musicpal_gpio_irq(void *opaque, int irq, int level)
+static void musicpal_gpio_pin_event(void *opaque, int pin, int level)
 {
     musicpal_gpio_state *s = (musicpal_gpio_state *) opaque;
+    uint32_t mask = 1 << pin;
+    uint32_t delta = level << pin;
+    uint32_t old = s->in_state & mask;
 
-    if (irq == 10) {
-        s->i2c_read_data = level;
-    }
-
-    /* receives keys bits */
-    if (irq <= 7) {
-        s->keys_event &= ~(1 << irq);
-        s->keys_event |= level << irq;
-        return;
-    }
+    s->in_state &= ~mask;
+    s->in_state |= delta;
 
-    /* receives key press/release */
-    if (irq == 8) {
-        s->key_released = level;
-        return;
+    if ((old ^ delta) &&
+        ((level && (s->imr & mask)) || (!level && (s->ier & mask)))) {
+        s->isr = mask;
+        qemu_irq_raise(s->irq);
     }
-
-    /* a key has been transmited */
-    if (irq == 9 && level == 1)
-        musicpal_gpio_keys_update(s);
 }
 
 static uint32_t musicpal_gpio_read(void *opaque, target_phys_addr_t offset)
@@ -1067,11 +1042,18 @@ static uint32_t musicpal_gpio_read(void *opaque, target_phys_addr_t offset)
     case MP_GPIO_IN_LO:
         return s->in_state & 0xFFFF;
     case MP_GPIO_IN_HI:
-        /* Update received I2C data */
-        s->in_state = (s->in_state & ~MP_GPIO_I2C_DATA) |
-                        (s->i2c_read_data << MP_GPIO_I2C_DATA_BIT);
         return s->in_state >> 16;
 
+    case MP_GPIO_IER_LO:
+        return s->ier & 0xFFFF;
+    case MP_GPIO_IER_HI:
+        return s->ier >> 16;
+
+    case MP_GPIO_IMR_LO:
+        return s->imr & 0xFFFF;
+    case MP_GPIO_IMR_HI:
+        return s->imr >> 16;
+
     case MP_GPIO_ISR_LO:
         return s->isr & 0xFFFF;
     case MP_GPIO_ISR_HI:
@@ -1105,6 +1087,19 @@ static void musicpal_gpio_write(void *opaque, target_phys_addr_t offset,
         qemu_set_irq(s->out[4], (s->out_state >> MP_GPIO_I2C_CLOCK_BIT) & 1);
         break;
 
+    case MP_GPIO_IER_LO:
+        s->ier = (s->ier & 0xFFFF0000) | (value & 0xFFFF);
+        break;
+    case MP_GPIO_IER_HI:
+        s->ier = (s->ier & 0xFFFF) | (value << 16);
+        break;
+
+    case MP_GPIO_IMR_LO:
+        s->imr = (s->imr & 0xFFFF0000) | (value & 0xFFFF);
+        break;
+    case MP_GPIO_IMR_HI:
+        s->imr = (s->imr & 0xFFFF) | (value << 16);
+        break;
     }
 }
 
@@ -1123,9 +1118,8 @@ static CPUWriteMemoryFunc * const musicpal_gpio_writefn[] = {
 static void musicpal_gpio_reset(musicpal_gpio_state *s)
 {
     s->in_state = 0xffffffff;
-    s->i2c_read_data = 1;
-    s->key_released = 0;
-    s->keys_event = 0;
+    s->ier = 0;
+    s->imr = 0;
     s->isr = 0;
 }
 
@@ -1142,10 +1136,9 @@ static int musicpal_gpio_init(SysBusDevice *dev)
 
     musicpal_gpio_reset(s);
 
-    /* 3 brightness out + 2 lcd (data and clock ) */
-    qdev_init_gpio_out(&dev->qdev, s->out, 5);
-    /* 10 gpio button input + 1 I2C data input */
-    qdev_init_gpio_in(&dev->qdev, musicpal_gpio_irq, 11);
+    qdev_init_gpio_out(&dev->qdev, s->out, ARRAY_SIZE(s->out));
+
+    qdev_init_gpio_in(&dev->qdev, musicpal_gpio_pin_event, 32);
 
     return 0;
 }
@@ -1165,7 +1158,7 @@ static int musicpal_gpio_init(SysBusDevice *dev)
 #define KEYCODE_LEFT            0x4b
 #define KEYCODE_RIGHT           0x4d
 
-#define MP_KEY_WHEEL_VOL       (1)
+#define MP_KEY_WHEEL_VOL       (1 << 0)
 #define MP_KEY_WHEEL_VOL_INV   (1 << 1)
 #define MP_KEY_WHEEL_NAV       (1 << 2)
 #define MP_KEY_WHEEL_NAV_INV   (1 << 3)
@@ -1177,8 +1170,8 @@ static int musicpal_gpio_init(SysBusDevice *dev)
 typedef struct musicpal_key_state {
     SysBusDevice busdev;
     uint32_t kbd_extended;
-    uint32_t keys_state;
-    qemu_irq out[10];
+    uint32_t pressed_keys;
+    qemu_irq out[8];
 } musicpal_key_state;
 
 static void musicpal_key_event(void *opaque, int keycode)
@@ -1229,27 +1222,30 @@ static void musicpal_key_event(void *opaque, int keycode)
             break;
         }
         /* Do not repeat already pressed buttons */
-        if (!(keycode & KEY_RELEASED) && !(s->keys_state & event))
+        if (!(keycode & KEY_RELEASED) && (s->pressed_keys & event)) {
             event = 0;
+        }
     }
 
     if (event) {
-
-        /* transmit key event on GPIOS */
-        for (i = 0; i <= 7; i++)
-            qemu_set_irq(s->out[i], (event >> i) & 1);
-
-        /* handle key press/release */
+        /* Raise GPIO pin first if repeating a key */
+        if (!(keycode & KEY_RELEASED) && (s->pressed_keys & event)) {
+            for (i = 0; i <= 7; i++) {
+                if (event & (1 << i)) {
+                    qemu_set_irq(s->out[i], 1);
+                }
+            }
+        }
+        for (i = 0; i <= 7; i++) {
+            if (event & (1 << i)) {
+                qemu_set_irq(s->out[i], !!(keycode & KEY_RELEASED));
+            }
+        }
         if (keycode & KEY_RELEASED) {
-            s->keys_state |= event;
-            qemu_irq_raise(s->out[8]);
+            s->pressed_keys &= ~event;
         } else {
-            s->keys_state &= ~event;
-            qemu_irq_lower(s->out[8]);
+            s->pressed_keys |= event;
         }
-
-        /* signal that a key event occured */
-        qemu_irq_pulse(s->out[9]);
     }
 
     s->kbd_extended = 0;
@@ -1262,10 +1258,9 @@ static int musicpal_key_init(SysBusDevice *dev)
     sysbus_init_mmio(dev, 0x0, 0);
 
     s->kbd_extended = 0;
-    s->keys_state = 0;
+    s->pressed_keys = 0;
 
-    /* 8 key event GPIO + 1 key press/release + 1 strobe */
-    qdev_init_gpio_out(&dev->qdev, s->out, 10);
+    qdev_init_gpio_out(&dev->qdev, s->out, ARRAY_SIZE(s->out));
 
     qemu_add_kbd_event_handler(musicpal_key_event, s);
 
@@ -1375,7 +1370,8 @@ static void musicpal_init(ram_addr_t ram_size,
     key_dev = sysbus_create_simple("musicpal_key", 0, NULL);
 
     /* I2C read data */
-    qdev_connect_gpio_out(i2c_dev, 0, qdev_get_gpio_in(dev, 10));
+    qdev_connect_gpio_out(i2c_dev, 0,
+                          qdev_get_gpio_in(dev, MP_GPIO_I2C_DATA_BIT));
     /* I2C data */
     qdev_connect_gpio_out(dev, 3, qdev_get_gpio_in(i2c_dev, 0));
     /* I2C clock */
@@ -1384,8 +1380,12 @@ static void musicpal_init(ram_addr_t ram_size,
     for (i = 0; i < 3; i++)
         qdev_connect_gpio_out(dev, i, qdev_get_gpio_in(lcd_dev, i));
 
-    for (i = 0; i < 10; i++)
-        qdev_connect_gpio_out(key_dev, i, qdev_get_gpio_in(dev, i));
+    for (i = 0; i < 4; i++) {
+        qdev_connect_gpio_out(key_dev, i, qdev_get_gpio_in(dev, i + 8));
+    }
+    for (i = 4; i < 8; i++) {
+        qdev_connect_gpio_out(key_dev, i, qdev_get_gpio_in(dev, i + 15));
+    }
 
 #ifdef HAS_AUDIO
     wm8750_dev = i2c_create_slave(i2c, "wm8750", MP_WM_ADDR);

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 8/8] musicpal: Add VMState support
  2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 3/8] musicpal: Clean up typecasts Jan Kiszka
@ 2009-09-18 18:51 ` Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 7/8] musicpal: Make PIT emulation more robust Jan Kiszka
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

Register all relevant fields of Musicpal device states with the VMState
framework. This involves a few type changes of state variables.

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
---

 hw/marvell_88w8618_audio.c |   28 ++++++-
 hw/musicpal.c              |  170 ++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 179 insertions(+), 19 deletions(-)

diff --git a/hw/marvell_88w8618_audio.c b/hw/marvell_88w8618_audio.c
index 7f17a9f..e656f10 100644
--- a/hw/marvell_88w8618_audio.c
+++ b/hw/marvell_88w8618_audio.c
@@ -41,11 +41,11 @@ typedef struct mv88w8618_audio_state {
     uint32_t playback_mode;
     uint32_t status;
     uint32_t irq_enable;
-    unsigned long phys_buf;
+    uint32_t phys_buf;
     uint32_t target_buffer;
-    unsigned int threshold;
-    unsigned int play_pos;
-    unsigned int last_free;
+    uint32_t threshold;
+    uint32_t play_pos;
+    uint32_t last_free;
     uint32_t clock_div;
     DeviceState *wm;
 } mv88w8618_audio_state;
@@ -255,11 +255,31 @@ static int mv88w8618_audio_init(SysBusDevice *dev)
     return 0;
 }
 
+static const VMStateDescription mv88w8618_audio_vmsd = {
+    .name = "mv88w8618_audio",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(playback_mode, mv88w8618_audio_state),
+        VMSTATE_UINT32(status, mv88w8618_audio_state),
+        VMSTATE_UINT32(irq_enable, mv88w8618_audio_state),
+        VMSTATE_UINT32(phys_buf, mv88w8618_audio_state),
+        VMSTATE_UINT32(target_buffer, mv88w8618_audio_state),
+        VMSTATE_UINT32(threshold, mv88w8618_audio_state),
+        VMSTATE_UINT32(play_pos, mv88w8618_audio_state),
+        VMSTATE_UINT32(last_free, mv88w8618_audio_state),
+        VMSTATE_UINT32(clock_div, mv88w8618_audio_state),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 static SysBusDeviceInfo mv88w8618_audio_info = {
     .init = mv88w8618_audio_init,
     .qdev.name  = "mv88w8618_audio",
     .qdev.size  = sizeof(mv88w8618_audio_state),
     .qdev.reset = mv88w8618_audio_reset,
+    .qdev.vmsd  = &mv88w8618_audio_vmsd,
     .qdev.props = (Property[]) {
         {
             .name   = "wm8750",
diff --git a/hw/musicpal.c b/hw/musicpal.c
index eca4a28..18ba9b1 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -146,7 +146,7 @@ typedef struct mv88w8618_eth_state {
     uint32_t icr;
     uint32_t imr;
     int mmio_index;
-    int vlan_header;
+    uint32_t vlan_header;
     uint32_t tx_queue[2];
     uint32_t rx_queue[4];
     uint32_t frx_queue[4];
@@ -387,6 +387,31 @@ static int mv88w8618_eth_init(SysBusDevice *dev)
     return 0;
 }
 
+static const VMStateDescription mv88w8618_eth_vmsd = {
+    .name = "mv88w8618_eth",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(smir, mv88w8618_eth_state),
+        VMSTATE_UINT32(icr, mv88w8618_eth_state),
+        VMSTATE_UINT32(imr, mv88w8618_eth_state),
+        VMSTATE_UINT32(vlan_header, mv88w8618_eth_state),
+        VMSTATE_UINT32_ARRAY(tx_queue, mv88w8618_eth_state, 2),
+        VMSTATE_UINT32_ARRAY(rx_queue, mv88w8618_eth_state, 4),
+        VMSTATE_UINT32_ARRAY(frx_queue, mv88w8618_eth_state, 4),
+        VMSTATE_UINT32_ARRAY(cur_rx, mv88w8618_eth_state, 4),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static SysBusDeviceInfo mv88w8618_eth_info = {
+    .init = mv88w8618_eth_init,
+    .qdev.name = "mv88w8618_eth",
+    .qdev.size = sizeof(mv88w8618_eth_state),
+    .qdev.vmsd = &mv88w8618_eth_vmsd,
+};
+
 /* LCD register offsets */
 #define MP_LCD_IRQCTRL          0x180
 #define MP_LCD_IRQSTAT          0x184
@@ -411,8 +436,8 @@ typedef struct musicpal_lcd_state {
     uint32_t brightness;
     uint32_t mode;
     uint32_t irqctrl;
-    int page;
-    int page_off;
+    uint32_t page;
+    uint32_t page_off;
     DisplayState *ds;
     uint8_t video_ram[128*64/8];
 } musicpal_lcd_state;
@@ -577,6 +602,29 @@ static int musicpal_lcd_init(SysBusDevice *dev)
     return 0;
 }
 
+static const VMStateDescription musicpal_lcd_vmsd = {
+    .name = "musicpal_lcd",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(brightness, musicpal_lcd_state),
+        VMSTATE_UINT32(mode, musicpal_lcd_state),
+        VMSTATE_UINT32(irqctrl, musicpal_lcd_state),
+        VMSTATE_UINT32(page, musicpal_lcd_state),
+        VMSTATE_UINT32(page_off, musicpal_lcd_state),
+        VMSTATE_BUFFER(video_ram, musicpal_lcd_state),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static SysBusDeviceInfo musicpal_lcd_info = {
+    .init = musicpal_lcd_init,
+    .qdev.name = "musicpal_lcd",
+    .qdev.size = sizeof(musicpal_lcd_state),
+    .qdev.vmsd = &musicpal_lcd_vmsd,
+};
+
 /* PIC register offsets */
 #define MP_PIC_STATUS           0x00
 #define MP_PIC_ENABLE_SET       0x08
@@ -668,11 +716,29 @@ static int mv88w8618_pic_init(SysBusDevice *dev)
     iomemtype = cpu_register_io_memory(mv88w8618_pic_readfn,
                                        mv88w8618_pic_writefn, s);
     sysbus_init_mmio(dev, MP_PIC_SIZE, iomemtype);
-
-    qemu_register_reset(mv88w8618_pic_reset, s);
     return 0;
 }
 
+static const VMStateDescription mv88w8618_pic_vmsd = {
+    .name = "mv88w8618_pic",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(level, mv88w8618_pic_state),
+        VMSTATE_UINT32(enabled, mv88w8618_pic_state),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static SysBusDeviceInfo mv88w8618_pic_info = {
+    .init = mv88w8618_pic_init,
+    .qdev.name = "mv88w8618_pic",
+    .qdev.size = sizeof(mv88w8618_pic_state),
+    .qdev.reset = mv88w8618_pic_reset,
+    .qdev.vmsd = &mv88w8618_pic_vmsd,
+};
+
 /* PIT register offsets */
 #define MP_PIT_TIMER1_LENGTH    0x00
 /* ... */
@@ -813,11 +879,36 @@ static int mv88w8618_pit_init(SysBusDevice *dev)
     return 0;
 }
 
+static const VMStateDescription mv88w8618_timer_vmsd = {
+    .name = "timer",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_PTIMER(ptimer, mv88w8618_timer_state),
+        VMSTATE_UINT32(limit, mv88w8618_timer_state),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static const VMStateDescription mv88w8618_pit_vmsd = {
+    .name = "mv88w8618_pit",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_STRUCT_ARRAY(timer, mv88w8618_pit_state, 4, 1,
+                             mv88w8618_timer_vmsd, mv88w8618_timer_state),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 static SysBusDeviceInfo mv88w8618_pit_info = {
     .init = mv88w8618_pit_init,
     .qdev.name  = "mv88w8618_pit",
     .qdev.size  = sizeof(mv88w8618_pit_state),
     .qdev.reset = mv88w8618_pit_reset,
+    .qdev.vmsd  = &mv88w8618_pit_vmsd,
 };
 
 /* Flash config register offsets */
@@ -878,6 +969,24 @@ static int mv88w8618_flashcfg_init(SysBusDevice *dev)
     return 0;
 }
 
+static const VMStateDescription mv88w8618_flashcfg_vmsd = {
+    .name = "mv88w8618_flashcfg",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(cfgr0, mv88w8618_flashcfg_state),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static SysBusDeviceInfo mv88w8618_flashcfg_info = {
+    .init = mv88w8618_flashcfg_init,
+    .qdev.name  = "mv88w8618_flashcfg",
+    .qdev.size  = sizeof(mv88w8618_flashcfg_state),
+    .qdev.vmsd  = &mv88w8618_flashcfg_vmsd,
+};
+
 /* Misc register offsets */
 #define MP_MISC_BOARD_REVISION  0x18
 
@@ -1184,11 +1293,28 @@ static int musicpal_gpio_init(SysBusDevice *dev)
     return 0;
 }
 
+static const VMStateDescription musicpal_gpio_vmsd = {
+    .name = "musicpal_gpio",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(lcd_brightness, musicpal_gpio_state),
+        VMSTATE_UINT32(out_state, musicpal_gpio_state),
+        VMSTATE_UINT32(in_state, musicpal_gpio_state),
+        VMSTATE_UINT32(ier, musicpal_gpio_state),
+        VMSTATE_UINT32(imr, musicpal_gpio_state),
+        VMSTATE_UINT32(isr, musicpal_gpio_state),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 static SysBusDeviceInfo musicpal_gpio_info = {
     .init = musicpal_gpio_init,
     .qdev.name  = "musicpal_gpio",
     .qdev.size  = sizeof(musicpal_gpio_state),
     .qdev.reset = musicpal_gpio_reset,
+    .qdev.vmsd  = &musicpal_gpio_vmsd,
 };
 
 /* Keyboard codes & masks */
@@ -1315,6 +1441,25 @@ static int musicpal_key_init(SysBusDevice *dev)
     return 0;
 }
 
+static const VMStateDescription musicpal_key_vmsd = {
+    .name = "musicpal_key",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(kbd_extended, musicpal_key_state),
+        VMSTATE_UINT32(pressed_keys, musicpal_key_state),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static SysBusDeviceInfo musicpal_key_info = {
+    .init = musicpal_key_init,
+    .qdev.name  = "musicpal_key",
+    .qdev.size  = sizeof(musicpal_key_state),
+    .qdev.vmsd  = &musicpal_key_vmsd,
+};
+
 static struct arm_boot_info musicpal_binfo = {
     .loader_start = 0x0,
     .board_id = 0x20e,
@@ -1469,20 +1614,15 @@ machine_init(musicpal_machine_init);
 
 static void musicpal_register_devices(void)
 {
-    sysbus_register_dev("mv88w8618_pic", sizeof(mv88w8618_pic_state),
-                        mv88w8618_pic_init);
+    sysbus_register_withprop(&mv88w8618_pic_info);
     sysbus_register_withprop(&mv88w8618_pit_info);
-    sysbus_register_dev("mv88w8618_flashcfg", sizeof(mv88w8618_flashcfg_state),
-                        mv88w8618_flashcfg_init);
-    sysbus_register_dev("mv88w8618_eth", sizeof(mv88w8618_eth_state),
-                        mv88w8618_eth_init);
+    sysbus_register_withprop(&mv88w8618_flashcfg_info);
+    sysbus_register_withprop(&mv88w8618_eth_info);
     sysbus_register_dev("mv88w8618_wlan", sizeof(SysBusDevice),
                         mv88w8618_wlan_init);
-    sysbus_register_dev("musicpal_lcd", sizeof(musicpal_lcd_state),
-                        musicpal_lcd_init);
+    sysbus_register_withprop(&musicpal_lcd_info);
     sysbus_register_withprop(&musicpal_gpio_info);
-    sysbus_register_dev("musicpal_key", sizeof(musicpal_key_state),
-                        musicpal_key_init);
+    sysbus_register_withprop(&musicpal_key_info);
 }
 
 device_init(musicpal_register_devices)

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 4/8] musicpal: Coding style fixes
  2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
                   ` (5 preceding siblings ...)
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 2/8] musicpal: Rework GPIO input events Jan Kiszka
@ 2009-09-18 18:51 ` Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 5/8] musicpal: True reset support for GPIO Jan Kiszka
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
---

 hw/marvell_88w8618_audio.c |   35 +++++++++++++-----------
 hw/musicpal.c              |   65 +++++++++++++++++++++++++++-----------------
 2 files changed, 59 insertions(+), 41 deletions(-)

diff --git a/hw/marvell_88w8618_audio.c b/hw/marvell_88w8618_audio.c
index 1c68da3..d6c14c6 100644
--- a/hw/marvell_88w8618_audio.c
+++ b/hw/marvell_88w8618_audio.c
@@ -58,22 +58,22 @@ static void mv88w8618_audio_callback(void *opaque, int free_out, int free_in)
     int8_t *mem_buffer;
     int pos, block_size;
 
-    if (!(s->playback_mode & MP_AUDIO_PLAYBACK_EN))
+    if (!(s->playback_mode & MP_AUDIO_PLAYBACK_EN)) {
         return;
-
-    if (s->playback_mode & MP_AUDIO_16BIT_SAMPLE)
+    }
+    if (s->playback_mode & MP_AUDIO_16BIT_SAMPLE) {
         free_out <<= 1;
-
-    if (!(s->playback_mode & MP_AUDIO_MONO))
+    }
+    if (!(s->playback_mode & MP_AUDIO_MONO)) {
         free_out <<= 1;
-
+    }
     block_size = s->threshold / 2;
-    if (free_out - s->last_free < block_size)
+    if (free_out - s->last_free < block_size) {
         return;
-
-    if (block_size > 4096)
+    }
+    if (block_size > 4096) {
         return;
-
+    }
     cpu_physical_memory_read(s->target_buffer + s->play_pos, (void *)buf,
                              block_size);
     mem_buffer = buf;
@@ -85,9 +85,10 @@ static void mv88w8618_audio_callback(void *opaque, int free_out, int free_in)
                 *codec_buffer++ = *(int16_t *)mem_buffer;
                 mem_buffer += 2;
             }
-        } else
+        } else {
             memcpy(wm8750_dac_buffer(s->wm, block_size >> 2),
                    (uint32_t *)mem_buffer, block_size);
+        }
     } else {
         if (s->playback_mode & MP_AUDIO_MONO) {
             codec_buffer = wm8750_dac_buffer(s->wm, block_size);
@@ -115,19 +116,20 @@ static void mv88w8618_audio_callback(void *opaque, int free_out, int free_in)
         s->play_pos = 0;
     }
 
-    if (s->status & s->irq_enable)
+    if (s->status & s->irq_enable) {
         qemu_irq_raise(s->irq);
+    }
 }
 
 static void mv88w8618_audio_clock_update(mv88w8618_audio_state *s)
 {
     int rate;
 
-    if (s->playback_mode & MP_AUDIO_CLOCK_24MHZ)
+    if (s->playback_mode & MP_AUDIO_CLOCK_24MHZ) {
         rate = 24576000 / 64; /* 24.576MHz */
-    else
+    } else {
         rate = 11289600 / 64; /* 11.2896MHz */
-
+    }
     rate /= ((s->clock_div >> 8) & 0xff) + 1;
 
     wm8750_set_bclk_in(s->wm, rate);
@@ -188,8 +190,9 @@ static void mv88w8618_audio_write(void *opaque, target_phys_addr_t offset,
 
     case MP_AUDIO_IRQ_ENABLE:
         s->irq_enable = value;
-        if (s->status & s->irq_enable)
+        if (s->status & s->irq_enable) {
             qemu_irq_raise(s->irq);
+        }
         break;
 
     case MP_AUDIO_TX_START_LO:
diff --git a/hw/musicpal.c b/hw/musicpal.c
index e1dc6da..efc20a4 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -188,8 +188,9 @@ static ssize_t eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
 
     for (i = 0; i < 4; i++) {
         desc_addr = s->cur_rx[i];
-        if (!desc_addr)
+        if (!desc_addr) {
             continue;
+        }
         do {
             eth_rx_desc_get(desc_addr, &desc);
             if ((desc.cmdstat & MP_ETH_RX_OWN) && desc.buffer_size >= size) {
@@ -200,8 +201,9 @@ static ssize_t eth_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
                 s->cur_rx[i] = desc.next;
 
                 s->icr |= MP_ETH_IRQ_RX;
-                if (s->icr & s->imr)
+                if (s->icr & s->imr) {
                     qemu_irq_raise(s->irq);
+                }
                 eth_rx_desc_put(desc_addr, &desc);
                 return size;
             }
@@ -313,12 +315,15 @@ static void mv88w8618_eth_write(void *opaque, target_phys_addr_t offset,
         break;
 
     case MP_ETH_SDCMR:
-        if (value & MP_ETH_CMD_TXHI)
+        if (value & MP_ETH_CMD_TXHI) {
             eth_send(s, 1);
-        if (value & MP_ETH_CMD_TXLO)
+        }
+        if (value & MP_ETH_CMD_TXLO) {
             eth_send(s, 0);
-        if (value & (MP_ETH_CMD_TXHI | MP_ETH_CMD_TXLO) && s->icr & s->imr)
+        }
+        if (value & (MP_ETH_CMD_TXHI | MP_ETH_CMD_TXLO) && s->icr & s->imr) {
             qemu_irq_raise(s->irq);
+        }
         break;
 
     case MP_ETH_ICR:
@@ -327,8 +332,9 @@ static void mv88w8618_eth_write(void *opaque, target_phys_addr_t offset,
 
     case MP_ETH_IMR:
         s->imr = value;
-        if (s->icr & s->imr)
+        if (s->icr & s->imr) {
             qemu_irq_raise(s->irq);
+        }
         break;
 
     case MP_ETH_FRDP0 ... MP_ETH_FRDP3:
@@ -453,12 +459,15 @@ static void lcd_refresh(void *opaque)
         col = func(scale_lcd_color(s, (MP_LCD_TEXTCOLOR >> 16) & 0xff), \
                    scale_lcd_color(s, (MP_LCD_TEXTCOLOR >> 8) & 0xff), \
                    scale_lcd_color(s, MP_LCD_TEXTCOLOR & 0xff)); \
-        for (x = 0; x < 128; x++) \
-            for (y = 0; y < 64; y++) \
-                if (s->video_ram[x + (y/8)*128] & (1 << (y % 8))) \
+        for (x = 0; x < 128; x++) { \
+            for (y = 0; y < 64; y++) { \
+                if (s->video_ram[x + (y/8)*128] & (1 << (y % 8))) { \
                     glue(set_lcd_pixel, depth)(s, x, y, col); \
-                else \
+                } else { \
                     glue(set_lcd_pixel, depth)(s, x, y, 0); \
+                } \
+            } \
+        } \
         break;
     LCD_REFRESH(8, rgb_to_pixel8)
     LCD_REFRESH(16, rgb_to_pixel16)
@@ -507,10 +516,11 @@ static void musicpal_lcd_write(void *opaque, target_phys_addr_t offset,
         break;
 
     case MP_LCD_SPICTRL:
-        if (value == MP_LCD_SPI_DATA || value == MP_LCD_SPI_CMD)
+        if (value == MP_LCD_SPI_DATA || value == MP_LCD_SPI_CMD) {
             s->mode = value;
-        else
+        } else {
             s->mode = MP_LCD_SPI_INVALID;
+        }
         break;
 
     case MP_LCD_INST:
@@ -589,10 +599,11 @@ static void mv88w8618_pic_set_irq(void *opaque, int irq, int level)
 {
     mv88w8618_pic_state *s = opaque;
 
-    if (level)
+    if (level) {
         s->level |= 1 << irq;
-    else
+    } else {
         s->level &= ~(1 << irq);
+    }
     mv88w8618_pic_update(s);
 }
 
@@ -749,8 +760,9 @@ static void mv88w8618_pit_write(void *opaque, target_phys_addr_t offset,
         break;
 
     case MP_BOARD_RESET:
-        if (value == MP_BOARD_RESET_MAGIC)
+        if (value == MP_BOARD_RESET_MAGIC) {
             qemu_system_reset_request();
+        }
         break;
     }
 }
@@ -838,7 +850,7 @@ static int mv88w8618_flashcfg_init(SysBusDevice *dev)
 
     s->cfgr0 = 0xfffe4285; /* Default as set by U-Boot for 8 MB flash */
     iomemtype = cpu_register_io_memory(mv88w8618_flashcfg_readfn,
-                       mv88w8618_flashcfg_writefn, s);
+                                       mv88w8618_flashcfg_writefn, s);
     sysbus_init_mmio(dev, MP_FLASHCFG_SIZE, iomemtype);
     return 0;
 }
@@ -1005,8 +1017,9 @@ static void musicpal_gpio_brightness_update(musicpal_gpio_state *s) {
     }
 
     /* set lcd brightness GPIOs  */
-    for (i = 0; i <= 2; i++)
+    for (i = 0; i <= 2; i++) {
         qemu_set_irq(s->out[i], (brightness >> i) & 1);
+    }
 }
 
 static void musicpal_gpio_pin_event(void *opaque, int pin, int level)
@@ -1185,7 +1198,7 @@ static void musicpal_key_event(void *opaque, int keycode)
         return;
     }
 
-    if (s->kbd_extended)
+    if (s->kbd_extended) {
         switch (keycode & KEY_CODE) {
         case KEYCODE_UP:
             event = MP_KEY_WHEEL_NAV | MP_KEY_WHEEL_NAV_INV;
@@ -1203,7 +1216,7 @@ static void musicpal_key_event(void *opaque, int keycode)
             event = MP_KEY_WHEEL_VOL;
             break;
         }
-    else {
+    } else {
         switch (keycode & KEY_CODE) {
         case KEYCODE_F:
             event = MP_KEY_BTN_FAVORITS;
@@ -1294,9 +1307,9 @@ static void musicpal_init(ram_addr_t ram_size,
     DriveInfo *dinfo;
     ram_addr_t sram_off;
 
-    if (!cpu_model)
+    if (!cpu_model) {
         cpu_model = "arm926";
-
+    }
     env = cpu_init(cpu_model);
     if (!env) {
         fprintf(stderr, "Unable to find CPU definition\n");
@@ -1320,12 +1333,14 @@ static void musicpal_init(ram_addr_t ram_size,
                           pic[MP_TIMER2_IRQ], pic[MP_TIMER3_IRQ],
                           pic[MP_TIMER4_IRQ], NULL);
 
-    if (serial_hds[0])
+    if (serial_hds[0]) {
         serial_mm_init(MP_UART1_BASE, 2, pic[MP_UART1_IRQ], 1825000,
                    serial_hds[0], 1);
-    if (serial_hds[1])
+    }
+    if (serial_hds[1]) {
         serial_mm_init(MP_UART2_BASE, 2, pic[MP_UART2_IRQ], 1825000,
                    serial_hds[1], 1);
+    }
 
     /* Register flash */
     dinfo = drive_get(IF_PFLASH, 0, 0);
@@ -1377,9 +1392,9 @@ static void musicpal_init(ram_addr_t ram_size,
     /* I2C clock */
     qdev_connect_gpio_out(dev, 4, qdev_get_gpio_in(i2c_dev, 1));
 
-    for (i = 0; i < 3; i++)
+    for (i = 0; i < 3; i++) {
         qdev_connect_gpio_out(dev, i, qdev_get_gpio_in(lcd_dev, i));
-
+    }
     for (i = 0; i < 4; i++) {
         qdev_connect_gpio_out(key_dev, i, qdev_get_gpio_in(dev, i + 8));
     }

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 5/8] musicpal: True reset support for GPIO
  2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
                   ` (6 preceding siblings ...)
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 4/8] musicpal: Coding style fixes Jan Kiszka
@ 2009-09-18 18:51 ` Jan Kiszka
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
---

 hw/musicpal.c |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/hw/musicpal.c b/hw/musicpal.c
index efc20a4..d4e797a 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -1128,8 +1128,12 @@ static CPUWriteMemoryFunc * const musicpal_gpio_writefn[] = {
     musicpal_gpio_write,
 };
 
-static void musicpal_gpio_reset(musicpal_gpio_state *s)
+static void musicpal_gpio_reset(void *opaque)
 {
+    musicpal_gpio_state *s = opaque;
+
+    s->lcd_brightness = 0;
+    s->out_state = 0;
     s->in_state = 0xffffffff;
     s->ier = 0;
     s->imr = 0;
@@ -1147,6 +1151,7 @@ static int musicpal_gpio_init(SysBusDevice *dev)
                                        musicpal_gpio_writefn, s);
     sysbus_init_mmio(dev, MP_GPIO_SIZE, iomemtype);
 
+    qemu_register_reset(musicpal_gpio_reset, s);
     musicpal_gpio_reset(s);
 
     qdev_init_gpio_out(&dev->qdev, s->out, ARRAY_SIZE(s->out));
@@ -1156,6 +1161,13 @@ static int musicpal_gpio_init(SysBusDevice *dev)
     return 0;
 }
 
+static SysBusDeviceInfo musicpal_gpio_info = {
+    .init = musicpal_gpio_init,
+    .qdev.name  = "musicpal_gpio",
+    .qdev.size  = sizeof(musicpal_gpio_state),
+    .qdev.reset = musicpal_gpio_reset,
+};
+
 /* Keyboard codes & masks */
 #define KEY_RELEASED            0x80
 #define KEY_CODE                0x7f
@@ -1446,8 +1458,7 @@ static void musicpal_register_devices(void)
                         mv88w8618_wlan_init);
     sysbus_register_dev("musicpal_lcd", sizeof(musicpal_lcd_state),
                         musicpal_lcd_init);
-    sysbus_register_dev("musicpal_gpio", sizeof(musicpal_gpio_state),
-                        musicpal_gpio_init);
+    sysbus_register_withprop(&musicpal_gpio_info);
     sysbus_register_dev("musicpal_key", sizeof(musicpal_key_state),
                         musicpal_key_init);
 }

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 6/8] musicpal: True reset support for audio device
  2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
                   ` (3 preceding siblings ...)
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 7/8] musicpal: Make PIT emulation more robust Jan Kiszka
@ 2009-09-18 18:51 ` Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 2/8] musicpal: Rework GPIO input events Jan Kiszka
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
---

 hw/marvell_88w8618_audio.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/hw/marvell_88w8618_audio.c b/hw/marvell_88w8618_audio.c
index d6c14c6..7f17a9f 100644
--- a/hw/marvell_88w8618_audio.c
+++ b/hw/marvell_88w8618_audio.c
@@ -222,6 +222,9 @@ static void mv88w8618_audio_reset(void *opaque)
     s->playback_mode = 0;
     s->status = 0;
     s->irq_enable = 0;
+    s->clock_div = 0;
+    s->threshold = 0;
+    s->phys_buf = 0;
 }
 
 static CPUReadMemoryFunc * const mv88w8618_audio_readfn[] = {
@@ -249,8 +252,6 @@ static int mv88w8618_audio_init(SysBusDevice *dev)
                                        mv88w8618_audio_writefn, s);
     sysbus_init_mmio(dev, MP_AUDIO_SIZE, iomemtype);
 
-    qemu_register_reset(mv88w8618_audio_reset, s);
-
     return 0;
 }
 
@@ -258,6 +259,7 @@ static SysBusDeviceInfo mv88w8618_audio_info = {
     .init = mv88w8618_audio_init,
     .qdev.name  = "mv88w8618_audio",
     .qdev.size  = sizeof(mv88w8618_audio_state),
+    .qdev.reset = mv88w8618_audio_reset,
     .qdev.props = (Property[]) {
         {
             .name   = "wm8750",

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 7/8] musicpal: Make PIT emulation more robust
  2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
                   ` (2 preceding siblings ...)
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 8/8] musicpal: Add VMState support Jan Kiszka
@ 2009-09-18 18:51 ` Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 6/8] musicpal: True reset support for audio device Jan Kiszka
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

Stop the periodic timers of the PIT on reset, disabling via the control
register and invalid parameters.

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
---

 hw/musicpal.c |   34 ++++++++++++++++++++++++++++------
 1 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/hw/musicpal.c b/hw/musicpal.c
index d4e797a..eca4a28 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -696,7 +696,6 @@ typedef struct mv88w8618_timer_state {
 typedef struct mv88w8618_pit_state {
     SysBusDevice busdev;
     mv88w8618_timer_state timer[4];
-    uint32_t control;
 } mv88w8618_pit_state;
 
 static void mv88w8618_timer_tick(void *opaque)
@@ -744,16 +743,22 @@ static void mv88w8618_pit_write(void *opaque, target_phys_addr_t offset,
     case MP_PIT_TIMER1_LENGTH ... MP_PIT_TIMER4_LENGTH:
         t = &s->timer[offset >> 2];
         t->limit = value;
-        ptimer_set_limit(t->ptimer, t->limit, 1);
+        if (t->limit > 0) {
+            ptimer_set_limit(t->ptimer, t->limit, 1);
+        } else {
+            ptimer_stop(t->ptimer);
+        }
         break;
 
     case MP_PIT_CONTROL:
         for (i = 0; i < 4; i++) {
-            if (value & 0xf) {
-                t = &s->timer[i];
+            t = &s->timer[i];
+            if (value & 0xf && t->limit > 0) {
                 ptimer_set_limit(t->ptimer, t->limit, 0);
                 ptimer_set_freq(t->ptimer, t->freq);
                 ptimer_run(t->ptimer, 0);
+            } else {
+                ptimer_stop(t->ptimer);
             }
             value >>= 4;
         }
@@ -767,6 +772,17 @@ static void mv88w8618_pit_write(void *opaque, target_phys_addr_t offset,
     }
 }
 
+static void mv88w8618_pit_reset(void *opaque)
+{
+    mv88w8618_pit_state *s = opaque;
+    int i;
+
+    for (i = 0; i < 4; i++) {
+        ptimer_stop(s->timer[i].ptimer);
+        s->timer[i].limit = 0;
+    }
+}
+
 static CPUReadMemoryFunc * const mv88w8618_pit_readfn[] = {
     mv88w8618_pit_read,
     mv88w8618_pit_read,
@@ -797,6 +813,13 @@ static int mv88w8618_pit_init(SysBusDevice *dev)
     return 0;
 }
 
+static SysBusDeviceInfo mv88w8618_pit_info = {
+    .init = mv88w8618_pit_init,
+    .qdev.name  = "mv88w8618_pit",
+    .qdev.size  = sizeof(mv88w8618_pit_state),
+    .qdev.reset = mv88w8618_pit_reset,
+};
+
 /* Flash config register offsets */
 #define MP_FLASHCFG_CFGR0    0x04
 
@@ -1448,8 +1471,7 @@ static void musicpal_register_devices(void)
 {
     sysbus_register_dev("mv88w8618_pic", sizeof(mv88w8618_pic_state),
                         mv88w8618_pic_init);
-    sysbus_register_dev("mv88w8618_pit", sizeof(mv88w8618_pit_state),
-                        mv88w8618_pit_init);
+    sysbus_register_withprop(&mv88w8618_pit_info);
     sysbus_register_dev("mv88w8618_flashcfg", sizeof(mv88w8618_flashcfg_state),
                         mv88w8618_flashcfg_init);
     sysbus_register_dev("mv88w8618_eth", sizeof(mv88w8618_eth_state),

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 3/8] musicpal: Clean up typecasts
  2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues Jan Kiszka
@ 2009-09-18 18:51 ` Jan Kiszka
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 8/8] musicpal: Add VMState support Jan Kiszka
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Jan Kiszka @ 2009-09-18 18:51 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
---

 hw/musicpal.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/hw/musicpal.c b/hw/musicpal.c
index f92c442..e1dc6da 100644
--- a/hw/musicpal.c
+++ b/hw/musicpal.c
@@ -478,7 +478,7 @@ static void lcd_invalidate(void *opaque)
 
 static void musicpal_lcd_gpio_brigthness_in(void *opaque, int irq, int level)
 {
-    musicpal_lcd_state *s = (musicpal_lcd_state *) opaque;
+    musicpal_lcd_state *s = opaque;
     s->brightness &= ~(1 << irq);
     s->brightness |= level << irq;
 }
@@ -1011,7 +1011,7 @@ static void musicpal_gpio_brightness_update(musicpal_gpio_state *s) {
 
 static void musicpal_gpio_pin_event(void *opaque, int pin, int level)
 {
-    musicpal_gpio_state *s = (musicpal_gpio_state *) opaque;
+    musicpal_gpio_state *s = opaque;
     uint32_t mask = 1 << pin;
     uint32_t delta = level << pin;
     uint32_t old = s->in_state & mask;
@@ -1028,7 +1028,7 @@ static void musicpal_gpio_pin_event(void *opaque, int pin, int level)
 
 static uint32_t musicpal_gpio_read(void *opaque, target_phys_addr_t offset)
 {
-    musicpal_gpio_state *s = (musicpal_gpio_state *) opaque;
+    musicpal_gpio_state *s = opaque;
 
     switch (offset) {
     case MP_GPIO_OE_HI: /* used for LCD brightness control */
@@ -1067,7 +1067,7 @@ static uint32_t musicpal_gpio_read(void *opaque, target_phys_addr_t offset)
 static void musicpal_gpio_write(void *opaque, target_phys_addr_t offset,
                                 uint32_t value)
 {
-    musicpal_gpio_state *s = (musicpal_gpio_state *) opaque;
+    musicpal_gpio_state *s = opaque;
     switch (offset) {
     case MP_GPIO_OE_HI: /* used for LCD brightness control */
         s->lcd_brightness = (s->lcd_brightness & MP_GPIO_LCD_BRIGHTNESS) |
@@ -1176,7 +1176,7 @@ typedef struct musicpal_key_state {
 
 static void musicpal_key_event(void *opaque, int keycode)
 {
-    musicpal_key_state *s = (musicpal_key_state *) opaque;
+    musicpal_key_state *s = opaque;
     uint32_t event = 0;
     int i;
 

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues
  2009-09-18 18:51 ` [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues Jan Kiszka
@ 2009-10-04  6:57   ` malc
  2009-10-04  7:04     ` malc
  0 siblings, 1 reply; 12+ messages in thread
From: malc @ 2009-10-04  6:57 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: qemu-devel, Paul Brook

On Fri, 18 Sep 2009, Jan Kiszka wrote:

> They likely represent invalid queues that should be skipped. We already
> do this for RX queues. Wish I had a spec...
> 
> Credits go to malc for analyzing the issue and suggesting this fix.
> 

What bothers me is:

a. Why 930c86820e8e0b6dfcf211bda5e835463d72ff42 (disregarding dodgy 
   reading into structures directly) and why only on a PPC
b. Why the "fix" was not needed before

-- 
mailto:av1474@comtv.ru

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues
  2009-10-04  6:57   ` malc
@ 2009-10-04  7:04     ` malc
  2009-10-04 11:09       ` malc
  0 siblings, 1 reply; 12+ messages in thread
From: malc @ 2009-10-04  7:04 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: qemu-devel, Paul Brook

On Sun, 4 Oct 2009, malc wrote:

> On Fri, 18 Sep 2009, Jan Kiszka wrote:
> 
> > They likely represent invalid queues that should be skipped. We already
> > do this for RX queues. Wish I had a spec...
> > 
> > Credits go to malc for analyzing the issue and suggesting this fix.
> > 
> 
> What bothers me is:
> 
> a. Why 930c86820e8e0b6dfcf211bda5e835463d72ff42 (disregarding dodgy 
                                                 ^ breaks it

>    reading into structures directly) and why only on a PPC
> b. Why the "fix" was not needed before
> 
> 

-- 
mailto:av1474@comtv.ru

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues
  2009-10-04  7:04     ` malc
@ 2009-10-04 11:09       ` malc
  0 siblings, 0 replies; 12+ messages in thread
From: malc @ 2009-10-04 11:09 UTC (permalink / raw)
  To: qemu-devel

On Sun, 4 Oct 2009, malc wrote:

> On Sun, 4 Oct 2009, malc wrote:
> 
> > On Fri, 18 Sep 2009, Jan Kiszka wrote:
> > 
> > > They likely represent invalid queues that should be skipped. We already
> > > do this for RX queues. Wish I had a spec...
> > > 
> > > Credits go to malc for analyzing the issue and suggesting this fix.
> > > 
> > 
> > What bothers me is:
> > 
> > a. Why 930c86820e8e0b6dfcf211bda5e835463d72ff42 (disregarding dodgy 
>                                                  ^ breaks it
> 
> >    reading into structures directly) and why only on a PPC
> > b. Why the "fix" was not needed before

And FWIW i'm again getting the bounces from web.de (a copy of which i've
sent you the other week)

-- 
mailto:av1474@comtv.ru

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2009-10-04 11:09 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-18 18:51 [Qemu-devel] [PATCH 0/8] Musicpal updates Jan Kiszka
2009-09-18 18:51 ` [Qemu-devel] [PATCH 1/8] musicpal: Catch null TX qeueues Jan Kiszka
2009-10-04  6:57   ` malc
2009-10-04  7:04     ` malc
2009-10-04 11:09       ` malc
2009-09-18 18:51 ` [Qemu-devel] [PATCH 3/8] musicpal: Clean up typecasts Jan Kiszka
2009-09-18 18:51 ` [Qemu-devel] [PATCH 8/8] musicpal: Add VMState support Jan Kiszka
2009-09-18 18:51 ` [Qemu-devel] [PATCH 7/8] musicpal: Make PIT emulation more robust Jan Kiszka
2009-09-18 18:51 ` [Qemu-devel] [PATCH 6/8] musicpal: True reset support for audio device Jan Kiszka
2009-09-18 18:51 ` [Qemu-devel] [PATCH 2/8] musicpal: Rework GPIO input events Jan Kiszka
2009-09-18 18:51 ` [Qemu-devel] [PATCH 4/8] musicpal: Coding style fixes Jan Kiszka
2009-09-18 18:51 ` [Qemu-devel] [PATCH 5/8] musicpal: True reset support for GPIO Jan Kiszka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.