16f2bcd5fSPhilippe Mathieu-Daudé #include "qemu/osdep.h" 24f3b0a4dSBALATON Zoltan #include "hw/irq.h" 34f3b0a4dSBALATON Zoltan #include "hw/isa/vt82c686.h" 46f2bcd5fSPhilippe Mathieu-Daudé #include "hcd-uhci.h" 56f2bcd5fSPhilippe Mathieu-Daudé 64f3b0a4dSBALATON Zoltan static void uhci_isa_set_irq(void *opaque, int irq_num, int level) 74f3b0a4dSBALATON Zoltan { 84f3b0a4dSBALATON Zoltan UHCIState *s = opaque; 94f3b0a4dSBALATON Zoltan uint8_t irq = pci_get_byte(s->dev.config + PCI_INTERRUPT_LINE); 104f3b0a4dSBALATON Zoltan if (irq > 0 && irq < 15) { 114f3b0a4dSBALATON Zoltan via_isa_set_irq(pci_get_function_0(&s->dev), irq, level); 124f3b0a4dSBALATON Zoltan } 134f3b0a4dSBALATON Zoltan } 144f3b0a4dSBALATON Zoltan 156f2bcd5fSPhilippe Mathieu-Daudé static void usb_uhci_vt82c686b_realize(PCIDevice *dev, Error **errp) 166f2bcd5fSPhilippe Mathieu-Daudé { 176f2bcd5fSPhilippe Mathieu-Daudé UHCIState *s = UHCI(dev); 186f2bcd5fSPhilippe Mathieu-Daudé uint8_t *pci_conf = s->dev.config; 196f2bcd5fSPhilippe Mathieu-Daudé 206f2bcd5fSPhilippe Mathieu-Daudé /* USB misc control 1/2 */ 216f2bcd5fSPhilippe Mathieu-Daudé pci_set_long(pci_conf + 0x40, 0x00001000); 226f2bcd5fSPhilippe Mathieu-Daudé /* PM capability */ 236f2bcd5fSPhilippe Mathieu-Daudé pci_set_long(pci_conf + 0x80, 0x00020001); 246f2bcd5fSPhilippe Mathieu-Daudé /* USB legacy support */ 256f2bcd5fSPhilippe Mathieu-Daudé pci_set_long(pci_conf + 0xc0, 0x00002000); 266f2bcd5fSPhilippe Mathieu-Daudé 276f2bcd5fSPhilippe Mathieu-Daudé usb_uhci_common_realize(dev, errp); 284f3b0a4dSBALATON Zoltan object_unref(s->irq); 294f3b0a4dSBALATON Zoltan s->irq = qemu_allocate_irq(uhci_isa_set_irq, s, 0); 306f2bcd5fSPhilippe Mathieu-Daudé } 316f2bcd5fSPhilippe Mathieu-Daudé 326f2bcd5fSPhilippe Mathieu-Daudé static UHCIInfo uhci_info[] = { 336f2bcd5fSPhilippe Mathieu-Daudé { 34*65c69e9aSBernhard Beschow .name = TYPE_VT82C686B_USB_UHCI, 356f2bcd5fSPhilippe Mathieu-Daudé .vendor_id = PCI_VENDOR_ID_VIA, 366f2bcd5fSPhilippe Mathieu-Daudé .device_id = PCI_DEVICE_ID_VIA_UHCI, 376f2bcd5fSPhilippe Mathieu-Daudé .revision = 0x01, 386f2bcd5fSPhilippe Mathieu-Daudé .irq_pin = 3, 396f2bcd5fSPhilippe Mathieu-Daudé .realize = usb_uhci_vt82c686b_realize, 406f2bcd5fSPhilippe Mathieu-Daudé .unplug = true, 41ece29df3SBALATON Zoltan /* Reason: only works as USB function of VT82xx superio chips */ 42ece29df3SBALATON Zoltan .notuser = true, 436f2bcd5fSPhilippe Mathieu-Daudé } 446f2bcd5fSPhilippe Mathieu-Daudé }; 456f2bcd5fSPhilippe Mathieu-Daudé 466f2bcd5fSPhilippe Mathieu-Daudé static const TypeInfo vt82c686b_usb_uhci_type_info = { 476f2bcd5fSPhilippe Mathieu-Daudé .parent = TYPE_UHCI, 48*65c69e9aSBernhard Beschow .name = TYPE_VT82C686B_USB_UHCI, 496f2bcd5fSPhilippe Mathieu-Daudé .class_init = uhci_data_class_init, 506f2bcd5fSPhilippe Mathieu-Daudé .class_data = uhci_info, 516f2bcd5fSPhilippe Mathieu-Daudé }; 526f2bcd5fSPhilippe Mathieu-Daudé 536f2bcd5fSPhilippe Mathieu-Daudé static void vt82c686b_usb_uhci_register_types(void) 546f2bcd5fSPhilippe Mathieu-Daudé { 556f2bcd5fSPhilippe Mathieu-Daudé type_register_static(&vt82c686b_usb_uhci_type_info); 566f2bcd5fSPhilippe Mathieu-Daudé } 576f2bcd5fSPhilippe Mathieu-Daudé 586f2bcd5fSPhilippe Mathieu-Daudé type_init(vt82c686b_usb_uhci_register_types) 59