On Monday 16 January 2012 08:23 PM, [email protected] wrote:
> ext Shubhrajyoti wrote on 2012-01-16:
>> On Monday 16 January 2012 06:41 PM, [email protected] wrote:
>>> ext Shubhrajyoti D wrote on 2012-01-16:
>>>> The commit 11dd62:[omap_hsmmc: context save/restore support]
>>>>
>>>> does a reset and restores AUTOIDLE settings.
>>>> This patch saves the register does a reset and restores
>>>> the same configuration.
>>> ...
>>>>    if (pdata->get_context_loss_count) {
>>>> @@ -700,6 +700,7 @@ static int omap_hsmmc_context_restore(struct
>>>> omap_hsmmc_host *host)
>>>>            && time_before(jiffies, timeout))               ; +     sysc =
>>>>  OMAP_HSMMC_READ(host->base, SYSCONFIG);   /* Do software reset */
>>>>    OMAP_HSMMC_WRITE(host->base, SYSCONFIG, SOFTRESET);     timeout =
>>>>  jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS);
>>>> @@ -707,8 +708,7 @@ static int omap_hsmmc_context_restore(struct
>>>> omap_hsmmc_host *host)
>>>>            && time_before(jiffies, timeout))
>>>>            ;
>>>> -  OMAP_HSMMC_WRITE(host->base, SYSCONFIG,
>>>> -                  OMAP_HSMMC_READ(host->base, SYSCONFIG) | AUTOIDLE);
>>>> +  OMAP_HSMMC_WRITE(host->base, SYSCONFIG, sysc);
>>> The meaning of the code is to restore the register context after it was lost
>> during transition into low power consumption state. SW reset is needed to 
>> bring
>> all the registers in a consistent state before reconfiguring some of them.
>> Agreed thanks.
>>> Saving and restoring the SYSCONFIG register across SW reset is not needed.
>>>
>>> Also re-configuring AUTOIDLE feature is not necessary since SYSCONFIG reset
>> value has is 1 already, according to TRM. I guess it was done to make things
>> more explicit.
>> However in addition to autoidle there are other bits in the register
>> like the sidle mode , enable wakeup which will get not get overwritten now.
>>
>> Do you agree?
> No, there's no need to do that - after SW reset the registers have predefined 
> reset values; the reset value is correct in case of SYSCONFIG register for 
> most of omap3|4 boards based, doesn't need any update after SW reset.
>
> If in case of your board the reset value of SYSCONFIG register is not what 
> you want - you still cannot rely on the contents of the SYSCONFIG register 
> once the context was lost, i.e. saving its value before SW reset doesn't 
> help. 
> You would need to initialize it to the proper value after the SW reset 
> manually, probably the same value that you used during initialization.

if you check the following code
arch/arm/mach-omap2/omap_hwmod_44xx_data.c

/*
 * 'mmc' class
 * multimedia card high-speed/sd/sdio (mmc/sd/sdio) host controller
 */

static struct omap_hwmod_class_sysconfig omap44xx_mmc_sysc = {
        .rev_offs       = 0x0000,
        .sysc_offs      = 0x0010,
        .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
                           SYSC_HAS_RESET_STATUS | SYSC_HAS_SIDLEMODE |
                           SYSC_HAS_SOFTRESET),
        .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
                           SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
                           MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
        .sysc_fields    = &omap_hwmod_sysc_type2,

<>
arch/arm/mach-omap2/omap_hwmod.c

 * upon error or 0 upon success.
 */
static int _enable_wakeup(struct omap_hwmod *oh, u32 *v)
{
        if (!oh->class->sysc ||
            !((oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP) ||
              (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP) ||
              (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)))
                return -EINVAL;

        if (!oh->class->sysc->sysc_fields) {
                WARN(1, "omap_hwmod: %s: offset struct for sysconfig not
provided in class\n", oh->name);
                return -EINVAL;
        }

        if (oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP)
                *v |= 0x1 << oh->class->sysc->sysc_fields->enwkup_shift;

        if (oh->class->sysc->idlemodes & SIDLE_SMART_WKUP)
                _set_slave_idlemode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);
        if (oh->class->sysc->idlemodes & MSTANDBY_SMART_WKUP)
                _set_master_standbymode(oh, HWMOD_IDLEMODE_SMART_WKUP, v);

however, I agree we could use hwmod framework to reset.


> Denis

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to