Commit 13557b5d authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

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

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

Felipe writes:

usb: fixes for v4.1-rc5

A few late important fixes which have been pending
on mailing list due to my vacations.

The important fixes are a fix for DEPCMD and DGCMD
status bitfields on DWC3, a couple fixes for Renesas
USB Controller, one of which prevents a broken DT
binding from reaching v4.1-final, and an old fix for
s3c2410-udc where pullup logic was reversed.
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parents 4bc5d3bb 93fb9127
...@@ -15,10 +15,8 @@ Optional properties: ...@@ -15,10 +15,8 @@ Optional properties:
- phys: phandle + phy specifier pair - phys: phandle + phy specifier pair
- phy-names: must be "usb" - phy-names: must be "usb"
- dmas: Must contain a list of references to DMA specifiers. - dmas: Must contain a list of references to DMA specifiers.
- dma-names : Must contain a list of DMA names: - dma-names : named "ch%d", where %d is the channel number ranging from zero
- tx0 ... tx<n> to the number of channels (DnFIFOs) minus one.
- rx0 ... rx<n>
- This <n> means DnFIFO in USBHS module.
Example: Example:
usbhs: usb@e6590000 { usbhs: usb@e6590000 {
......
...@@ -339,7 +339,7 @@ ...@@ -339,7 +339,7 @@
#define DWC3_DGCMD_SET_ENDPOINT_NRDY 0x0c #define DWC3_DGCMD_SET_ENDPOINT_NRDY 0x0c
#define DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK 0x10 #define DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK 0x10
#define DWC3_DGCMD_STATUS(n) (((n) >> 15) & 1) #define DWC3_DGCMD_STATUS(n) (((n) >> 12) & 0x0F)
#define DWC3_DGCMD_CMDACT (1 << 10) #define DWC3_DGCMD_CMDACT (1 << 10)
#define DWC3_DGCMD_CMDIOC (1 << 8) #define DWC3_DGCMD_CMDIOC (1 << 8)
...@@ -355,7 +355,7 @@ ...@@ -355,7 +355,7 @@
#define DWC3_DEPCMD_PARAM_SHIFT 16 #define DWC3_DEPCMD_PARAM_SHIFT 16
#define DWC3_DEPCMD_PARAM(x) ((x) << DWC3_DEPCMD_PARAM_SHIFT) #define DWC3_DEPCMD_PARAM(x) ((x) << DWC3_DEPCMD_PARAM_SHIFT)
#define DWC3_DEPCMD_GET_RSC_IDX(x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f) #define DWC3_DEPCMD_GET_RSC_IDX(x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f)
#define DWC3_DEPCMD_STATUS(x) (((x) >> 15) & 1) #define DWC3_DEPCMD_STATUS(x) (((x) >> 12) & 0x0F)
#define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11) #define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11)
#define DWC3_DEPCMD_CMDACT (1 << 10) #define DWC3_DEPCMD_CMDACT (1 << 10)
#define DWC3_DEPCMD_CMDIOC (1 << 8) #define DWC3_DEPCMD_CMDIOC (1 << 8)
......
...@@ -315,7 +315,6 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf, ...@@ -315,7 +315,6 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf,
return ret; return ret;
} }
set_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags);
return len; return len;
} }
break; break;
...@@ -847,7 +846,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) ...@@ -847,7 +846,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
ret = ep->status; ret = ep->status;
if (io_data->read && ret > 0) { if (io_data->read && ret > 0) {
ret = copy_to_iter(data, ret, &io_data->data); ret = copy_to_iter(data, ret, &io_data->data);
if (unlikely(iov_iter_count(&io_data->data))) if (!ret)
ret = -EFAULT; ret = -EFAULT;
} }
} }
...@@ -1463,8 +1462,7 @@ static void ffs_data_clear(struct ffs_data *ffs) ...@@ -1463,8 +1462,7 @@ static void ffs_data_clear(struct ffs_data *ffs)
{ {
ENTER(); ENTER();
if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags)) ffs_closed(ffs);
ffs_closed(ffs);
BUG_ON(ffs->gadget); BUG_ON(ffs->gadget);
...@@ -3422,9 +3420,13 @@ static int ffs_ready(struct ffs_data *ffs) ...@@ -3422,9 +3420,13 @@ static int ffs_ready(struct ffs_data *ffs)
ffs_obj->desc_ready = true; ffs_obj->desc_ready = true;
ffs_obj->ffs_data = ffs; ffs_obj->ffs_data = ffs;
if (ffs_obj->ffs_ready_callback) if (ffs_obj->ffs_ready_callback) {
ret = ffs_obj->ffs_ready_callback(ffs); ret = ffs_obj->ffs_ready_callback(ffs);
if (ret)
goto done;
}
set_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags);
done: done:
ffs_dev_unlock(); ffs_dev_unlock();
return ret; return ret;
...@@ -3443,7 +3445,8 @@ static void ffs_closed(struct ffs_data *ffs) ...@@ -3443,7 +3445,8 @@ static void ffs_closed(struct ffs_data *ffs)
ffs_obj->desc_ready = false; ffs_obj->desc_ready = false;
if (ffs_obj->ffs_closed_callback) if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags) &&
ffs_obj->ffs_closed_callback)
ffs_obj->ffs_closed_callback(ffs); ffs_obj->ffs_closed_callback(ffs);
if (!ffs_obj->opts || ffs_obj->opts->no_configfs if (!ffs_obj->opts || ffs_obj->opts->no_configfs
......
...@@ -973,7 +973,13 @@ static ssize_t f_midi_opts_id_show(struct f_midi_opts *opts, char *page) ...@@ -973,7 +973,13 @@ static ssize_t f_midi_opts_id_show(struct f_midi_opts *opts, char *page)
int result; int result;
mutex_lock(&opts->lock); mutex_lock(&opts->lock);
result = strlcpy(page, opts->id, PAGE_SIZE); if (opts->id) {
result = strlcpy(page, opts->id, PAGE_SIZE);
} else {
page[0] = 0;
result = 0;
}
mutex_unlock(&opts->lock); mutex_unlock(&opts->lock);
return result; return result;
......
...@@ -588,7 +588,10 @@ static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt) ...@@ -588,7 +588,10 @@ static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
if (intf == 1) { if (intf == 1) {
if (alt == 1) { if (alt == 1) {
config_ep_by_speed(cdev->gadget, f, out_ep); err = config_ep_by_speed(cdev->gadget, f, out_ep);
if (err)
return err;
usb_ep_enable(out_ep); usb_ep_enable(out_ep);
out_ep->driver_data = audio; out_ep->driver_data = audio;
audio->copy_buf = f_audio_buffer_alloc(audio_buf_size); audio->copy_buf = f_audio_buffer_alloc(audio_buf_size);
......
...@@ -304,8 +304,10 @@ static int functionfs_ready_callback(struct ffs_data *ffs) ...@@ -304,8 +304,10 @@ static int functionfs_ready_callback(struct ffs_data *ffs)
gfs_registered = true; gfs_registered = true;
ret = usb_composite_probe(&gfs_driver); ret = usb_composite_probe(&gfs_driver);
if (unlikely(ret < 0)) if (unlikely(ret < 0)) {
++missing_funcs;
gfs_registered = false; gfs_registered = false;
}
return ret; return ret;
} }
......
...@@ -1487,7 +1487,7 @@ static int s3c2410_udc_pullup(struct usb_gadget *gadget, int is_on) ...@@ -1487,7 +1487,7 @@ static int s3c2410_udc_pullup(struct usb_gadget *gadget, int is_on)
dprintk(DEBUG_NORMAL, "%s()\n", __func__); dprintk(DEBUG_NORMAL, "%s()\n", __func__);
s3c2410_udc_set_pullup(udc, is_on ? 0 : 1); s3c2410_udc_set_pullup(udc, is_on);
return 0; return 0;
} }
......
...@@ -2021,13 +2021,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -2021,13 +2021,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
if (musb->ops->quirks) if (musb->ops->quirks)
musb->io.quirks = musb->ops->quirks; musb->io.quirks = musb->ops->quirks;
/* At least tusb6010 has it's own offsets.. */ /* Most devices use indexed offset or flat offset */
if (musb->ops->ep_offset)
musb->io.ep_offset = musb->ops->ep_offset;
if (musb->ops->ep_select)
musb->io.ep_select = musb->ops->ep_select;
/* ..and some devices use indexed offset or flat offset */
if (musb->io.quirks & MUSB_INDEXED_EP) { if (musb->io.quirks & MUSB_INDEXED_EP) {
musb->io.ep_offset = musb_indexed_ep_offset; musb->io.ep_offset = musb_indexed_ep_offset;
musb->io.ep_select = musb_indexed_ep_select; musb->io.ep_select = musb_indexed_ep_select;
...@@ -2036,6 +2030,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) ...@@ -2036,6 +2030,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
musb->io.ep_select = musb_flat_ep_select; musb->io.ep_select = musb_flat_ep_select;
} }
/* At least tusb6010 has its own offsets */
if (musb->ops->ep_offset)
musb->io.ep_offset = musb->ops->ep_offset;
if (musb->ops->ep_select)
musb->io.ep_select = musb->ops->ep_select;
if (musb->ops->fifo_mode) if (musb->ops->fifo_mode)
fifo_mode = musb->ops->fifo_mode; fifo_mode = musb->ops->fifo_mode;
else else
......
...@@ -1179,7 +1179,7 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev, ...@@ -1179,7 +1179,7 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev,
} }
err = devm_request_threaded_irq(&pdev->dev, irq, NULL, err = devm_request_threaded_irq(&pdev->dev, irq, NULL,
ab8500_usb_link_status_irq, ab8500_usb_link_status_irq,
IRQF_NO_SUSPEND | IRQF_SHARED, IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT,
"usb-link-status", ab); "usb-link-status", ab);
if (err < 0) { if (err < 0) {
dev_err(ab->dev, "request_irq failed for link status irq\n"); dev_err(ab->dev, "request_irq failed for link status irq\n");
...@@ -1195,7 +1195,7 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev, ...@@ -1195,7 +1195,7 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev,
} }
err = devm_request_threaded_irq(&pdev->dev, irq, NULL, err = devm_request_threaded_irq(&pdev->dev, irq, NULL,
ab8500_usb_disconnect_irq, ab8500_usb_disconnect_irq,
IRQF_NO_SUSPEND | IRQF_SHARED, IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT,
"usb-id-fall", ab); "usb-id-fall", ab);
if (err < 0) { if (err < 0) {
dev_err(ab->dev, "request_irq failed for ID fall irq\n"); dev_err(ab->dev, "request_irq failed for ID fall irq\n");
...@@ -1211,7 +1211,7 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev, ...@@ -1211,7 +1211,7 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev,
} }
err = devm_request_threaded_irq(&pdev->dev, irq, NULL, err = devm_request_threaded_irq(&pdev->dev, irq, NULL,
ab8500_usb_disconnect_irq, ab8500_usb_disconnect_irq,
IRQF_NO_SUSPEND | IRQF_SHARED, IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT,
"usb-vbus-fall", ab); "usb-vbus-fall", ab);
if (err < 0) { if (err < 0) {
dev_err(ab->dev, "request_irq failed for Vbus fall irq\n"); dev_err(ab->dev, "request_irq failed for Vbus fall irq\n");
......
...@@ -401,7 +401,8 @@ static int tahvo_usb_probe(struct platform_device *pdev) ...@@ -401,7 +401,8 @@ static int tahvo_usb_probe(struct platform_device *pdev)
dev_set_drvdata(&pdev->dev, tu); dev_set_drvdata(&pdev->dev, tu);
tu->irq = platform_get_irq(pdev, 0); tu->irq = platform_get_irq(pdev, 0);
ret = request_threaded_irq(tu->irq, NULL, tahvo_usb_vbus_interrupt, 0, ret = request_threaded_irq(tu->irq, NULL, tahvo_usb_vbus_interrupt,
IRQF_ONESHOT,
"tahvo-vbus", tu); "tahvo-vbus", tu);
if (ret) { if (ret) {
dev_err(&pdev->dev, "could not register tahvo-vbus irq: %d\n", dev_err(&pdev->dev, "could not register tahvo-vbus irq: %d\n",
......
...@@ -611,6 +611,8 @@ struct usbhs_pkt_handle usbhs_fifo_pio_push_handler = { ...@@ -611,6 +611,8 @@ struct usbhs_pkt_handle usbhs_fifo_pio_push_handler = {
static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done) static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done)
{ {
struct usbhs_pipe *pipe = pkt->pipe; struct usbhs_pipe *pipe = pkt->pipe;
struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
struct usbhs_fifo *fifo = usbhsf_get_cfifo(priv);
if (usbhs_pipe_is_busy(pipe)) if (usbhs_pipe_is_busy(pipe))
return 0; return 0;
...@@ -624,6 +626,9 @@ static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done) ...@@ -624,6 +626,9 @@ static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done)
usbhs_pipe_data_sequence(pipe, pkt->sequence); usbhs_pipe_data_sequence(pipe, pkt->sequence);
pkt->sequence = -1; /* -1 sequence will be ignored */ pkt->sequence = -1; /* -1 sequence will be ignored */
if (usbhs_pipe_is_dcp(pipe))
usbhsf_fifo_clear(pipe, fifo);
usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->length); usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->length);
usbhs_pipe_enable(pipe); usbhs_pipe_enable(pipe);
usbhs_pipe_running(pipe, 1); usbhs_pipe_running(pipe, 1);
...@@ -673,7 +678,14 @@ static int usbhsf_pio_try_pop(struct usbhs_pkt *pkt, int *is_done) ...@@ -673,7 +678,14 @@ static int usbhsf_pio_try_pop(struct usbhs_pkt *pkt, int *is_done)
*is_done = 1; *is_done = 1;
usbhsf_rx_irq_ctrl(pipe, 0); usbhsf_rx_irq_ctrl(pipe, 0);
usbhs_pipe_running(pipe, 0); usbhs_pipe_running(pipe, 0);
usbhs_pipe_disable(pipe); /* disable pipe first */ /*
* If function mode, since this controller is possible to enter
* Control Write status stage at this timing, this driver
* should not disable the pipe. If such a case happens, this
* controller is not able to complete the status stage.
*/
if (!usbhs_mod_is_host(priv) && !usbhs_pipe_is_dcp(pipe))
usbhs_pipe_disable(pipe); /* disable pipe first */
} }
/* /*
...@@ -1227,15 +1239,21 @@ static void usbhsf_dma_init_dt(struct device *dev, struct usbhs_fifo *fifo, ...@@ -1227,15 +1239,21 @@ static void usbhsf_dma_init_dt(struct device *dev, struct usbhs_fifo *fifo,
{ {
char name[16]; char name[16];
snprintf(name, sizeof(name), "tx%d", channel); /*
fifo->tx_chan = dma_request_slave_channel_reason(dev, name); * To avoid complex handing for DnFIFOs, the driver uses each
if (IS_ERR(fifo->tx_chan)) * DnFIFO as TX or RX direction (not bi-direction).
fifo->tx_chan = NULL; * So, the driver uses odd channels for TX, even channels for RX.
*/
snprintf(name, sizeof(name), "rx%d", channel); snprintf(name, sizeof(name), "ch%d", channel);
fifo->rx_chan = dma_request_slave_channel_reason(dev, name); if (channel & 1) {
if (IS_ERR(fifo->rx_chan)) fifo->tx_chan = dma_request_slave_channel_reason(dev, name);
fifo->rx_chan = NULL; if (IS_ERR(fifo->tx_chan))
fifo->tx_chan = NULL;
} else {
fifo->rx_chan = dma_request_slave_channel_reason(dev, name);
if (IS_ERR(fifo->rx_chan))
fifo->rx_chan = NULL;
}
} }
static void usbhsf_dma_init(struct usbhs_priv *priv, struct usbhs_fifo *fifo, static void usbhsf_dma_init(struct usbhs_priv *priv, struct usbhs_fifo *fifo,
......
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