diff mbox

[v5,6/6] usb: musb: dsps: Enable sw babble control for newer silicon

Message ID 1400740181-31213-7-git-send-email-george.cherian@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

George Cherian May 22, 2014, 6:29 a.m. UTC
Find whether we are running on newer silicon. The babble control
register reads 0x4 by default in newer silicon as opposed to 0
in old versions of AM335x. Based on this enable the sw babble
control logic.

Signed-off-by: George Cherian <george.cherian@ti.com>
---
 drivers/usb/musb/musb_dsps.c | 38 ++++++++++++++++++++++++++++++++------
 1 file changed, 32 insertions(+), 6 deletions(-)

Comments

Sergei Shtylyov May 22, 2014, 11:58 a.m. UTC | #1
Hello.

On 22-05-2014 10:29, George Cherian wrote:

> Find whether we are running on newer silicon. The babble control
> register reads 0x4 by default in newer silicon as opposed to 0
> in old versions of AM335x. Based on this enable the sw babble
> control logic.

> Signed-off-by: George Cherian <george.cherian@ti.com>
> ---
>   drivers/usb/musb/musb_dsps.c | 38 ++++++++++++++++++++++++++++++++------
>   1 file changed, 32 insertions(+), 6 deletions(-)

> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
> index 868caf8..2ced061 100644
> --- a/drivers/usb/musb/musb_dsps.c
> +++ b/drivers/usb/musb/musb_dsps.c
[...]
> @@ -469,6 +470,19 @@ static int dsps_musb_init(struct musb *musb)
>   	val &= ~(1 << wrp->otg_disable);
>   	dsps_writel(musb->ctrl_base, wrp->phy_utmi, val);
>
> +	/*
> +	 *  Check whether the dsps version has babble control enabled.

    One space too many before this sentence.

> +	 * In latest silicon revision the babble control logic is enabled.
> +	 * If MUSB_BABBLE_CTL returns 0x4 then we have the babble control
> +	 * logic enabled.
> +	 */
> +	val = dsps_readb(musb->mregs, MUSB_BABBLE_CTL);
> +	if (val == MUSB_BABBLE_RCV_DISABLE) {
> +		glue->sw_babble_enabled = true;
> +		val |= MUSB_BABBLE_SW_SESSION_CTRL;
> +		dsps_writeb(musb->mregs, MUSB_BABBLE_CTL, val);
> +	}
> +

    Hm, from the register offset that you declared in the previous patch, I 
got an impression that this is a new standard MUSB register? Shouldn't this 
check be done in the generic MUSB code then?

WBR, Sergei

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
George Cherian May 22, 2014, 12:52 p.m. UTC | #2
On 5/22/2014 5:28 PM, Sergei Shtylyov wrote:
> Hello.
>
> On 22-05-2014 10:29, George Cherian wrote:
>
>> Find whether we are running on newer silicon. The babble control
>> register reads 0x4 by default in newer silicon as opposed to 0
>> in old versions of AM335x. Based on this enable the sw babble
>> control logic.
>
>> Signed-off-by: George Cherian <george.cherian@ti.com>
>> ---
>>   drivers/usb/musb/musb_dsps.c | 38 
>> ++++++++++++++++++++++++++++++++------
>>   1 file changed, 32 insertions(+), 6 deletions(-)
>
>> diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
>> index 868caf8..2ced061 100644
>> --- a/drivers/usb/musb/musb_dsps.c
>> +++ b/drivers/usb/musb/musb_dsps.c
> [...]
>> @@ -469,6 +470,19 @@ static int dsps_musb_init(struct musb *musb)
>>       val &= ~(1 << wrp->otg_disable);
>>       dsps_writel(musb->ctrl_base, wrp->phy_utmi, val);
>>
>> +    /*
>> +     *  Check whether the dsps version has babble control enabled.
>
>    One space too many before this sentence.
>
>> +     * In latest silicon revision the babble control logic is enabled.
>> +     * If MUSB_BABBLE_CTL returns 0x4 then we have the babble control
>> +     * logic enabled.
>> +     */
>> +    val = dsps_readb(musb->mregs, MUSB_BABBLE_CTL);
>> +    if (val == MUSB_BABBLE_RCV_DISABLE) {
>> +        glue->sw_babble_enabled = true;
>> +        val |= MUSB_BABBLE_SW_SESSION_CTRL;
>> +        dsps_writeb(musb->mregs, MUSB_BABBLE_CTL, val);
>> +    }
>> +
>
>    Hm, from the register offset that you declared in the previous 
> patch, I got an impression that this is a new standard MUSB register? 
Its very AM335x MUSB specific register, not a standard one.
Unfortunately the designers put it as part of MUSB core regs.
> Shouldn't this check be done in the generic MUSB code then?
>
> WBR, Sergei
>
diff mbox

Patch

diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 868caf8..2ced061 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -136,6 +136,7 @@  struct dsps_glue {
 	const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
 	struct timer_list timer;	/* otg_workaround timer */
 	unsigned long last_timer;    /* last timer data for each instance */
+	bool sw_babble_enabled;
 
 	struct dsps_context context;
 	struct debugfs_regset32 regset;
@@ -469,6 +470,19 @@  static int dsps_musb_init(struct musb *musb)
 	val &= ~(1 << wrp->otg_disable);
 	dsps_writel(musb->ctrl_base, wrp->phy_utmi, val);
 
+	/*
+	 *  Check whether the dsps version has babble control enabled.
+	 * In latest silicon revision the babble control logic is enabled.
+	 * If MUSB_BABBLE_CTL returns 0x4 then we have the babble control
+	 * logic enabled.
+	 */
+	val = dsps_readb(musb->mregs, MUSB_BABBLE_CTL);
+	if (val == MUSB_BABBLE_RCV_DISABLE) {
+		glue->sw_babble_enabled = true;
+		val |= MUSB_BABBLE_SW_SESSION_CTRL;
+		dsps_writeb(musb->mregs, MUSB_BABBLE_CTL, val);
+	}
+
 	ret = dsps_musb_dbg_init(musb, glue);
 	if (ret)
 		return ret;
@@ -591,14 +605,26 @@  static int dsps_musb_reset(struct musb *musb)
 	struct device *dev = musb->controller;
 	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
 	const struct dsps_musb_wrapper *wrp = glue->wrp;
+	int session_restart = 0;
 
-	dsps_writel(musb->ctrl_base, wrp->control, (1 << wrp->reset));
-	usleep_range(100, 200);
-	usb_phy_shutdown(musb->xceiv);
-	usleep_range(100, 200);
-	usb_phy_init(musb->xceiv);
+	if (glue->sw_babble_enabled)
+		session_restart = sw_babble_control(musb);
+	/*
+	 * In case of new silicon version babble condition can be recovered
+	 * without resetting the MUSB. But for older silicon versions, MUSB
+	 * reset is needed
+	 */
+	if (session_restart || !glue->sw_babble_enabled) {
+		dev_info(musb->controller, "Restarting MUSB to recover from Babble\n");
+		dsps_writel(musb->ctrl_base, wrp->control, (1 << wrp->reset));
+		usleep_range(100, 200);
+		usb_phy_shutdown(musb->xceiv);
+		usleep_range(100, 200);
+		usb_phy_init(musb->xceiv);
+		session_restart = 1;
+	}
 
-	return 0;
+	return !session_restart;
 }
 
 static struct musb_platform_ops dsps_ops = {