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

Commit ac96511b authored by Peter Chen's avatar Peter Chen Committed by Greg Kroah-Hartman
Browse files

usb: phy: change phy notify connect/disconnect API



The old parameter "port" is useless for phy notify, as one usb
phy is only for one usb port. New parameter "speed" stands for
the device's speed which is on the port, this "speed" parameter
is needed at some platforms which will do some phy operations
according to device's speed.

Signed-off-by: default avatarPeter Chen <peter.chen@freescale.com>
Tested-by: default avatarMike Thompson <mpthompson@gmail.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b76baa81
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -4039,7 +4039,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
		goto fail;
		goto fail;


	if (hcd->phy && !hdev->parent)
	if (hcd->phy && !hdev->parent)
		usb_phy_notify_connect(hcd->phy, port1);
		usb_phy_notify_connect(hcd->phy, udev->speed);


	/*
	/*
	 * Some superspeed devices have finished the link training process
	 * Some superspeed devices have finished the link training process
@@ -4238,7 +4238,7 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
	if (udev) {
	if (udev) {
		if (hcd->phy && !hdev->parent &&
		if (hcd->phy && !hdev->parent &&
				!(portstatus & USB_PORT_STAT_CONNECTION))
				!(portstatus & USB_PORT_STAT_CONNECTION))
			usb_phy_notify_disconnect(hcd->phy, port1);
			usb_phy_notify_disconnect(hcd->phy, udev->speed);
		usb_disconnect(&hub->ports[port1 - 1]->child);
		usb_disconnect(&hub->ports[port1 - 1]->child);
	}
	}
	clear_bit(port1, hub->change_bits);
	clear_bit(port1, hub->change_bits);
+14 −8
Original line number Original line Diff line number Diff line
@@ -76,20 +76,26 @@ static void mxs_phy_shutdown(struct usb_phy *phy)
	clk_disable_unprepare(mxs_phy->clk);
	clk_disable_unprepare(mxs_phy->clk);
}
}


static int mxs_phy_on_connect(struct usb_phy *phy, int port)
static int mxs_phy_on_connect(struct usb_phy *phy,
		enum usb_device_speed speed)
{
{
	dev_dbg(phy->dev, "Connect on port %d\n", port);
	dev_dbg(phy->dev, "%s speed device has connected\n",
		(speed == USB_SPEED_HIGH) ? "high" : "non-high");


	if (speed == USB_SPEED_HIGH)
		writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
		writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
				phy->io_priv + HW_USBPHY_CTRL_SET);
				phy->io_priv + HW_USBPHY_CTRL_SET);


	return 0;
	return 0;
}
}


static int mxs_phy_on_disconnect(struct usb_phy *phy, int port)
static int mxs_phy_on_disconnect(struct usb_phy *phy,
		enum usb_device_speed speed)
{
{
	dev_dbg(phy->dev, "Disconnect on port %d\n", port);
	dev_dbg(phy->dev, "%s speed device has disconnected\n",
		(speed == USB_SPEED_HIGH) ? "high" : "non-high");


	if (speed == USB_SPEED_HIGH)
		writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
		writel_relaxed(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
				phy->io_priv + HW_USBPHY_CTRL_CLR);
				phy->io_priv + HW_USBPHY_CTRL_CLR);


+9 −6
Original line number Original line Diff line number Diff line
@@ -10,6 +10,7 @@
#define __LINUX_USB_PHY_H
#define __LINUX_USB_PHY_H


#include <linux/notifier.h>
#include <linux/notifier.h>
#include <linux/usb.h>


enum usb_phy_events {
enum usb_phy_events {
	USB_EVENT_NONE,         /* no events or cable disconnected */
	USB_EVENT_NONE,         /* no events or cable disconnected */
@@ -99,8 +100,10 @@ struct usb_phy {
				int suspend);
				int suspend);


	/* notify phy connect status change */
	/* notify phy connect status change */
	int	(*notify_connect)(struct usb_phy *x, int port);
	int	(*notify_connect)(struct usb_phy *x,
	int	(*notify_disconnect)(struct usb_phy *x, int port);
			enum usb_device_speed speed);
	int	(*notify_disconnect)(struct usb_phy *x,
			enum usb_device_speed speed);
};
};




@@ -189,19 +192,19 @@ usb_phy_set_suspend(struct usb_phy *x, int suspend)
}
}


static inline int
static inline int
usb_phy_notify_connect(struct usb_phy *x, int port)
usb_phy_notify_connect(struct usb_phy *x, enum usb_device_speed speed)
{
{
	if (x->notify_connect)
	if (x->notify_connect)
		return x->notify_connect(x, port);
		return x->notify_connect(x, speed);
	else
	else
		return 0;
		return 0;
}
}


static inline int
static inline int
usb_phy_notify_disconnect(struct usb_phy *x, int port)
usb_phy_notify_disconnect(struct usb_phy *x, enum usb_device_speed speed)
{
{
	if (x->notify_disconnect)
	if (x->notify_disconnect)
		return x->notify_disconnect(x, port);
		return x->notify_disconnect(x, speed);
	else
	else
		return 0;
		return 0;
}
}