OSDN Git Service

usb: xhci: cleanup xhci_hcd allocation
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / drivers / usb / host / xhci.h
index ea75e8c..11a231d 100644 (file)
@@ -1591,10 +1591,24 @@ struct xhci_hcd {
 #define COMP_MODE_RCVRY_MSECS 2000
 };
 
+/* Platform specific overrides to generic XHCI hc_driver ops */
+struct xhci_driver_overrides {
+       size_t extra_priv_size;
+       int (*reset)(struct usb_hcd *hcd);
+       int (*start)(struct usb_hcd *hcd);
+};
+
 /* convert between an HCD pointer and the corresponding EHCI_HCD */
 static inline struct xhci_hcd *hcd_to_xhci(struct usb_hcd *hcd)
 {
-       return *((struct xhci_hcd **) (hcd->hcd_priv));
+       struct usb_hcd *primary_hcd;
+
+       if (usb_hcd_is_primary_hcd(hcd))
+               primary_hcd = hcd;
+       else
+               primary_hcd = hcd->primary_hcd;
+
+       return (struct xhci_hcd *) (primary_hcd->hcd_priv);
 }
 
 static inline struct usb_hcd *xhci_to_hcd(struct xhci_hcd *xhci)
@@ -1748,7 +1762,8 @@ int xhci_run(struct usb_hcd *hcd);
 void xhci_stop(struct usb_hcd *hcd);
 void xhci_shutdown(struct usb_hcd *hcd);
 int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks);
-void xhci_init_driver(struct hc_driver *drv, int (*setup_fn)(struct usb_hcd *));
+void xhci_init_driver(struct hc_driver *drv,
+                     const struct xhci_driver_overrides *over);
 
 #ifdef CONFIG_PM
 int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup);