X-Git-Url: http://git.maemo.org/git/?p=qemu;a=blobdiff_plain;f=hw%2Fpl050.c;fp=hw%2Fpl050.c;h=1f8878c21e0a792ed52c7c3fbb3dbd17ff56274d;hp=0ab60bf8382b23306fbc7a908107ec31f3264bc9;hb=759b334a9739814df2883aa4c41b1c0f5670e90a;hpb=7e2198fc87e878b8ce5df965477e21713ebf7834 diff --git a/hw/pl050.c b/hw/pl050.c index 0ab60bf..1f8878c 100644 --- a/hw/pl050.c +++ b/hw/pl050.c @@ -7,11 +7,11 @@ * This code is licenced under the GPL. */ -#include "hw.h" -#include "primecell.h" +#include "sysbus.h" #include "ps2.h" typedef struct { + SysBusDevice busdev; void *dev; uint32_t cr; uint32_t clk; @@ -79,7 +79,7 @@ static uint32_t pl050_read(void *opaque, target_phys_addr_t offset) case 4: /* KMIIR */ return s->pending | 2; default: - cpu_abort (cpu_single_env, "pl050_read: Bad offset %x\n", (int)offset); + hw_error("pl050_read: Bad offset %x\n", (int)offset); return 0; } } @@ -107,7 +107,7 @@ static void pl050_write(void *opaque, target_phys_addr_t offset, s->clk = value; return; default: - cpu_abort (cpu_single_env, "pl050_write: Bad offset %x\n", (int)offset); + hw_error("pl050_write: Bad offset %x\n", (int)offset); } } static CPUReadMemoryFunc *pl050_readfn[] = { @@ -122,20 +122,39 @@ static CPUWriteMemoryFunc *pl050_writefn[] = { pl050_write }; -void pl050_init(uint32_t base, qemu_irq irq, int is_mouse) +static void pl050_init(SysBusDevice *dev, int is_mouse) { + pl050_state *s = FROM_SYSBUS(pl050_state, dev); int iomemtype; - pl050_state *s; - s = (pl050_state *)qemu_mallocz(sizeof(pl050_state)); iomemtype = cpu_register_io_memory(0, pl050_readfn, pl050_writefn, s); - cpu_register_physical_memory(base, 0x00001000, iomemtype); - s->irq = irq; + sysbus_init_mmio(dev, 0x1000, iomemtype); + sysbus_init_irq(dev, &s->irq); s->is_mouse = is_mouse; - if (is_mouse) + if (s->is_mouse) s->dev = ps2_mouse_init(pl050_update, s); else s->dev = ps2_kbd_init(pl050_update, s); /* ??? Save/restore. */ } + +static void pl050_init_keyboard(SysBusDevice *dev) +{ + pl050_init(dev, 0); +} + +static void pl050_init_mouse(SysBusDevice *dev) +{ + pl050_init(dev, 1); +} + +static void pl050_register_devices(void) +{ + sysbus_register_dev("pl050_keyboard", sizeof(pl050_state), + pl050_init_keyboard); + sysbus_register_dev("pl050_mouse", sizeof(pl050_state), + pl050_init_mouse); +} + +device_init(pl050_register_devices)