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
Show file tree
Hide file tree
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
Expand Up @@ -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;
};
Expand Down
4 changes: 4 additions & 0 deletions drivers/usb/chipidea/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions drivers/usb/chipidea/host.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 7 additions & 4 deletions drivers/usb/chipidea/udc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions include/linux/usb/chipidea.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit a2c3d69

Please sign in to comment.