#include "xhci.h"
 #include "xhci-trace.h"
+#include "xhci-pci.h"
 
 #define SSIC_PORT_NUM          2
 #define SSIC_PORT_CFG2         0x880c
 
 static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
 {
-       struct pci_dev          *pdev = to_pci_dev(dev);
+       struct pci_dev                  *pdev = to_pci_dev(dev);
+       struct xhci_driver_data         *driver_data;
+       const struct pci_device_id      *id;
+
+       id = pci_match_id(pdev->driver->id_table, pdev);
+
+       if (id && id->driver_data) {
+               driver_data = (struct xhci_driver_data *)id->driver_data;
+               xhci->quirks |= driver_data->quirks;
+       }
 
        /* Look for vendor-specific quirks */
        if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
        int retval;
        struct xhci_hcd *xhci;
        struct usb_hcd *hcd;
+       struct xhci_driver_data *driver_data;
+
+       driver_data = (struct xhci_driver_data *)id->driver_data;
+       if (driver_data && driver_data->quirks & XHCI_RENESAS_FW_QUIRK) {
+               retval = renesas_xhci_check_request_fw(dev, id);
+               if (retval)
+                       return retval;
+       }
 
        /* Prevent runtime suspending between USB-2 and USB-3 initialization */
        pm_runtime_get_noresume(&dev->dev);
        struct xhci_hcd *xhci;
 
        xhci = hcd_to_xhci(pci_get_drvdata(dev));
+       if (xhci->quirks & XHCI_RENESAS_FW_QUIRK)
+               renesas_xhci_pci_exit(dev);
+
        xhci->xhc_state |= XHCI_STATE_REMOVING;
 
        if (xhci->quirks & XHCI_DEFAULT_PM_RUNTIME_ALLOW)
 
 /*-------------------------------------------------------------------------*/
 
+static const struct xhci_driver_data reneses_data = {
+       .quirks  = XHCI_RENESAS_FW_QUIRK,
+       .firmware = "renesas_usb_fw.mem",
+};
+
 /* PCI driver selection metadata; PCI hotplugging uses this */
 static const struct pci_device_id pci_ids[] = {
+       { PCI_DEVICE(0x1912, 0x0014),
+               .driver_data =  (unsigned long)&reneses_data,
+       },
+       { PCI_DEVICE(0x1912, 0x0015),
+               .driver_data =  (unsigned long)&reneses_data,
+       },
        /* handle any USB 3.0 xHCI controller */
        { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_XHCI, ~0),
        },
        { /* end: all zeroes */ }
 };
 MODULE_DEVICE_TABLE(pci, pci_ids);
+MODULE_FIRMWARE("renesas_usb_fw.mem");
 
 /* pci driver glue; this is a "new style" PCI driver module */
 static struct pci_driver xhci_pci_driver = {