diff options
| author | Richard Zhao <richard.zhao@freescale.com> | 2012-07-07 22:56:46 +0800 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-07-09 09:59:23 -0700 | 
| commit | a2c3d6902f6f9916b5376c44baa8c1d08bf92a27 (patch) | |
| tree | 5148bf5983295422ff66b67a1df66a51b627c790 | |
| parent | 526c51382d59144a3704970ab111d668e604a10f (diff) | |
| download | olio-linux-3.10-a2c3d6902f6f9916b5376c44baa8c1d08bf92a27.tar.xz olio-linux-3.10-a2c3d6902f6f9916b5376c44baa8c1d08bf92a27.zip  | |
usb: chipidea: permit driver bindings pass phy pointer
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>
| -rw-r--r-- | drivers/usb/chipidea/ci.h | 2 | ||||
| -rw-r--r-- | drivers/usb/chipidea/core.c | 4 | ||||
| -rw-r--r-- | drivers/usb/chipidea/host.c | 1 | ||||
| -rw-r--r-- | drivers/usb/chipidea/udc.c | 11 | ||||
| -rw-r--r-- | 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 9655e3569d4..d738603a275 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 39603d7b791..1083585fad0 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 4a4fdb8c65f..ebff9f4f56e 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c @@ -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; diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index ba8284e2a23..c7a032a4f0c 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c @@ -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 @@ remove_dbg:  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); diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h index be078f0bfde..544825dde82 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)  |