mirror of https://gitlab.com/qemu-project/qemu
hw/char: QOM'ify cadence_uart model
* drop qemu_char_get_next_serial and use chardev prop * create cadence_uart_create wrapper function to create cadence_uart_device * change affected board code to use the new way Signed-off-by: xiaoqiang zhao <zxq_yx_007@163.com> Message-id: 1465028065-5855-3-git-send-email-zxq_yx_007@163.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
f0d1d2c115
commit
4be12ea09a
|
@ -32,6 +32,7 @@
|
||||||
#include "hw/ssi/ssi.h"
|
#include "hw/ssi/ssi.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
#include "hw/sd/sd.h"
|
#include "hw/sd/sd.h"
|
||||||
|
#include "hw/char/cadence_uart.h"
|
||||||
|
|
||||||
#define NUM_SPI_FLASHES 4
|
#define NUM_SPI_FLASHES 4
|
||||||
#define NUM_QSPI_FLASHES 2
|
#define NUM_QSPI_FLASHES 2
|
||||||
|
@ -235,8 +236,8 @@ static void zynq_init(MachineState *machine)
|
||||||
sysbus_create_simple("xlnx,ps7-usb", 0xE0002000, pic[53-IRQ_OFFSET]);
|
sysbus_create_simple("xlnx,ps7-usb", 0xE0002000, pic[53-IRQ_OFFSET]);
|
||||||
sysbus_create_simple("xlnx,ps7-usb", 0xE0003000, pic[76-IRQ_OFFSET]);
|
sysbus_create_simple("xlnx,ps7-usb", 0xE0003000, pic[76-IRQ_OFFSET]);
|
||||||
|
|
||||||
sysbus_create_simple("cadence_uart", 0xE0000000, pic[59-IRQ_OFFSET]);
|
cadence_uart_create(0xE0000000, pic[59 - IRQ_OFFSET], serial_hds[0]);
|
||||||
sysbus_create_simple("cadence_uart", 0xE0001000, pic[82-IRQ_OFFSET]);
|
cadence_uart_create(0xE0001000, pic[82 - IRQ_OFFSET], serial_hds[1]);
|
||||||
|
|
||||||
sysbus_create_varargs("cadence_ttc", 0xF8001000,
|
sysbus_create_varargs("cadence_ttc", 0xF8001000,
|
||||||
pic[42-IRQ_OFFSET], pic[43-IRQ_OFFSET], pic[44-IRQ_OFFSET], NULL);
|
pic[42-IRQ_OFFSET], pic[43-IRQ_OFFSET], pic[44-IRQ_OFFSET], NULL);
|
||||||
|
|
|
@ -331,6 +331,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < XLNX_ZYNQMP_NUM_UARTS; i++) {
|
for (i = 0; i < XLNX_ZYNQMP_NUM_UARTS; i++) {
|
||||||
|
qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", serial_hds[i]);
|
||||||
object_property_set_bool(OBJECT(&s->uart[i]), true, "realized", &err);
|
object_property_set_bool(OBJECT(&s->uart[i]), true, "realized", &err);
|
||||||
if (err) {
|
if (err) {
|
||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
|
|
|
@ -468,9 +468,6 @@ static void cadence_uart_realize(DeviceState *dev, Error **errp)
|
||||||
s->fifo_trigger_handle = timer_new_ns(QEMU_CLOCK_VIRTUAL,
|
s->fifo_trigger_handle = timer_new_ns(QEMU_CLOCK_VIRTUAL,
|
||||||
fifo_trigger_update, s);
|
fifo_trigger_update, s);
|
||||||
|
|
||||||
/* FIXME use a qdev chardev prop instead of qemu_char_get_next_serial() */
|
|
||||||
s->chr = qemu_char_get_next_serial();
|
|
||||||
|
|
||||||
if (s->chr) {
|
if (s->chr) {
|
||||||
qemu_chr_add_handlers(s->chr, uart_can_receive, uart_receive,
|
qemu_chr_add_handlers(s->chr, uart_can_receive, uart_receive,
|
||||||
uart_event, s);
|
uart_event, s);
|
||||||
|
@ -517,6 +514,11 @@ static const VMStateDescription vmstate_cadence_uart = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static Property cadence_uart_properties[] = {
|
||||||
|
DEFINE_PROP_CHR("chardev", CadenceUARTState, chr),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
};
|
||||||
|
|
||||||
static void cadence_uart_class_init(ObjectClass *klass, void *data)
|
static void cadence_uart_class_init(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
@ -524,9 +526,8 @@ static void cadence_uart_class_init(ObjectClass *klass, void *data)
|
||||||
dc->realize = cadence_uart_realize;
|
dc->realize = cadence_uart_realize;
|
||||||
dc->vmsd = &vmstate_cadence_uart;
|
dc->vmsd = &vmstate_cadence_uart;
|
||||||
dc->reset = cadence_uart_reset;
|
dc->reset = cadence_uart_reset;
|
||||||
/* Reason: realize() method uses qemu_char_get_next_serial() */
|
dc->props = cadence_uart_properties;
|
||||||
dc->cannot_instantiate_with_device_add_yet = true;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static const TypeInfo cadence_uart_info = {
|
static const TypeInfo cadence_uart_info = {
|
||||||
.name = TYPE_CADENCE_UART,
|
.name = TYPE_CADENCE_UART,
|
||||||
|
|
|
@ -49,5 +49,22 @@ typedef struct {
|
||||||
QEMUTimer *fifo_trigger_handle;
|
QEMUTimer *fifo_trigger_handle;
|
||||||
} CadenceUARTState;
|
} CadenceUARTState;
|
||||||
|
|
||||||
|
static inline DeviceState *cadence_uart_create(hwaddr addr,
|
||||||
|
qemu_irq irq,
|
||||||
|
CharDriverState *chr)
|
||||||
|
{
|
||||||
|
DeviceState *dev;
|
||||||
|
SysBusDevice *s;
|
||||||
|
|
||||||
|
dev = qdev_create(NULL, TYPE_CADENCE_UART);
|
||||||
|
s = SYS_BUS_DEVICE(dev);
|
||||||
|
qdev_prop_set_chr(dev, "chardev", chr);
|
||||||
|
qdev_init_nofail(dev);
|
||||||
|
sysbus_mmio_map(s, 0, addr);
|
||||||
|
sysbus_connect_irq(s, 0, irq);
|
||||||
|
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
|
||||||
#define CADENCE_UART_H
|
#define CADENCE_UART_H
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue