xref: /qemu/hw/usb/vt82c686-uhci-pci.c (revision 65c69e9a9f05ac407ebb2df48b5261f3da21afc9)
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