diff options
Diffstat (limited to 'drivers/usb')
| -rw-r--r-- | drivers/usb/dwc3/dwc3-msm.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_qc_rndis.c | 2 | ||||
| -rw-r--r-- | drivers/usb/misc/ks_bridge.c | 46 | ||||
| -rw-r--r-- | drivers/usb/misc/mdm_ctrl_bridge.c | 9 | ||||
| -rw-r--r-- | drivers/usb/phy/phy-msm-usb.c | 9 |
5 files changed, 48 insertions, 20 deletions
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 96280f5f80e..748b1eb7caa 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -43,10 +43,10 @@ #include <linux/cdev.h> #include <linux/completion.h> #include <linux/clk/msm-clk.h> +#include <soc/qcom/scm.h> #include <mach/rpm-regulator.h> #include <mach/msm_bus.h> -#include <mach/scm.h> #include "dwc3_otg.h" #include "core.h" diff --git a/drivers/usb/gadget/f_qc_rndis.c b/drivers/usb/gadget/f_qc_rndis.c index f229f91edbf..e79fb2960be 100644 --- a/drivers/usb/gadget/f_qc_rndis.c +++ b/drivers/usb/gadget/f_qc_rndis.c @@ -353,7 +353,7 @@ static struct usb_ss_ep_comp_descriptor rndis_qc_ss_bulk_comp_desc = { }; static struct usb_descriptor_header *eth_qc_ss_function[] = { - (struct usb_descriptor_header *) &rndis_iad_descriptor, + (struct usb_descriptor_header *) &rndis_qc_iad_descriptor, /* control interface matches ACM, not Ethernet */ (struct usb_descriptor_header *) &rndis_qc_control_intf, diff --git a/drivers/usb/misc/ks_bridge.c b/drivers/usb/misc/ks_bridge.c index 26986de7725..8c39f37fec6 100644 --- a/drivers/usb/misc/ks_bridge.c +++ b/drivers/usb/misc/ks_bridge.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013, Linux Foundation. All rights reserved. + * Copyright (c) 2012-2014, Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -104,6 +104,9 @@ struct ks_bridge { unsigned long flags; + /* to handle INT IN ep */ + unsigned int period; + #define DBG_MSG_LEN 40 #define DBG_MAX_MSG 500 unsigned int dbg_idx; @@ -440,6 +443,8 @@ static const struct usb_device_id ksb_usb_ids[] = { .driver_info = (unsigned long)&ksb_efs_hsic_dev, }, { USB_DEVICE_INTERFACE_NUMBER(0x5c6, 0x908E, 3), .driver_info = (unsigned long)&ksb_efs_hsic_dev, }, + { USB_DEVICE_INTERFACE_NUMBER(0x5c6, 0x90A0, 2), + .driver_info = (unsigned long)&ksb_efs_hsic_dev, }, {} /* terminating entry */ }; @@ -459,9 +464,15 @@ submit_one_urb(struct ks_bridge *ksb, gfp_t flags, struct data_pkt *pkt) return; } - usb_fill_bulk_urb(urb, ksb->udev, ksb->in_pipe, - pkt->buf, pkt->len, - ksb_rx_cb, pkt); + if (ksb->period) + usb_fill_int_urb(urb, ksb->udev, ksb->in_pipe, + pkt->buf, pkt->len, + ksb_rx_cb, pkt, ksb->period); + else + usb_fill_bulk_urb(urb, ksb->udev, ksb->in_pipe, + pkt->buf, pkt->len, + ksb_rx_cb, pkt); + usb_anchor_urb(urb, &ksb->submitted); if (!test_bit(USB_DEV_CONNECTED, &ksb->flags)) { @@ -573,9 +584,15 @@ static void ksb_start_rx_work(struct work_struct *w) break; } - usb_fill_bulk_urb(urb, ksb->udev, ksb->in_pipe, - pkt->buf, pkt->len, - ksb_rx_cb, pkt); + if (ksb->period) + usb_fill_int_urb(urb, ksb->udev, ksb->in_pipe, + pkt->buf, pkt->len, + ksb_rx_cb, pkt, ksb->period); + else + usb_fill_bulk_urb(urb, ksb->udev, ksb->in_pipe, + pkt->buf, pkt->len, + ksb_rx_cb, pkt); + usb_anchor_urb(urb, &ksb->submitted); dbg_log_event(ksb, "S RX_URB", pkt->len, 0); @@ -635,6 +652,7 @@ ksb_usb_probe(struct usb_interface *ifc, const struct usb_device_id *id) case 0x9075: case 0x908A: case 0x908E: + case 0x90A0: ksb = __ksb[EFS_HSIC_BRIDGE_INDEX]; break; case 0x9079: @@ -659,8 +677,15 @@ ksb_usb_probe(struct usb_interface *ifc, const struct usb_device_id *id) for (i = 0; i < ifc_desc->desc.bNumEndpoints; i++) { ep_desc = &ifc_desc->endpoint[i].desc; - if (!ksb->in_epAddr && usb_endpoint_is_bulk_in(ep_desc)) + if (!ksb->in_epAddr && (usb_endpoint_is_bulk_in(ep_desc))) { + ksb->in_epAddr = ep_desc->bEndpointAddress; + ksb->period = 0; + } + + if (!ksb->in_epAddr && (usb_endpoint_is_int_in(ep_desc))) { ksb->in_epAddr = ep_desc->bEndpointAddress; + ksb->period = ep_desc->bInterval; + } if (!ksb->out_epAddr && usb_endpoint_is_bulk_out(ep_desc)) ksb->out_epAddr = ep_desc->bEndpointAddress; @@ -674,7 +699,10 @@ ksb_usb_probe(struct usb_interface *ifc, const struct usb_device_id *id) return -ENODEV; } - ksb->in_pipe = usb_rcvbulkpipe(ksb->udev, ksb->in_epAddr); + ksb->in_pipe = ksb->period ? + usb_rcvintpipe(ksb->udev, ksb->in_epAddr) : + usb_rcvbulkpipe(ksb->udev, ksb->in_epAddr); + ksb->out_pipe = usb_sndbulkpipe(ksb->udev, ksb->out_epAddr); usb_set_intfdata(ifc, ksb); diff --git a/drivers/usb/misc/mdm_ctrl_bridge.c b/drivers/usb/misc/mdm_ctrl_bridge.c index 755fadbf0c3..f3c5c813360 100644 --- a/drivers/usb/misc/mdm_ctrl_bridge.c +++ b/drivers/usb/misc/mdm_ctrl_bridge.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2013, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -26,10 +26,6 @@ #include <asm/unaligned.h> #include <mach/usb_bridge.h> -/* polling interval for Interrupt ep */ -#define HS_INTERVAL 7 -#define FS_LS_INTERVAL 3 - #define ACM_CTRL_DTR (1 << 0) #define DEFAULT_READ_URB_LENGTH 4096 @@ -719,8 +715,7 @@ ctrl_bridge_probe(struct usb_interface *ifc, struct usb_host_endpoint *int_in, goto free_inturb; } - interval = - (udev->speed == USB_SPEED_HIGH) ? HS_INTERVAL : FS_LS_INTERVAL; + interval = int_in->desc.bInterval; usb_fill_int_urb(dev->inturb, udev, dev->int_pipe, dev->intbuf, wMaxPacketSize, diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index 37ed14d4b9c..84f74bbc4ba 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2013, Linux Foundation. All rights reserved. +/* Copyright (c) 2009-2014, Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -31,6 +31,7 @@ #include <linux/dma-mapping.h> #include <linux/clk/msm-clk.h> #include <linux/irqchip/msm-mpm-irq.h> +#include <soc/qcom/scm.h> #include <linux/usb.h> #include <linux/usb/otg.h> @@ -46,7 +47,6 @@ #include <linux/mfd/pm8xxx/misc.h> #include <linux/mhl_8334.h> -#include <mach/scm.h> #include <mach/msm_xo.h> #include <mach/msm_bus.h> #include <mach/rpm-regulator.h> @@ -2659,6 +2659,8 @@ static void msm_otg_sm_work(struct work_struct *w) bool work = 0, srp_reqd, dcp; pm_runtime_resume(otg->phy->dev); + if (motg->pm_done) + pm_runtime_get_sync(otg->phy->dev); pr_debug("%s work\n", usb_otg_state_string(otg->phy->state)); switch (otg->phy->state) { case OTG_STATE_UNDEFINED: @@ -2804,6 +2806,7 @@ static void msm_otg_sm_work(struct work_struct *w) */ pm_runtime_mark_last_busy(otg->phy->dev); pm_runtime_autosuspend(otg->phy->dev); + motg->pm_done = 1; } break; case OTG_STATE_B_SRP_INIT: @@ -5031,6 +5034,7 @@ static int msm_otg_runtime_resume(struct device *dev) dev_dbg(dev, "OTG runtime resume\n"); pm_runtime_get_noresume(dev); + motg->pm_done = 0; return msm_otg_resume(motg); } #endif @@ -5058,6 +5062,7 @@ static int msm_otg_pm_resume(struct device *dev) dev_dbg(dev, "OTG PM resume\n"); + motg->pm_done = 0; atomic_set(&motg->pm_suspended, 0); if (motg->async_int || motg->sm_work_pending || !pm_runtime_suspended(dev)) { |
