Patchwork [1/3,v2] sdhci: Add auto CMD12 support for eSDHC driver

login
register
mail settings
Submitter Zang Roy-R61911
Date Aug. 3, 2010, 3:11 a.m.
Message ID <1280805072-26112-1-git-send-email-tie-fei.zang@freescale.com>
Download mbox | patch
Permalink /patch/60717/
State Accepted, archived
Delegated to: Kumar Gala
Headers show

Comments

Zang Roy-R61911 - Aug. 3, 2010, 3:11 a.m.
From: Jerry Huang <Chang-Ming.Huang@freescale.com>

Add auto CMD12 command support for eSDHC driver.
This is needed by P4080 and P1022 for block read/write.
Manual asynchronous CMD12 abort operation causes protocol violations on
these silicons.

Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
---
 drivers/mmc/host/sdhci-of-core.c |    4 ++++
 drivers/mmc/host/sdhci.c         |   14 ++++++++++++--
 drivers/mmc/host/sdhci.h         |    2 ++
 3 files changed, 18 insertions(+), 2 deletions(-)
Andrew Morton - Aug. 3, 2010, 11:43 p.m.
On Tue, 3 Aug 2010 11:11:10 +0800
Roy Zang <tie-fei.zang@freescale.com> wrote:

> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -240,6 +240,8 @@ struct sdhci_host {
>  #define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN		(1<<25)
>  /* Controller cannot support End Attribute in NOP ADMA descriptor */
>  #define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC		(1<<26)
> +/* Controller uses Auto CMD12 command to stop the transfer */
> +#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12		(1<<27)

This becomes 1<<29 in my tree.

We're about to run out.  What happens then?
Zang Roy-R61911 - Aug. 4, 2010, 2:57 a.m.
> -----Original Message-----
> From: Andrew Morton [mailto:akpm@linux-foundation.org] 
> Sent: Wednesday, August 04, 2010 7:44 AM
> To: Zang Roy-R61911
> Cc: linux-mmc@vger.kernel.org; linuxppc-dev@ozlabs.org
> Subject: Re: [PATCH 1/3 v2] sdhci: Add auto CMD12 support for 
> eSDHC driver
> 
> On Tue, 3 Aug 2010 11:11:10 +0800
> Roy Zang <tie-fei.zang@freescale.com> wrote:
> 
> > --- a/drivers/mmc/host/sdhci.h
> > +++ b/drivers/mmc/host/sdhci.h
> > @@ -240,6 +240,8 @@ struct sdhci_host {
> >  #define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN		(1<<25)
> >  /* Controller cannot support End Attribute in NOP ADMA 
> descriptor */
> >  #define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC		(1<<26)
> > +/* Controller uses Auto CMD12 command to stop the transfer */
> > +#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12		(1<<27)
> 
> This becomes 1<<29 in my tree.
It also works.
> 
> We're about to run out.  
:-(
>What happens then?
Rewrite the code to extend some bits, I suppose.
Roy
Grant Likely - Aug. 5, 2010, 1:02 a.m.
On Mon, Aug 2, 2010 at 9:11 PM, Roy Zang <tie-fei.zang@freescale.com> wrote:
> From: Jerry Huang <Chang-Ming.Huang@freescale.com>
>
> Add auto CMD12 command support for eSDHC driver.
> This is needed by P4080 and P1022 for block read/write.
> Manual asynchronous CMD12 abort operation causes protocol violations on
> these silicons.
>
> Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
> Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> ---
>  drivers/mmc/host/sdhci-of-core.c |    4 ++++
>  drivers/mmc/host/sdhci.c         |   14 ++++++++++++--
>  drivers/mmc/host/sdhci.h         |    2 ++
>  3 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index c6d1bd8..a92566e 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -817,8 +817,12 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
>        WARN_ON(!host->data);
>
>        mode = SDHCI_TRNS_BLK_CNT_EN;
> -       if (data->blocks > 1)
> -               mode |= SDHCI_TRNS_MULTI;
> +       if (data->blocks > 1) {
> +               if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> +                       mode |= SDHCI_TRNS_MULTI | SDHCI_TRNS_ACMD12;
> +               else
> +                       mode |= SDHCI_TRNS_MULTI;

nit:
+               mode |= SDHCI_TRNS_MULTI;
+               if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
+                       mode |= SDHCI_TRNS_ACMD12;

Clearer, no?

> +       }
>        if (data->flags & MMC_DATA_READ)
>                mode |= SDHCI_TRNS_READ;
>        if (host->flags & SDHCI_REQ_USE_DMA)
Zang Roy-R61911 - Aug. 5, 2010, 2:14 a.m.
> -----Original Message-----
> From: glikely@secretlab.ca [mailto:glikely@secretlab.ca] On 
> Behalf Of Grant Likely
> Sent: Thursday, August 05, 2010 9:03 AM
> To: Zang Roy-R61911
> Cc: linux-mmc@vger.kernel.org; linuxppc-dev@ozlabs.org; 
> akpm@linux-foundation.org
> Subject: Re: [PATCH 1/3 v2] sdhci: Add auto CMD12 support for 
> eSDHC driver
> 
> On Mon, Aug 2, 2010 at 9:11 PM, Roy Zang 
> <tie-fei.zang@freescale.com> wrote:
> > From: Jerry Huang <Chang-Ming.Huang@freescale.com>
> >
> > Add auto CMD12 command support for eSDHC driver.
> > This is needed by P4080 and P1022 for block read/write.
> > Manual asynchronous CMD12 abort operation causes protocol 
> violations on
> > these silicons.
> >
> > Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
> > Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> > ---
> >  drivers/mmc/host/sdhci-of-core.c |    4 ++++
> >  drivers/mmc/host/sdhci.c         |   14 ++++++++++++--
> >  drivers/mmc/host/sdhci.h         |    2 ++
> >  3 files changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> > index c6d1bd8..a92566e 100644
> > --- a/drivers/mmc/host/sdhci.c
> > +++ b/drivers/mmc/host/sdhci.c
> > @@ -817,8 +817,12 @@ static void 
> sdhci_set_transfer_mode(struct sdhci_host *host,
> >        WARN_ON(!host->data);
> >
> >        mode = SDHCI_TRNS_BLK_CNT_EN;
> > -       if (data->blocks > 1)
> > -               mode |= SDHCI_TRNS_MULTI;
> > +       if (data->blocks > 1) {
> > +               if (host->quirks & 
> SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> > +                       mode |= SDHCI_TRNS_MULTI | 
> SDHCI_TRNS_ACMD12;
> > +               else
> > +                       mode |= SDHCI_TRNS_MULTI;
> 
> nit:
> +               mode |= SDHCI_TRNS_MULTI;
> +               if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> +                       mode |= SDHCI_TRNS_ACMD12;
> 
> Clearer, no?
why?
Roy
Grant Likely - Aug. 9, 2010, 5:50 a.m.
On Wed, Aug 4, 2010 at 8:14 PM, Zang Roy-R61911 <r61911@freescale.com> wrote:
>> > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>> > index c6d1bd8..a92566e 100644
>> > --- a/drivers/mmc/host/sdhci.c
>> > +++ b/drivers/mmc/host/sdhci.c
>> > @@ -817,8 +817,12 @@ static void
>> sdhci_set_transfer_mode(struct sdhci_host *host,
>> >        WARN_ON(!host->data);
>> >
>> >        mode = SDHCI_TRNS_BLK_CNT_EN;
>> > -       if (data->blocks > 1)
>> > -               mode |= SDHCI_TRNS_MULTI;
>> > +       if (data->blocks > 1) {
>> > +               if (host->quirks &
>> SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
>> > +                       mode |= SDHCI_TRNS_MULTI |
>> SDHCI_TRNS_ACMD12;
>> > +               else
>> > +                       mode |= SDHCI_TRNS_MULTI;
>>
>> nit:
>> +               mode |= SDHCI_TRNS_MULTI;
>> +               if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
>> +                       mode |= SDHCI_TRNS_ACMD12;
>>
>> Clearer, no?
> why?

Shorter lines, fewer lines, and the SDHCI_TRNS_MULTI is more obviously
unconditional.  But as I said, it is a nitpick.

g.
Anton Vorontsov - Aug. 9, 2010, 5:43 p.m.
On Wed, Aug 04, 2010 at 07:02:56PM -0600, Grant Likely wrote:
> On Mon, Aug 2, 2010 at 9:11 PM, Roy Zang <tie-fei.zang@freescale.com> wrote:
> > From: Jerry Huang <Chang-Ming.Huang@freescale.com>
> >
> > Add auto CMD12 command support for eSDHC driver.
> > This is needed by P4080 and P1022 for block read/write.
> > Manual asynchronous CMD12 abort operation causes protocol violations on
> > these silicons.
> >
> > Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
> > Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> > ---
> >  drivers/mmc/host/sdhci-of-core.c |    4 ++++
> >  drivers/mmc/host/sdhci.c         |   14 ++++++++++++--
> >  drivers/mmc/host/sdhci.h         |    2 ++
> >  3 files changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> > index c6d1bd8..a92566e 100644
> > --- a/drivers/mmc/host/sdhci.c
> > +++ b/drivers/mmc/host/sdhci.c
> > @@ -817,8 +817,12 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
> >        WARN_ON(!host->data);
> >
> >        mode = SDHCI_TRNS_BLK_CNT_EN;
> > -       if (data->blocks > 1)
> > -               mode |= SDHCI_TRNS_MULTI;
> > +       if (data->blocks > 1) {
> > +               if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> > +                       mode |= SDHCI_TRNS_MULTI | SDHCI_TRNS_ACMD12;
> > +               else
> > +                       mode |= SDHCI_TRNS_MULTI;
> 
> nit:
> +               mode |= SDHCI_TRNS_MULTI;
> +               if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> +                       mode |= SDHCI_TRNS_ACMD12;
> 
> Clearer, no?

Much clearer. I would prefer the nit incorporated.

Another nit:

> @@ -154,6 +154,10 @@ static int __devinit sdhci_of_probe(struct of_device *ofdev,
>                 host->ops = &sdhci_of_data->ops;
>         }
> 
> +       if (of_get_property(np, "sdhci,auto-cmd12", NULL))
> +               host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;
> +
> +      

^^ No need for the two empty lines.

>        if (of_get_property(np, "sdhci,1-bit-only", NULL))

Though, technically the patch looks OK, feel free to add my

  Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>

on the next resend (if any).

Thanks Roy!
=?ISO-8859-2?Q?Micha=B3_Miros=B3aw?= - Aug. 9, 2010, 6:24 p.m.
2010/8/3 Roy Zang <tie-fei.zang@freescale.com>:
[...]
> @@ -240,6 +240,8 @@ struct sdhci_host {
>  #define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN              (1<<25)
>  /* Controller cannot support End Attribute in NOP ADMA descriptor */
>  #define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC              (1<<26)
> +/* Controller uses Auto CMD12 command to stop the transfer */
> +#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12             (1<<27)
>
>        int                     irq;            /* Device IRQ */
>        void __iomem *          ioaddr;         /* Mapped address */

Just a cosmetic hint: I suggest SDHCI_QUIRK_MULTIBLOCK_READ_AUTO_CMD12
or something for the quirk name, because ACMD12 part might be confused
with MMC/SD App CMD 12 (CMD55+CMD12 combo) if/whenever that gets used.

Best Regards,
Michał Mirosław
Zang Roy-R61911 - Aug. 10, 2010, 9:47 a.m.
> -----Original Message-----
> From: glikely@secretlab.ca [mailto:glikely@secretlab.ca] On 
> Behalf Of Grant Likely
> Sent: Thursday, August 05, 2010 9:03 AM
> To: Zang Roy-R61911
> Cc: linux-mmc@vger.kernel.org; linuxppc-dev@ozlabs.org; 
> akpm@linux-foundation.org
> Subject: Re: [PATCH 1/3 v2] sdhci: Add auto CMD12 support for 
> eSDHC driver
> 
> On Mon, Aug 2, 2010 at 9:11 PM, Roy Zang 
> <tie-fei.zang@freescale.com> wrote:
> > From: Jerry Huang <Chang-Ming.Huang@freescale.com>
> >
> > Add auto CMD12 command support for eSDHC driver.
> > This is needed by P4080 and P1022 for block read/write.
> > Manual asynchronous CMD12 abort operation causes protocol 
> violations on
> > these silicons.
> >
> > Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
> > Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> > ---
> >  drivers/mmc/host/sdhci-of-core.c |    4 ++++
> >  drivers/mmc/host/sdhci.c         |   14 ++++++++++++--
> >  drivers/mmc/host/sdhci.h         |    2 ++
> >  3 files changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> > index c6d1bd8..a92566e 100644
> > --- a/drivers/mmc/host/sdhci.c
> > +++ b/drivers/mmc/host/sdhci.c
> > @@ -817,8 +817,12 @@ static void 
> sdhci_set_transfer_mode(struct sdhci_host *host,
> >        WARN_ON(!host->data);
> >
> >        mode = SDHCI_TRNS_BLK_CNT_EN;
> > -       if (data->blocks > 1)
> > -               mode |= SDHCI_TRNS_MULTI;
> > +       if (data->blocks > 1) {
> > +               if (host->quirks & 
> SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> > +                       mode |= SDHCI_TRNS_MULTI | 
> SDHCI_TRNS_ACMD12;
> > +               else
> > +                       mode |= SDHCI_TRNS_MULTI;
> 
> nit:
> +               mode |= SDHCI_TRNS_MULTI;
> +               if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> +                       mode |= SDHCI_TRNS_ACMD12;
> 
> Clearer, no?
It is clear.
Thanks.
Roy
Zang Roy-R61911 - Aug. 10, 2010, 10:04 a.m.
> -----Original Message-----
> From: Anton Vorontsov [mailto:cbouatmailru@gmail.com] 
> Sent: Tuesday, August 10, 2010 1:44 AM
> To: Grant Likely
> Cc: Zang Roy-R61911; linuxppc-dev@ozlabs.org; 
> akpm@linux-foundation.org; linux-mmc@vger.kernel.org
> Subject: Re: [PATCH 1/3 v2] sdhci: Add auto CMD12 support for 
> eSDHC driver
> 
> On Wed, Aug 04, 2010 at 07:02:56PM -0600, Grant Likely wrote:
> > On Mon, Aug 2, 2010 at 9:11 PM, Roy Zang 
> <tie-fei.zang@freescale.com> wrote:
> > > From: Jerry Huang <Chang-Ming.Huang@freescale.com>
> > >
> > > Add auto CMD12 command support for eSDHC driver.
> > > This is needed by P4080 and P1022 for block read/write.
> > > Manual asynchronous CMD12 abort operation causes protocol 
> violations on
> > > these silicons.
> > >
> > > Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
> > > Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
> > > ---
> > >  drivers/mmc/host/sdhci-of-core.c |    4 ++++
> > >  drivers/mmc/host/sdhci.c         |   14 ++++++++++++--
> > >  drivers/mmc/host/sdhci.h         |    2 ++
> > >  3 files changed, 18 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> > > index c6d1bd8..a92566e 100644
> > > --- a/drivers/mmc/host/sdhci.c
> > > +++ b/drivers/mmc/host/sdhci.c
> > > @@ -817,8 +817,12 @@ static void 
> sdhci_set_transfer_mode(struct sdhci_host *host,
> > >        WARN_ON(!host->data);
> > >
> > >        mode = SDHCI_TRNS_BLK_CNT_EN;
> > > -       if (data->blocks > 1)
> > > -               mode |= SDHCI_TRNS_MULTI;
> > > +       if (data->blocks > 1) {
> > > +               if (host->quirks & 
> SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> > > +                       mode |= SDHCI_TRNS_MULTI | 
> SDHCI_TRNS_ACMD12;
> > > +               else
> > > +                       mode |= SDHCI_TRNS_MULTI;
> > 
> > nit:
> > +               mode |= SDHCI_TRNS_MULTI;
> > +               if (host->quirks & 
> SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
> > +                       mode |= SDHCI_TRNS_ACMD12;
> > 
> > Clearer, no?
> 
> Much clearer. I would prefer the nit incorporated.
Agree.

> 
> Another nit:
> 
> > @@ -154,6 +154,10 @@ static int __devinit 
> sdhci_of_probe(struct of_device *ofdev,
> >                 host->ops = &sdhci_of_data->ops;
> >         }
> > 
> > +       if (of_get_property(np, "sdhci,auto-cmd12", NULL))
> > +               host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;
> > +
> > +      
> 
> ^^ No need for the two empty lines.
Agree.
> 
> >        if (of_get_property(np, "sdhci,1-bit-only", NULL))
> 
> Though, technically the patch looks OK, feel free to add my
> 
>   Acked-by: Anton Vorontsov <cbouatmailru@gmail.com>
I send a new patch to fix the nip. you are Cced.
Thanks.
Roy
Zang Roy-R61911 - Aug. 10, 2010, 10:07 a.m.
> -----Original Message-----
> From: Michał Mirosław [mailto:mirqus@gmail.com] 
> Sent: Tuesday, August 10, 2010 2:25 AM
> To: Zang Roy-R61911
> Cc: linux-mmc@vger.kernel.org; linuxppc-dev@ozlabs.org; 
> akpm@linux-foundation.org
> Subject: Re: [PATCH 1/3 v2] sdhci: Add auto CMD12 support for 
> eSDHC driver
> 
> 2010/8/3 Roy Zang <tie-fei.zang@freescale.com>:
> [...]
> > @@ -240,6 +240,8 @@ struct sdhci_host {
> >  #define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN              (1<<25)
> >  /* Controller cannot support End Attribute in NOP ADMA 
> descriptor */
> >  #define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC              (1<<26)
> > +/* Controller uses Auto CMD12 command to stop the transfer */
> > +#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12             (1<<27)
> >
> >        int                     irq;            /* Device IRQ */
> >        void __iomem *          ioaddr;         /* Mapped address */
> 
> Just a cosmetic hint: I suggest SDHCI_QUIRK_MULTIBLOCK_READ_AUTO_CMD12
> or something for the quirk name, because ACMD12 part might be confused
> with MMC/SD App CMD 12 (CMD55+CMD12 combo) if/whenever that gets used.
Thanks for the suggestion.
There are several ACMD12 needed to be updated.
Send a new patch to update it.
Roy

Patch

diff --git a/drivers/mmc/host/sdhci-of-core.c b/drivers/mmc/host/sdhci-of-core.c
index a2e9820..dd1bdd1 100644
--- a/drivers/mmc/host/sdhci-of-core.c
+++ b/drivers/mmc/host/sdhci-of-core.c
@@ -154,6 +154,10 @@  static int __devinit sdhci_of_probe(struct of_device *ofdev,
 		host->ops = &sdhci_of_data->ops;
 	}
 
+	if (of_get_property(np, "sdhci,auto-cmd12", NULL))
+		host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;
+
+
 	if (of_get_property(np, "sdhci,1-bit-only", NULL))
 		host->quirks |= SDHCI_QUIRK_FORCE_1_BIT_DATA;
 
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index c6d1bd8..a92566e 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -817,8 +817,12 @@  static void sdhci_set_transfer_mode(struct sdhci_host *host,
 	WARN_ON(!host->data);
 
 	mode = SDHCI_TRNS_BLK_CNT_EN;
-	if (data->blocks > 1)
-		mode |= SDHCI_TRNS_MULTI;
+	if (data->blocks > 1) {
+		if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12)
+			mode |= SDHCI_TRNS_MULTI | SDHCI_TRNS_ACMD12;
+		else
+			mode |= SDHCI_TRNS_MULTI;
+	}
 	if (data->flags & MMC_DATA_READ)
 		mode |= SDHCI_TRNS_READ;
 	if (host->flags & SDHCI_REQ_USE_DMA)
@@ -1108,6 +1112,12 @@  static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)
 #ifndef SDHCI_USE_LEDS_CLASS
 	sdhci_activate_led(host);
 #endif
+	if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12) {
+		if (mrq->stop) {
+			mrq->data->stop = NULL;
+			mrq->stop = NULL;
+		}
+	}
 
 	host->mrq = mrq;
 
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index c846813..8fb088c 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -240,6 +240,8 @@  struct sdhci_host {
 #define SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN		(1<<25)
 /* Controller cannot support End Attribute in NOP ADMA descriptor */
 #define SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC		(1<<26)
+/* Controller uses Auto CMD12 command to stop the transfer */
+#define SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12		(1<<27)
 
 	int			irq;		/* Device IRQ */
 	void __iomem *		ioaddr;		/* Mapped address */