Commit d27cf0ae6dae753ae4f7c5eac3e375fbc11cb417
1 parent
f40070c3
Sparc32/Sparc64/PPC: convert m48txx to qdev
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
42 additions
and
17 deletions
hw/m48t59.c
| @@ -23,9 +23,9 @@ | @@ -23,9 +23,9 @@ | ||
| 23 | */ | 23 | */ |
| 24 | #include "hw.h" | 24 | #include "hw.h" |
| 25 | #include "nvram.h" | 25 | #include "nvram.h" |
| 26 | -#include "isa.h" | ||
| 27 | #include "qemu-timer.h" | 26 | #include "qemu-timer.h" |
| 28 | #include "sysemu.h" | 27 | #include "sysemu.h" |
| 28 | +#include "sysbus.h" | ||
| 29 | 29 | ||
| 30 | //#define DEBUG_NVRAM | 30 | //#define DEBUG_NVRAM |
| 31 | 31 | ||
| @@ -41,11 +41,11 @@ | @@ -41,11 +41,11 @@ | ||
| 41 | * PPC platform there is also a nvram lock function. | 41 | * PPC platform there is also a nvram lock function. |
| 42 | */ | 42 | */ |
| 43 | struct m48t59_t { | 43 | struct m48t59_t { |
| 44 | + SysBusDevice busdev; | ||
| 44 | /* Model parameters */ | 45 | /* Model parameters */ |
| 45 | int type; // 2 = m48t02, 8 = m48t08, 59 = m48t59 | 46 | int type; // 2 = m48t02, 8 = m48t08, 59 = m48t59 |
| 46 | /* Hardware parameters */ | 47 | /* Hardware parameters */ |
| 47 | qemu_irq IRQ; | 48 | qemu_irq IRQ; |
| 48 | - int mem_index; | ||
| 49 | uint32_t io_base; | 49 | uint32_t io_base; |
| 50 | uint16_t size; | 50 | uint16_t size; |
| 51 | /* RTC management */ | 51 | /* RTC management */ |
| @@ -618,32 +618,57 @@ m48t59_t *m48t59_init (qemu_irq IRQ, target_phys_addr_t mem_base, | @@ -618,32 +618,57 @@ m48t59_t *m48t59_init (qemu_irq IRQ, target_phys_addr_t mem_base, | ||
| 618 | uint32_t io_base, uint16_t size, | 618 | uint32_t io_base, uint16_t size, |
| 619 | int type) | 619 | int type) |
| 620 | { | 620 | { |
| 621 | - m48t59_t *s; | ||
| 622 | - target_phys_addr_t save_base; | ||
| 623 | - | ||
| 624 | - s = qemu_mallocz(sizeof(m48t59_t)); | ||
| 625 | - s->buffer = qemu_mallocz(size); | ||
| 626 | - s->IRQ = IRQ; | ||
| 627 | - s->size = size; | ||
| 628 | - s->io_base = io_base; | ||
| 629 | - s->type = type; | 621 | + DeviceState *dev; |
| 622 | + SysBusDevice *s; | ||
| 623 | + m48t59_t *d; | ||
| 624 | + | ||
| 625 | + dev = qdev_create(NULL, "m48t59"); | ||
| 626 | + qdev_set_prop_int(dev, "type", type); | ||
| 627 | + qdev_set_prop_int(dev, "size", size); | ||
| 628 | + qdev_set_prop_int(dev, "io_base", io_base); | ||
| 629 | + qdev_init(dev); | ||
| 630 | + s = sysbus_from_qdev(dev); | ||
| 631 | + sysbus_connect_irq(s, 0, IRQ); | ||
| 630 | if (io_base != 0) { | 632 | if (io_base != 0) { |
| 631 | register_ioport_read(io_base, 0x04, 1, NVRAM_readb, s); | 633 | register_ioport_read(io_base, 0x04, 1, NVRAM_readb, s); |
| 632 | register_ioport_write(io_base, 0x04, 1, NVRAM_writeb, s); | 634 | register_ioport_write(io_base, 0x04, 1, NVRAM_writeb, s); |
| 633 | } | 635 | } |
| 634 | if (mem_base != 0) { | 636 | if (mem_base != 0) { |
| 635 | - s->mem_index = cpu_register_io_memory(nvram_read, nvram_write, s); | ||
| 636 | - cpu_register_physical_memory(mem_base, size, s->mem_index); | 637 | + sysbus_mmio_map(s, 0, mem_base); |
| 637 | } | 638 | } |
| 638 | - if (type == 59) { | 639 | + |
| 640 | + d = FROM_SYSBUS(m48t59_t, s); | ||
| 641 | + | ||
| 642 | + return d; | ||
| 643 | +} | ||
| 644 | + | ||
| 645 | +static void m48t59_init1(SysBusDevice *dev) | ||
| 646 | +{ | ||
| 647 | + m48t59_t *s = FROM_SYSBUS(m48t59_t, dev); | ||
| 648 | + int mem_index; | ||
| 649 | + | ||
| 650 | + s->size = qdev_get_prop_int(&dev->qdev, "size", -1); | ||
| 651 | + s->buffer = qemu_mallocz(s->size); | ||
| 652 | + sysbus_init_irq(dev, &s->IRQ); | ||
| 653 | + s->io_base = qdev_get_prop_int(&dev->qdev, "io_base", 0); | ||
| 654 | + s->type = qdev_get_prop_int(&dev->qdev, "type", -1); | ||
| 655 | + | ||
| 656 | + mem_index = cpu_register_io_memory(nvram_read, nvram_write, s); | ||
| 657 | + sysbus_init_mmio(dev, s->size, mem_index); | ||
| 658 | + | ||
| 659 | + if (s->type == 59) { | ||
| 639 | s->alrm_timer = qemu_new_timer(vm_clock, &alarm_cb, s); | 660 | s->alrm_timer = qemu_new_timer(vm_clock, &alarm_cb, s); |
| 640 | s->wd_timer = qemu_new_timer(vm_clock, &watchdog_cb, s); | 661 | s->wd_timer = qemu_new_timer(vm_clock, &watchdog_cb, s); |
| 641 | } | 662 | } |
| 642 | qemu_get_timedate(&s->alarm, 0); | 663 | qemu_get_timedate(&s->alarm, 0); |
| 643 | 664 | ||
| 644 | qemu_register_reset(m48t59_reset, s); | 665 | qemu_register_reset(m48t59_reset, s); |
| 645 | - save_base = mem_base ? mem_base : io_base; | ||
| 646 | - register_savevm("m48t59", save_base, 1, m48t59_save, m48t59_load, s); | 666 | + register_savevm("m48t59", -1, 1, m48t59_save, m48t59_load, s); |
| 667 | +} | ||
| 647 | 668 | ||
| 648 | - return s; | 669 | +static void m48t59_register_devices(void) |
| 670 | +{ | ||
| 671 | + sysbus_register_dev("m48t59", sizeof(m48t59_t), m48t59_init1); | ||
| 649 | } | 672 | } |
| 673 | + | ||
| 674 | +device_init(m48t59_register_devices) |