Commit b97a3134 authored by Miquel Raynal's avatar Miquel Raynal Committed by Greg Kroah-Hartman
Browse files

usb: core: comply to PHY framework



Current implementation of the USB core does not take into account the
new PHY framework. Correct the situation by adding a call to
phy_set_mode() before phy_power_on().

Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c9381e18
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -2736,6 +2736,11 @@ int usb_add_hcd(struct usb_hcd *hcd,
		if (retval)
			return retval;

		retval = usb_phy_roothub_set_mode(hcd->phy_roothub,
						  PHY_MODE_USB_HOST_SS);
		if (retval)
			goto err_usb_phy_roothub_power_on;

		retval = usb_phy_roothub_power_on(hcd->phy_roothub);
		if (retval)
			goto err_usb_phy_roothub_power_on;
+28 −0
Original line number Diff line number Diff line
@@ -123,6 +123,34 @@ int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub)
}
EXPORT_SYMBOL_GPL(usb_phy_roothub_exit);

int usb_phy_roothub_set_mode(struct usb_phy_roothub *phy_roothub,
			     enum phy_mode mode)
{
	struct usb_phy_roothub *roothub_entry;
	struct list_head *head;
	int err;

	if (!phy_roothub)
		return 0;

	head = &phy_roothub->list;

	list_for_each_entry(roothub_entry, head, list) {
		err = phy_set_mode(roothub_entry->phy, mode);
		if (err)
			goto err_out;
	}

	return 0;

err_out:
	list_for_each_entry_continue_reverse(roothub_entry, head, list)
		phy_power_off(roothub_entry->phy);

	return err;
}
EXPORT_SYMBOL_GPL(usb_phy_roothub_set_mode);

int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub)
{
	struct usb_phy_roothub *roothub_entry;
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@ struct usb_phy_roothub *usb_phy_roothub_alloc(struct device *dev);
int usb_phy_roothub_init(struct usb_phy_roothub *phy_roothub);
int usb_phy_roothub_exit(struct usb_phy_roothub *phy_roothub);

int usb_phy_roothub_set_mode(struct usb_phy_roothub *phy_roothub,
			     enum phy_mode mode);
int usb_phy_roothub_power_on(struct usb_phy_roothub *phy_roothub);
void usb_phy_roothub_power_off(struct usb_phy_roothub *phy_roothub);