hw/arm/musicpal: Don't connect two qemu_irqs directly to the same input
The MusicPal board code connects both of the IRQ outputs of the UART to the same INTC qemu_irq. Connecting two qemu_irqs outputs directly to the same input is not valid as it produces subtly wrong behaviour (for instance if both the IRQ lines are high, and then one goes low, the INTC input will see this as a high-to-low transition even though the second IRQ line should still be holding it high). This kind of wiring needs an explicitly created OR gate; add one. Inspired-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-id: 20201107193403.436146-5-f4bug@amsat.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
bdad3654d3
commit
498661dd22
@ -93,6 +93,7 @@ config MUSCA
|
||||
|
||||
config MUSICPAL
|
||||
bool
|
||||
select OR_IRQ
|
||||
select BITBANG_I2C
|
||||
select MARVELL_88W8618
|
||||
select PTIMER
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "ui/console.h"
|
||||
#include "hw/i2c/i2c.h"
|
||||
#include "hw/irq.h"
|
||||
#include "hw/or-irq.h"
|
||||
#include "hw/audio/wm8750.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
#include "sysemu/runstate.h"
|
||||
@ -77,8 +78,7 @@
|
||||
#define MP_TIMER4_IRQ 7
|
||||
#define MP_EHCI_IRQ 8
|
||||
#define MP_ETH_IRQ 9
|
||||
#define MP_UART1_IRQ 11
|
||||
#define MP_UART2_IRQ 11
|
||||
#define MP_UART_SHARED_IRQ 11
|
||||
#define MP_GPIO_IRQ 12
|
||||
#define MP_RTC_IRQ 28
|
||||
#define MP_AUDIO_IRQ 30
|
||||
@ -1589,6 +1589,7 @@ static void musicpal_init(MachineState *machine)
|
||||
ARMCPU *cpu;
|
||||
qemu_irq pic[32];
|
||||
DeviceState *dev;
|
||||
DeviceState *uart_orgate;
|
||||
DeviceState *i2c_dev;
|
||||
DeviceState *lcd_dev;
|
||||
DeviceState *key_dev;
|
||||
@ -1627,9 +1628,17 @@ static void musicpal_init(MachineState *machine)
|
||||
pic[MP_TIMER2_IRQ], pic[MP_TIMER3_IRQ],
|
||||
pic[MP_TIMER4_IRQ], NULL);
|
||||
|
||||
serial_mm_init(address_space_mem, MP_UART1_BASE, 2, pic[MP_UART1_IRQ],
|
||||
/* Logically OR both UART IRQs together */
|
||||
uart_orgate = DEVICE(object_new(TYPE_OR_IRQ));
|
||||
object_property_set_int(OBJECT(uart_orgate), "num-lines", 2, &error_fatal);
|
||||
qdev_realize_and_unref(uart_orgate, NULL, &error_fatal);
|
||||
qdev_connect_gpio_out(DEVICE(uart_orgate), 0, pic[MP_UART_SHARED_IRQ]);
|
||||
|
||||
serial_mm_init(address_space_mem, MP_UART1_BASE, 2,
|
||||
qdev_get_gpio_in(uart_orgate, 0),
|
||||
1825000, serial_hd(0), DEVICE_NATIVE_ENDIAN);
|
||||
serial_mm_init(address_space_mem, MP_UART2_BASE, 2, pic[MP_UART2_IRQ],
|
||||
serial_mm_init(address_space_mem, MP_UART2_BASE, 2,
|
||||
qdev_get_gpio_in(uart_orgate, 1),
|
||||
1825000, serial_hd(1), DEVICE_NATIVE_ENDIAN);
|
||||
|
||||
/* Register flash */
|
||||
|
Loading…
Reference in New Issue
Block a user