Commit 833674a4 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'fixes-for-v4.10-rc5' of...

Merge tag 'fixes-for-v4.10-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus

Felipe writes:

usb: fixes for v4.10-rc5

One memory leak fix on the atmel UDC. Several fixes for dwc2. A fix on
composite.c to use usb_ep_free_request() when freeing struct
usb_request.
parents 49def185 efe357f4
...@@ -513,8 +513,8 @@ struct dwc2_core_params { ...@@ -513,8 +513,8 @@ struct dwc2_core_params {
/* Gadget parameters */ /* Gadget parameters */
bool g_dma; bool g_dma;
bool g_dma_desc; bool g_dma_desc;
u16 g_rx_fifo_size; u32 g_rx_fifo_size;
u16 g_np_tx_fifo_size; u32 g_np_tx_fifo_size;
u32 g_tx_fifo_size[MAX_EPS_CHANNELS]; u32 g_tx_fifo_size[MAX_EPS_CHANNELS];
}; };
......
...@@ -3169,7 +3169,7 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg, ...@@ -3169,7 +3169,7 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
/* keep other bits untouched (so e.g. forced modes are not lost) */ /* keep other bits untouched (so e.g. forced modes are not lost) */
usbcfg = dwc2_readl(hsotg->regs + GUSBCFG); usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
usbcfg &= ~(GUSBCFG_TOUTCAL_MASK | GUSBCFG_PHYIF16 | GUSBCFG_SRPCAP | usbcfg &= ~(GUSBCFG_TOUTCAL_MASK | GUSBCFG_PHYIF16 | GUSBCFG_SRPCAP |
GUSBCFG_HNPCAP); GUSBCFG_HNPCAP | GUSBCFG_USBTRDTIM_MASK);
if (hsotg->params.phy_type == DWC2_PHY_TYPE_PARAM_FS && if (hsotg->params.phy_type == DWC2_PHY_TYPE_PARAM_FS &&
(hsotg->params.speed == DWC2_SPEED_PARAM_FULL || (hsotg->params.speed == DWC2_SPEED_PARAM_FULL ||
...@@ -3749,8 +3749,8 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep, ...@@ -3749,8 +3749,8 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
__func__, epctrl, epctrl_reg); __func__, epctrl, epctrl_reg);
/* Allocate DMA descriptor chain for non-ctrl endpoints */ /* Allocate DMA descriptor chain for non-ctrl endpoints */
if (using_desc_dma(hsotg)) { if (using_desc_dma(hsotg) && !hs_ep->desc_list) {
hs_ep->desc_list = dma_alloc_coherent(hsotg->dev, hs_ep->desc_list = dmam_alloc_coherent(hsotg->dev,
MAX_DMA_DESC_NUM_GENERIC * MAX_DMA_DESC_NUM_GENERIC *
sizeof(struct dwc2_dma_desc), sizeof(struct dwc2_dma_desc),
&hs_ep->desc_list_dma, GFP_ATOMIC); &hs_ep->desc_list_dma, GFP_ATOMIC);
...@@ -3872,7 +3872,7 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep, ...@@ -3872,7 +3872,7 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
error2: error2:
if (ret && using_desc_dma(hsotg) && hs_ep->desc_list) { if (ret && using_desc_dma(hsotg) && hs_ep->desc_list) {
dma_free_coherent(hsotg->dev, MAX_DMA_DESC_NUM_GENERIC * dmam_free_coherent(hsotg->dev, MAX_DMA_DESC_NUM_GENERIC *
sizeof(struct dwc2_dma_desc), sizeof(struct dwc2_dma_desc),
hs_ep->desc_list, hs_ep->desc_list_dma); hs_ep->desc_list, hs_ep->desc_list_dma);
hs_ep->desc_list = NULL; hs_ep->desc_list = NULL;
...@@ -3902,14 +3902,6 @@ static int dwc2_hsotg_ep_disable(struct usb_ep *ep) ...@@ -3902,14 +3902,6 @@ static int dwc2_hsotg_ep_disable(struct usb_ep *ep)
return -EINVAL; return -EINVAL;
} }
/* Remove DMA memory allocated for non-control Endpoints */
if (using_desc_dma(hsotg)) {
dma_free_coherent(hsotg->dev, MAX_DMA_DESC_NUM_GENERIC *
sizeof(struct dwc2_dma_desc),
hs_ep->desc_list, hs_ep->desc_list_dma);
hs_ep->desc_list = NULL;
}
epctrl_reg = dir_in ? DIEPCTL(index) : DOEPCTL(index); epctrl_reg = dir_in ? DIEPCTL(index) : DOEPCTL(index);
spin_lock_irqsave(&hsotg->lock, flags); spin_lock_irqsave(&hsotg->lock, flags);
...@@ -4131,7 +4123,7 @@ static void dwc2_hsotg_init(struct dwc2_hsotg *hsotg) ...@@ -4131,7 +4123,7 @@ static void dwc2_hsotg_init(struct dwc2_hsotg *hsotg)
/* keep other bits untouched (so e.g. forced modes are not lost) */ /* keep other bits untouched (so e.g. forced modes are not lost) */
usbcfg = dwc2_readl(hsotg->regs + GUSBCFG); usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
usbcfg &= ~(GUSBCFG_TOUTCAL_MASK | GUSBCFG_PHYIF16 | GUSBCFG_SRPCAP | usbcfg &= ~(GUSBCFG_TOUTCAL_MASK | GUSBCFG_PHYIF16 | GUSBCFG_SRPCAP |
GUSBCFG_HNPCAP); GUSBCFG_HNPCAP | GUSBCFG_USBTRDTIM_MASK);
/* set the PLL on, remove the HNP/SRP and set the PHY */ /* set the PLL on, remove the HNP/SRP and set the PHY */
trdtim = (hsotg->phyif == GUSBCFG_PHYIF8) ? 9 : 5; trdtim = (hsotg->phyif == GUSBCFG_PHYIF8) ? 9 : 5;
......
...@@ -4367,6 +4367,9 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd) ...@@ -4367,6 +4367,9 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd)
if (!HCD_HW_ACCESSIBLE(hcd)) if (!HCD_HW_ACCESSIBLE(hcd))
goto unlock; goto unlock;
if (hsotg->op_state == OTG_STATE_B_PERIPHERAL)
goto unlock;
if (!hsotg->params.hibernation) if (!hsotg->params.hibernation)
goto skip_power_saving; goto skip_power_saving;
...@@ -4489,8 +4492,8 @@ static void dwc2_dump_urb_info(struct usb_hcd *hcd, struct urb *urb, ...@@ -4489,8 +4492,8 @@ static void dwc2_dump_urb_info(struct usb_hcd *hcd, struct urb *urb,
{ {
#ifdef VERBOSE_DEBUG #ifdef VERBOSE_DEBUG
struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd); struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
char *pipetype; char *pipetype = NULL;
char *speed; char *speed = NULL;
dev_vdbg(hsotg->dev, "%s, urb %p\n", fn_name, urb); dev_vdbg(hsotg->dev, "%s, urb %p\n", fn_name, urb);
dev_vdbg(hsotg->dev, " Device address: %d\n", dev_vdbg(hsotg->dev, " Device address: %d\n",
......
...@@ -385,16 +385,16 @@ static void dwc2_set_param(struct dwc2_hsotg *hsotg, void *param, ...@@ -385,16 +385,16 @@ static void dwc2_set_param(struct dwc2_hsotg *hsotg, void *param,
} }
/** /**
* dwc2_set_param_u16() - Set a u16 parameter * dwc2_set_param_u32() - Set a u32 parameter
* *
* See dwc2_set_param(). * See dwc2_set_param().
*/ */
static void dwc2_set_param_u16(struct dwc2_hsotg *hsotg, u16 *param, static void dwc2_set_param_u32(struct dwc2_hsotg *hsotg, u32 *param,
bool lookup, char *property, u16 legacy, bool lookup, char *property, u16 legacy,
u16 def, u16 min, u16 max) u16 def, u16 min, u16 max)
{ {
dwc2_set_param(hsotg, param, lookup, property, dwc2_set_param(hsotg, param, lookup, property,
legacy, def, min, max, 2); legacy, def, min, max, 4);
} }
/** /**
...@@ -1178,12 +1178,12 @@ static void dwc2_set_parameters(struct dwc2_hsotg *hsotg, ...@@ -1178,12 +1178,12 @@ static void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
* auto-detect if the hardware does not support the * auto-detect if the hardware does not support the
* default. * default.
*/ */
dwc2_set_param_u16(hsotg, &p->g_rx_fifo_size, dwc2_set_param_u32(hsotg, &p->g_rx_fifo_size,
true, "g-rx-fifo-size", 2048, true, "g-rx-fifo-size", 2048,
hw->rx_fifo_size, hw->rx_fifo_size,
16, hw->rx_fifo_size); 16, hw->rx_fifo_size);
dwc2_set_param_u16(hsotg, &p->g_np_tx_fifo_size, dwc2_set_param_u32(hsotg, &p->g_np_tx_fifo_size,
true, "g-np-tx-fifo-size", 1024, true, "g-np-tx-fifo-size", 1024,
hw->dev_nperio_tx_fifo_size, hw->dev_nperio_tx_fifo_size,
16, hw->dev_nperio_tx_fifo_size); 16, hw->dev_nperio_tx_fifo_size);
......
...@@ -138,7 +138,8 @@ static int dwc3_exynos_probe(struct platform_device *pdev) ...@@ -138,7 +138,8 @@ static int dwc3_exynos_probe(struct platform_device *pdev)
exynos->axius_clk = devm_clk_get(dev, "usbdrd30_axius_clk"); exynos->axius_clk = devm_clk_get(dev, "usbdrd30_axius_clk");
if (IS_ERR(exynos->axius_clk)) { if (IS_ERR(exynos->axius_clk)) {
dev_err(dev, "no AXI UpScaler clk specified\n"); dev_err(dev, "no AXI UpScaler clk specified\n");
return -ENODEV; ret = -ENODEV;
goto axius_clk_err;
} }
clk_prepare_enable(exynos->axius_clk); clk_prepare_enable(exynos->axius_clk);
} else { } else {
...@@ -196,6 +197,7 @@ static int dwc3_exynos_probe(struct platform_device *pdev) ...@@ -196,6 +197,7 @@ static int dwc3_exynos_probe(struct platform_device *pdev)
regulator_disable(exynos->vdd33); regulator_disable(exynos->vdd33);
err2: err2:
clk_disable_unprepare(exynos->axius_clk); clk_disable_unprepare(exynos->axius_clk);
axius_clk_err:
clk_disable_unprepare(exynos->susp_clk); clk_disable_unprepare(exynos->susp_clk);
clk_disable_unprepare(exynos->clk); clk_disable_unprepare(exynos->clk);
return ret; return ret;
......
...@@ -2147,7 +2147,7 @@ int composite_os_desc_req_prepare(struct usb_composite_dev *cdev, ...@@ -2147,7 +2147,7 @@ int composite_os_desc_req_prepare(struct usb_composite_dev *cdev,
cdev->os_desc_req->buf = kmalloc(4096, GFP_KERNEL); cdev->os_desc_req->buf = kmalloc(4096, GFP_KERNEL);
if (!cdev->os_desc_req->buf) { if (!cdev->os_desc_req->buf) {
ret = -ENOMEM; ret = -ENOMEM;
kfree(cdev->os_desc_req); usb_ep_free_request(ep0, cdev->os_desc_req);
goto end; goto end;
} }
cdev->os_desc_req->context = cdev; cdev->os_desc_req->context = cdev;
......
...@@ -1806,7 +1806,7 @@ static void ffs_func_eps_disable(struct ffs_function *func) ...@@ -1806,7 +1806,7 @@ static void ffs_func_eps_disable(struct ffs_function *func)
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&func->ffs->eps_lock, flags); spin_lock_irqsave(&func->ffs->eps_lock, flags);
do { while (count--) {
/* pending requests get nuked */ /* pending requests get nuked */
if (likely(ep->ep)) if (likely(ep->ep))
usb_ep_disable(ep->ep); usb_ep_disable(ep->ep);
...@@ -1817,7 +1817,7 @@ static void ffs_func_eps_disable(struct ffs_function *func) ...@@ -1817,7 +1817,7 @@ static void ffs_func_eps_disable(struct ffs_function *func)
__ffs_epfile_read_buffer_free(epfile); __ffs_epfile_read_buffer_free(epfile);
++epfile; ++epfile;
} }
} while (--count); }
spin_unlock_irqrestore(&func->ffs->eps_lock, flags); spin_unlock_irqrestore(&func->ffs->eps_lock, flags);
} }
...@@ -1831,7 +1831,7 @@ static int ffs_func_eps_enable(struct ffs_function *func) ...@@ -1831,7 +1831,7 @@ static int ffs_func_eps_enable(struct ffs_function *func)
int ret = 0; int ret = 0;
spin_lock_irqsave(&func->ffs->eps_lock, flags); spin_lock_irqsave(&func->ffs->eps_lock, flags);
do { while(count--) {
struct usb_endpoint_descriptor *ds; struct usb_endpoint_descriptor *ds;
int desc_idx; int desc_idx;
...@@ -1867,7 +1867,7 @@ static int ffs_func_eps_enable(struct ffs_function *func) ...@@ -1867,7 +1867,7 @@ static int ffs_func_eps_enable(struct ffs_function *func)
++ep; ++ep;
++epfile; ++epfile;
} while (--count); }
spin_unlock_irqrestore(&func->ffs->eps_lock, flags); spin_unlock_irqrestore(&func->ffs->eps_lock, flags);
return ret; return ret;
...@@ -3448,12 +3448,12 @@ static void ffs_func_unbind(struct usb_configuration *c, ...@@ -3448,12 +3448,12 @@ static void ffs_func_unbind(struct usb_configuration *c,
/* cleanup after autoconfig */ /* cleanup after autoconfig */
spin_lock_irqsave(&func->ffs->eps_lock, flags); spin_lock_irqsave(&func->ffs->eps_lock, flags);
do { while (count--) {
if (ep->ep && ep->req) if (ep->ep && ep->req)
usb_ep_free_request(ep->ep, ep->req); usb_ep_free_request(ep->ep, ep->req);
ep->req = NULL; ep->req = NULL;
++ep; ++ep;
} while (--count); }
spin_unlock_irqrestore(&func->ffs->eps_lock, flags); spin_unlock_irqrestore(&func->ffs->eps_lock, flags);
kfree(func->eps); kfree(func->eps);
func->eps = NULL; func->eps = NULL;
......
...@@ -1978,7 +1978,8 @@ static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev, ...@@ -1978,7 +1978,8 @@ static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev,
dev_err(&pdev->dev, "of_probe: name error(%d)\n", ret); dev_err(&pdev->dev, "of_probe: name error(%d)\n", ret);
goto err; goto err;
} }
ep->ep.name = kasprintf(GFP_KERNEL, "ep%d", ep->index); sprintf(ep->name, "ep%d", ep->index);
ep->ep.name = ep->name;
ep->ep_regs = udc->regs + USBA_EPT_BASE(i); ep->ep_regs = udc->regs + USBA_EPT_BASE(i);
ep->dma_regs = udc->regs + USBA_DMA_BASE(i); ep->dma_regs = udc->regs + USBA_DMA_BASE(i);
......
...@@ -280,6 +280,7 @@ struct usba_ep { ...@@ -280,6 +280,7 @@ struct usba_ep {
void __iomem *ep_regs; void __iomem *ep_regs;
void __iomem *dma_regs; void __iomem *dma_regs;
void __iomem *fifo; void __iomem *fifo;
char name[8];
struct usb_ep ep; struct usb_ep ep;
struct usba_udc *udc; struct usba_udc *udc;
......
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