|
@@ -225,6 +225,7 @@ struct ehci_hcd { /* one per controller */
|
|
unsigned has_synopsys_hc_bug:1; /* Synopsys HC */
|
|
unsigned has_synopsys_hc_bug:1; /* Synopsys HC */
|
|
unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */
|
|
unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */
|
|
unsigned need_oc_pp_cycle:1; /* MPC834X port power */
|
|
unsigned need_oc_pp_cycle:1; /* MPC834X port power */
|
|
|
|
+ unsigned imx28_write_fix:1; /* For Freescale i.MX28 */
|
|
|
|
|
|
/* required for usb32 quirk */
|
|
/* required for usb32 quirk */
|
|
#define OHCI_CTRL_HCFS (3 << 6)
|
|
#define OHCI_CTRL_HCFS (3 << 6)
|
|
@@ -728,6 +729,18 @@ static inline unsigned int ehci_readl(const struct ehci_hcd *ehci,
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef CONFIG_SOC_IMX28
|
|
|
|
+static inline void imx28_ehci_writel(const unsigned int val,
|
|
|
|
+ volatile __u32 __iomem *addr)
|
|
|
|
+{
|
|
|
|
+ __asm__ ("swp %0, %0, [%1]" : : "r"(val), "r"(addr));
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline void imx28_ehci_writel(const unsigned int val,
|
|
|
|
+ volatile __u32 __iomem *addr)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+#endif
|
|
static inline void ehci_writel(const struct ehci_hcd *ehci,
|
|
static inline void ehci_writel(const struct ehci_hcd *ehci,
|
|
const unsigned int val, __u32 __iomem *regs)
|
|
const unsigned int val, __u32 __iomem *regs)
|
|
{
|
|
{
|
|
@@ -736,7 +749,10 @@ static inline void ehci_writel(const struct ehci_hcd *ehci,
|
|
writel_be(val, regs) :
|
|
writel_be(val, regs) :
|
|
writel(val, regs);
|
|
writel(val, regs);
|
|
#else
|
|
#else
|
|
- writel(val, regs);
|
|
|
|
|
|
+ if (ehci->imx28_write_fix)
|
|
|
|
+ imx28_ehci_writel(val, regs);
|
|
|
|
+ else
|
|
|
|
+ writel(val, regs);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|