diff options
author | George Cherian <george.cherian@ti.com> | 2014-07-16 08:52:11 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-07-16 10:59:58 -0400 |
commit | d871c622e202efc663f953a4fcbd2cba6a28a24f (patch) | |
tree | 3b55073f60857eb84e4587b23a2d88ab9cdc7cb0 | |
parent | 675ae7631150a54eac81806ccb1bf16aba2bead8 (diff) |
usb: musb: core: Convert the musb_platform_reset to have a return value.
Currently musb_platform_reset() is only used by dsps.
In case of BABBLE interrupt for other platforms the musb_platform_reset()
is a NOP. In such situations no need to re-initialize the endpoints.
Also in the latest silicon revision of AM335x, we do have a babble recovery
mechanism without resetting the IP block. In preperation to add that support
its better to have a rest_done return for musb_platform_reset().
Signed-off-by: George Cherian <george.cherian@ti.com>
Tested-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r-- | drivers/usb/musb/musb_core.c | 10 | ||||
-rw-r--r-- | drivers/usb/musb/musb_core.h | 10 | ||||
-rw-r--r-- | drivers/usb/musb/musb_dsps.c | 3 |
3 files changed, 14 insertions, 9 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index c0ce09f8fdcd..b841ee0bff06 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -1753,9 +1753,11 @@ static void musb_irq_work(struct work_struct *data) | |||
1753 | static void musb_recover_work(struct work_struct *data) | 1753 | static void musb_recover_work(struct work_struct *data) |
1754 | { | 1754 | { |
1755 | struct musb *musb = container_of(data, struct musb, recover_work.work); | 1755 | struct musb *musb = container_of(data, struct musb, recover_work.work); |
1756 | int status; | 1756 | int status, ret; |
1757 | 1757 | ||
1758 | musb_platform_reset(musb); | 1758 | ret = musb_platform_reset(musb); |
1759 | if (ret) | ||
1760 | return; | ||
1759 | 1761 | ||
1760 | usb_phy_vbus_off(musb->xceiv); | 1762 | usb_phy_vbus_off(musb->xceiv); |
1761 | usleep_range(100, 200); | 1763 | usleep_range(100, 200); |
@@ -1764,8 +1766,8 @@ static void musb_recover_work(struct work_struct *data) | |||
1764 | usleep_range(100, 200); | 1766 | usleep_range(100, 200); |
1765 | 1767 | ||
1766 | /* | 1768 | /* |
1767 | * When a babble condition occurs, the musb controller removes the | 1769 | * When a babble condition occurs, the musb controller |
1768 | * session bit and the endpoint config is lost. | 1770 | * removes the session bit and the endpoint config is lost. |
1769 | */ | 1771 | */ |
1770 | if (musb->dyn_fifo) | 1772 | if (musb->dyn_fifo) |
1771 | status = ep_config_from_table(musb); | 1773 | status = ep_config_from_table(musb); |
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index 9241025f6965..414e57a984bb 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
@@ -192,7 +192,7 @@ struct musb_platform_ops { | |||
192 | 192 | ||
193 | int (*set_mode)(struct musb *musb, u8 mode); | 193 | int (*set_mode)(struct musb *musb, u8 mode); |
194 | void (*try_idle)(struct musb *musb, unsigned long timeout); | 194 | void (*try_idle)(struct musb *musb, unsigned long timeout); |
195 | void (*reset)(struct musb *musb); | 195 | int (*reset)(struct musb *musb); |
196 | 196 | ||
197 | int (*vbus_status)(struct musb *musb); | 197 | int (*vbus_status)(struct musb *musb); |
198 | void (*set_vbus)(struct musb *musb, int on); | 198 | void (*set_vbus)(struct musb *musb, int on); |
@@ -555,10 +555,12 @@ static inline void musb_platform_try_idle(struct musb *musb, | |||
555 | musb->ops->try_idle(musb, timeout); | 555 | musb->ops->try_idle(musb, timeout); |
556 | } | 556 | } |
557 | 557 | ||
558 | static inline void musb_platform_reset(struct musb *musb) | 558 | static inline int musb_platform_reset(struct musb *musb) |
559 | { | 559 | { |
560 | if (musb->ops->reset) | 560 | if (!musb->ops->reset) |
561 | musb->ops->reset(musb); | 561 | return -EINVAL; |
562 | |||
563 | return musb->ops->reset(musb); | ||
562 | } | 564 | } |
563 | 565 | ||
564 | static inline int musb_platform_get_vbus_status(struct musb *musb) | 566 | static inline int musb_platform_get_vbus_status(struct musb *musb) |
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index b29f59f718bb..53a4351aef97 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c | |||
@@ -544,7 +544,7 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode) | |||
544 | return 0; | 544 | return 0; |
545 | } | 545 | } |
546 | 546 | ||
547 | static void dsps_musb_reset(struct musb *musb) | 547 | static int dsps_musb_reset(struct musb *musb) |
548 | { | 548 | { |
549 | struct device *dev = musb->controller; | 549 | struct device *dev = musb->controller; |
550 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); | 550 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); |
@@ -556,6 +556,7 @@ static void dsps_musb_reset(struct musb *musb) | |||
556 | usleep_range(100, 200); | 556 | usleep_range(100, 200); |
557 | usb_phy_init(musb->xceiv); | 557 | usb_phy_init(musb->xceiv); |
558 | 558 | ||
559 | return 0; | ||
559 | } | 560 | } |
560 | 561 | ||
561 | static struct musb_platform_ops dsps_ops = { | 562 | static struct musb_platform_ops dsps_ops = { |