Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d871c622 authored by George Cherian's avatar George Cherian Committed by Felipe Balbi
Browse files

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: default avatarGeorge Cherian <george.cherian@ti.com>
Tested-by: default avatarBin Liu <b-liu@ti.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 675ae763
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -1753,9 +1753,11 @@ static void musb_irq_work(struct work_struct *data)
static void musb_recover_work(struct work_struct *data)
{
	struct musb *musb = container_of(data, struct musb, recover_work.work);
	int status;
	int status, ret;

	musb_platform_reset(musb);
	ret  = musb_platform_reset(musb);
	if (ret)
		return;

	usb_phy_vbus_off(musb->xceiv);
	usleep_range(100, 200);
@@ -1764,8 +1766,8 @@ static void musb_recover_work(struct work_struct *data)
	usleep_range(100, 200);

	/*
	 * When a babble condition occurs, the musb controller removes the
	 * session bit and the endpoint config is lost.
	 * When a babble condition occurs, the musb controller
	 * removes the session bit and the endpoint config is lost.
	 */
	if (musb->dyn_fifo)
		status = ep_config_from_table(musb);
+6 −4
Original line number Diff line number Diff line
@@ -192,7 +192,7 @@ struct musb_platform_ops {

	int	(*set_mode)(struct musb *musb, u8 mode);
	void	(*try_idle)(struct musb *musb, unsigned long timeout);
	void	(*reset)(struct musb *musb);
	int	(*reset)(struct musb *musb);

	int	(*vbus_status)(struct musb *musb);
	void	(*set_vbus)(struct musb *musb, int on);
@@ -555,10 +555,12 @@ static inline void musb_platform_try_idle(struct musb *musb,
		musb->ops->try_idle(musb, timeout);
}

static inline void musb_platform_reset(struct musb *musb)
static inline int  musb_platform_reset(struct musb *musb)
{
	if (musb->ops->reset)
		musb->ops->reset(musb);
	if (!musb->ops->reset)
		return -EINVAL;

	return musb->ops->reset(musb);
}

static inline int musb_platform_get_vbus_status(struct musb *musb)
+2 −1
Original line number Diff line number Diff line
@@ -544,7 +544,7 @@ static int dsps_musb_set_mode(struct musb *musb, u8 mode)
	return 0;
}

static void dsps_musb_reset(struct musb *musb)
static int dsps_musb_reset(struct musb *musb)
{
	struct device *dev = musb->controller;
	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
@@ -556,6 +556,7 @@ static void dsps_musb_reset(struct musb *musb)
	usleep_range(100, 200);
	usb_phy_init(musb->xceiv);

	return 0;
}

static struct musb_platform_ops dsps_ops = {