mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
USB and PHY driver fixes for 4.1-rc7
Here are some USB and PHY driver fixes that resolve some reported regressions. Also in here are some new device ids. All of the details are in the shortlog and these patches have been in linux-next with no problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEABECAAYFAlVzhIcACgkQMUfUDdst+ykY9ACg0HeMGzJAfsWSLiSsBRpDxFAr ixAAnjOYj4Gv+XtAD4ZiOuMpaQaADntQ =4uxU -----END PGP SIGNATURE----- Merge tag 'usb-4.1-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB and PHY driver fixes from Greg KH: "Here are some USB and PHY driver fixes that resolve some reported regressions. Also in here are some new device ids. All of the details are in the shortlog and these patches have been in linux-next with no problems" * tag 'usb-4.1-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (22 commits) USB: cp210x: add ID for HubZ dual ZigBee and Z-Wave dongle usb: renesas_usbhs: Don't disable the pipe if Control write status stage usb: renesas_usbhs: Fix fifo unclear in usbhsf_prepare_pop usb: gadget: f_fs: fix check in read operation usb: musb: fix order of conditions for assigning end point operations usb: gadget: f_uac1: check return code from config_ep_by_speed usb: gadget: ffs: fix: Always call ffs_closed() in ffs_data_clear() usb: gadget: g_ffs: Fix counting of missing_functions usb: s3c2410_udc: correct reversed pullup logic usb: dwc3: gadget: Fix incorrect DEPCMD and DGCMD status macros usb: phy: tahvo: Pass the IRQF_ONESHOT flag usb: phy: ab8500-usb: Pass the IRQF_ONESHOT flag usb: renesas_usbhs: Revise the binding document about the dma-names usb: host: xhci: add mutex for non-thread-safe data usb: make module xhci_hcd removable USB: serial: ftdi_sio: Add support for a Motion Tracker Development Board usb: gadget: f_midi: fix segfault when reading empty id phy: phy-rcar-gen2: Fix USBHS_UGSTS_LOCK value phy: omap-usb2: invoke pm_runtime_disable on error path phy: fix Kconfig dependencies ...
This commit is contained in:
commit
e900f2c097
20 changed files with 123 additions and 63 deletions
|
@ -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 {
|
||||
|
|
|
@ -38,7 +38,9 @@ config ARMADA375_USBCLUSTER_PHY
|
|||
config PHY_DM816X_USB
|
||||
tristate "TI dm816x USB PHY driver"
|
||||
depends on ARCH_OMAP2PLUS
|
||||
depends on USB_SUPPORT
|
||||
select GENERIC_PHY
|
||||
select USB_PHY
|
||||
help
|
||||
Enable this for dm816x USB to work.
|
||||
|
||||
|
@ -97,8 +99,9 @@ config OMAP_CONTROL_PHY
|
|||
config OMAP_USB2
|
||||
tristate "OMAP USB2 PHY Driver"
|
||||
depends on ARCH_OMAP2PLUS
|
||||
depends on USB_PHY
|
||||
depends on USB_SUPPORT
|
||||
select GENERIC_PHY
|
||||
select USB_PHY
|
||||
select OMAP_CONTROL_PHY
|
||||
depends on OMAP_OCP2SCP
|
||||
help
|
||||
|
@ -122,8 +125,9 @@ config TI_PIPE3
|
|||
config TWL4030_USB
|
||||
tristate "TWL4030 USB Transceiver Driver"
|
||||
depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS
|
||||
depends on USB_PHY
|
||||
depends on USB_SUPPORT
|
||||
select GENERIC_PHY
|
||||
select USB_PHY
|
||||
help
|
||||
Enable this to support the USB OTG transceiver on TWL4030
|
||||
family chips (including the TWL5030 and TPS659x0 devices).
|
||||
|
@ -304,7 +308,7 @@ config PHY_STIH41X_USB
|
|||
|
||||
config PHY_QCOM_UFS
|
||||
tristate "Qualcomm UFS PHY driver"
|
||||
depends on OF && ARCH_MSM
|
||||
depends on OF && ARCH_QCOM
|
||||
select GENERIC_PHY
|
||||
help
|
||||
Support for UFS PHY on QCOM chipsets.
|
||||
|
|
|
@ -530,7 +530,7 @@ struct phy *phy_optional_get(struct device *dev, const char *string)
|
|||
{
|
||||
struct phy *phy = phy_get(dev, string);
|
||||
|
||||
if (PTR_ERR(phy) == -ENODEV)
|
||||
if (IS_ERR(phy) && (PTR_ERR(phy) == -ENODEV))
|
||||
phy = NULL;
|
||||
|
||||
return phy;
|
||||
|
@ -584,7 +584,7 @@ struct phy *devm_phy_optional_get(struct device *dev, const char *string)
|
|||
{
|
||||
struct phy *phy = devm_phy_get(dev, string);
|
||||
|
||||
if (PTR_ERR(phy) == -ENODEV)
|
||||
if (IS_ERR(phy) && (PTR_ERR(phy) == -ENODEV))
|
||||
phy = NULL;
|
||||
|
||||
return phy;
|
||||
|
|
|
@ -275,6 +275,7 @@ static int omap_usb2_probe(struct platform_device *pdev)
|
|||
phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k");
|
||||
if (IS_ERR(phy->wkupclk)) {
|
||||
dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n");
|
||||
pm_runtime_disable(phy->dev);
|
||||
return PTR_ERR(phy->wkupclk);
|
||||
} else {
|
||||
dev_warn(&pdev->dev,
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#define USBHS_LPSTS 0x02
|
||||
#define USBHS_UGCTRL 0x80
|
||||
#define USBHS_UGCTRL2 0x84
|
||||
#define USBHS_UGSTS 0x88 /* The manuals have 0x90 */
|
||||
#define USBHS_UGSTS 0x88 /* From technical update */
|
||||
|
||||
/* Low Power Status register (LPSTS) */
|
||||
#define USBHS_LPSTS_SUSPM 0x4000
|
||||
|
@ -41,7 +41,7 @@
|
|||
#define USBHS_UGCTRL2_USB0SEL_HS_USB 0x00000030
|
||||
|
||||
/* USB General status register (UGSTS) */
|
||||
#define USBHS_UGSTS_LOCK 0x00000300 /* The manuals have 0x3 */
|
||||
#define USBHS_UGSTS_LOCK 0x00000100 /* From technical update */
|
||||
|
||||
#define PHYS_PER_CHANNEL 2
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -3682,18 +3682,21 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
|
|||
{
|
||||
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
int ret, slot_id;
|
||||
struct xhci_command *command;
|
||||
|
||||
command = xhci_alloc_command(xhci, false, false, GFP_KERNEL);
|
||||
if (!command)
|
||||
return 0;
|
||||
|
||||
/* xhci->slot_id and xhci->addr_dev are not thread-safe */
|
||||
mutex_lock(&xhci->mutex);
|
||||
spin_lock_irqsave(&xhci->lock, flags);
|
||||
command->completion = &xhci->addr_dev;
|
||||
ret = xhci_queue_slot_control(xhci, command, TRB_ENABLE_SLOT, 0);
|
||||
if (ret) {
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
mutex_unlock(&xhci->mutex);
|
||||
xhci_dbg(xhci, "FIXME: allocate a command ring segment\n");
|
||||
kfree(command);
|
||||
return 0;
|
||||
|
@ -3702,8 +3705,10 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
|
|||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
|
||||
wait_for_completion(command->completion);
|
||||
slot_id = xhci->slot_id;
|
||||
mutex_unlock(&xhci->mutex);
|
||||
|
||||
if (!xhci->slot_id || command->status != COMP_SUCCESS) {
|
||||
if (!slot_id || command->status != COMP_SUCCESS) {
|
||||
xhci_err(xhci, "Error while assigning device slot ID\n");
|
||||
xhci_err(xhci, "Max number of devices this xHCI host supports is %u.\n",
|
||||
HCS_MAX_SLOTS(
|
||||
|
@ -3728,11 +3733,11 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
|
|||
* xhci_discover_or_reset_device(), which may be called as part of
|
||||
* mass storage driver error handling.
|
||||
*/
|
||||
if (!xhci_alloc_virt_device(xhci, xhci->slot_id, udev, GFP_NOIO)) {
|
||||
if (!xhci_alloc_virt_device(xhci, slot_id, udev, GFP_NOIO)) {
|
||||
xhci_warn(xhci, "Could not allocate xHCI USB device data structures\n");
|
||||
goto disable_slot;
|
||||
}
|
||||
udev->slot_id = xhci->slot_id;
|
||||
udev->slot_id = slot_id;
|
||||
|
||||
#ifndef CONFIG_USB_DEFAULT_PERSIST
|
||||
/*
|
||||
|
@ -3778,12 +3783,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
|||
struct xhci_slot_ctx *slot_ctx;
|
||||
struct xhci_input_control_ctx *ctrl_ctx;
|
||||
u64 temp_64;
|
||||
struct xhci_command *command;
|
||||
struct xhci_command *command = NULL;
|
||||
|
||||
mutex_lock(&xhci->mutex);
|
||||
|
||||
if (!udev->slot_id) {
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_address,
|
||||
"Bad Slot ID %d", udev->slot_id);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
virt_dev = xhci->devs[udev->slot_id];
|
||||
|
@ -3796,7 +3804,8 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
|||
*/
|
||||
xhci_warn(xhci, "Virt dev invalid for slot_id 0x%x!\n",
|
||||
udev->slot_id);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (setup == SETUP_CONTEXT_ONLY) {
|
||||
|
@ -3804,13 +3813,15 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
|||
if (GET_SLOT_STATE(le32_to_cpu(slot_ctx->dev_state)) ==
|
||||
SLOT_STATE_DEFAULT) {
|
||||
xhci_dbg(xhci, "Slot already in default state\n");
|
||||
return 0;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
command = xhci_alloc_command(xhci, false, false, GFP_KERNEL);
|
||||
if (!command)
|
||||
return -ENOMEM;
|
||||
if (!command) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
command->in_ctx = virt_dev->in_ctx;
|
||||
command->completion = &xhci->addr_dev;
|
||||
|
@ -3820,8 +3831,8 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
|||
if (!ctrl_ctx) {
|
||||
xhci_warn(xhci, "%s: Could not get input context, bad type.\n",
|
||||
__func__);
|
||||
kfree(command);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* If this is the first Set Address since device plug-in or
|
||||
|
@ -3848,8 +3859,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
|||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_address,
|
||||
"FIXME: allocate a command ring segment");
|
||||
kfree(command);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
xhci_ring_cmd_db(xhci);
|
||||
spin_unlock_irqrestore(&xhci->lock, flags);
|
||||
|
@ -3896,10 +3906,8 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
|||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
if (ret) {
|
||||
kfree(command);
|
||||
return ret;
|
||||
}
|
||||
if (ret)
|
||||
goto out;
|
||||
temp_64 = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr);
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_address,
|
||||
"Op regs DCBAA ptr = %#016llx", temp_64);
|
||||
|
@ -3932,8 +3940,10 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
|
|||
xhci_dbg_trace(xhci, trace_xhci_dbg_address,
|
||||
"Internal device address = %d",
|
||||
le32_to_cpu(slot_ctx->dev_state) & DEV_ADDR_MASK);
|
||||
out:
|
||||
mutex_unlock(&xhci->mutex);
|
||||
kfree(command);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
|
||||
|
@ -4855,6 +4865,7 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
|
|||
return 0;
|
||||
}
|
||||
|
||||
mutex_init(&xhci->mutex);
|
||||
xhci->cap_regs = hcd->regs;
|
||||
xhci->op_regs = hcd->regs +
|
||||
HC_LENGTH(readl(&xhci->cap_regs->hc_capbase));
|
||||
|
@ -5011,4 +5022,12 @@ static int __init xhci_hcd_init(void)
|
|||
BUILD_BUG_ON(sizeof(struct xhci_run_regs) != (8+8*128)*32/8);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If an init function is provided, an exit function must also be provided
|
||||
* to allow module unload.
|
||||
*/
|
||||
static void __exit xhci_hcd_fini(void) { }
|
||||
|
||||
module_init(xhci_hcd_init);
|
||||
module_exit(xhci_hcd_fini);
|
||||
|
|
|
@ -1497,6 +1497,8 @@ struct xhci_hcd {
|
|||
struct list_head lpm_failed_devs;
|
||||
|
||||
/* slot enabling and address device helpers */
|
||||
/* these are not thread safe so use mutex */
|
||||
struct mutex mutex;
|
||||
struct completion addr_dev;
|
||||
int slot_id;
|
||||
/* For USB 3.0 LPM enable/disable. */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -128,6 +128,7 @@ static const struct usb_device_id id_table[] = {
|
|||
{ USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
|
||||
{ USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
|
||||
{ USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */
|
||||
{ USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
|
||||
{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */
|
||||
{ USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */
|
||||
|
|
|
@ -699,6 +699,7 @@ static const struct usb_device_id id_table_combined[] = {
|
|||
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_DONGLE_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
|
||||
{ USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
|
||||
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
||||
|
|
|
@ -155,6 +155,7 @@
|
|||
#define XSENS_AWINDA_STATION_PID 0x0101
|
||||
#define XSENS_AWINDA_DONGLE_PID 0x0102
|
||||
#define XSENS_MTW_PID 0x0200 /* Xsens MTw */
|
||||
#define XSENS_MTDEVBOARD_PID 0x0300 /* Motion Tracker Development Board */
|
||||
#define XSENS_CONVERTER_PID 0xD00D /* Xsens USB-serial converter */
|
||||
|
||||
/* Xsens devices using FTDI VID */
|
||||
|
|
Loading…
Reference in a new issue