Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2c3d690 authored by Richard Zhao's avatar Richard Zhao Committed by Greg Kroah-Hartman
Browse files

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: default avatarRichard Zhao <richard.zhao@freescale.com>
Reviewed-by: default avatarMarek Vasut <marex@denx.de>
Acked-by: default avatarFelipe Balbi <balbi@ti.com>
Tested-by: default avatarSubodh Nijsure <snijsure@grid-net.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 526c5138
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -160,6 +160,8 @@ struct ci13xxx {


	struct ci13xxx_platform_data	*platdata;
	struct ci13xxx_platform_data	*platdata;
	int				vbus_active;
	int				vbus_active;
	/* FIXME: some day, we'll not use global phy */
	bool				global_phy;
	struct usb_phy			*transceiver;
	struct usb_phy			*transceiver;
	struct usb_hcd			*hcd;
	struct usb_hcd			*hcd;
};
};
+4 −0
Original line number Original line Diff line number Diff line
@@ -419,6 +419,10 @@ static int __devinit ci_hdrc_probe(struct platform_device *pdev)


	ci->dev = dev;
	ci->dev = dev;
	ci->platdata = dev->platform_data;
	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);
	ret = hw_device_init(ci, base);
	if (ret < 0) {
	if (ret < 0) {
+1 −0
Original line number Original line Diff line number Diff line
@@ -117,6 +117,7 @@ static int host_start(struct ci13xxx *ci)
	hcd->has_tt = 1;
	hcd->has_tt = 1;


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


	ehci = hcd_to_ehci(hcd);
	ehci = hcd_to_ehci(hcd);
	ehci->caps = ci->hw_bank.cap;
	ehci->caps = ci->hw_bank.cap;
+7 −4
Original line number Original line Diff line number Diff line
@@ -1685,6 +1685,7 @@ static int udc_start(struct ci13xxx *ci)


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


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


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


@@ -1738,7 +1740,7 @@ static int udc_start(struct ci13xxx *ci)
unreg_device:
unreg_device:
	device_unregister(&ci->gadget.dev);
	device_unregister(&ci->gadget.dev);
put_transceiver:
put_transceiver:
	if (!IS_ERR_OR_NULL(ci->transceiver))
	if (!IS_ERR_OR_NULL(ci->transceiver) && ci->global_phy)
		usb_put_phy(ci->transceiver);
		usb_put_phy(ci->transceiver);
free_pools:
free_pools:
	dma_pool_destroy(ci->td_pool);
	dma_pool_destroy(ci->td_pool);
@@ -1772,6 +1774,7 @@ static void udc_stop(struct ci13xxx *ci)


	if (!IS_ERR_OR_NULL(ci->transceiver)) {
	if (!IS_ERR_OR_NULL(ci->transceiver)) {
		otg_set_peripheral(ci->transceiver->otg, NULL);
		otg_set_peripheral(ci->transceiver->otg, NULL);
		if (ci->global_phy)
			usb_put_phy(ci->transceiver);
			usb_put_phy(ci->transceiver);
	}
	}
	dbg_remove_files(&ci->gadget.dev);
	dbg_remove_files(&ci->gadget.dev);
+3 −0
Original line number Original line Diff line number Diff line
@@ -5,12 +5,15 @@
#ifndef __LINUX_USB_CHIPIDEA_H
#ifndef __LINUX_USB_CHIPIDEA_H
#define __LINUX_USB_CHIPIDEA_H
#define __LINUX_USB_CHIPIDEA_H


#include <linux/usb/otg.h>

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