diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-12-01 12:14:54 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-12-01 12:14:54 -0500 |
commit | a4861761e563568c2617851987eb2801dcc325f2 (patch) | |
tree | 834f5a5c4c62ec9e475a800155fbed9f1d6216d9 | |
parent | 31ade3b83e1821da5fbb2f11b5b3d4ab2ec39db8 (diff) | |
parent | f74875dc36135ebae82a8e005f4b7f52289d2c40 (diff) |
Merge tag 'fixes-for-v4.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus
Felipe writes:
usb: fixes for v4.4-rc3
Here's our second round of fixes. Some of the bugs are pretty old like
the one on pxa27x suspend implementation.
The most important part is a randbuild warning fix on MUSB CPPI DMA
engine by Arnd, a couple fixes by Felipe Tonello on f_midi (first one
makes sure we only transmit on enabled ep IN while second plugs a memory
leak) and a NULL pointer dereference fix on renesas usbhs.
Note that we also have a new compatible string being added for the MXS
PHY.
-rw-r--r-- | drivers/usb/dwc2/platform.c | 81 | ||||
-rw-r--r-- | drivers/usb/gadget/function/f_fs.c | 6 | ||||
-rw-r--r-- | drivers/usb/gadget/function/f_midi.c | 3 | ||||
-rw-r--r-- | drivers/usb/gadget/udc/pxa27x_udc.c | 3 | ||||
-rw-r--r-- | drivers/usb/musb/Kconfig | 2 | ||||
-rw-r--r-- | drivers/usb/phy/phy-mxs-usb.c | 5 | ||||
-rw-r--r-- | drivers/usb/renesas_usbhs/mod_gadget.c | 11 |
7 files changed, 76 insertions, 35 deletions
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c index e61d773cf65e..39c1cbf0e75d 100644 --- a/drivers/usb/dwc2/platform.c +++ b/drivers/usb/dwc2/platform.c | |||
@@ -125,9 +125,11 @@ static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) | |||
125 | if (ret) | 125 | if (ret) |
126 | return ret; | 126 | return ret; |
127 | 127 | ||
128 | ret = clk_prepare_enable(hsotg->clk); | 128 | if (hsotg->clk) { |
129 | if (ret) | 129 | ret = clk_prepare_enable(hsotg->clk); |
130 | return ret; | 130 | if (ret) |
131 | return ret; | ||
132 | } | ||
131 | 133 | ||
132 | if (hsotg->uphy) | 134 | if (hsotg->uphy) |
133 | ret = usb_phy_init(hsotg->uphy); | 135 | ret = usb_phy_init(hsotg->uphy); |
@@ -175,7 +177,8 @@ static int __dwc2_lowlevel_hw_disable(struct dwc2_hsotg *hsotg) | |||
175 | if (ret) | 177 | if (ret) |
176 | return ret; | 178 | return ret; |
177 | 179 | ||
178 | clk_disable_unprepare(hsotg->clk); | 180 | if (hsotg->clk) |
181 | clk_disable_unprepare(hsotg->clk); | ||
179 | 182 | ||
180 | ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), | 183 | ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies), |
181 | hsotg->supplies); | 184 | hsotg->supplies); |
@@ -212,14 +215,41 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) | |||
212 | */ | 215 | */ |
213 | hsotg->phy = devm_phy_get(hsotg->dev, "usb2-phy"); | 216 | hsotg->phy = devm_phy_get(hsotg->dev, "usb2-phy"); |
214 | if (IS_ERR(hsotg->phy)) { | 217 | if (IS_ERR(hsotg->phy)) { |
215 | hsotg->phy = NULL; | 218 | ret = PTR_ERR(hsotg->phy); |
219 | switch (ret) { | ||
220 | case -ENODEV: | ||
221 | case -ENOSYS: | ||
222 | hsotg->phy = NULL; | ||
223 | break; | ||
224 | case -EPROBE_DEFER: | ||
225 | return ret; | ||
226 | default: | ||
227 | dev_err(hsotg->dev, "error getting phy %d\n", ret); | ||
228 | return ret; | ||
229 | } | ||
230 | } | ||
231 | |||
232 | if (!hsotg->phy) { | ||
216 | hsotg->uphy = devm_usb_get_phy(hsotg->dev, USB_PHY_TYPE_USB2); | 233 | hsotg->uphy = devm_usb_get_phy(hsotg->dev, USB_PHY_TYPE_USB2); |
217 | if (IS_ERR(hsotg->uphy)) | 234 | if (IS_ERR(hsotg->uphy)) { |
218 | hsotg->uphy = NULL; | 235 | ret = PTR_ERR(hsotg->uphy); |
219 | else | 236 | switch (ret) { |
220 | hsotg->plat = dev_get_platdata(hsotg->dev); | 237 | case -ENODEV: |
238 | case -ENXIO: | ||
239 | hsotg->uphy = NULL; | ||
240 | break; | ||
241 | case -EPROBE_DEFER: | ||
242 | return ret; | ||
243 | default: | ||
244 | dev_err(hsotg->dev, "error getting usb phy %d\n", | ||
245 | ret); | ||
246 | return ret; | ||
247 | } | ||
248 | } | ||
221 | } | 249 | } |
222 | 250 | ||
251 | hsotg->plat = dev_get_platdata(hsotg->dev); | ||
252 | |||
223 | if (hsotg->phy) { | 253 | if (hsotg->phy) { |
224 | /* | 254 | /* |
225 | * If using the generic PHY framework, check if the PHY bus | 255 | * If using the generic PHY framework, check if the PHY bus |
@@ -229,11 +259,6 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg) | |||
229 | hsotg->phyif = GUSBCFG_PHYIF8; | 259 | hsotg->phyif = GUSBCFG_PHYIF8; |
230 | } | 260 | } |
231 | 261 | ||
232 | if (!hsotg->phy && !hsotg->uphy && !hsotg->plat) { | ||
233 | dev_err(hsotg->dev, "no platform data or transceiver defined\n"); | ||
234 | return -EPROBE_DEFER; | ||
235 | } | ||
236 | |||
237 | /* Clock */ | 262 | /* Clock */ |
238 | hsotg->clk = devm_clk_get(hsotg->dev, "otg"); | 263 | hsotg->clk = devm_clk_get(hsotg->dev, "otg"); |
239 | if (IS_ERR(hsotg->clk)) { | 264 | if (IS_ERR(hsotg->clk)) { |
@@ -342,20 +367,6 @@ static int dwc2_driver_probe(struct platform_device *dev) | |||
342 | if (retval) | 367 | if (retval) |
343 | return retval; | 368 | return retval; |
344 | 369 | ||
345 | irq = platform_get_irq(dev, 0); | ||
346 | if (irq < 0) { | ||
347 | dev_err(&dev->dev, "missing IRQ resource\n"); | ||
348 | return irq; | ||
349 | } | ||
350 | |||
351 | dev_dbg(hsotg->dev, "registering common handler for irq%d\n", | ||
352 | irq); | ||
353 | retval = devm_request_irq(hsotg->dev, irq, | ||
354 | dwc2_handle_common_intr, IRQF_SHARED, | ||
355 | dev_name(hsotg->dev), hsotg); | ||
356 | if (retval) | ||
357 | return retval; | ||
358 | |||
359 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); | 370 | res = platform_get_resource(dev, IORESOURCE_MEM, 0); |
360 | hsotg->regs = devm_ioremap_resource(&dev->dev, res); | 371 | hsotg->regs = devm_ioremap_resource(&dev->dev, res); |
361 | if (IS_ERR(hsotg->regs)) | 372 | if (IS_ERR(hsotg->regs)) |
@@ -390,6 +401,20 @@ static int dwc2_driver_probe(struct platform_device *dev) | |||
390 | 401 | ||
391 | dwc2_set_all_params(hsotg->core_params, -1); | 402 | dwc2_set_all_params(hsotg->core_params, -1); |
392 | 403 | ||
404 | irq = platform_get_irq(dev, 0); | ||
405 | if (irq < 0) { | ||
406 | dev_err(&dev->dev, "missing IRQ resource\n"); | ||
407 | return irq; | ||
408 | } | ||
409 | |||
410 | dev_dbg(hsotg->dev, "registering common handler for irq%d\n", | ||
411 | irq); | ||
412 | retval = devm_request_irq(hsotg->dev, irq, | ||
413 | dwc2_handle_common_intr, IRQF_SHARED, | ||
414 | dev_name(hsotg->dev), hsotg); | ||
415 | if (retval) | ||
416 | return retval; | ||
417 | |||
393 | retval = dwc2_lowlevel_hw_enable(hsotg); | 418 | retval = dwc2_lowlevel_hw_enable(hsotg); |
394 | if (retval) | 419 | if (retval) |
395 | return retval; | 420 | return retval; |
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index adc6d52efa46..cf43e9e18368 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
@@ -423,7 +423,7 @@ static ssize_t __ffs_ep0_read_events(struct ffs_data *ffs, char __user *buf, | |||
423 | spin_unlock_irq(&ffs->ev.waitq.lock); | 423 | spin_unlock_irq(&ffs->ev.waitq.lock); |
424 | mutex_unlock(&ffs->mutex); | 424 | mutex_unlock(&ffs->mutex); |
425 | 425 | ||
426 | return unlikely(__copy_to_user(buf, events, size)) ? -EFAULT : size; | 426 | return unlikely(copy_to_user(buf, events, size)) ? -EFAULT : size; |
427 | } | 427 | } |
428 | 428 | ||
429 | static ssize_t ffs_ep0_read(struct file *file, char __user *buf, | 429 | static ssize_t ffs_ep0_read(struct file *file, char __user *buf, |
@@ -513,7 +513,7 @@ static ssize_t ffs_ep0_read(struct file *file, char __user *buf, | |||
513 | 513 | ||
514 | /* unlocks spinlock */ | 514 | /* unlocks spinlock */ |
515 | ret = __ffs_ep0_queue_wait(ffs, data, len); | 515 | ret = __ffs_ep0_queue_wait(ffs, data, len); |
516 | if (likely(ret > 0) && unlikely(__copy_to_user(buf, data, len))) | 516 | if (likely(ret > 0) && unlikely(copy_to_user(buf, data, len))) |
517 | ret = -EFAULT; | 517 | ret = -EFAULT; |
518 | goto done_mutex; | 518 | goto done_mutex; |
519 | 519 | ||
@@ -3493,7 +3493,7 @@ static char *ffs_prepare_buffer(const char __user *buf, size_t len) | |||
3493 | if (unlikely(!data)) | 3493 | if (unlikely(!data)) |
3494 | return ERR_PTR(-ENOMEM); | 3494 | return ERR_PTR(-ENOMEM); |
3495 | 3495 | ||
3496 | if (unlikely(__copy_from_user(data, buf, len))) { | 3496 | if (unlikely(copy_from_user(data, buf, len))) { |
3497 | kfree(data); | 3497 | kfree(data); |
3498 | return ERR_PTR(-EFAULT); | 3498 | return ERR_PTR(-EFAULT); |
3499 | } | 3499 | } |
diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index 42acb45e1ab4..898a570319f1 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c | |||
@@ -370,6 +370,7 @@ static int f_midi_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
370 | if (err) { | 370 | if (err) { |
371 | ERROR(midi, "%s queue req: %d\n", | 371 | ERROR(midi, "%s queue req: %d\n", |
372 | midi->out_ep->name, err); | 372 | midi->out_ep->name, err); |
373 | free_ep_req(midi->out_ep, req); | ||
373 | } | 374 | } |
374 | } | 375 | } |
375 | 376 | ||
@@ -545,7 +546,7 @@ static void f_midi_transmit(struct f_midi *midi, struct usb_request *req) | |||
545 | } | 546 | } |
546 | } | 547 | } |
547 | 548 | ||
548 | if (req->length > 0) { | 549 | if (req->length > 0 && ep->enabled) { |
549 | int err; | 550 | int err; |
550 | 551 | ||
551 | err = usb_ep_queue(ep, req, GFP_ATOMIC); | 552 | err = usb_ep_queue(ep, req, GFP_ATOMIC); |
diff --git a/drivers/usb/gadget/udc/pxa27x_udc.c b/drivers/usb/gadget/udc/pxa27x_udc.c index 670ac0b12f00..001a3b74a993 100644 --- a/drivers/usb/gadget/udc/pxa27x_udc.c +++ b/drivers/usb/gadget/udc/pxa27x_udc.c | |||
@@ -2536,6 +2536,9 @@ static int pxa_udc_suspend(struct platform_device *_dev, pm_message_t state) | |||
2536 | udc->pullup_resume = udc->pullup_on; | 2536 | udc->pullup_resume = udc->pullup_on; |
2537 | dplus_pullup(udc, 0); | 2537 | dplus_pullup(udc, 0); |
2538 | 2538 | ||
2539 | if (udc->driver) | ||
2540 | udc->driver->disconnect(&udc->gadget); | ||
2541 | |||
2539 | return 0; | 2542 | return 0; |
2540 | } | 2543 | } |
2541 | 2544 | ||
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 1f2037bbeb0d..45c83baf675d 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
@@ -159,7 +159,7 @@ config USB_TI_CPPI_DMA | |||
159 | 159 | ||
160 | config USB_TI_CPPI41_DMA | 160 | config USB_TI_CPPI41_DMA |
161 | bool 'TI CPPI 4.1 (AM335x)' | 161 | bool 'TI CPPI 4.1 (AM335x)' |
162 | depends on ARCH_OMAP | 162 | depends on ARCH_OMAP && DMADEVICES |
163 | select TI_CPPI41 | 163 | select TI_CPPI41 |
164 | 164 | ||
165 | config USB_TUSB_OMAP_DMA | 165 | config USB_TUSB_OMAP_DMA |
diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index b7536af777ab..c2936dc48ca7 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c | |||
@@ -143,12 +143,17 @@ static const struct mxs_phy_data imx6sx_phy_data = { | |||
143 | .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS, | 143 | .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS, |
144 | }; | 144 | }; |
145 | 145 | ||
146 | static const struct mxs_phy_data imx6ul_phy_data = { | ||
147 | .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS, | ||
148 | }; | ||
149 | |||
146 | static const struct of_device_id mxs_phy_dt_ids[] = { | 150 | static const struct of_device_id mxs_phy_dt_ids[] = { |
147 | { .compatible = "fsl,imx6sx-usbphy", .data = &imx6sx_phy_data, }, | 151 | { .compatible = "fsl,imx6sx-usbphy", .data = &imx6sx_phy_data, }, |
148 | { .compatible = "fsl,imx6sl-usbphy", .data = &imx6sl_phy_data, }, | 152 | { .compatible = "fsl,imx6sl-usbphy", .data = &imx6sl_phy_data, }, |
149 | { .compatible = "fsl,imx6q-usbphy", .data = &imx6q_phy_data, }, | 153 | { .compatible = "fsl,imx6q-usbphy", .data = &imx6q_phy_data, }, |
150 | { .compatible = "fsl,imx23-usbphy", .data = &imx23_phy_data, }, | 154 | { .compatible = "fsl,imx23-usbphy", .data = &imx23_phy_data, }, |
151 | { .compatible = "fsl,vf610-usbphy", .data = &vf610_phy_data, }, | 155 | { .compatible = "fsl,vf610-usbphy", .data = &vf610_phy_data, }, |
156 | { .compatible = "fsl,imx6ul-usbphy", .data = &imx6ul_phy_data, }, | ||
152 | { /* sentinel */ } | 157 | { /* sentinel */ } |
153 | }; | 158 | }; |
154 | MODULE_DEVICE_TABLE(of, mxs_phy_dt_ids); | 159 | MODULE_DEVICE_TABLE(of, mxs_phy_dt_ids); |
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index de4f97d84a82..8f7a78e70975 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
@@ -131,7 +131,8 @@ static void __usbhsg_queue_pop(struct usbhsg_uep *uep, | |||
131 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | 131 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); |
132 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); | 132 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); |
133 | 133 | ||
134 | dev_dbg(dev, "pipe %d : queue pop\n", usbhs_pipe_number(pipe)); | 134 | if (pipe) |
135 | dev_dbg(dev, "pipe %d : queue pop\n", usbhs_pipe_number(pipe)); | ||
135 | 136 | ||
136 | ureq->req.status = status; | 137 | ureq->req.status = status; |
137 | spin_unlock(usbhs_priv_to_lock(priv)); | 138 | spin_unlock(usbhs_priv_to_lock(priv)); |
@@ -685,7 +686,13 @@ static int usbhsg_ep_dequeue(struct usb_ep *ep, struct usb_request *req) | |||
685 | struct usbhsg_request *ureq = usbhsg_req_to_ureq(req); | 686 | struct usbhsg_request *ureq = usbhsg_req_to_ureq(req); |
686 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | 687 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); |
687 | 688 | ||
688 | usbhs_pkt_pop(pipe, usbhsg_ureq_to_pkt(ureq)); | 689 | if (pipe) |
690 | usbhs_pkt_pop(pipe, usbhsg_ureq_to_pkt(ureq)); | ||
691 | |||
692 | /* | ||
693 | * To dequeue a request, this driver should call the usbhsg_queue_pop() | ||
694 | * even if the pipe is NULL. | ||
695 | */ | ||
689 | usbhsg_queue_pop(uep, ureq, -ECONNRESET); | 696 | usbhsg_queue_pop(uep, ureq, -ECONNRESET); |
690 | 697 | ||
691 | return 0; | 698 | return 0; |