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:
Richard Zhao 2012-06-13 20:34:12 +08:00 committed by Greg Kroah-Hartman
parent 4527715979
commit c2e935a7db
6 changed files with 31 additions and 34 deletions

View File

@ -142,19 +142,19 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver,
if (pdata->operating_mode == FSL_USB2_DR_OTG) { if (pdata->operating_mode == FSL_USB2_DR_OTG) {
struct ehci_hcd *ehci = hcd_to_ehci(hcd); struct ehci_hcd *ehci = hcd_to_ehci(hcd);
ehci->transceiver = usb_get_transceiver(); hcd->phy = usb_get_transceiver();
dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, transceiver=0x%p\n", dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, phy=0x%p\n",
hcd, ehci, ehci->transceiver); hcd, ehci, hcd->phy);
if (ehci->transceiver) { if (hcd->phy) {
retval = otg_set_host(ehci->transceiver->otg, retval = otg_set_host(hcd->phy->otg,
&ehci_to_hcd(ehci)->self); &ehci_to_hcd(ehci)->self);
if (retval) { if (retval) {
usb_put_transceiver(ehci->transceiver); usb_put_transceiver(hcd->phy);
goto err4; goto err4;
} }
} else { } else {
dev_err(&pdev->dev, "can't find transceiver\n"); dev_err(&pdev->dev, "can't find phy\n");
retval = -ENODEV; retval = -ENODEV;
goto err4; goto err4;
} }
@ -190,11 +190,10 @@ static void usb_hcd_fsl_remove(struct usb_hcd *hcd,
struct platform_device *pdev) struct platform_device *pdev)
{ {
struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
struct ehci_hcd *ehci = hcd_to_ehci(hcd);
if (ehci->transceiver) { if (hcd->phy) {
otg_set_host(ehci->transceiver->otg, NULL); otg_set_host(hcd->phy->otg, NULL);
usb_put_transceiver(ehci->transceiver); usb_put_transceiver(hcd->phy);
} }
usb_remove_hcd(hcd); usb_remove_hcd(hcd);

View File

@ -724,7 +724,7 @@ static int ehci_hub_control (
#ifdef CONFIG_USB_OTG #ifdef CONFIG_USB_OTG
if ((hcd->self.otg_port == (wIndex + 1)) if ((hcd->self.otg_port == (wIndex + 1))
&& hcd->self.b_hnp_enable) { && hcd->self.b_hnp_enable) {
otg_start_hnp(ehci->transceiver->otg); otg_start_hnp(hcd->phy->otg);
break; break;
} }
#endif #endif

View File

@ -175,10 +175,6 @@ struct ehci_hcd { /* one per controller */
#ifdef DEBUG #ifdef DEBUG
struct dentry *debug_dir; struct dentry *debug_dir;
#endif #endif
/*
* OTG controllers and transceivers need software interaction
*/
struct usb_phy *transceiver;
}; };
/* convert between an HCD pointer and the corresponding EHCI_HCD */ /* convert between an HCD pointer and the corresponding EHCI_HCD */

View File

@ -167,14 +167,15 @@ static int omap_1510_local_bus_init(void)
static void start_hnp(struct ohci_hcd *ohci) 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; unsigned long flags;
u32 l; u32 l;
otg_start_hnp(ohci->transceiver->otg); otg_start_hnp(hcd->phy->otg);
local_irq_save(flags); 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]); writel (RH_PS_PSS, &ohci->regs->roothub.portstatus [port]);
l = omap_readl(OTG_CTRL); l = omap_readl(OTG_CTRL);
l &= ~OTG_A_BUSREQ; l &= ~OTG_A_BUSREQ;
@ -211,18 +212,18 @@ static int ohci_omap_init(struct usb_hcd *hcd)
#ifdef CONFIG_USB_OTG #ifdef CONFIG_USB_OTG
if (need_transceiver) { if (need_transceiver) {
ohci->transceiver = usb_get_transceiver(); hcd->phy = usb_get_transceiver();
if (ohci->transceiver) { if (hcd->phy) {
int status = otg_set_host(ohci->transceiver->otg, int status = otg_set_host(hcd->phy->otg,
&ohci_to_hcd(ohci)->self); &ohci_to_hcd(ohci)->self);
dev_dbg(hcd->self.controller, "init %s transceiver, status %d\n", dev_dbg(hcd->self.controller, "init %s phy, status %d\n",
ohci->transceiver->label, status); hcd->phy->label, status);
if (status) { if (status) {
usb_put_transceiver(ohci->transceiver); usb_put_transceiver(hcd->phy);
return status; return status;
} }
} else { } else {
dev_err(hcd->self.controller, "can't find transceiver\n"); dev_err(hcd->self.controller, "can't find phy\n");
return -ENODEV; return -ENODEV;
} }
ohci->start_hnp = start_hnp; 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); struct ohci_hcd *ohci = hcd_to_ohci (hcd);
usb_remove_hcd(hcd); usb_remove_hcd(hcd);
if (ohci->transceiver) { if (hcd->phy) {
(void) otg_set_host(ohci->transceiver->otg, 0); (void) otg_set_host(hcd->phy->otg, 0);
usb_put_transceiver(ohci->transceiver); usb_put_transceiver(hcd->phy);
} }
if (machine_is_omap_osk()) if (machine_is_omap_osk())
gpio_free(9); gpio_free(9);

View File

@ -372,11 +372,6 @@ struct ohci_hcd {
struct ed *ed_controltail; /* last in ctrl list */ struct ed *ed_controltail; /* last in ctrl list */
struct ed *periodic [NUM_INTS]; /* shadow int_table */ 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); void (*start_hnp)(struct ohci_hcd *ohci);
/* /*

View File

@ -93,6 +93,12 @@ struct usb_hcd {
*/ */
const struct hc_driver *driver; /* hw-specific hooks */ 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 /* Flags that need to be manipulated atomically because they can
* change while the host controller is running. Always use * change while the host controller is running. Always use
* set_bit() or clear_bit() to change their values. * set_bit() or clear_bit() to change their values.