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

Commit 42b59eba authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Greg Kroah-Hartman
Browse files

USB: OHCI: Export the OHCI hub control and status_data functions



Platform drivers sometimes need to perform specific handling of hub
control requests and status data. Make this possible by exporting the
ohci_hub_control() and ohci_hub_status_data() functions which can then
be called from custom hub operations in the default case.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0021a75a
Loading
Loading
Loading
Loading
+2 −9
Original line number Diff line number Diff line
@@ -46,9 +46,6 @@ static const char hcd_name[] = "ohci-atmel";

static struct hc_driver __read_mostly ohci_at91_hc_driver;
static int clocked;
static int (*orig_ohci_hub_control)(struct usb_hcd  *hcd, u16 typeReq,
			u16 wValue, u16 wIndex, char *buf, u16 wLength);
static int (*orig_ohci_hub_status_data)(struct usb_hcd *hcd, char *buf);

extern int usb_disabled(void);

@@ -262,7 +259,7 @@ static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port)
static int ohci_at91_hub_status_data(struct usb_hcd *hcd, char *buf)
{
	struct at91_usbh_data *pdata = hcd->self.controller->platform_data;
	int length = orig_ohci_hub_status_data(hcd, buf);
	int length = ohci_hub_status_data(hcd, buf);
	int port;

	at91_for_each_port(port) {
@@ -340,8 +337,7 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
		break;
	}

	ret = orig_ohci_hub_control(hcd, typeReq, wValue, wIndex + 1,
				buf, wLength);
	ret = ohci_hub_control(hcd, typeReq, wValue, wIndex + 1, buf, wLength);
	if (ret)
		goto out;

@@ -690,9 +686,6 @@ static int __init ohci_at91_init(void)
	 * too easy.
	 */

	orig_ohci_hub_control = ohci_at91_hc_driver.hub_control;
	orig_ohci_hub_status_data = ohci_at91_hc_driver.hub_status_data;

	ohci_at91_hc_driver.hub_status_data	= ohci_at91_hub_status_data;
	ohci_at91_hc_driver.hub_control		= ohci_at91_hub_control;

+4 −4
Original line number Diff line number Diff line
@@ -438,8 +438,7 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,

/* build "status change" packet (one or two bytes) from HC registers */

static int
ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
int ohci_hub_status_data(struct usb_hcd *hcd, char *buf)
{
	struct ohci_hcd	*ohci = hcd_to_ohci (hcd);
	int		i, changed = 0, length = 1;
@@ -504,6 +503,7 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf)

	return changed ? length : 0;
}
EXPORT_SYMBOL_GPL(ohci_hub_status_data);

/*-------------------------------------------------------------------------*/

@@ -646,7 +646,7 @@ static inline int root_port_reset (struct ohci_hcd *ohci, unsigned port)
	return 0;
}

static int ohci_hub_control (
int ohci_hub_control(
	struct usb_hcd	*hcd,
	u16		typeReq,
	u16		wValue,
@@ -772,4 +772,4 @@ static int ohci_hub_control (
	}
	return retval;
}
EXPORT_SYMBOL_GPL(ohci_hub_control);
+3 −10
Original line number Diff line number Diff line
@@ -45,10 +45,6 @@ static struct clk *usb_clk;

/* forward definitions */

static int (*orig_ohci_hub_control)(struct usb_hcd  *hcd, u16 typeReq,
			u16 wValue, u16 wIndex, char *buf, u16 wLength);
static int (*orig_ohci_hub_status_data)(struct usb_hcd *hcd, char *buf);

static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc);

/* conversion functions */
@@ -110,7 +106,7 @@ ohci_s3c2410_hub_status_data(struct usb_hcd *hcd, char *buf)
	int orig;
	int portno;

	orig = orig_ohci_hub_status_data(hcd, buf);
	orig = ohci_hub_status_data(hcd, buf);

	if (info == NULL)
		return orig;
@@ -181,7 +177,7 @@ static int ohci_s3c2410_hub_control(
	 * process the request straight away and exit */

	if (info == NULL) {
		ret = orig_ohci_hub_control(hcd, typeReq, wValue,
		ret = ohci_hub_control(hcd, typeReq, wValue,
				       wIndex, buf, wLength);
		goto out;
	}
@@ -231,7 +227,7 @@ static int ohci_s3c2410_hub_control(
		break;
	}

	ret = orig_ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
	ret = ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
	if (ret)
		goto out;

@@ -489,9 +485,6 @@ static int __init ohci_s3c2410_init(void)
	 * override these functions by making it too easy.
	 */

	orig_ohci_hub_control = ohci_s3c2410_hc_driver.hub_control;
	orig_ohci_hub_status_data = ohci_s3c2410_hc_driver.hub_status_data;

	ohci_s3c2410_hc_driver.hub_status_data	= ohci_s3c2410_hub_status_data;
	ohci_s3c2410_hc_driver.hub_control	= ohci_s3c2410_hub_control;

+3 −0
Original line number Diff line number Diff line
@@ -727,3 +727,6 @@ extern int ohci_setup(struct usb_hcd *hcd);
extern int	ohci_suspend(struct usb_hcd *hcd, bool do_wakeup);
extern int	ohci_resume(struct usb_hcd *hcd, bool hibernated);
#endif
extern int	ohci_hub_control(struct usb_hcd	*hcd, u16 typeReq, u16 wValue,
				 u16 wIndex, char *buf, u16 wLength);
extern int	ohci_hub_status_data(struct usb_hcd *hcd, char *buf);