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: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0021a75a47
commit
42b59eba71
@@ -46,9 +46,6 @@ static const char hcd_name[] = "ohci-atmel";
|
|||||||
|
|
||||||
static struct hc_driver __read_mostly ohci_at91_hc_driver;
|
static struct hc_driver __read_mostly ohci_at91_hc_driver;
|
||||||
static int clocked;
|
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);
|
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)
|
static int ohci_at91_hub_status_data(struct usb_hcd *hcd, char *buf)
|
||||||
{
|
{
|
||||||
struct at91_usbh_data *pdata = hcd->self.controller->platform_data;
|
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;
|
int port;
|
||||||
|
|
||||||
at91_for_each_port(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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = orig_ohci_hub_control(hcd, typeReq, wValue, wIndex + 1,
|
ret = ohci_hub_control(hcd, typeReq, wValue, wIndex + 1, buf, wLength);
|
||||||
buf, wLength);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@@ -690,9 +686,6 @@ static int __init ohci_at91_init(void)
|
|||||||
* too easy.
|
* 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_status_data = ohci_at91_hub_status_data;
|
||||||
ohci_at91_hc_driver.hub_control = ohci_at91_hub_control;
|
ohci_at91_hc_driver.hub_control = ohci_at91_hub_control;
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
/* build "status change" packet (one or two bytes) from HC registers */
|
||||||
|
|
||||||
static int
|
int ohci_hub_status_data(struct usb_hcd *hcd, char *buf)
|
||||||
ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
|
|
||||||
{
|
{
|
||||||
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
|
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
|
||||||
int i, changed = 0, length = 1;
|
int i, changed = 0, length = 1;
|
||||||
@@ -504,6 +503,7 @@ done:
|
|||||||
|
|
||||||
return changed ? length : 0;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ohci_hub_control (
|
int ohci_hub_control(
|
||||||
struct usb_hcd *hcd,
|
struct usb_hcd *hcd,
|
||||||
u16 typeReq,
|
u16 typeReq,
|
||||||
u16 wValue,
|
u16 wValue,
|
||||||
@@ -772,4 +772,4 @@ error:
|
|||||||
}
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ohci_hub_control);
|
||||||
|
|||||||
@@ -45,10 +45,6 @@ static struct clk *usb_clk;
|
|||||||
|
|
||||||
/* forward definitions */
|
/* 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);
|
static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc);
|
||||||
|
|
||||||
/* conversion functions */
|
/* conversion functions */
|
||||||
@@ -110,7 +106,7 @@ ohci_s3c2410_hub_status_data(struct usb_hcd *hcd, char *buf)
|
|||||||
int orig;
|
int orig;
|
||||||
int portno;
|
int portno;
|
||||||
|
|
||||||
orig = orig_ohci_hub_status_data(hcd, buf);
|
orig = ohci_hub_status_data(hcd, buf);
|
||||||
|
|
||||||
if (info == NULL)
|
if (info == NULL)
|
||||||
return orig;
|
return orig;
|
||||||
@@ -181,7 +177,7 @@ static int ohci_s3c2410_hub_control(
|
|||||||
* process the request straight away and exit */
|
* process the request straight away and exit */
|
||||||
|
|
||||||
if (info == NULL) {
|
if (info == NULL) {
|
||||||
ret = orig_ohci_hub_control(hcd, typeReq, wValue,
|
ret = ohci_hub_control(hcd, typeReq, wValue,
|
||||||
wIndex, buf, wLength);
|
wIndex, buf, wLength);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -231,7 +227,7 @@ static int ohci_s3c2410_hub_control(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = orig_ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
|
ret = ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@@ -489,9 +485,6 @@ static int __init ohci_s3c2410_init(void)
|
|||||||
* override these functions by making it too easy.
|
* 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_status_data = ohci_s3c2410_hub_status_data;
|
||||||
ohci_s3c2410_hc_driver.hub_control = ohci_s3c2410_hub_control;
|
ohci_s3c2410_hc_driver.hub_control = ohci_s3c2410_hub_control;
|
||||||
|
|
||||||
|
|||||||
@@ -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_suspend(struct usb_hcd *hcd, bool do_wakeup);
|
||||||
extern int ohci_resume(struct usb_hcd *hcd, bool hibernated);
|
extern int ohci_resume(struct usb_hcd *hcd, bool hibernated);
|
||||||
#endif
|
#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);
|
||||||
|
|||||||
Reference in New Issue
Block a user