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) |