forked from Minki/linux
usb: fixes for v4.8-rc3
Few fixes on dwc3 again, the most important being a fix for pm_runtime to make it work with current intel platforms. Other than that, there's a signedness bug fix in fsl udc and some other minor fixes. -----BEGIN PGP SIGNATURE----- iQI6BAABCAAkBQJXvrw3HRxmZWxpcGUuYmFsYmlAbGludXguaW50ZWwuY29tAAoJ EIaOsuA1yqREWCMP/0zlF8sqCLgTOJcR8wBbzCCY6CLxrWrBxUB5+Ld6gs101f/0 d1YEqgRtGxauaJVdTfwiSoVTb+WGzG97ExHXBSQjcxniG/3u39Yq+KkKao6+Y4iR bqoT7vqPkLqNhVxzIL2Mx0uWBiCibl2NrAfXreNhSxHkabrf6JsWMfQ9Kc0N47/j aFRJ4U+NG/q53NbSfpfSxYG0p0LB4BHEpR0BVIKtWxMgFEsdwOMM6ZyqHpw3pede km7wqp/7HAUu2rhiZFQtLuPa7yjqlGEZ8vO1ERzIACDy+CiedRoJW+hHE0rJn4TL xjCLGEEeH7pP/lqAmsw6oxjg9cdhTakfMcM0374203U31hTIYC6PK1gRMivvE3rD zZ8RLU3NCuAh6HBQaHl/k+i3t9U76K/DJuFbSKnO1wwYMlDS2u6WBUWTXFDanYij BTIJSrqAEp+Ne3MCMQ0u79daTO5iTAhf08xbMwLJwY9c8k43bFmo2kYoGjo8aAyi 0U03NYMfuOTqcTpYNlRXyRhFGdCM0wxvYwzGaUs+oxPzzpsrQiotd0Lm8+UWSB/Y b4EfsZew0CBNnN3BPgyPDSrntPFiyL6OV2bRkLnxgUlwVEoEIBqTRu0Uv6bsrLkG qO4ibILgDbGUIuC8EyyR3ObQcTNQxxLTbdHyrNIq8dcgLypu3tW9jHHCe6vO =Tm2m -----END PGP SIGNATURE----- Merge tag 'fixes-for-v4.8-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus Felipe writes: usb: fixes for v4.8-rc3 Few fixes on dwc3 again, the most important being a fix for pm_runtime to make it work with current intel platforms. Other than that, there's a signedness bug fix in fsl udc and some other minor fixes.
This commit is contained in:
commit
368907ddb2
@ -868,6 +868,7 @@ struct dwc2_hsotg {
|
||||
void *priv;
|
||||
int irq;
|
||||
struct clk *clk;
|
||||
struct reset_control *reset;
|
||||
|
||||
unsigned int queuing_high_bandwidth:1;
|
||||
unsigned int srp_success:1;
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/phy/phy.h>
|
||||
#include <linux/platform_data/s3c-hsotg.h>
|
||||
#include <linux/reset.h>
|
||||
|
||||
#include <linux/usb/of.h>
|
||||
|
||||
@ -337,6 +338,24 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
hsotg->reset = devm_reset_control_get_optional(hsotg->dev, "dwc2");
|
||||
if (IS_ERR(hsotg->reset)) {
|
||||
ret = PTR_ERR(hsotg->reset);
|
||||
switch (ret) {
|
||||
case -ENOENT:
|
||||
case -ENOTSUPP:
|
||||
hsotg->reset = NULL;
|
||||
break;
|
||||
default:
|
||||
dev_err(hsotg->dev, "error getting reset control %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (hsotg->reset)
|
||||
reset_control_deassert(hsotg->reset);
|
||||
|
||||
/* Set default UTMI width */
|
||||
hsotg->phyif = GUSBCFG_PHYIF16;
|
||||
|
||||
@ -434,6 +453,9 @@ static int dwc2_driver_remove(struct platform_device *dev)
|
||||
if (hsotg->ll_hw_enabled)
|
||||
dwc2_lowlevel_hw_disable(hsotg);
|
||||
|
||||
if (hsotg->reset)
|
||||
reset_control_assert(hsotg->reset);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1192,6 +1192,7 @@ static int dwc3_runtime_resume(struct device *dev)
|
||||
}
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
pm_runtime_put(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ dwc3_ep_event_string(const struct dwc3_event_depevt *event)
|
||||
int ret;
|
||||
|
||||
ret = sprintf(str, "ep%d%s: ", epnum >> 1,
|
||||
(epnum & 1) ? "in" : "in");
|
||||
(epnum & 1) ? "in" : "out");
|
||||
if (ret < 0)
|
||||
return "UNKNOWN";
|
||||
|
||||
|
@ -243,6 +243,13 @@ static int dwc3_pci_runtime_suspend(struct device *dev)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static int dwc3_pci_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct platform_device *dwc3 = dev_get_drvdata(dev);
|
||||
|
||||
return pm_runtime_get(&dwc3->dev);
|
||||
}
|
||||
|
||||
static int dwc3_pci_pm_dummy(struct device *dev)
|
||||
{
|
||||
/*
|
||||
@ -259,7 +266,7 @@ static int dwc3_pci_pm_dummy(struct device *dev)
|
||||
|
||||
static struct dev_pm_ops dwc3_pci_dev_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(dwc3_pci_pm_dummy, dwc3_pci_pm_dummy)
|
||||
SET_RUNTIME_PM_OPS(dwc3_pci_runtime_suspend, dwc3_pci_pm_dummy,
|
||||
SET_RUNTIME_PM_OPS(dwc3_pci_runtime_suspend, dwc3_pci_runtime_resume,
|
||||
NULL)
|
||||
};
|
||||
|
||||
|
@ -884,12 +884,9 @@ static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
|
||||
return DWC3_TRB_NUM - 1;
|
||||
}
|
||||
|
||||
trbs_left = dep->trb_dequeue - dep->trb_enqueue;
|
||||
trbs_left = dep->trb_dequeue - dep->trb_enqueue - 1;
|
||||
trbs_left &= (DWC3_TRB_NUM - 1);
|
||||
|
||||
if (dep->trb_dequeue < dep->trb_enqueue)
|
||||
trbs_left--;
|
||||
|
||||
return trbs_left;
|
||||
}
|
||||
|
||||
@ -1433,7 +1430,7 @@ static int dwc3_gadget_get_frame(struct usb_gadget *g)
|
||||
|
||||
static int __dwc3_gadget_wakeup(struct dwc3 *dwc)
|
||||
{
|
||||
unsigned long timeout;
|
||||
int retries;
|
||||
|
||||
int ret;
|
||||
u32 reg;
|
||||
@ -1484,9 +1481,9 @@ static int __dwc3_gadget_wakeup(struct dwc3 *dwc)
|
||||
}
|
||||
|
||||
/* poll until Link State changes to ON */
|
||||
timeout = jiffies + msecs_to_jiffies(100);
|
||||
retries = 20000;
|
||||
|
||||
while (!time_after(jiffies, timeout)) {
|
||||
while (retries--) {
|
||||
reg = dwc3_readl(dwc->regs, DWC3_DSTS);
|
||||
|
||||
/* in HS, means ON */
|
||||
|
@ -341,11 +341,15 @@ static struct sk_buff *eem_wrap(struct gether *port, struct sk_buff *skb)
|
||||
{
|
||||
struct sk_buff *skb2 = NULL;
|
||||
struct usb_ep *in = port->in_ep;
|
||||
int padlen = 0;
|
||||
int headroom, tailroom, padlen = 0;
|
||||
u16 len = skb->len;
|
||||
|
||||
int headroom = skb_headroom(skb);
|
||||
int tailroom = skb_tailroom(skb);
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
len = skb->len;
|
||||
headroom = skb_headroom(skb);
|
||||
tailroom = skb_tailroom(skb);
|
||||
|
||||
/* When (len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) is 0,
|
||||
* stick two bytes of zero-length EEM packet on the end.
|
||||
|
@ -374,6 +374,9 @@ static struct sk_buff *rndis_add_header(struct gether *port,
|
||||
{
|
||||
struct sk_buff *skb2;
|
||||
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
skb2 = skb_realloc_headroom(skb, sizeof(struct rndis_packet_msg_type));
|
||||
rndis_add_hdr(skb2);
|
||||
|
||||
|
@ -375,10 +375,15 @@ __acquires(&port->port_lock)
|
||||
*/
|
||||
{
|
||||
struct list_head *pool = &port->write_pool;
|
||||
struct usb_ep *in = port->port_usb->in;
|
||||
struct usb_ep *in;
|
||||
int status = 0;
|
||||
bool do_tty_wake = false;
|
||||
|
||||
if (!port->port_usb)
|
||||
return status;
|
||||
|
||||
in = port->port_usb->in;
|
||||
|
||||
while (!port->write_busy && !list_empty(pool)) {
|
||||
struct usb_request *req;
|
||||
int len;
|
||||
|
@ -827,7 +827,7 @@ void usb_gadget_unmap_request_by_dev(struct device *dev,
|
||||
return;
|
||||
|
||||
if (req->num_mapped_sgs) {
|
||||
dma_unmap_sg(dev, req->sg, req->num_mapped_sgs,
|
||||
dma_unmap_sg(dev, req->sg, req->num_sgs,
|
||||
is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
|
||||
|
||||
req->num_mapped_sgs = 0;
|
||||
|
@ -1878,11 +1878,8 @@ static int qe_get_frame(struct usb_gadget *gadget)
|
||||
|
||||
tmp = in_be16(&udc->usb_param->frame_n);
|
||||
if (tmp & 0x8000)
|
||||
tmp = tmp & 0x07ff;
|
||||
else
|
||||
tmp = -EINVAL;
|
||||
|
||||
return (int)tmp;
|
||||
return tmp & 0x07ff;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int fsl_qe_start(struct usb_gadget *gadget,
|
||||
|
@ -1076,7 +1076,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
|
||||
|
||||
gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED);
|
||||
dev_info(dev, "%stransceiver found\n",
|
||||
gpriv->transceiver ? "" : "no ");
|
||||
!IS_ERR(gpriv->transceiver) ? "" : "no ");
|
||||
|
||||
/*
|
||||
* CAUTION
|
||||
|
Loading…
Reference in New Issue
Block a user