Commit ba1ba3a4 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'fixes-for-v3.16-rc4' of...

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: default avatarFelipe Balbi <balbi@ti.com>
parents 8ecd93ab 80356913
...@@ -1532,8 +1532,9 @@ static int gr_ep_enable(struct usb_ep *_ep, ...@@ -1532,8 +1532,9 @@ static int gr_ep_enable(struct usb_ep *_ep,
"%s mode: multiple trans./microframe not valid\n", "%s mode: multiple trans./microframe not valid\n",
(mode == 2 ? "Bulk" : "Control")); (mode == 2 ? "Bulk" : "Control"));
return -EINVAL; return -EINVAL;
} else if (nt == 0x11) { } else if (nt == 0x3) {
dev_err(dev->dev, "Invalid value for trans./microframe\n"); dev_err(dev->dev,
"Invalid value 0x3 for additional trans./microframe\n");
return -EINVAL; return -EINVAL;
} else if ((nt + 1) * max > buffer_size) { } else if ((nt + 1) * max > buffer_size) {
dev_err(dev->dev, "Hw buffer size %d < max payload %d * %d\n", 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) ...@@ -19,21 +19,6 @@ static int am335x_child_probe(struct platform_device *pdev)
return ret; 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[] = { static const struct of_device_id am335x_child_of_match[] = {
{ .compatible = "ti,am33xx-usb" }, { .compatible = "ti,am33xx-usb" },
{ }, { },
...@@ -42,13 +27,17 @@ MODULE_DEVICE_TABLE(of, am335x_child_of_match); ...@@ -42,13 +27,17 @@ MODULE_DEVICE_TABLE(of, am335x_child_of_match);
static struct platform_driver am335x_child_driver = { static struct platform_driver am335x_child_driver = {
.probe = am335x_child_probe, .probe = am335x_child_probe,
.remove = am335x_child_remove,
.driver = { .driver = {
.name = "am335x-usb-childs", .name = "am335x-usb-childs",
.of_match_table = am335x_child_of_match, .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_DESCRIPTION("AM33xx child devices");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -318,7 +318,7 @@ static void cppi41_dma_callback(void *private_data) ...@@ -318,7 +318,7 @@ static void cppi41_dma_callback(void *private_data)
} }
list_add_tail(&cppi41_channel->tx_check, list_add_tail(&cppi41_channel->tx_check,
&controller->early_tx_list); &controller->early_tx_list);
if (!hrtimer_active(&controller->early_tx)) { if (!hrtimer_is_queued(&controller->early_tx)) {
hrtimer_start_range_ns(&controller->early_tx, hrtimer_start_range_ns(&controller->early_tx,
ktime_set(0, 140 * NSEC_PER_USEC), ktime_set(0, 140 * NSEC_PER_USEC),
40 * NSEC_PER_USEC, 40 * NSEC_PER_USEC,
......
...@@ -494,10 +494,9 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode) ...@@ -494,10 +494,9 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode)
struct dsps_glue *glue = dev_get_drvdata(dev->parent); struct dsps_glue *glue = dev_get_drvdata(dev->parent);
const struct dsps_musb_wrapper *wrp = glue->wrp; const struct dsps_musb_wrapper *wrp = glue->wrp;
void __iomem *ctrl_base = musb->ctrl_base; void __iomem *ctrl_base = musb->ctrl_base;
void __iomem *base = musb->mregs;
u32 reg; u32 reg;
reg = dsps_readl(base, wrp->mode); reg = dsps_readl(ctrl_base, wrp->mode);
switch (mode) { switch (mode) {
case MUSB_HOST: case MUSB_HOST:
...@@ -510,7 +509,7 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode) ...@@ -510,7 +509,7 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode)
*/ */
reg |= (1 << wrp->iddig_mux); 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); dsps_writel(ctrl_base, wrp->phy_utmi, 0x02);
break; break;
case MUSB_PERIPHERAL: case MUSB_PERIPHERAL:
...@@ -523,10 +522,10 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode) ...@@ -523,10 +522,10 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode)
*/ */
reg |= (1 << wrp->iddig_mux); reg |= (1 << wrp->iddig_mux);
dsps_writel(base, wrp->mode, reg); dsps_writel(ctrl_base, wrp->mode, reg);
break; break;
case MUSB_OTG: case MUSB_OTG:
dsps_writel(base, wrp->phy_utmi, 0x02); dsps_writel(ctrl_base, wrp->phy_utmi, 0x02);
break; break;
default: default:
dev_err(glue->dev, "unsupported mode %d\n", mode); dev_err(glue->dev, "unsupported mode %d\n", mode);
......
...@@ -1229,7 +1229,9 @@ static void msm_otg_sm_work(struct work_struct *w) ...@@ -1229,7 +1229,9 @@ static void msm_otg_sm_work(struct work_struct *w)
motg->chg_state = USB_CHG_STATE_UNDEFINED; motg->chg_state = USB_CHG_STATE_UNDEFINED;
motg->chg_type = USB_INVALID_CHARGER; 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; break;
case OTG_STATE_B_PERIPHERAL: case OTG_STATE_B_PERIPHERAL:
dev_dbg(otg->phy->dev, "OTG_STATE_B_PERIPHERAL state\n"); dev_dbg(otg->phy->dev, "OTG_STATE_B_PERIPHERAL state\n");
......
...@@ -33,6 +33,13 @@ struct usb_endpoint_descriptor_no_audio { ...@@ -33,6 +33,13 @@ struct usb_endpoint_descriptor_no_audio {
__u8 bInterval; __u8 bInterval;
} __attribute__((packed)); } __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: * Descriptors format:
...@@ -53,7 +60,7 @@ struct usb_endpoint_descriptor_no_audio { ...@@ -53,7 +60,7 @@ struct usb_endpoint_descriptor_no_audio {
* structure. Any flags that are not recognised cause the whole block to be * structure. Any flags that are not recognised cause the whole block to be
* rejected with -ENOSYS. * rejected with -ENOSYS.
* *
* Legacy descriptors format (deprecated as of 3.14): * Legacy descriptors format:
* *
* | off | name | type | description | * | off | name | type | description |
* |-----+-----------+--------------+--------------------------------------| * |-----+-----------+--------------+--------------------------------------|
......
...@@ -6,11 +6,7 @@ WARNINGS = -Wall -Wextra ...@@ -6,11 +6,7 @@ WARNINGS = -Wall -Wextra
CFLAGS = $(WARNINGS) -g -I../include CFLAGS = $(WARNINGS) -g -I../include
LDFLAGS = $(PTHREAD_LIBS) LDFLAGS = $(PTHREAD_LIBS)
all: testusb ffs-test ffs-test-legacy all: testusb ffs-test
ffs-test-legacy: ffs-test.c
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -DUSE_LEGACY_DESC_HEAD
%: %.c %: %.c
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
......
/* /*
* 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 * Copyright (C) 2010 Samsung Electronics
* Author: Michal Nazarewicz <mina86@mina86.com> * Author: Michal Nazarewicz <mina86@mina86.com>
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
/* $(CROSS_COMPILE)cc -Wall -Wextra -g -o ffs-test ffs-test.c -lpthread */ /* $(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 */ #define _BSD_SOURCE /* for endian.h */
...@@ -108,15 +106,7 @@ static void _msg(unsigned level, const char *fmt, ...) ...@@ -108,15 +106,7 @@ static void _msg(unsigned level, const char *fmt, ...)
/******************** Descriptors and Strings *******************************/ /******************** Descriptors and Strings *******************************/
static const struct { static const struct {
struct { struct usb_functionfs_descs_head header;
__le32 magic;
__le32 length;
#ifndef USE_LEGACY_DESC_HEAD
__le32 flags;
#endif
__le32 fs_count;
__le32 hs_count;
} __attribute__((packed)) header;
struct { struct {
struct usb_interface_descriptor intf; struct usb_interface_descriptor intf;
struct usb_endpoint_descriptor_no_audio sink; struct usb_endpoint_descriptor_no_audio sink;
...@@ -124,16 +114,10 @@ static const struct { ...@@ -124,16 +114,10 @@ static const struct {
} __attribute__((packed)) fs_descs, hs_descs; } __attribute__((packed)) fs_descs, hs_descs;
} __attribute__((packed)) descriptors = { } __attribute__((packed)) descriptors = {
.header = { .header = {
#ifdef USE_LEGACY_DESC_HEAD
.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC), .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), .length = cpu_to_le32(sizeof descriptors),
.fs_count = 3, .fs_count = cpu_to_le32(3),
.hs_count = 3, .hs_count = cpu_to_le32(3),
}, },
.fs_descs = { .fs_descs = {
.intf = { .intf = {
......
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