mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 08:02:07 +00:00
USB: move transceiver from ehci_hcd and ohci_hcd to hcd and rename it as phy
- to decrease redundant since both ehci_hcd and ohci_hcd have the same variable - it helps access phy in usb core code - phy is more meaningful than transceiver Signed-off-by: Richard Zhao <richard.zhao@freescale.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
4527715979
commit
c2e935a7db
@ -142,19 +142,19 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver,
|
||||
if (pdata->operating_mode == FSL_USB2_DR_OTG) {
|
||||
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
|
||||
|
||||
ehci->transceiver = usb_get_transceiver();
|
||||
dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, transceiver=0x%p\n",
|
||||
hcd, ehci, ehci->transceiver);
|
||||
hcd->phy = usb_get_transceiver();
|
||||
dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, phy=0x%p\n",
|
||||
hcd, ehci, hcd->phy);
|
||||
|
||||
if (ehci->transceiver) {
|
||||
retval = otg_set_host(ehci->transceiver->otg,
|
||||
if (hcd->phy) {
|
||||
retval = otg_set_host(hcd->phy->otg,
|
||||
&ehci_to_hcd(ehci)->self);
|
||||
if (retval) {
|
||||
usb_put_transceiver(ehci->transceiver);
|
||||
usb_put_transceiver(hcd->phy);
|
||||
goto err4;
|
||||
}
|
||||
} else {
|
||||
dev_err(&pdev->dev, "can't find transceiver\n");
|
||||
dev_err(&pdev->dev, "can't find phy\n");
|
||||
retval = -ENODEV;
|
||||
goto err4;
|
||||
}
|
||||
@ -190,11 +190,10 @@ static void usb_hcd_fsl_remove(struct usb_hcd *hcd,
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
|
||||
|
||||
if (ehci->transceiver) {
|
||||
otg_set_host(ehci->transceiver->otg, NULL);
|
||||
usb_put_transceiver(ehci->transceiver);
|
||||
if (hcd->phy) {
|
||||
otg_set_host(hcd->phy->otg, NULL);
|
||||
usb_put_transceiver(hcd->phy);
|
||||
}
|
||||
|
||||
usb_remove_hcd(hcd);
|
||||
|
@ -724,7 +724,7 @@ static int ehci_hub_control (
|
||||
#ifdef CONFIG_USB_OTG
|
||||
if ((hcd->self.otg_port == (wIndex + 1))
|
||||
&& hcd->self.b_hnp_enable) {
|
||||
otg_start_hnp(ehci->transceiver->otg);
|
||||
otg_start_hnp(hcd->phy->otg);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
@ -175,10 +175,6 @@ struct ehci_hcd { /* one per controller */
|
||||
#ifdef DEBUG
|
||||
struct dentry *debug_dir;
|
||||
#endif
|
||||
/*
|
||||
* OTG controllers and transceivers need software interaction
|
||||
*/
|
||||
struct usb_phy *transceiver;
|
||||
};
|
||||
|
||||
/* convert between an HCD pointer and the corresponding EHCI_HCD */
|
||||
|
@ -167,14 +167,15 @@ static int omap_1510_local_bus_init(void)
|
||||
|
||||
static void start_hnp(struct ohci_hcd *ohci)
|
||||
{
|
||||
const unsigned port = ohci_to_hcd(ohci)->self.otg_port - 1;
|
||||
struct usb_hcd *hcd = ohci_to_hcd(ohci);
|
||||
const unsigned port = hcd->self.otg_port - 1;
|
||||
unsigned long flags;
|
||||
u32 l;
|
||||
|
||||
otg_start_hnp(ohci->transceiver->otg);
|
||||
otg_start_hnp(hcd->phy->otg);
|
||||
|
||||
local_irq_save(flags);
|
||||
ohci->transceiver->state = OTG_STATE_A_SUSPEND;
|
||||
hcd->phy->state = OTG_STATE_A_SUSPEND;
|
||||
writel (RH_PS_PSS, &ohci->regs->roothub.portstatus [port]);
|
||||
l = omap_readl(OTG_CTRL);
|
||||
l &= ~OTG_A_BUSREQ;
|
||||
@ -211,18 +212,18 @@ static int ohci_omap_init(struct usb_hcd *hcd)
|
||||
|
||||
#ifdef CONFIG_USB_OTG
|
||||
if (need_transceiver) {
|
||||
ohci->transceiver = usb_get_transceiver();
|
||||
if (ohci->transceiver) {
|
||||
int status = otg_set_host(ohci->transceiver->otg,
|
||||
hcd->phy = usb_get_transceiver();
|
||||
if (hcd->phy) {
|
||||
int status = otg_set_host(hcd->phy->otg,
|
||||
&ohci_to_hcd(ohci)->self);
|
||||
dev_dbg(hcd->self.controller, "init %s transceiver, status %d\n",
|
||||
ohci->transceiver->label, status);
|
||||
dev_dbg(hcd->self.controller, "init %s phy, status %d\n",
|
||||
hcd->phy->label, status);
|
||||
if (status) {
|
||||
usb_put_transceiver(ohci->transceiver);
|
||||
usb_put_transceiver(hcd->phy);
|
||||
return status;
|
||||
}
|
||||
} else {
|
||||
dev_err(hcd->self.controller, "can't find transceiver\n");
|
||||
dev_err(hcd->self.controller, "can't find phy\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
ohci->start_hnp = start_hnp;
|
||||
@ -403,9 +404,9 @@ usb_hcd_omap_remove (struct usb_hcd *hcd, struct platform_device *pdev)
|
||||
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
|
||||
|
||||
usb_remove_hcd(hcd);
|
||||
if (ohci->transceiver) {
|
||||
(void) otg_set_host(ohci->transceiver->otg, 0);
|
||||
usb_put_transceiver(ohci->transceiver);
|
||||
if (hcd->phy) {
|
||||
(void) otg_set_host(hcd->phy->otg, 0);
|
||||
usb_put_transceiver(hcd->phy);
|
||||
}
|
||||
if (machine_is_omap_osk())
|
||||
gpio_free(9);
|
||||
|
@ -372,11 +372,6 @@ struct ohci_hcd {
|
||||
struct ed *ed_controltail; /* last in ctrl list */
|
||||
struct ed *periodic [NUM_INTS]; /* shadow int_table */
|
||||
|
||||
/*
|
||||
* OTG controllers and transceivers need software interaction;
|
||||
* other external transceivers should be software-transparent
|
||||
*/
|
||||
struct usb_phy *transceiver;
|
||||
void (*start_hnp)(struct ohci_hcd *ohci);
|
||||
|
||||
/*
|
||||
|
@ -93,6 +93,12 @@ struct usb_hcd {
|
||||
*/
|
||||
const struct hc_driver *driver; /* hw-specific hooks */
|
||||
|
||||
/*
|
||||
* OTG and some Host controllers need software interaction with phys;
|
||||
* other external phys should be software-transparent
|
||||
*/
|
||||
struct usb_phy *phy;
|
||||
|
||||
/* Flags that need to be manipulated atomically because they can
|
||||
* change while the host controller is running. Always use
|
||||
* set_bit() or clear_bit() to change their values.
|
||||
|
Loading…
Reference in New Issue
Block a user