mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-30 21:46:31 +00:00
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: Felipe Balbi <balbi@ti.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJVZJJbAAoJEIaOsuA1yqREjaoP/iVQXzCB0+IDNou37xM/HTzN euOCrx2Lc8O3zyWNWwjlYDT0uu3ev8+Bw/s3Bd7ZWtYDWD8dBVjbCM4WZ4CEkaht 4xSdCgP/HLJZmqxYfYheqmtAdwN5gkwRX2Gwi3+lJ0sq9I8WhX0RwEsHYY8sPk6K R3y9x6ggTo5ws9oupYhiNaCtODEBF0S2PbZg9S0nxmOueypAZPJMNmw63d9njh25 dey4z52xEJMw6hgdjI/d14OE86ZRhq5+qRUhg4Wh6kGJ5nYoNTSug+Pxg5iuzzTM 2NeasXxhls5zbPiaglggqoYd36akvQ7g8KadBx7oWGFyqeEGTpZiC+gQTO1OYfEF pERKA9tXi+eClcmmhzrakpl8K9mBz22KDpeh2oFSKHlrc+R9erG4b1oF3G06SCVk d3Mz9qDazjYSqknLlvK6G3BxukYSe1J/bIRHCYAfqAXsw8SiT7IbdLrGsaY1Gssy bauyXe4L/oEpYoYBuwA1MTR8n20AIYEcDrGM3kbQD22eQJqLCcnqCElX6/uIzv5d 3AKc2JiYbT9ZeYdYVAh2FNcvVd0j99b9dVc6Szv9ZzLrvbLegERjp58WEQC53VDM fMxZv4FEl3pjiGsjC3F5RnhKnFQt1oCKmcUK5qqMkpZb2AY5XnVdZQczEOU9pjeK +xvWvya+3W4MrVk6I0Q/ =gNa5 -----END PGP SIGNATURE----- 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: Felipe Balbi <balbi@ti.com>
This commit is contained in:
commit
13557b5d84
@ -15,10 +15,8 @@ Optional properties:
|
||||
- phys: phandle + phy specifier pair
|
||||
- phy-names: must be "usb"
|
||||
- dmas: Must contain a list of references to DMA specifiers.
|
||||
- dma-names : Must contain a list of DMA names:
|
||||
- tx0 ... tx<n>
|
||||
- rx0 ... rx<n>
|
||||
- This <n> means DnFIFO in USBHS module.
|
||||
- dma-names : named "ch%d", where %d is the channel number ranging from zero
|
||||
to the number of channels (DnFIFOs) minus one.
|
||||
|
||||
Example:
|
||||
usbhs: usb@e6590000 {
|
||||
|
@ -339,7 +339,7 @@
|
||||
#define DWC3_DGCMD_SET_ENDPOINT_NRDY 0x0c
|
||||
#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_CMDIOC (1 << 8)
|
||||
|
||||
@ -355,7 +355,7 @@
|
||||
#define DWC3_DEPCMD_PARAM_SHIFT 16
|
||||
#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_STATUS(x) (((x) >> 15) & 1)
|
||||
#define DWC3_DEPCMD_STATUS(x) (((x) >> 12) & 0x0F)
|
||||
#define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11)
|
||||
#define DWC3_DEPCMD_CMDACT (1 << 10)
|
||||
#define DWC3_DEPCMD_CMDIOC (1 << 8)
|
||||
|
@ -315,7 +315,6 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf,
|
||||
return ret;
|
||||
}
|
||||
|
||||
set_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags);
|
||||
return len;
|
||||
}
|
||||
break;
|
||||
@ -847,7 +846,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
|
||||
ret = ep->status;
|
||||
if (io_data->read && ret > 0) {
|
||||
ret = copy_to_iter(data, ret, &io_data->data);
|
||||
if (unlikely(iov_iter_count(&io_data->data)))
|
||||
if (!ret)
|
||||
ret = -EFAULT;
|
||||
}
|
||||
}
|
||||
@ -1463,8 +1462,7 @@ static void ffs_data_clear(struct ffs_data *ffs)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags))
|
||||
ffs_closed(ffs);
|
||||
ffs_closed(ffs);
|
||||
|
||||
BUG_ON(ffs->gadget);
|
||||
|
||||
@ -3422,9 +3420,13 @@ static int ffs_ready(struct ffs_data *ffs)
|
||||
ffs_obj->desc_ready = true;
|
||||
ffs_obj->ffs_data = ffs;
|
||||
|
||||
if (ffs_obj->ffs_ready_callback)
|
||||
if (ffs_obj->ffs_ready_callback) {
|
||||
ret = ffs_obj->ffs_ready_callback(ffs);
|
||||
if (ret)
|
||||
goto done;
|
||||
}
|
||||
|
||||
set_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags);
|
||||
done:
|
||||
ffs_dev_unlock();
|
||||
return ret;
|
||||
@ -3443,7 +3445,8 @@ static void ffs_closed(struct ffs_data *ffs)
|
||||
|
||||
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);
|
||||
|
||||
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)
|
||||
int result;
|
||||
|
||||
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);
|
||||
|
||||
return result;
|
||||
|
@ -588,7 +588,10 @@ static int f_audio_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
|
||||
|
||||
if (intf == 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);
|
||||
out_ep->driver_data = audio;
|
||||
audio->copy_buf = f_audio_buffer_alloc(audio_buf_size);
|
||||
|
@ -304,8 +304,10 @@ static int functionfs_ready_callback(struct ffs_data *ffs)
|
||||
gfs_registered = true;
|
||||
|
||||
ret = usb_composite_probe(&gfs_driver);
|
||||
if (unlikely(ret < 0))
|
||||
if (unlikely(ret < 0)) {
|
||||
++missing_funcs;
|
||||
gfs_registered = false;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1487,7 +1487,7 @@ static int s3c2410_udc_pullup(struct usb_gadget *gadget, int is_on)
|
||||
|
||||
dprintk(DEBUG_NORMAL, "%s()\n", __func__);
|
||||
|
||||
s3c2410_udc_set_pullup(udc, is_on ? 0 : 1);
|
||||
s3c2410_udc_set_pullup(udc, is_on);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2021,13 +2021,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
|
||||
if (musb->ops->quirks)
|
||||
musb->io.quirks = musb->ops->quirks;
|
||||
|
||||
/* At least tusb6010 has it's 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;
|
||||
|
||||
/* ..and some devices use indexed offset or flat offset */
|
||||
/* Most devices use indexed offset or flat offset */
|
||||
if (musb->io.quirks & MUSB_INDEXED_EP) {
|
||||
musb->io.ep_offset = musb_indexed_ep_offset;
|
||||
musb->io.ep_select = musb_indexed_ep_select;
|
||||
@ -2036,6 +2030,12 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
|
||||
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)
|
||||
fifo_mode = musb->ops->fifo_mode;
|
||||
else
|
||||
|
@ -1179,7 +1179,7 @@ static int ab8500_usb_irq_setup(struct platform_device *pdev,
|
||||
}
|
||||
err = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||
ab8500_usb_link_status_irq,
|
||||
IRQF_NO_SUSPEND | IRQF_SHARED,
|
||||
IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT,
|
||||
"usb-link-status", ab);
|
||||
if (err < 0) {
|
||||
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,
|
||||
}
|
||||
err = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||
ab8500_usb_disconnect_irq,
|
||||
IRQF_NO_SUSPEND | IRQF_SHARED,
|
||||
IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT,
|
||||
"usb-id-fall", ab);
|
||||
if (err < 0) {
|
||||
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,
|
||||
}
|
||||
err = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||
ab8500_usb_disconnect_irq,
|
||||
IRQF_NO_SUSPEND | IRQF_SHARED,
|
||||
IRQF_NO_SUSPEND | IRQF_SHARED | IRQF_ONESHOT,
|
||||
"usb-vbus-fall", ab);
|
||||
if (err < 0) {
|
||||
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)
|
||||
dev_set_drvdata(&pdev->dev, tu);
|
||||
|
||||
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);
|
||||
if (ret) {
|
||||
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 = {
|
||||
static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done)
|
||||
{
|
||||
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))
|
||||
return 0;
|
||||
@ -624,6 +626,9 @@ static int usbhsf_prepare_pop(struct usbhs_pkt *pkt, int *is_done)
|
||||
usbhs_pipe_data_sequence(pipe, pkt->sequence);
|
||||
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_enable(pipe);
|
||||
usbhs_pipe_running(pipe, 1);
|
||||
@ -673,7 +678,14 @@ static int usbhsf_pio_try_pop(struct usbhs_pkt *pkt, int *is_done)
|
||||
*is_done = 1;
|
||||
usbhsf_rx_irq_ctrl(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,
|
||||
{
|
||||
char name[16];
|
||||
|
||||
snprintf(name, sizeof(name), "tx%d", channel);
|
||||
fifo->tx_chan = dma_request_slave_channel_reason(dev, name);
|
||||
if (IS_ERR(fifo->tx_chan))
|
||||
fifo->tx_chan = NULL;
|
||||
|
||||
snprintf(name, sizeof(name), "rx%d", channel);
|
||||
fifo->rx_chan = dma_request_slave_channel_reason(dev, name);
|
||||
if (IS_ERR(fifo->rx_chan))
|
||||
fifo->rx_chan = NULL;
|
||||
/*
|
||||
* To avoid complex handing for DnFIFOs, the driver uses each
|
||||
* DnFIFO as TX or RX direction (not bi-direction).
|
||||
* So, the driver uses odd channels for TX, even channels for RX.
|
||||
*/
|
||||
snprintf(name, sizeof(name), "ch%d", channel);
|
||||
if (channel & 1) {
|
||||
fifo->tx_chan = dma_request_slave_channel_reason(dev, name);
|
||||
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,
|
||||
|
Loading…
Reference in New Issue
Block a user