Commit 368907dd authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'fixes-for-v4.8-rc3' of...

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.
parents 53e5f36f 6f8245b4
...@@ -868,6 +868,7 @@ struct dwc2_hsotg { ...@@ -868,6 +868,7 @@ struct dwc2_hsotg {
void *priv; void *priv;
int irq; int irq;
struct clk *clk; struct clk *clk;
struct reset_control *reset;
unsigned int queuing_high_bandwidth:1; unsigned int queuing_high_bandwidth:1;
unsigned int srp_success:1; unsigned int srp_success:1;
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/phy/phy.h> #include <linux/phy/phy.h>
#include <linux/platform_data/s3c-hsotg.h> #include <linux/platform_data/s3c-hsotg.h>
#include <linux/reset.h>
#include <linux/usb/of.h> #include <linux/usb/of.h>
...@@ -337,6 +338,24 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) ...@@ -337,6 +338,24 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
{ {
int i, ret; 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 */ /* Set default UTMI width */
hsotg->phyif = GUSBCFG_PHYIF16; hsotg->phyif = GUSBCFG_PHYIF16;
...@@ -434,6 +453,9 @@ static int dwc2_driver_remove(struct platform_device *dev) ...@@ -434,6 +453,9 @@ static int dwc2_driver_remove(struct platform_device *dev)
if (hsotg->ll_hw_enabled) if (hsotg->ll_hw_enabled)
dwc2_lowlevel_hw_disable(hsotg); dwc2_lowlevel_hw_disable(hsotg);
if (hsotg->reset)
reset_control_assert(hsotg->reset);
return 0; return 0;
} }
......
...@@ -1192,6 +1192,7 @@ static int dwc3_runtime_resume(struct device *dev) ...@@ -1192,6 +1192,7 @@ static int dwc3_runtime_resume(struct device *dev)
} }
pm_runtime_mark_last_busy(dev); pm_runtime_mark_last_busy(dev);
pm_runtime_put(dev);
return 0; return 0;
} }
......
...@@ -192,7 +192,7 @@ dwc3_ep_event_string(const struct dwc3_event_depevt *event) ...@@ -192,7 +192,7 @@ dwc3_ep_event_string(const struct dwc3_event_depevt *event)
int ret; int ret;
ret = sprintf(str, "ep%d%s: ", epnum >> 1, ret = sprintf(str, "ep%d%s: ", epnum >> 1,
(epnum & 1) ? "in" : "in"); (epnum & 1) ? "in" : "out");
if (ret < 0) if (ret < 0)
return "UNKNOWN"; return "UNKNOWN";
......
...@@ -243,6 +243,13 @@ static int dwc3_pci_runtime_suspend(struct device *dev) ...@@ -243,6 +243,13 @@ static int dwc3_pci_runtime_suspend(struct device *dev)
return -EBUSY; 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) static int dwc3_pci_pm_dummy(struct device *dev)
{ {
/* /*
...@@ -259,7 +266,7 @@ 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 = { static struct dev_pm_ops dwc3_pci_dev_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(dwc3_pci_pm_dummy, dwc3_pci_pm_dummy) 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) NULL)
}; };
......
...@@ -884,12 +884,9 @@ static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep) ...@@ -884,12 +884,9 @@ static u32 dwc3_calc_trbs_left(struct dwc3_ep *dep)
return DWC3_TRB_NUM - 1; 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); trbs_left &= (DWC3_TRB_NUM - 1);
if (dep->trb_dequeue < dep->trb_enqueue)
trbs_left--;
return trbs_left; return trbs_left;
} }
...@@ -1433,7 +1430,7 @@ static int dwc3_gadget_get_frame(struct usb_gadget *g) ...@@ -1433,7 +1430,7 @@ static int dwc3_gadget_get_frame(struct usb_gadget *g)
static int __dwc3_gadget_wakeup(struct dwc3 *dwc) static int __dwc3_gadget_wakeup(struct dwc3 *dwc)
{ {
unsigned long timeout; int retries;
int ret; int ret;
u32 reg; u32 reg;
...@@ -1484,9 +1481,9 @@ static int __dwc3_gadget_wakeup(struct dwc3 *dwc) ...@@ -1484,9 +1481,9 @@ static int __dwc3_gadget_wakeup(struct dwc3 *dwc)
} }
/* poll until Link State changes to ON */ /* 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); reg = dwc3_readl(dwc->regs, DWC3_DSTS);
/* in HS, means ON */ /* in HS, means ON */
......
...@@ -341,11 +341,15 @@ static struct sk_buff *eem_wrap(struct gether *port, struct sk_buff *skb) ...@@ -341,11 +341,15 @@ static struct sk_buff *eem_wrap(struct gether *port, struct sk_buff *skb)
{ {
struct sk_buff *skb2 = NULL; struct sk_buff *skb2 = NULL;
struct usb_ep *in = port->in_ep; struct usb_ep *in = port->in_ep;
int padlen = 0; int headroom, tailroom, padlen = 0;
u16 len = skb->len; u16 len = skb->len;
int headroom = skb_headroom(skb); if (!skb)
int tailroom = skb_tailroom(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, /* When (len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) is 0,
* stick two bytes of zero-length EEM packet on the end. * 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, ...@@ -374,6 +374,9 @@ static struct sk_buff *rndis_add_header(struct gether *port,
{ {
struct sk_buff *skb2; struct sk_buff *skb2;
if (!skb)
return NULL;
skb2 = skb_realloc_headroom(skb, sizeof(struct rndis_packet_msg_type)); skb2 = skb_realloc_headroom(skb, sizeof(struct rndis_packet_msg_type));
rndis_add_hdr(skb2); rndis_add_hdr(skb2);
......
...@@ -375,10 +375,15 @@ __acquires(&port->port_lock) ...@@ -375,10 +375,15 @@ __acquires(&port->port_lock)
*/ */
{ {
struct list_head *pool = &port->write_pool; struct list_head *pool = &port->write_pool;
struct usb_ep *in = port->port_usb->in; struct usb_ep *in;
int status = 0; int status = 0;
bool do_tty_wake = false; bool do_tty_wake = false;
if (!port->port_usb)
return status;
in = port->port_usb->in;
while (!port->write_busy && !list_empty(pool)) { while (!port->write_busy && !list_empty(pool)) {
struct usb_request *req; struct usb_request *req;
int len; int len;
......
...@@ -827,7 +827,7 @@ void usb_gadget_unmap_request_by_dev(struct device *dev, ...@@ -827,7 +827,7 @@ void usb_gadget_unmap_request_by_dev(struct device *dev,
return; return;
if (req->num_mapped_sgs) { 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); is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
req->num_mapped_sgs = 0; req->num_mapped_sgs = 0;
......
...@@ -1878,11 +1878,8 @@ static int qe_get_frame(struct usb_gadget *gadget) ...@@ -1878,11 +1878,8 @@ static int qe_get_frame(struct usb_gadget *gadget)
tmp = in_be16(&udc->usb_param->frame_n); tmp = in_be16(&udc->usb_param->frame_n);
if (tmp & 0x8000) if (tmp & 0x8000)
tmp = tmp & 0x07ff; return tmp & 0x07ff;
else return -EINVAL;
tmp = -EINVAL;
return (int)tmp;
} }
static int fsl_qe_start(struct usb_gadget *gadget, static int fsl_qe_start(struct usb_gadget *gadget,
......
...@@ -1076,7 +1076,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) ...@@ -1076,7 +1076,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED); gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED);
dev_info(dev, "%stransceiver found\n", dev_info(dev, "%stransceiver found\n",
gpriv->transceiver ? "" : "no "); !IS_ERR(gpriv->transceiver) ? "" : "no ");
/* /*
* CAUTION * CAUTION
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment