Re: [PATCH 3/3] omap3/omap4 hsmmc: Register offset handling

2010-09-06 Thread kishore kadiyala
Hi Benoit,

On Fri, Sep 3, 2010 at 1:51 PM, kishore kadiyala
 wrote:
> Hi Benoit
>
> 
>
>>> +               while (!(omap_readl(base + reg_off)&
>>>                          MMCHS_SYSSTATUS_RESETDONE))
>>>                         cpu_relax();
>>
>> Why does that series not seems to be based on your hwmod migration? The
>> reset is fully handle by the hwmod framework now.
>
> Agree. But Kevin has  suggested to post this patch  independent of hwmod.
> Does this patch has to go in hwmod series ?
>
>>
>> BTW, when do you have to apply a reset in your case? Do you have the need
>> for an API accessible by the driver?
>> I'm asking because for the moment the framework does not expose the reset
>> API and use it only at init time.
>
> Correct , I don't need reset API access in the driver.

One correction here , in case of context restore , driver does
software reset apart from
the initial reset. So reset is required and so both the tables needs
registers SYSCONFIG and
SYSSTATUS. In which case  offset deviation of 0x100 can't be maintained.

Regards,
Kishore
>
> 
>
>>>
>>> +enum {
>>> +       OMAP_HSMMC_SYSCONFIG = 0,
>>> +       OMAP_HSMMC_SYSSTATUS,
>>> +       OMAP_HSMMC_CON,
>>> +       OMAP_HSMMC_BLK,
>>> +       OMAP_HSMMC_ARG,
>>> +       OMAP_HSMMC_CMD,
>>> +       OMAP_HSMMC_RSP10,
>>> +       OMAP_HSMMC_RSP32,
>>> +       OMAP_HSMMC_RSP54,
>>> +       OMAP_HSMMC_RSP76,
>>> +       OMAP_HSMMC_DATA,
>>> +       OMAP_HSMMC_PSTATE,
>>> +       OMAP_HSMMC_HCTL,
>>> +       OMAP_HSMMC_SYSCTL,
>>> +       OMAP_HSMMC_STAT,
>>> +       OMAP_HSMMC_IE,
>>> +       OMAP_HSMMC_ISE,
>>> +       OMAP_HSMMC_CAPA,
>>> +       OMAP_HSMMC_REV,
>>> +       OMAP_HSMMC_CUR_CAPA,
>>> +       OMAP_HSMMC_FE,
>>> +       OMAP_HSMMC_ADMA_ES,
>>> +       OMAP_HSMMC_ADMA_SAL,
>>> +};
>>> +
>>> +static const u16 omap3_mmc_reg_map[] = {
>>> +       [OMAP_HSMMC_SYSCONFIG] = 0x0010,
>>> +       [OMAP_HSMMC_SYSSTATUS] = 0x0014,
>>> +       [OMAP_HSMMC_CON] = 0x002C,
>>> +       [OMAP_HSMMC_BLK] = 0x0104,
>>> +       [OMAP_HSMMC_ARG] = 0x0108,
>>> +       [OMAP_HSMMC_CMD] = 0x010C,
>>> +       [OMAP_HSMMC_RSP10] = 0x0110,
>>> +       [OMAP_HSMMC_RSP32] = 0x0114,
>>> +       [OMAP_HSMMC_RSP54] = 0x0118,
>>> +       [OMAP_HSMMC_RSP76] = 0x011C,
>>> +       [OMAP_HSMMC_DATA] = 0x0120,
>>> +       [OMAP_HSMMC_PSTATE] = 0x0124,
>>> +       [OMAP_HSMMC_HCTL] = 0x0128,
>>> +       [OMAP_HSMMC_SYSCTL] = 0x012C,
>>> +       [OMAP_HSMMC_STAT] = 0x0130,
>>> +       [OMAP_HSMMC_IE] = 0x0134,
>>> +       [OMAP_HSMMC_ISE] = 0x0138,
>>> +       [OMAP_HSMMC_CAPA] = 0x0140,
>>> +       [OMAP_HSMMC_REV] = 0x01FC,
>>> +};
>>> +
>>> +static const u16 omap4_mmc_reg_map[] = {
>>> +       [OMAP_HSMMC_SYSCONFIG] = 0x0010,        /* Use Highlander Version
>>> */
>>> +       [OMAP_HSMMC_SYSSTATUS] = 0x0114,
>>
>> In fact that sysstatus is a legacy register that is not needed anymore in
>> the highlander version. The resetdone is in the sysconfig now.
>> So you can ignore it in OMAP4.
>
> Just verified and thanks for pointing this.
> ok will avoid checking resetdone in sysstatus for OMAP4
>
>>
>>> +       [OMAP_HSMMC_CON] = 0x012C,
>>> +       [OMAP_HSMMC_BLK] = 0x0204,
>>> +       [OMAP_HSMMC_ARG] = 0x0208,
>>> +       [OMAP_HSMMC_CMD] = 0x020C,
>>> +       [OMAP_HSMMC_RSP10] = 0x0210,
>>> +       [OMAP_HSMMC_RSP32] = 0x0214,
>>> +       [OMAP_HSMMC_RSP54] = 0x0218,
>>> +       [OMAP_HSMMC_RSP76] = 0x021C,
>>> +       [OMAP_HSMMC_DATA] = 0x0220,
>>> +       [OMAP_HSMMC_PSTATE] = 0x0224,
>>> +       [OMAP_HSMMC_HCTL] = 0x0228,
>>> +       [OMAP_HSMMC_SYSCTL] = 0x022C,
>>> +       [OMAP_HSMMC_STAT] = 0x0230,
>>> +       [OMAP_HSMMC_IE] = 0x0234,
>>> +       [OMAP_HSMMC_ISE] = 0x0238,
>>> +       [OMAP_HSMMC_CAPA] = 0x0240,
>>> +       [OMAP_HSMMC_REV] = 0x,      /* Use Highlander Version */
>>> +       [OMAP_HSMMC_CUR_CAPA] = 0x0248,
>>> +       [OMAP_HSMMC_FE] = 0x0250,
>>> +       [OMAP_HSMMC_ADMA_ES] = 0x0254,
>>> +       [OMAP_HSMMC_ADMA_SAL] = 0x0258,
>>
>> I didn't check all the registers, but it seems that there is a constant
>> 0x100 offset for most of these registers. Cannot you simplify this table?
>
> Sure will simplify and post.
>
>>
>> Regards,
>> Benoit
>>
>
> 
>
> Regards,
> Kishore
>
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/3] omap3/omap4 hsmmc: Register offset handling

2010-09-03 Thread Cousson, Benoit

On 9/3/2010 5:44 PM, Kevin Hilman wrote:

kishore kadiyala  writes:


Hi Benoit




+   while (!(omap_readl(base + reg_off)&
  MMCHS_SYSSTATUS_RESETDONE))
 cpu_relax();


Why does that series not seems to be based on your hwmod migration? The
reset is fully handle by the hwmod framework now.


Agree. But Kevin has  suggested to post this patch  independent of hwmod.
Does this patch has to go in hwmod series ?


I suggested that this register conversion patch could be merged before
the hwmod conversion as it is independent of that.


OK, I missed that part. I was surprised because the hwmod series was 
sent before that one.


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


Re: [PATCH 3/3] omap3/omap4 hsmmc: Register offset handling

2010-09-03 Thread Kevin Hilman
kishore kadiyala  writes:

> Hi Benoit
>
> 
>
>>> +               while (!(omap_readl(base + reg_off)&
>>>                          MMCHS_SYSSTATUS_RESETDONE))
>>>                         cpu_relax();
>>
>> Why does that series not seems to be based on your hwmod migration? The
>> reset is fully handle by the hwmod framework now.
>
> Agree. But Kevin has  suggested to post this patch  independent of hwmod.
> Does this patch has to go in hwmod series ?

