hw/arm/spitz: Fix reset handling

Using the CPU reset handler for resets triggered by writing into
gpio pins other than GPIO01 is not appropriate and does not work,
since the reset triggered by writing into GPIO01 is configurable.
Use a separate reset handler for spitz to reset the entire system
and not just the CPU.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Message-id: 1477597646-24111-1-git-send-email-linux@roeck-us.net
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Guenter Roeck 2016-10-28 14:12:31 +01:00 committed by Peter Maydell
parent 1141d1eb57
commit 14da582101

View File

@ -29,6 +29,7 @@
#include "sysemu/block-backend.h" #include "sysemu/block-backend.h"
#include "hw/sysbus.h" #include "hw/sysbus.h"
#include "exec/address-spaces.h" #include "exec/address-spaces.h"
#include "sysemu/sysemu.h"
#undef REG_FMT #undef REG_FMT
#define REG_FMT "0x%02lx" #define REG_FMT "0x%02lx"
@ -844,9 +845,18 @@ static void spitz_lcd_hsync_handler(void *opaque, int line, int level)
spitz_hsync ^= 1; spitz_hsync ^= 1;
} }
static void spitz_reset(void *opaque, int line, int level)
{
if (level) {
qemu_system_reset_request();
}
}
static void spitz_gpio_setup(PXA2xxState *cpu, int slots) static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
{ {
qemu_irq lcd_hsync; qemu_irq lcd_hsync;
qemu_irq reset;
/* /*
* Bad hack: We toggle the LCD hsync GPIO on every GPIO status * Bad hack: We toggle the LCD hsync GPIO on every GPIO status
* read to satisfy broken guests that poll-wait for hsync. * read to satisfy broken guests that poll-wait for hsync.
@ -867,7 +877,8 @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
qemu_irq_raise(qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_BAT_COVER)); qemu_irq_raise(qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_BAT_COVER));
/* Handle reset */ /* Handle reset */
qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_ON_RESET, cpu->reset); reset = qemu_allocate_irq(spitz_reset, cpu, 0);
qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_ON_RESET, reset);
/* PCMCIA signals: card's IRQ and Card-Detect */ /* PCMCIA signals: card's IRQ and Card-Detect */
if (slots >= 1) if (slots >= 1)