Patchwork [U-Boot] mmc:fix: Set mmc width according to MMC host capabilities

login
register
mail settings
Submitter Łukasz Majewski
Date March 13, 2012, 8:07 a.m.
Message ID <1331626038-20893-1-git-send-email-l.majewski@samsung.com>
Download mbox | patch
Permalink /patch/146359/
State Accepted
Commit 62722036410b7887a04cf6705effb3122fb9b549
Delegated to: Andy Fleming
Headers show

Comments

Łukasz Majewski - March 13, 2012, 8:07 a.m.
This patch sets the MMC width according to the MMC host capabilities.
It turned out, that there are some targets (e.g. GONI), which are able
to read data from SPI only at 4 bit mode.
This patch restricts the width number according to the MMC host.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Andy Fleming <afleming@gmail.com>
---
 drivers/mmc/mmc.c |    4 +++-
 include/mmc.h     |    3 +++
 2 files changed, 6 insertions(+), 1 deletions(-)
Łukasz Majewski - March 26, 2012, 1:22 p.m.
Hi Andy,

> This patch sets the MMC width according to the MMC host capabilities.
> It turned out, that there are some targets (e.g. GONI), which are able
> to read data from SPI only at 4 bit mode.
> This patch restricts the width number according to the MMC host.
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> Cc: Andy Fleming <afleming@gmail.com>
> ---
>  drivers/mmc/mmc.c |    4 +++-
>  include/mmc.h     |    3 +++
>  2 files changed, 6 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 49c3349..51c0106 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -1103,7 +1103,9 @@ int mmc_startup(struct mmc *mmc)
>  		else
>  			mmc_set_clock(mmc, 25000000);
>  	} else {
> -		for (width = EXT_CSD_BUS_WIDTH_8; width >= 0;
> width--) {
> +		width = ((mmc->host_caps & MMC_MODE_MASK_WIDTH_BITS)
> >>
> +			 MMC_MODE_WIDTH_BITS_SHIFT);
> +		for (; width >= 0; width--) {
>  			/* Set the card to use 4 bit*/
>  			err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
>  					EXT_CSD_BUS_WIDTH, width);
> diff --git a/include/mmc.h b/include/mmc.h
> index 30c2375..ff2f28e 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -47,6 +47,9 @@
>  #define MMC_MODE_SPI		0x400
>  #define MMC_MODE_HC		0x800
>  
> +#define MMC_MODE_MASK_WIDTH_BITS (MMC_MODE_4BIT | MMC_MODE_8BIT)
> +#define MMC_MODE_WIDTH_BITS_SHIFT 8
> +
>  #define SD_DATA_4BIT	0x00040000
>  
>  #define IS_SD(x) (x->version & SD_VERSION_SD)

Do you have any opinions/comments about this patch?
It has already spent some time on the mainling list and nobody
complaint :-)
Łukasz Majewski - April 2, 2012, 3:10 p.m.
Hi Andy,

> Hi Andy,
> 
> > This patch sets the MMC width according to the MMC host
> > capabilities. It turned out, that there are some targets (e.g.
> > GONI), which are able to read data from SPI only at 4 bit mode.
> > This patch restricts the width number according to the MMC host.
> > 
> > Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> > Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> > Cc: Andy Fleming <afleming@gmail.com>
> > ---
> >  drivers/mmc/mmc.c |    4 +++-
> >  include/mmc.h     |    3 +++
> >  2 files changed, 6 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> > index 49c3349..51c0106 100644
> > --- a/drivers/mmc/mmc.c
> > +++ b/drivers/mmc/mmc.c
> > @@ -1103,7 +1103,9 @@ int mmc_startup(struct mmc *mmc)
> >  		else
> >  			mmc_set_clock(mmc, 25000000);
> >  	} else {
> > -		for (width = EXT_CSD_BUS_WIDTH_8; width >= 0;
> > width--) {
> > +		width = ((mmc->host_caps &
> > MMC_MODE_MASK_WIDTH_BITS)
> > >>
> > +			 MMC_MODE_WIDTH_BITS_SHIFT);
> > +		for (; width >= 0; width--) {
> >  			/* Set the card to use 4 bit*/
> >  			err = mmc_switch(mmc,
> > EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, width);
> > diff --git a/include/mmc.h b/include/mmc.h
> > index 30c2375..ff2f28e 100644
> > --- a/include/mmc.h
> > +++ b/include/mmc.h
> > @@ -47,6 +47,9 @@
> >  #define MMC_MODE_SPI		0x400
> >  #define MMC_MODE_HC		0x800
> >  
> > +#define MMC_MODE_MASK_WIDTH_BITS (MMC_MODE_4BIT | MMC_MODE_8BIT)
> > +#define MMC_MODE_WIDTH_BITS_SHIFT 8
> > +
> >  #define SD_DATA_4BIT	0x00040000
> >  
> >  #define IS_SD(x) (x->version & SD_VERSION_SD)
> 
> Do you have any opinions/comments about this patch?
> It has already spent some time on the mainling list and nobody
> complaint :-)
> 

Do you have any questions about this patch?

Patch

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 49c3349..51c0106 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1103,7 +1103,9 @@  int mmc_startup(struct mmc *mmc)
 		else
 			mmc_set_clock(mmc, 25000000);
 	} else {
-		for (width = EXT_CSD_BUS_WIDTH_8; width >= 0; width--) {
+		width = ((mmc->host_caps & MMC_MODE_MASK_WIDTH_BITS) >>
+			 MMC_MODE_WIDTH_BITS_SHIFT);
+		for (; width >= 0; width--) {
 			/* Set the card to use 4 bit*/
 			err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
 					EXT_CSD_BUS_WIDTH, width);
diff --git a/include/mmc.h b/include/mmc.h
index 30c2375..ff2f28e 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -47,6 +47,9 @@ 
 #define MMC_MODE_SPI		0x400
 #define MMC_MODE_HC		0x800
 
+#define MMC_MODE_MASK_WIDTH_BITS (MMC_MODE_4BIT | MMC_MODE_8BIT)
+#define MMC_MODE_WIDTH_BITS_SHIFT 8
+
 #define SD_DATA_4BIT	0x00040000
 
 #define IS_SD(x) (x->version & SD_VERSION_SD)