Commit 6c319c82223a1766c5d64a20051e5c6ab7b53951
1 parent
2582cfa0
Sparc32/PPC: convert escc to qdev
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
97 additions
and
57 deletions
hw/escc.c
@@ -21,7 +21,9 @@ | @@ -21,7 +21,9 @@ | ||
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | * THE SOFTWARE. | 22 | * THE SOFTWARE. |
23 | */ | 23 | */ |
24 | + | ||
24 | #include "hw.h" | 25 | #include "hw.h" |
26 | +#include "sysbus.h" | ||
25 | #include "escc.h" | 27 | #include "escc.h" |
26 | #include "qemu-char.h" | 28 | #include "qemu-char.h" |
27 | #include "console.h" | 29 | #include "console.h" |
@@ -114,8 +116,10 @@ typedef struct ChannelState { | @@ -114,8 +116,10 @@ typedef struct ChannelState { | ||
114 | } ChannelState; | 116 | } ChannelState; |
115 | 117 | ||
116 | struct SerialState { | 118 | struct SerialState { |
119 | + SysBusDevice busdev; | ||
117 | struct ChannelState chn[2]; | 120 | struct ChannelState chn[2]; |
118 | int it_shift; | 121 | int it_shift; |
122 | + int mmio_index; | ||
119 | }; | 123 | }; |
120 | 124 | ||
121 | #define SERIAL_CTRL 0 | 125 | #define SERIAL_CTRL 0 |
@@ -723,44 +727,28 @@ int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB, | @@ -723,44 +727,28 @@ int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB, | ||
723 | CharDriverState *chrA, CharDriverState *chrB, | 727 | CharDriverState *chrA, CharDriverState *chrB, |
724 | int clock, int it_shift) | 728 | int clock, int it_shift) |
725 | { | 729 | { |
726 | - int escc_io_memory, i; | ||
727 | - SerialState *s; | ||
728 | - | ||
729 | - s = qemu_mallocz(sizeof(SerialState)); | ||
730 | - | ||
731 | - escc_io_memory = cpu_register_io_memory(escc_mem_read, | ||
732 | - escc_mem_write, | ||
733 | - s); | ||
734 | - if (base) | ||
735 | - cpu_register_physical_memory(base, ESCC_SIZE << it_shift, | ||
736 | - escc_io_memory); | ||
737 | - | ||
738 | - s->it_shift = it_shift; | ||
739 | - s->chn[0].chr = chrB; | ||
740 | - s->chn[1].chr = chrA; | ||
741 | - s->chn[0].disabled = 0; | ||
742 | - s->chn[1].disabled = 0; | ||
743 | - s->chn[0].irq = irqB; | ||
744 | - s->chn[1].irq = irqA; | ||
745 | - | ||
746 | - for (i = 0; i < 2; i++) { | ||
747 | - s->chn[i].chn = 1 - i; | ||
748 | - s->chn[i].type = ser; | ||
749 | - s->chn[i].clock = clock / 2; | ||
750 | - if (s->chn[i].chr) { | ||
751 | - qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, | ||
752 | - serial_receive1, serial_event, &s->chn[i]); | ||
753 | - } | 730 | + DeviceState *dev; |
731 | + SysBusDevice *s; | ||
732 | + SerialState *d; | ||
733 | + | ||
734 | + dev = qdev_create(NULL, "escc"); | ||
735 | + qdev_set_prop_int(dev, "disabled", 0); | ||
736 | + qdev_set_prop_int(dev, "frequency", clock); | ||
737 | + qdev_set_prop_int(dev, "it_shift", it_shift); | ||
738 | + qdev_set_prop_ptr(dev, "chrB", chrB); | ||
739 | + qdev_set_prop_ptr(dev, "chrA", chrA); | ||
740 | + qdev_set_prop_int(dev, "chnBtype", ser); | ||
741 | + qdev_set_prop_int(dev, "chnAtype", ser); | ||
742 | + qdev_init(dev); | ||
743 | + s = sysbus_from_qdev(dev); | ||
744 | + sysbus_connect_irq(s, 0, irqA); | ||
745 | + sysbus_connect_irq(s, 1, irqB); | ||
746 | + if (base) { | ||
747 | + sysbus_mmio_map(s, 0, base); | ||
754 | } | 748 | } |
755 | - s->chn[0].otherchn = &s->chn[1]; | ||
756 | - s->chn[1].otherchn = &s->chn[0]; | ||
757 | - if (base) | ||
758 | - register_savevm("escc", base, 2, escc_save, escc_load, s); | ||
759 | - else | ||
760 | - register_savevm("escc", -1, 2, escc_save, escc_load, s); | ||
761 | - qemu_register_reset(escc_reset, s); | ||
762 | - escc_reset(s); | ||
763 | - return escc_io_memory; | 749 | + |
750 | + d = FROM_SYSBUS(SerialState, s); | ||
751 | + return d->mmio_index; | ||
764 | } | 752 | } |
765 | 753 | ||
766 | static const uint8_t keycodes[128] = { | 754 | static const uint8_t keycodes[128] = { |
@@ -903,35 +891,87 @@ static void sunmouse_event(void *opaque, | @@ -903,35 +891,87 @@ static void sunmouse_event(void *opaque, | ||
903 | void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, | 891 | void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, |
904 | int disabled, int clock, int it_shift) | 892 | int disabled, int clock, int it_shift) |
905 | { | 893 | { |
906 | - int slavio_serial_io_memory, i; | ||
907 | - SerialState *s; | ||
908 | - | ||
909 | - s = qemu_mallocz(sizeof(SerialState)); | 894 | + DeviceState *dev; |
895 | + SysBusDevice *s; | ||
896 | + | ||
897 | + dev = qdev_create(NULL, "escc"); | ||
898 | + qdev_set_prop_int(dev, "disabled", disabled); | ||
899 | + qdev_set_prop_int(dev, "frequency", clock); | ||
900 | + qdev_set_prop_int(dev, "it_shift", it_shift); | ||
901 | + qdev_set_prop_ptr(dev, "chrB", NULL); | ||
902 | + qdev_set_prop_ptr(dev, "chrA", NULL); | ||
903 | + qdev_set_prop_int(dev, "chnBtype", mouse); | ||
904 | + qdev_set_prop_int(dev, "chnAtype", kbd); | ||
905 | + qdev_init(dev); | ||
906 | + s = sysbus_from_qdev(dev); | ||
907 | + sysbus_connect_irq(s, 0, irq); | ||
908 | + sysbus_connect_irq(s, 1, irq); | ||
909 | + sysbus_mmio_map(s, 0, base); | ||
910 | +} | ||
910 | 911 | ||
911 | - s->it_shift = it_shift; | 912 | +static void escc_init1(SysBusDevice *dev) |
913 | +{ | ||
914 | + SerialState *s = FROM_SYSBUS(SerialState, dev); | ||
915 | + int io; | ||
916 | + unsigned int i; | ||
917 | + uint32_t clock, disabled; | ||
918 | + | ||
919 | + s->it_shift = qdev_get_prop_int(&dev->qdev, "it_shift", 0); | ||
920 | + clock = qdev_get_prop_int(&dev->qdev, "frequency", 0); | ||
921 | + s->chn[0].chr = qdev_get_prop_ptr(&dev->qdev, "chrB"); | ||
922 | + s->chn[1].chr = qdev_get_prop_ptr(&dev->qdev, "chrA"); | ||
923 | + disabled = qdev_get_prop_int(&dev->qdev, "disabled", 0); | ||
924 | + s->chn[0].disabled = disabled; | ||
925 | + s->chn[1].disabled = disabled; | ||
912 | for (i = 0; i < 2; i++) { | 926 | for (i = 0; i < 2; i++) { |
913 | - s->chn[i].irq = irq; | 927 | + sysbus_init_irq(dev, &s->chn[i].irq); |
914 | s->chn[i].chn = 1 - i; | 928 | s->chn[i].chn = 1 - i; |
915 | - s->chn[i].chr = NULL; | ||
916 | s->chn[i].clock = clock / 2; | 929 | s->chn[i].clock = clock / 2; |
930 | + if (s->chn[i].chr) { | ||
931 | + qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive, | ||
932 | + serial_receive1, serial_event, &s->chn[i]); | ||
933 | + } | ||
917 | } | 934 | } |
918 | s->chn[0].otherchn = &s->chn[1]; | 935 | s->chn[0].otherchn = &s->chn[1]; |
919 | s->chn[1].otherchn = &s->chn[0]; | 936 | s->chn[1].otherchn = &s->chn[0]; |
920 | - s->chn[0].type = mouse; | ||
921 | - s->chn[1].type = kbd; | ||
922 | - s->chn[0].disabled = disabled; | ||
923 | - s->chn[1].disabled = disabled; | 937 | + s->chn[0].type = qdev_get_prop_int(&dev->qdev, "chnBtype", 0); |
938 | + s->chn[1].type = qdev_get_prop_int(&dev->qdev, "chnAtype", 0); | ||
924 | 939 | ||
925 | - slavio_serial_io_memory = cpu_register_io_memory(escc_mem_read, | ||
926 | - escc_mem_write, | ||
927 | - s); | ||
928 | - cpu_register_physical_memory(base, ESCC_SIZE << it_shift, | ||
929 | - slavio_serial_io_memory); | 940 | + io = cpu_register_io_memory(escc_mem_read, escc_mem_write, s); |
941 | + sysbus_init_mmio(dev, ESCC_SIZE << s->it_shift, io); | ||
942 | + s->mmio_index = io; | ||
930 | 943 | ||
931 | - qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, | ||
932 | - "QEMU Sun Mouse"); | ||
933 | - qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); | ||
934 | - register_savevm("slavio_serial_mouse", base, 2, escc_save, escc_load, s); | 944 | + if (s->chn[0].type == mouse) { |
945 | + qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0, | ||
946 | + "QEMU Sun Mouse"); | ||
947 | + } | ||
948 | + if (s->chn[1].type == kbd) { | ||
949 | + qemu_add_kbd_event_handler(sunkbd_event, &s->chn[1]); | ||
950 | + } | ||
951 | + register_savevm("escc", -1, 2, escc_save, escc_load, s); | ||
935 | qemu_register_reset(escc_reset, s); | 952 | qemu_register_reset(escc_reset, s); |
936 | escc_reset(s); | 953 | escc_reset(s); |
937 | } | 954 | } |
955 | + | ||
956 | +static SysBusDeviceInfo escc_info = { | ||
957 | + .init = escc_init1, | ||
958 | + .qdev.name = "escc", | ||
959 | + .qdev.size = sizeof(SerialState), | ||
960 | + .qdev.props = (DevicePropList[]) { | ||
961 | + {.name = "frequency", .type = PROP_TYPE_INT}, | ||
962 | + {.name = "it_shift", .type = PROP_TYPE_INT}, | ||
963 | + {.name = "disabled", .type = PROP_TYPE_INT}, | ||
964 | + {.name = "chrB", .type = PROP_TYPE_PTR}, | ||
965 | + {.name = "chrA", .type = PROP_TYPE_PTR}, | ||
966 | + {.name = "chnBtype", .type = PROP_TYPE_INT}, | ||
967 | + {.name = "chnAtype", .type = PROP_TYPE_INT}, | ||
968 | + {.name = NULL} | ||
969 | + } | ||
970 | +}; | ||
971 | + | ||
972 | +static void escc_register_devices(void) | ||
973 | +{ | ||
974 | + sysbus_register_withprop(&escc_info); | ||
975 | +} | ||
976 | + | ||
977 | +device_init(escc_register_devices) |