I suggested that this register conversion patch could be merged before
the hwmod conversion as it is independent of that.

The hwmod conversion (based on this series) would then just remove the
reset from here.

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


Re: [PATCH 3/3] omap3/omap4 hsmmc: Register offset handling

2010-09-03 Thread kishore kadiyala
Hi Benoit



>> +               while (!(omap_readl(base + reg_off)&
>>                          MMCHS_SYSSTATUS_RESETDONE))
>>                         cpu_relax();
>
> Why does that series not seems to be based on your hwmod migration? The
> reset is fully handle by the hwmod framework now.

Agree. But Kevin has  suggested to post this patch  independent of hwmod.
Does this patch has to go in hwmod series ?

>
> BTW, when do you have to apply a reset in your case? Do you have the need
> for an API accessible by the driver?
> I'm asking because for the moment the framework does not expose the reset
> API and use it only at init time.

Correct , I don't need reset API access in the driver.



>>
>> +enum {
>> +       OMAP_HSMMC_SYSCONFIG = 0,
>> +       OMAP_HSMMC_SYSSTATUS,
>> +       OMAP_HSMMC_CON,
>> +       OMAP_HSMMC_BLK,
>> +       OMAP_HSMMC_ARG,
>> +       OMAP_HSMMC_CMD,
>> +       OMAP_HSMMC_RSP10,
>> +       OMAP_HSMMC_RSP32,
>> +       OMAP_HSMMC_RSP54,
>> +       OMAP_HSMMC_RSP76,
>> +       OMAP_HSMMC_DATA,
>> +       OMAP_HSMMC_PSTATE,
>> +       OMAP_HSMMC_HCTL,
>> +       OMAP_HSMMC_SYSCTL,
>> +       OMAP_HSMMC_STAT,
>> +       OMAP_HSMMC_IE,
>> +       OMAP_HSMMC_ISE,
>> +       OMAP_HSMMC_CAPA,
>> +       OMAP_HSMMC_REV,
>> +       OMAP_HSMMC_CUR_CAPA,
>> +       OMAP_HSMMC_FE,
>> +       OMAP_HSMMC_ADMA_ES,
>> +       OMAP_HSMMC_ADMA_SAL,
>> +};
>> +
>> +static const u16 omap3_mmc_reg_map[] = {
>> +       [OMAP_HSMMC_SYSCONFIG] = 0x0010,
>> +       [OMAP_HSMMC_SYSSTATUS] = 0x0014,
>> +       [OMAP_HSMMC_CON] = 0x002C,
>> +       [OMAP_HSMMC_BLK] = 0x0104,
>> +       [OMAP_HSMMC_ARG] = 0x0108,
>> +       [OMAP_HSMMC_CMD] = 0x010C,
>> +       [OMAP_HSMMC_RSP10] = 0x0110,
>> +       [OMAP_HSMMC_RSP32] = 0x0114,
>> +       [OMAP_HSMMC_RSP54] = 0x0118,
>> +       [OMAP_HSMMC_RSP76] = 0x011C,
>> +       [OMAP_HSMMC_DATA] = 0x0120,
>> +       [OMAP_HSMMC_PSTATE] = 0x0124,
>> +       [OMAP_HSMMC_HCTL] = 0x0128,
>> +       [OMAP_HSMMC_SYSCTL] = 0x012C,
>> +       [OMAP_HSMMC_STAT] = 0x0130,
>> +       [OMAP_HSMMC_IE] = 0x0134,
>> +       [OMAP_HSMMC_ISE] = 0x0138,
>> +       [OMAP_HSMMC_CAPA] = 0x0140,
>> +       [OMAP_HSMMC_REV] = 0x01FC,
>> +};
>> +
>> +static const u16 omap4_mmc_reg_map[] = {
>> +       [OMAP_HSMMC_SYSCONFIG] = 0x0010,        /* Use Highlander Version
>> */
>> +       [OMAP_HSMMC_SYSSTATUS] = 0x0114,
>
> In fact that sysstatus is a legacy register that is not needed anymore in
> the highlander version. The resetdone is in the sysconfig now.
> So you can ignore it in OMAP4.

Just verified and thanks for pointing this.
ok will avoid checking resetdone in sysstatus for OMAP4

>
>> +       [OMAP_HSMMC_CON] = 0x012C,
>> +       [OMAP_HSMMC_BLK] = 0x0204,
>> +       [OMAP_HSMMC_ARG] = 0x0208,
>> +       [OMAP_HSMMC_CMD] = 0x020C,
>> +       [OMAP_HSMMC_RSP10] = 0x0210,
>> +       [OMAP_HSMMC_RSP32] = 0x0214,
>> +       [OMAP_HSMMC_RSP54] = 0x0218,
>> +       [OMAP_HSMMC_RSP76] = 0x021C,
>> +       [OMAP_HSMMC_DATA] = 0x0220,
>> +       [OMAP_HSMMC_PSTATE] = 0x0224,
>> +       [OMAP_HSMMC_HCTL] = 0x0228,
>> +       [OMAP_HSMMC_SYSCTL] = 0x022C,
>> +       [OMAP_HSMMC_STAT] = 0x0230,
>> +       [OMAP_HSMMC_IE] = 0x0234,
>> +       [OMAP_HSMMC_ISE] = 0x0238,
>> +       [OMAP_HSMMC_CAPA] = 0x0240,
>> +       [OMAP_HSMMC_REV] = 0x,      /* Use Highlander Version */
>> +       [OMAP_HSMMC_CUR_CAPA] = 0x0248,
>> +       [OMAP_HSMMC_FE] = 0x0250,
>> +       [OMAP_HSMMC_ADMA_ES] = 0x0254,
>> +       [OMAP_HSMMC_ADMA_SAL] = 0x0258,
>
> I didn't check all the registers, but it seems that there is a constant
> 0x100 offset for most of these registers. Cannot you simplify this table?

Sure will simplify and post.

>
> Regards,
> Benoit
>



Regards,
Kishore
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/3] omap3/omap4 hsmmc: Register offset handling

