2 * Generic UHCI HCD (Host Controller Driver) for Platform Devices
4 * Copyright (c) 2011 Tony Prisk <linux@prisktech.co.nz>
6 * This file is based on uhci-grlib.c
7 * (C) Copyright 2004-2007 Alan Stern, stern@rowland.harvard.edu
11 #include <linux/platform_device.h>
13 static int uhci_platform_init(struct usb_hcd
*hcd
)
15 struct uhci_hcd
*uhci
= hcd_to_uhci(hcd
);
17 uhci
->rh_numports
= uhci_count_ports(hcd
);
19 /* Set up pointers to to generic functions */
20 uhci
->reset_hc
= uhci_generic_reset_hc
;
21 uhci
->check_and_reset_hc
= uhci_generic_check_and_reset_hc
;
23 /* No special actions need to be taken for the functions below */
24 uhci
->configure_hc
= NULL
;
25 uhci
->resume_detect_interrupts_are_broken
= NULL
;
26 uhci
->global_suspend_mode_is_broken
= NULL
;
28 /* Reset if the controller isn't already safely quiescent. */
29 check_and_reset_hc(uhci
);
33 static const struct hc_driver uhci_platform_hc_driver
= {
34 .description
= hcd_name
,
35 .product_desc
= "Generic UHCI Host Controller",
36 .hcd_priv_size
= sizeof(struct uhci_hcd
),
38 /* Generic hardware linkage */
40 .flags
= HCD_MEMORY
| HCD_USB11
,
42 /* Basic lifecycle operations */
43 .reset
= uhci_platform_init
,
48 .bus_suspend
= uhci_rh_suspend
,
49 .bus_resume
= uhci_rh_resume
,
53 .urb_enqueue
= uhci_urb_enqueue
,
54 .urb_dequeue
= uhci_urb_dequeue
,
56 .endpoint_disable
= uhci_hcd_endpoint_disable
,
57 .get_frame_number
= uhci_hcd_get_frame_number
,
59 .hub_status_data
= uhci_hub_status_data
,
60 .hub_control
= uhci_hub_control
,
63 static int uhci_hcd_platform_probe(struct platform_device
*pdev
)
66 struct uhci_hcd
*uhci
;
74 * Right now device-tree probed devices don't get dma_mask set.
75 * Since shared usb code relies on it, set it here for now.
76 * Once we have dma capability bindings this can go away.
78 if (!pdev
->dev
.dma_mask
)
79 pdev
->dev
.dma_mask
= &pdev
->dev
.coherent_dma_mask
;
80 if (!pdev
->dev
.coherent_dma_mask
)
81 pdev
->dev
.coherent_dma_mask
= DMA_BIT_MASK(32);
83 hcd
= usb_create_hcd(&uhci_platform_hc_driver
, &pdev
->dev
,
88 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
89 hcd
->rsrc_start
= res
->start
;
90 hcd
->rsrc_len
= resource_size(res
);
92 if (!request_mem_region(hcd
->rsrc_start
, hcd
->rsrc_len
, hcd_name
)) {
93 pr_err("%s: request_mem_region failed\n", __func__
);
98 hcd
->regs
= ioremap(hcd
->rsrc_start
, hcd
->rsrc_len
);
100 pr_err("%s: ioremap failed\n", __func__
);
104 uhci
= hcd_to_uhci(hcd
);
106 uhci
->regs
= hcd
->regs
;
108 ret
= usb_add_hcd(hcd
, pdev
->resource
[1].start
, IRQF_DISABLED
|
118 release_mem_region(hcd
->rsrc_start
, hcd
->rsrc_len
);
125 static int uhci_hcd_platform_remove(struct platform_device
*pdev
)
127 struct usb_hcd
*hcd
= platform_get_drvdata(pdev
);
131 release_mem_region(hcd
->rsrc_start
, hcd
->rsrc_len
);
137 /* Make sure the controller is quiescent and that we're not using it
138 * any more. This is mainly for the benefit of programs which, like kexec,
139 * expect the hardware to be idle: not doing DMA or generating IRQs.
141 * This routine may be called in a damaged or failing kernel. Hence we
142 * do not acquire the spinlock before shutting down the controller.
144 static void uhci_hcd_platform_shutdown(struct platform_device
*op
)
146 struct usb_hcd
*hcd
= platform_get_drvdata(op
);
148 uhci_hc_died(hcd_to_uhci(hcd
));
151 static const struct of_device_id platform_uhci_ids
[] = {
152 { .compatible
= "platform-uhci", },
156 static struct platform_driver uhci_platform_driver
= {
157 .probe
= uhci_hcd_platform_probe
,
158 .remove
= uhci_hcd_platform_remove
,
159 .shutdown
= uhci_hcd_platform_shutdown
,
161 .name
= "platform-uhci",
162 .owner
= THIS_MODULE
,
163 .of_match_table
= platform_uhci_ids
,