Sparc32/PPC: convert escc to qdev

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
Blue Swirl 2009-07-15 08:51:32 +00:00
parent 2582cfa0cb
commit 6c319c8222

150
hw/escc.c
View file

@ -21,7 +21,9 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include "hw.h" #include "hw.h"
#include "sysbus.h"
#include "escc.h" #include "escc.h"
#include "qemu-char.h" #include "qemu-char.h"
#include "console.h" #include "console.h"
@ -114,8 +116,10 @@ typedef struct ChannelState {
} ChannelState; } ChannelState;
struct SerialState { struct SerialState {
SysBusDevice busdev;
struct ChannelState chn[2]; struct ChannelState chn[2];
int it_shift; int it_shift;
int mmio_index;
}; };
#define SERIAL_CTRL 0 #define SERIAL_CTRL 0
@ -723,44 +727,28 @@ int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
CharDriverState *chrA, CharDriverState *chrB, CharDriverState *chrA, CharDriverState *chrB,
int clock, int it_shift) int clock, int it_shift)
{ {
int escc_io_memory, i; DeviceState *dev;
SerialState *s; SysBusDevice *s;
SerialState *d;
s = qemu_mallocz(sizeof(SerialState)); dev = qdev_create(NULL, "escc");
qdev_set_prop_int(dev, "disabled", 0);
escc_io_memory = cpu_register_io_memory(escc_mem_read, qdev_set_prop_int(dev, "frequency", clock);
escc_mem_write, qdev_set_prop_int(dev, "it_shift", it_shift);
s); qdev_set_prop_ptr(dev, "chrB", chrB);
if (base) qdev_set_prop_ptr(dev, "chrA", chrA);
cpu_register_physical_memory(base, ESCC_SIZE << it_shift, qdev_set_prop_int(dev, "chnBtype", ser);
escc_io_memory); qdev_set_prop_int(dev, "chnAtype", ser);
qdev_init(dev);
s->it_shift = it_shift; s = sysbus_from_qdev(dev);
s->chn[0].chr = chrB; sysbus_connect_irq(s, 0, irqA);
s->chn[1].chr = chrA; sysbus_connect_irq(s, 1, irqB);
s->chn[0].disabled = 0; if (base) {
s->chn[1].disabled = 0; sysbus_mmio_map(s, 0, base);
s->chn[0].irq = irqB;
s->chn[1].irq = irqA;
for (i = 0; i < 2; i++) {
s->chn[i].chn = 1 - i;
s->chn[i].type = ser;
s->chn[i].clock = clock / 2;
if (s->chn[i].chr) {
qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive,
serial_receive1, serial_event, &s->chn[i]);
}
} }
s->chn[0].otherchn = &s->chn[1];
s->chn[1].otherchn = &s->chn[0]; d = FROM_SYSBUS(SerialState, s);
if (base) return d->mmio_index;
register_savevm("escc", base, 2, escc_save, escc_load, s);
else
register_savevm("escc", -1, 2, escc_save, escc_load, s);
qemu_register_reset(escc_reset, s);
escc_reset(s);
return escc_io_memory;
} }
static const uint8_t keycodes[128] = { static const uint8_t keycodes[128] = {
@ -903,35 +891,87 @@ static void sunmouse_event(void *opaque,
void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq,
int disabled, int clock, int it_shift) int disabled, int clock, int it_shift)
{ {
int slavio_serial_io_memory, i; DeviceState *dev;
SerialState *s; SysBusDevice *s;
s = qemu_mallocz(sizeof(SerialState)); dev = qdev_create(NULL, "escc");
qdev_set_prop_int(dev, "disabled", disabled);
qdev_set_prop_int(dev, "frequency", clock);
qdev_set_prop_int(dev, "it_shift", it_shift);
qdev_set_prop_ptr(dev, "chrB", NULL);
qdev_set_prop_ptr(dev, "chrA", NULL);
qdev_set_prop_int(dev, "chnBtype", mouse);
qdev_set_prop_int(dev, "chnAtype", kbd);
qdev_init(dev);
s = sysbus_from_qdev(dev);
sysbus_connect_irq(s, 0, irq);
sysbus_connect_irq(s, 1, irq);
sysbus_mmio_map(s, 0, base);
}
s->it_shift = it_shift; static void escc_init1(SysBusDevice *dev)
{
SerialState *s = FROM_SYSBUS(SerialState, dev);
int io;
unsigned int i;
uint32_t clock, disabled;
s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", 0);
clock = qdev_get_prop_int(&dev->qdev, "frequency", 0);
s->chn[0].chr = qdev_get_prop_ptr(&dev->qdev, "chrB");
s->chn[1].chr = qdev_get_prop_ptr(&dev->qdev, "chrA");
disabled = qdev_get_prop_int(&dev->qdev, "disabled", 0);
s->chn[0].disabled = disabled;
s->chn[1].disabled = disabled;
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
s->chn[i].irq = irq; sysbus_init_irq(dev, &s->chn[i].irq);
s->chn[i].chn = 1 - i; s->chn[i].chn = 1 - i;
s->chn[i].chr = NULL;
s->chn[i].clock = clock / 2; s->chn[i].clock = clock / 2;
if (s->chn[i].chr) {
qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive,
serial_receive1, serial_event, &s->chn[i]);
}
} }
s->chn[0].otherchn = &s->chn[1]; s->chn[0].otherchn = &s->chn[1];
s->chn[1].otherchn = &s->chn[0]; s->chn[1].otherchn = &s->chn[0];
s->chn[0].type = mouse; s->chn[0].type = qdev_get_prop_int(&dev->qdev, "chnBtype", 0);
s->chn[1].type = kbd; s->chn[1].type = qdev_get_prop_int(&dev->qdev, "chnAtype", 0);
s->chn[0].disabled = disabled;
s->chn[1].disabled = disabled;
slavio_serial_io_memory = cpu_register_io_memory(escc_mem_read, io = cpu_register_io_memory(escc_mem_read, escc_mem_write, s);
escc_mem_write, sysbus_init_mmio(dev, ESCC_SIZE << s->it_shift, io);
s); s->mmio_index = io;
cpu_register_physical_memory(base, ESCC_SIZE << it_shift,
slavio_serial_io_memory);
qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, if (s->chn[0].type == mouse) {
"QEMU Sun Mouse"); qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0,
qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); "QEMU Sun Mouse");
register_savevm("slavio_serial_mouse", base, 2, escc_save, escc_load, s); }
if (s->chn[1].type == kbd) {
qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]);
}
register_savevm("escc", -1, 2, escc_save, escc_load, s);
qemu_register_reset(escc_reset, s); qemu_register_reset(escc_reset, s);
escc_reset(s); escc_reset(s);
} }
static SysBusDeviceInfo escc_info = {
.init = escc_init1,
.qdev.name = "escc",
.qdev.size = sizeof(SerialState),
.qdev.props = (DevicePropList[]) {
{.name = "frequency", .type = PROP_TYPE_INT},
{.name = "it_shift", .type = PROP_TYPE_INT},
{.name = "disabled", .type = PROP_TYPE_INT},
{.name = "chrB", .type = PROP_TYPE_PTR},
{.name = "chrA", .type = PROP_TYPE_PTR},
{.name = "chnBtype", .type = PROP_TYPE_INT},
{.name = "chnAtype", .type = PROP_TYPE_INT},
{.name = NULL}
}
};
static void escc_register_devices(void)
{
sysbus_register_withprop(&escc_info);
}
device_init(escc_register_devices)