usb: fixes for v3.16-rc4
A few more fixes for this RC cycle. There's a revert of a previous patch which ended up being the wrong version, so we reverted that commit and applied a better fix. CPPI41 got a race condition fix which was found by Thomas Gleixner. The MSM PHY driver got a runtime pm usage fix so that it wouldn't kill the PHY while it was still being used. We also have a fix for a panic caused when removing musb_am335x driver. Other than that, a few other minor fixes. Signed-of-by: Felipe Balbi <balbi@ti.com> -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJTsa7CAAoJEIaOsuA1yqREC7kP/RRECPS8UrZgrVlU9Gch5iqw WtV3TdkTVuB6bhwvtRGIAjiXOdr8INvRkKvlzVN082cROAdSWjElbD9A/830a2Iv 5sMOWbM6HIkrwr51cGXIMul+0wNhcszftCn4+8UUiuKoP7dFnqTGZBgcyoDhfkHQ BjQ3/RlzeZ3XjLiBtnA4gTVko9i9L77TMayskOyjDpEEBKJ4HBKcD9Ged2xfgDxV P7lc5lkehUF9l3BAP4xfJq+vV8nxpRwq5J4OkBmJpODUPmim8XlSTNxA3EJQ+3SQ 1NusKOT/pVcSNYzVtB23C9Qvj6pvocso0ktvJOzwMLmW95GNMwN6NzbJUiSXIUzG cOGXGA6dJYKVFZ/7QNsV99ZAjEYBrgszZqtDHYmitYdo29ABMSuZ/3ZdfAT09a9P +Fqm4gqTDLJ9y72PHSc1CPJq4whTINGpIKcyRiVaxl+jFXl4v5rs3BywKV2gMIlM EhXaNz/AG+wGZVOiZzg0zHSjAhCw0GbthysMmd87z7Ynjcu97pDBEIw+xl1aI3wS eyFFt16WtRxujXFYqfDtArU0pdqrTxLgTBisxf949LKZJiB6Ta7v+MZOfFKVu//O 5K8KCN1l4vMUPOvTghT0BIGsCg4Td9zi0LTEQOBEwavYzXyATdqGAYnYeLgoqO4z 82XvxgC4fqXzXLhAntC5 =7Mt5 -----END PGP SIGNATURE----- Merge tag 'fixes-for-v3.16-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus Felipe writes: usb: fixes for v3.16-rc4 A few more fixes for this RC cycle. There's a revert of a previous patch which ended up being the wrong version, so we reverted that commit and applied a better fix. CPPI41 got a race condition fix which was found by Thomas Gleixner. The MSM PHY driver got a runtime pm usage fix so that it wouldn't kill the PHY while it was still being used. We also have a fix for a panic caused when removing musb_am335x driver. Other than that, a few other minor fixes. Signed-of-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
commit
ba1ba3a4ed
|
@ -1532,8 +1532,9 @@ static int gr_ep_enable(struct usb_ep *_ep,
|
|||
"%s mode: multiple trans./microframe not valid\n",
|
||||
(mode == 2 ? "Bulk" : "Control"));
|
||||
return -EINVAL;
|
||||
} else if (nt == 0x11) {
|
||||
dev_err(dev->dev, "Invalid value for trans./microframe\n");
|
||||
} else if (nt == 0x3) {
|
||||
dev_err(dev->dev,
|
||||
"Invalid value 0x3 for additional trans./microframe\n");
|
||||
return -EINVAL;
|
||||
} else if ((nt + 1) * max > buffer_size) {
|
||||
dev_err(dev->dev, "Hw buffer size %d < max payload %d * %d\n",
|
||||
|
|
|
@ -19,21 +19,6 @@ static int am335x_child_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int of_remove_populated_child(struct device *dev, void *d)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
|
||||
of_device_unregister(pdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int am335x_child_remove(struct platform_device *pdev)
|
||||
{
|
||||
device_for_each_child(&pdev->dev, NULL, of_remove_populated_child);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id am335x_child_of_match[] = {
|
||||
{ .compatible = "ti,am33xx-usb" },
|
||||
{ },
|
||||
|
@ -42,13 +27,17 @@ MODULE_DEVICE_TABLE(of, am335x_child_of_match);
|
|||
|
||||
static struct platform_driver am335x_child_driver = {
|
||||
.probe = am335x_child_probe,
|
||||
.remove = am335x_child_remove,
|
||||
.driver = {
|
||||
.name = "am335x-usb-childs",
|
||||
.of_match_table = am335x_child_of_match,
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(am335x_child_driver);
|
||||
static int __init am335x_child_init(void)
|
||||
{
|
||||
return platform_driver_register(&am335x_child_driver);
|
||||
}
|
||||
module_init(am335x_child_init);
|
||||
|
||||
MODULE_DESCRIPTION("AM33xx child devices");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -318,7 +318,7 @@ static void cppi41_dma_callback(void *private_data)
|
|||
}
|
||||
list_add_tail(&cppi41_channel->tx_check,
|
||||
&controller->early_tx_list);
|
||||
if (!hrtimer_active(&controller->early_tx)) {
|
||||
if (!hrtimer_is_queued(&controller->early_tx)) {
|
||||
hrtimer_start_range_ns(&controller->early_tx,
|
||||
ktime_set(0, 140 * NSEC_PER_USEC),
|
||||
40 * NSEC_PER_USEC,
|
||||
|
|
|
@ -494,10 +494,9 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode)
|
|||
struct dsps_glue *glue = dev_get_drvdata(dev->parent);
|
||||
const struct dsps_musb_wrapper *wrp = glue->wrp;
|
||||
void __iomem *ctrl_base = musb->ctrl_base;
|
||||
void __iomem *base = musb->mregs;
|
||||
u32 reg;
|
||||
|
||||
reg = dsps_readl(base, wrp->mode);
|
||||
reg = dsps_readl(ctrl_base, wrp->mode);
|
||||
|
||||
switch (mode) {
|
||||
case MUSB_HOST:
|
||||
|
@ -510,7 +509,7 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode)
|
|||
*/
|
||||
reg |= (1 << wrp->iddig_mux);
|
||||
|
||||
dsps_writel(base, wrp->mode, reg);
|
||||
dsps_writel(ctrl_base, wrp->mode, reg);
|
||||
dsps_writel(ctrl_base, wrp->phy_utmi, 0x02);
|
||||
break;
|
||||
case MUSB_PERIPHERAL:
|
||||
|
@ -523,10 +522,10 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode)
|
|||
*/
|
||||
reg |= (1 << wrp->iddig_mux);
|
||||
|
||||
dsps_writel(base, wrp->mode, reg);
|
||||
dsps_writel(ctrl_base, wrp->mode, reg);
|
||||
break;
|
||||
case MUSB_OTG:
|
||||
dsps_writel(base, wrp->phy_utmi, 0x02);
|
||||
dsps_writel(ctrl_base, wrp->phy_utmi, 0x02);
|
||||
break;
|
||||
default:
|
||||
dev_err(glue->dev, "unsupported mode %d\n", mode);
|
||||
|
|
|
@ -1229,7 +1229,9 @@ static void msm_otg_sm_work(struct work_struct *w)
|
|||
motg->chg_state = USB_CHG_STATE_UNDEFINED;
|
||||
motg->chg_type = USB_INVALID_CHARGER;
|
||||
}
|
||||
pm_runtime_put_sync(otg->phy->dev);
|
||||
|
||||
if (otg->phy->state == OTG_STATE_B_IDLE)
|
||||
pm_runtime_put_sync(otg->phy->dev);
|
||||
break;
|
||||
case OTG_STATE_B_PERIPHERAL:
|
||||
dev_dbg(otg->phy->dev, "OTG_STATE_B_PERIPHERAL state\n");
|
||||
|
|
|
@ -33,6 +33,13 @@ struct usb_endpoint_descriptor_no_audio {
|
|||
__u8 bInterval;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Legacy format, deprecated as of 3.14. */
|
||||
struct usb_functionfs_descs_head {
|
||||
__le32 magic;
|
||||
__le32 length;
|
||||
__le32 fs_count;
|
||||
__le32 hs_count;
|
||||
} __attribute__((packed, deprecated));
|
||||
|
||||
/*
|
||||
* Descriptors format:
|
||||
|
@ -53,7 +60,7 @@ struct usb_endpoint_descriptor_no_audio {
|
|||
* structure. Any flags that are not recognised cause the whole block to be
|
||||
* rejected with -ENOSYS.
|
||||
*
|
||||
* Legacy descriptors format (deprecated as of 3.14):
|
||||
* Legacy descriptors format:
|
||||
*
|
||||
* | off | name | type | description |
|
||||
* |-----+-----------+--------------+--------------------------------------|
|
||||
|
|
|
@ -6,11 +6,7 @@ WARNINGS = -Wall -Wextra
|
|||
CFLAGS = $(WARNINGS) -g -I../include
|
||||
LDFLAGS = $(PTHREAD_LIBS)
|
||||
|
||||
all: testusb ffs-test ffs-test-legacy
|
||||
|
||||
ffs-test-legacy: ffs-test.c
|
||||
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -DUSE_LEGACY_DESC_HEAD
|
||||
|
||||
all: testusb ffs-test
|
||||
%: %.c
|
||||
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* ffs-test.c -- user mode filesystem api for usb composite function
|
||||
* ffs-test.c.c -- user mode filesystem api for usb composite function
|
||||
*
|
||||
* Copyright (C) 2010 Samsung Electronics
|
||||
* Author: Michal Nazarewicz <mina86@mina86.com>
|
||||
|
@ -21,8 +21,6 @@
|
|||
|
||||
/* $(CROSS_COMPILE)cc -Wall -Wextra -g -o ffs-test ffs-test.c -lpthread */
|
||||
|
||||
/* Uncomment to make the tool use legacy FFS descriptor headers. */
|
||||
/* #define USE_LEGACY_DESC_HEAD */
|
||||
|
||||
#define _BSD_SOURCE /* for endian.h */
|
||||
|
||||
|
@ -108,15 +106,7 @@ static void _msg(unsigned level, const char *fmt, ...)
|
|||
/******************** Descriptors and Strings *******************************/
|
||||
|
||||
static const struct {
|
||||
struct {
|
||||
__le32 magic;
|
||||
__le32 length;
|
||||
#ifndef USE_LEGACY_DESC_HEAD
|
||||
__le32 flags;
|
||||
#endif
|
||||
__le32 fs_count;
|
||||
__le32 hs_count;
|
||||
} __attribute__((packed)) header;
|
||||
struct usb_functionfs_descs_head header;
|
||||
struct {
|
||||
struct usb_interface_descriptor intf;
|
||||
struct usb_endpoint_descriptor_no_audio sink;
|
||||
|
@ -124,16 +114,10 @@ static const struct {
|
|||
} __attribute__((packed)) fs_descs, hs_descs;
|
||||
} __attribute__((packed)) descriptors = {
|
||||
.header = {
|
||||
#ifdef USE_LEGACY_DESC_HEAD
|
||||
.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC),
|
||||
#else
|
||||
.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2),
|
||||
.flags = cpu_to_le32(FUNCTIONFS_HAS_FS_DESC |
|
||||
FUNCTIONFS_HAS_HS_DESC),
|
||||
#endif
|
||||
.length = cpu_to_le32(sizeof descriptors),
|
||||
.fs_count = 3,
|
||||
.hs_count = 3,
|
||||
.fs_count = cpu_to_le32(3),
|
||||
.hs_count = cpu_to_le32(3),
|
||||
},
|
||||
.fs_descs = {
|
||||
.intf = {
|
||||
|
|
Loading…
Reference in New Issue