summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHemant Kumar <hemantk@codeaurora.org>2017-08-17 17:01:00 -0700
committerAjay Agarwal <ajaya@codeaurora.org>2017-11-24 14:50:23 +0530
commitc611d78437adeb9299d8be3f7be78b9c153152e5 (patch)
treeef718a4eacaf809228f496673f72878c31622b23
parent03a86f5cb1adaa2e30a70eefd7bc1ab9509eea46 (diff)
usb: core: Add helper function to return controller id
Function provides controller id used by a remote entity to identify which usb controller to program to initiate data transfer. Change-Id: Ied396f34496104c139a7910ee86844c124e6803f Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
-rw-r--r--drivers/usb/core/hcd.c10
-rw-r--r--drivers/usb/core/usb.c9
-rw-r--r--include/linux/usb.h1
-rw-r--r--include/linux/usb/hcd.h2
4 files changed, 22 insertions, 0 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index c31c753b6e28..72ee12782b6c 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2264,6 +2264,16 @@ usb_hcd_get_xfer_ring_dma_addr(struct usb_device *udev,
return hcd->driver->get_xfer_ring_dma_addr(hcd, udev, ep);
}
+int usb_hcd_get_controller_id(struct usb_device *udev)
+{
+ struct usb_hcd *hcd = bus_to_hcd(udev->bus);
+
+ if (!HCD_RH_RUNNING(hcd))
+ return -EINVAL;
+
+ return hcd->driver->get_core_id(hcd);
+}
+
#ifdef CONFIG_PM
int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg)
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 062677f8e91d..e64fd6570a23 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -717,6 +717,15 @@ dma_addr_t usb_get_xfer_ring_dma_addr(struct usb_device *dev,
}
EXPORT_SYMBOL(usb_get_xfer_ring_dma_addr);
+int usb_get_controller_id(struct usb_device *dev)
+{
+ if (dev->state == USB_STATE_NOTATTACHED)
+ return -EINVAL;
+
+ return usb_hcd_get_controller_id(dev);
+}
+EXPORT_SYMBOL(usb_get_controller_id);
+
/*-------------------------------------------------------------------*/
/*
* __usb_get_extra_descriptor() finds a descriptor of specific type in the
diff --git a/include/linux/usb.h b/include/linux/usb.h
index e8b2ed4ad851..f226476a2ea4 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -755,6 +755,7 @@ usb_get_sec_event_ring_dma_addr(struct usb_device *dev,
extern dma_addr_t usb_get_dcba_dma_addr(struct usb_device *dev);
extern dma_addr_t usb_get_xfer_ring_dma_addr(struct usb_device *dev,
struct usb_host_endpoint *ep);
+extern int usb_get_controller_id(struct usb_device *dev);
/* Sets up a group of bulk endpoints to support multiple stream IDs. */
extern int usb_alloc_streams(struct usb_interface *interface,
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index dff7adbc60bb..f603b46ff48a 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -405,6 +405,7 @@ struct hc_driver {
struct usb_device *udev, struct usb_host_endpoint *ep);
dma_addr_t (*get_dcba_dma_addr)(struct usb_hcd *hcd,
struct usb_device *udev);
+ int (*get_core_id)(struct usb_hcd *hcd);
};
static inline int hcd_giveback_urb_in_bh(struct usb_hcd *hcd)
@@ -454,6 +455,7 @@ extern dma_addr_t usb_hcd_get_dcba_dma_addr(struct usb_device *udev);
extern dma_addr_t
usb_hcd_get_xfer_ring_dma_addr(struct usb_device *udev,
struct usb_host_endpoint *ep);
+extern int usb_hcd_get_controller_id(struct usb_device *udev);
extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver,
struct device *dev, const char *bus_name);