2010-09-03 Thread Cousson, Benoit

Hi Kishore,

On 8/30/2010 7:48 PM, Kadiyala, Kishore wrote:

OMAP4 not only have newly added hsmmc registers but also
have registers which were there in OMAP3 and which doesn't
have a common offset deviation compared to OMAP3.

For generic handling, OMAP3 and OMAP4 has different array's of
register offset maintained and right one is choosen during run time.

Cc: Tony Lindgren
Cc: Adrian Hunter
Cc: Madhusudhan Chikkature
Cc: Andrew Morton
Signed-off-by: Kishore Kadiyala
---
  arch/arm/mach-omap2/devices.c |   30 +++--
  arch/arm/mach-omap2/hsmmc.c   |6 +
  arch/arm/plat-omap/include/plat/mmc.h |   78 ++-
  drivers/mmc/host/omap_hsmmc.c |  251 +++--
  4 files changed, 218 insertions(+), 147 deletions(-)

diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 2dbb265..03add6e 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -506,6 +506,8 @@ static inline void omap_init_sham(void) { }
  #define MMCHS_SYSCONFIG_SWRESET(1<<  1)
  #define MMCHS_SYSSTATUS0x0014
  #define MMCHS_SYSSTATUS_RESETDONE  (1<<  0)
+#define OMAP4_MMCHS_SYSCONFIG_SWRESET  (1<<  0)
+#define OMAP4_MMCHS_OFFSET 0x100

  static struct platform_device dummy_pdev = {
 .dev = {
@@ -528,6 +530,8 @@ static struct platform_device dummy_pdev = {
  static void __init omap_hsmmc_reset(void)
  {
 u32 i, nr_controllers;
+   u32 reg_val = 0;
+   u32 reg_off = 0;

 if (cpu_is_omap242x())
 return;
@@ -562,9 +566,6 @@ static void __init omap_hsmmc_reset(void)
 break;
 }

-   if (cpu_is_omap44xx())
-   base += OMAP4_MMC_REG_OFFSET;
-
 dummy_pdev.id = i;
 dev_set_name(&dummy_pdev.dev, "mmci-omap-hs.%d", i);
 iclk = clk_get(dev, "ick");
@@ -582,9 +583,18 @@ static void __init omap_hsmmc_reset(void)
 break;
 }

-   omap_writel(MMCHS_SYSCONFIG_SWRESET, base + MMCHS_SYSCONFIG);
-   v = omap_readl(base + MMCHS_SYSSTATUS);
-   while (!(omap_readl(base + MMCHS_SYSSTATUS)&
+   if (cpu_is_omap44xx())
+   reg_val = MMCHS_SYSCONFIG_SWRESET;
+   else
+   reg_val = MMCHS_SYSCONFIG_SWRESET;
+   omap_writel(reg_val, base + MMCHS_SYSCONFIG);
+
+   reg_off = MMCHS_SYSSTATUS;
+   if (cpu_is_omap44xx())
+   reg_off += OMAP4_MMCHS_OFFSET;
+   v = omap_readl(base + reg_off);
+
+   while (!(omap_readl(base + reg_off)&
  MMCHS_SYSSTATUS_RESETDONE))
 cpu_relax();


Why does that series not seems to be based on your hwmod migration? The 
reset is fully handle by the hwmod framework now.


BTW, when do you have to apply a reset in your case? Do you have the 
need for an API accessible by the driver?
I'm asking because for the moment the framework does not expose the 
reset API and use it only at init time.



@@ -745,13 +755,13 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data 
**mmc_data,
 case 3:
 if (!cpu_is_omap44xx())
 return;
-   base = OMAP4_MMC4_BASE + OMAP4_MMC_REG_OFFSET;
+   base = OMAP4_MMC4_BASE;
 irq = OMAP44XX_IRQ_MMC4;
 break;
 case 4:
 if (!cpu_is_omap44xx())
 return;
-   base = OMAP4_MMC5_BASE + OMAP4_MMC_REG_OFFSET;
+   base = OMAP4_MMC5_BASE;
 irq = OMAP44XX_IRQ_MMC5;
 break;
 default:
@@ -762,10 +772,8 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data 
**mmc_data,
 size = OMAP2420_MMC_SIZE;
 name = "mmci-omap";
 } else if (cpu_is_omap44xx()) {
-   if (i<  3) {
-   base += OMAP4_MMC_REG_OFFSET;
+   if (i<  3)
 irq += OMAP44XX_IRQ_GIC_START;
-   }
 size = OMAP4_HSMMC_SIZE;
 namee = "mmci-omap-hs";
 } else {
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index c8f647b..d93b704 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -262,6 +262,12 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info 
*controllers)
 mmc->slots[0].internal_clock = !c->ext_clock;
 mmc->dma_mask = 0x;

+   /* Register offset Mapping */
+   if (cpu_is_omap44xx())
+

Re: [PATCH 3/3] omap3/omap4 hsmmc: Register offset handling

2010-09-01 Thread kishore kadiyala
On Wed, Sep 1, 2010 at 5:56 PM, Adrian Hunter  wrote:
> kishore kadiyala wrote:
>>
>> OMAP4 not only have newly added hsmmc registers but also
>> have registers which were there in OMAP3 and which doesn't
>> have a common offset deviation compared to OMAP3.
>>
>> For generic handling, OMAP3 and OMAP4 has different array's of
>> register offset maintained and right one is choosen during run time.
>>
>> Cc: Tony Lindgren 
>> Cc: Adrian Hunter 
>> Cc: Madhusudhan Chikkature 
>> Cc: Andrew Morton 
>> Signed-off-by: Kishore Kadiyala 
>> ---
>>  arch/arm/mach-omap2/devices.c         |   30 +++--
>>  arch/arm/mach-omap2/hsmmc.c           |    6 +
>>  arch/arm/plat-omap/include/plat/mmc.h |   78 ++-
>>  drivers/mmc/host/omap_hsmmc.c         |  251
>> +++--
>>  4 files changed, 218 insertions(+), 147 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
>> index 2dbb265..03add6e 100644
>> --- a/arch/arm/mach-omap2/devices.c
>> +++ b/arch/arm/mach-omap2/devices.c
>> @@ -506,6 +506,8 @@ static inline void omap_init_sham(void) { }
>>  #define MMCHS_SYSCONFIG_SWRESET                (1 << 1)
>>  #define MMCHS_SYSSTATUS                        0x0014
>>  #define MMCHS_SYSSTATUS_RESETDONE      (1 << 0)
>> +#define OMAP4_MMCHS_SYSCONFIG_SWRESET  (1 << 0)
>> +#define OMAP4_MMCHS_OFFSET             0x100
>>
>>  static struct platform_device dummy_pdev = {
>>        .dev = {
>> @@ -528,6 +530,8 @@ static struct platform_device dummy_pdev = {
>>  static void __init omap_hsmmc_reset(void)
>>  {
>>        u32 i, nr_controllers;
>> +       u32 reg_val = 0;
>> +       u32 reg_off = 0;
>>
>>        if (cpu_is_omap242x())
>>                return;
>> @@ -562,9 +566,6 @@ static void __init omap_hsmmc_reset(void)
>>                        break;
>>                }
>>
>> -               if (cpu_is_omap44xx())
>> -                       base += OMAP4_MMC_REG_OFFSET;
>> -
>>                dummy_pdev.id = i;
>>                dev_set_name(&dummy_pdev.dev, "mmci-omap-hs.%d", i);
>>                iclk = clk_get(dev, "ick");
>> @@ -582,9 +583,18 @@ static void __init omap_hsmmc_reset(void)
>>                        break;
>>                }
>>
>> -               omap_writel(MMCHS_SYSCONFIG_SWRESET, base +
>> MMCHS_SYSCONFIG);
>> -               v = omap_readl(base + MMCHS_SYSSTATUS);
>> -               while (!(omap_readl(base + MMCHS_SYSSTATUS) &
>> +               if (cpu_is_omap44xx())
>> +                       reg_val = MMCHS_SYSCONFIG_SWRESET;
>
> Should this be OMAP4_MMCHS_SYSCONFIG_SWRESET?

Yes, it should be as mentioned [Late night post's take's away quality :) ] ,
will correct it and repost .



Thanks,
Kishore
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/3] omap3/omap4 hsmmc: Register offset handling

2010-09-01 Thread Adrian Hunter

kishore kadiyala wrote:

OMAP4 not only have newly added hsmmc registers but also
have registers which were there in OMAP3 and which doesn't
have a common offset deviation compared to OMAP3.

For generic handling, OMAP3 and OMAP4 has different array's of
register offset maintained and right one is choosen during run time.

Cc: Tony Lindgren 
Cc: Adrian Hunter 
Cc: Madhusudhan Chikkature 
Cc: Andrew Morton 
Signed-off-by: Kishore Kadiyala 
---
 arch/arm/mach-omap2/devices.c |   30 +++--
 arch/arm/mach-omap2/hsmmc.c   |6 +
 arch/arm/plat-omap/include/plat/mmc.h |   78 ++-
 drivers/mmc/host/omap_hsmmc.c |  251 +++--
 4 files changed, 218 insertions(+), 147 deletions(-)

diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 2dbb265..03add6e 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -506,6 +506,8 @@ static inline void omap_init_sham(void) { }
 #define MMCHS_SYSCONFIG_SWRESET(1 << 1)
 #define MMCHS_SYSSTATUS0x0014
 #define MMCHS_SYSSTATUS_RESETDONE  (1 << 0)
+#define OMAP4_MMCHS_SYSCONFIG_SWRESET  (1 << 0)
+#define OMAP4_MMCHS_OFFSET 0x100

 static struct platform_device dummy_pdev = {
.dev = {
@@ -528,6 +530,8 @@ static struct platform_device dummy_pdev = {
 static void __init omap_hsmmc_reset(void)
 {
u32 i, nr_controllers;
+   u32 reg_val = 0;
+   u32 reg_off = 0;

if (cpu_is_omap242x())
return;
@@ -562,9 +566,6 @@ static void __init omap_hsmmc_reset(void)
break;
}

-   if (cpu_is_omap44xx())
-   base += OMAP4_MMC_REG_OFFSET;
-
dummy_pdev.id = i;
dev_set_name(&dummy_pdev.dev, "mmci-omap-hs.%d", i);
iclk = clk_get(dev, "ick");
@@ -582,9 +583,18 @@ static void __init omap_hsmmc_reset(void)
break;
}

-   omap_writel(MMCHS_SYSCONFIG_SWRESET, base + MMCHS_SYSCONFIG);
-   v = omap_readl(base + MMCHS_SYSSTATUS);
-   while (!(omap_readl(base + MMCHS_SYSSTATUS) &
+   if (cpu_is_omap44xx())
+   reg_val = MMCHS_SYSCONFIG_SWRESET;


Should this be OMAP4_MMCHS_SYSCONFIG_SWRESET?



+   else
+   reg_val = MMCHS_SYSCONFIG_SWRESET;
+   omap_writel(reg_val, base + MMCHS_SYSCONFIG);
+
+   reg_off = MMCHS_SYSSTATUS;
+   if (cpu_is_omap44xx())
+   reg_off += OMAP4_MMCHS_OFFSET;
+   v = omap_readl(base + reg_off);
+
+   while (!(omap_readl(base + reg_off) &
 MMCHS_SYSSTATUS_RESETDONE))
cpu_relax();

@@ -745,13 +755,13 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data 
**mmc_data,
case 3:
if (!cpu_is_omap44xx())
return;
-   base = OMAP4_MMC4_BASE + OMAP4_MMC_REG_OFFSET;
+   base = OMAP4_MMC4_BASE;
irq = OMAP44XX_IRQ_MMC4;
break;
case 4:
if (!cpu_is_omap44xx())
return;
-   base = OMAP4_MMC5_BASE + OMAP4_MMC_REG_OFFSET;
+   base = OMAP4_MMC5_BASE;
irq = OMAP44XX_IRQ_MMC5;
break;
default:
@@ -762,10 +772,8 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data 
**mmc_data,
size = OMAP2420_MMC_SIZE;
name = "mmci-omap";
} else if (cpu_is_omap44xx()) {
-   if (i < 3) {
-   base += OMAP4_MMC_REG_OFFSET;
+   if (i < 3)
irq += OMAP44XX_IRQ_GIC_START;
-   }
size = OMAP4_HSMMC_SIZE;
name = "mmci-omap-hs";
} else {
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index c8f647b..d93b704 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -262,6 +262,12 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info 
*controllers)
mmc->slots[0].internal_clock = !c->ext_clock;
mmc->dma_mask = 0x;

+   /* Register offset Mapping */
+   if (cpu_is_omap44xx())
+   mmc->regs_map = (u16 *) omap4_mmc_reg_map;
+   else
+   mmc->regs_map = (u16 *) omap3_mmc_reg_map;
+
mmc->get_context_loss_count = hsmmc_get_context_loss;

mmc->slots[0].switch_pin = c->gpio_cd;
diff --git a/arch/arm/plat-omap/include/plat/mmc.h 
b/arch/arm/plat-omap/include/plat/mmc.h
index 9b89ec6..a85f