[PATCH v3 02/12] usb: chipidea: permit driver bindings pass phy pointer
From: Felipe Balbi <hidden>
Date: 2012-06-06 08:50:22
Also in:
linux-devicetree
On Fri, May 25, 2012 at 10:24:15AM +0800, Richard Zhao wrote:
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 <redacted> Reviewed-by: Marek Vasut <marex@denx.de>
Acked-by: Felipe Balbi <redacted>
quoted hunk
--- drivers/usb/chipidea/ci.h | 2 ++ drivers/usb/chipidea/core.c | 4 ++++ drivers/usb/chipidea/host.c | 1 + drivers/usb/chipidea/udc.c | 11 +++++++---- include/linux/usb/chipidea.h | 3 +++ 5 files changed, 17 insertions(+), 4 deletions(-)diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h index 9655e35..d738603 100644 --- a/drivers/usb/chipidea/ci.h +++ b/drivers/usb/chipidea/ci.h@@ -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; };diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index c14ce2b..21407e7 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c@@ -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) {diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index 4a4fdb8..4479f5a 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c@@ -121,6 +121,7 @@ static int host_start(struct ci13xxx *ci) ehci = hcd_to_ehci(hcd); ehci->caps = ci->hw_bank.cap; ehci->has_hostpc = ci->hw_bank.lpm; + ehci->transceiver = ci->transceiver; ret = usb_add_hcd(hcd, 0, 0); if (ret)diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index ca9b387..b43b29c 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c@@ -1684,7 +1684,8 @@ static int udc_start(struct ci13xxx *ci) ci->gadget.ep0 = &ci->ep0in->ep; - ci->transceiver = usb_get_transceiver(); + if (ci->global_phy) { + ci->transceiver = usb_get_transceiver(); if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) { if (ci->transceiver == NULL) {@@ -1728,7 +1729,8 @@ static int udc_start(struct ci13xxx *ci) remove_trans: if (ci->transceiver) { otg_set_peripheral(ci->transceiver->otg, &ci->gadget); - usb_put_transceiver(ci->transceiver); + if (ci->global_phy) + usb_put_transceiver(ci->transceiver); } dev_err(dev, "error = %i\n", retval);@@ -1737,7 +1739,7 @@ remove_dbg: unreg_device: device_unregister(&ci->gadget.dev); put_transceiver: - if (ci->transceiver) + if (ci->transceiver && ci->global_phy) usb_put_transceiver(ci->transceiver); free_pools: dma_pool_destroy(ci->td_pool);@@ -1771,7 +1773,8 @@ static void udc_stop(struct ci13xxx *ci) if (ci->transceiver) { otg_set_peripheral(ci->transceiver->otg, NULL); - usb_put_transceiver(ci->transceiver); + if (ci->global_phy) + usb_put_transceiver(ci->transceiver); } dbg_remove_files(&ci->gadget.dev); device_unregister(&ci->gadget.dev);diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h index be078f0..544825d 100644 --- a/include/linux/usb/chipidea.h +++ b/include/linux/usb/chipidea.h@@ -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)-- 1.7.5.4
-- balbi -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120606/4cebb060/attachment.sig>