14
14
#include <linux/platform_device.h>
15
15
#include <asm/mach-au1x00/au1000.h>
17
#define USB_HOST_CONFIG (USB_MSR_BASE + USB_MSR_MCFG)
18
#define USB_MCFG_PFEN (1<<31)
19
#define USB_MCFG_RDCOMB (1<<30)
20
#define USB_MCFG_SSDEN (1<<23)
21
#define USB_MCFG_PHYPLLEN (1<<19)
22
#define USB_MCFG_UCECLKEN (1<<18)
23
#define USB_MCFG_EHCCLKEN (1<<17)
24
#ifdef CONFIG_DMA_COHERENT
25
#define USB_MCFG_UCAM (1<<7)
27
#define USB_MCFG_UCAM (0)
29
#define USB_MCFG_EBMEN (1<<3)
30
#define USB_MCFG_EMEMEN (1<<2)
32
#define USBH_ENABLE_CE (USB_MCFG_PHYPLLEN | USB_MCFG_EHCCLKEN)
33
#define USBH_ENABLE_INIT (USB_MCFG_PFEN | USB_MCFG_RDCOMB | \
34
USBH_ENABLE_CE | USB_MCFG_SSDEN | \
35
USB_MCFG_UCAM | USB_MCFG_EBMEN | \
38
#define USBH_DISABLE (USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
40
18
extern int usb_disabled(void);
42
static void au1xxx_start_ehc(void)
44
/* enable clock to EHCI block and HS PHY PLL*/
45
au_writel(au_readl(USB_HOST_CONFIG) | USBH_ENABLE_CE, USB_HOST_CONFIG);
49
/* enable EHCI mmio */
50
au_writel(au_readl(USB_HOST_CONFIG) | USBH_ENABLE_INIT, USB_HOST_CONFIG);
55
static void au1xxx_stop_ehc(void)
60
au_writel(au_readl(USB_HOST_CONFIG) & ~USBH_DISABLE, USB_HOST_CONFIG);
64
/* Disable EHC clock. If the HS PHY is unused disable it too. */
65
c = au_readl(USB_HOST_CONFIG) & ~USB_MCFG_EHCCLKEN;
66
if (!(c & USB_MCFG_UCECLKEN)) /* UDC disabled? */
67
c &= ~USB_MCFG_PHYPLLEN; /* yes: disable HS PHY PLL */
68
au_writel(c, USB_HOST_CONFIG);
72
20
static int au1xxx_ehci_setup(struct usb_hcd *hcd)
74
22
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
136
84
if (usb_disabled())
139
#if defined(CONFIG_SOC_AU1200) && defined(CONFIG_DMA_COHERENT)
140
/* Au1200 AB USB does not support coherent memory */
141
if (!(read_c0_prid() & 0xff)) {
142
printk(KERN_INFO "%s: this is chip revision AB!\n", pdev->name);
143
printk(KERN_INFO "%s: update your board or re-configure"
144
" the kernel\n", pdev->name);
149
87
if (pdev->resource[1].flags != IORESOURCE_IRQ) {
150
88
pr_debug("resource[1] is not IORESOURCE_IRQ");
181
123
ehci->hcs_params = readl(&ehci->caps->hcs_params);
183
125
ret = usb_add_hcd(hcd, pdev->resource[1].start,
184
IRQF_DISABLED | IRQF_SHARED);
186
128
platform_set_drvdata(pdev, hcd);
132
alchemy_usb_control(ALCHEMY_USB_EHCI0, 0);
191
134
iounmap(hcd->regs);
193
136
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
201
144
struct usb_hcd *hcd = platform_get_drvdata(pdev);
203
146
usb_remove_hcd(hcd);
147
alchemy_usb_control(ALCHEMY_USB_EHCI0, 0);
204
148
iounmap(hcd->regs);
205
149
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
206
150
usb_put_hcd(hcd);
208
151
platform_set_drvdata(pdev, NULL);
293
236
/* here we "know" root ports should always stay powered */
294
237
ehci_port_power(ehci, 1);
296
hcd->state = HC_STATE_SUSPENDED;
239
ehci->rh_state = EHCI_RH_SUSPENDED;