Skip to content

Commit

Permalink
usb: chipidea: permit driver bindings pass phy pointer
Browse files Browse the repository at this point in the history
Sometimes, the driver bindings may know what phy they use.
For example, when using device tree, the usb controller may have a
phandler pointing to usb phy.

Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
Reviewed-by: Marek Vasut <marex@denx.de>
Acked-by: Felipe Balbi <balbi@ti.com>
Tested-by: Subodh Nijsure <snijsure@grid-net.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Richard Zhao authored and Greg Kroah-Hartman committed Jul 9, 2012
1 parent 526c513 commit a2c3d69
Showing 5 changed files with 17 additions and 4 deletions.
2 changes: 2 additions & 0 deletions drivers/usb/chipidea/ci.h
Original file line number Diff line number Diff line change
@@ -160,6 +160,8 @@ struct ci13xxx {

struct ci13xxx_platform_data *platdata;
int vbus_active;
/* FIXME: some day, we'll not use global phy */
bool global_phy;
struct usb_phy *transceiver;
struct usb_hcd *hcd;
};
4 changes: 4 additions & 0 deletions drivers/usb/chipidea/core.c
Original file line number Diff line number Diff line change
@@ -419,6 +419,10 @@ static int __devinit ci_hdrc_probe(struct platform_device *pdev)

ci->dev = dev;
ci->platdata = dev->platform_data;
if (ci->platdata->phy)
ci->transceiver = ci->platdata->phy;
else
ci->global_phy = true;

ret = hw_device_init(ci, base);
if (ret < 0) {
1 change: 1 addition & 0 deletions drivers/usb/chipidea/host.c
Original file line number Diff line number Diff line change
@@ -117,6 +117,7 @@ static int host_start(struct ci13xxx *ci)
hcd->has_tt = 1;

hcd->power_budget = ci->platdata->power_budget;
hcd->phy = ci->transceiver;

ehci = hcd_to_ehci(hcd);
ehci->caps = ci->hw_bank.cap;
11 changes: 7 additions & 4 deletions drivers/usb/chipidea/udc.c
Original file line number Diff line number Diff line change
@@ -1685,7 +1685,8 @@ static int udc_start(struct ci13xxx *ci)

ci->gadget.ep0 = &ci->ep0in->ep;

ci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);
if (ci->global_phy)
ci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2);

if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
if (ci->transceiver == NULL) {
@@ -1729,7 +1730,8 @@ static int udc_start(struct ci13xxx *ci)
remove_trans:
if (!IS_ERR_OR_NULL(ci->transceiver)) {
otg_set_peripheral(ci->transceiver->otg, &ci->gadget);
usb_put_phy(ci->transceiver);
if (ci->global_phy)
usb_put_phy(ci->transceiver);
}

dev_err(dev, "error = %i\n", retval);
@@ -1738,7 +1740,7 @@ static int udc_start(struct ci13xxx *ci)
unreg_device:
device_unregister(&ci->gadget.dev);
put_transceiver:
if (!IS_ERR_OR_NULL(ci->transceiver))
if (!IS_ERR_OR_NULL(ci->transceiver) && ci->global_phy)
usb_put_phy(ci->transceiver);
free_pools:
dma_pool_destroy(ci->td_pool);
@@ -1772,7 +1774,8 @@ static void udc_stop(struct ci13xxx *ci)

if (!IS_ERR_OR_NULL(ci->transceiver)) {
otg_set_peripheral(ci->transceiver->otg, NULL);
usb_put_phy(ci->transceiver);
if (ci->global_phy)
usb_put_phy(ci->transceiver);
}
dbg_remove_files(&ci->gadget.dev);
device_unregister(&ci->gadget.dev);
3 changes: 3 additions & 0 deletions include/linux/usb/chipidea.h
Original file line number Diff line number Diff line change
@@ -5,12 +5,15 @@
#ifndef __LINUX_USB_CHIPIDEA_H
#define __LINUX_USB_CHIPIDEA_H

#include <linux/usb/otg.h>

struct ci13xxx;
struct ci13xxx_platform_data {
const char *name;
/* offset of the capability registers */
uintptr_t capoffset;
unsigned power_budget;
struct usb_phy *phy;
unsigned long flags;
#define CI13XXX_REGS_SHARED BIT(0)
#define CI13XXX_REQUIRE_TRANSCEIVER BIT(1)

0 comments on commit a2c3d69

Please sign in to comment.