On 14 December 2011 20:50, Subhash Jadavani <subhashj@xxxxxxxxxxxxxx> wrote: > Just a thought (not sure if it's explicitly specified in 4.5 spec or not): > Do we really need to perform bus test in HS200 mode? because in HS200, we > are anyways going to perform the tuning sequence (which achieves what bus > test command does). > you are right. i have removed it in the modified version. It does only tuning and power class selection > Regards, > Subhash > >> -----Original Message----- >> From: Saugata Das [mailto:saugata.das@xxxxxxxxxx] >> Sent: Tuesday, December 13, 2011 11:03 AM >> To: Girish K S >> Cc: Subhash Jadavani; linux-mmc@xxxxxxxxxxxxxxx; patches@xxxxxxxxxx; >> linux-samsung-soc@xxxxxxxxxxxxxxx; Chris Ball >> Subject: Re: [PATCH V5] mmc: core: HS200 mode support for eMMC 4.5 >> >> On 13 December 2011 10:13, Girish K S <girish.shivananjappa@xxxxxxxxxx> >> wrote: >> > On 12 December 2011 12:20, Girish K S >> <girish.shivananjappa@xxxxxxxxxx> wrote: >> >> On 5 December 2011 20:29, Saugata Das <saugata.das@xxxxxxxxxx> >> wrote: >> >>> Hi Girish >> >>> >> >>> Please refer to Figure 71 (HS200 device output timing) of the MMC- >> 4.5 >> >>> spec. It shows that both CMD and DATA[7-0] will have some latency >> till >> >>> valid window. This implies that even the CMD line will need tuning >> for >> >>> reading the response. The specification talks about identifying >> >>> sampling point for data lines by reading tuning blocks. Based on >> host >> >>> controller capability, even the CMD line will get the good sample >> >>> point during the same tuning sequence. >> >>> >> >>> We need to have the tuning done (execute_tuning) soon after >> switching >> >>> to HS200 mode and 200MHz clock. >> >>> >> >> If i make a change as per subhash suggestion"set bus width before >> >> setting the HS200 mode." then it will affect the entire frame work >> of >> >> mmc which is developed as per Annexure A6.1 A.6.2 A.6.3 (mentions >> the >> >> steps for bus initialization). can any of you suggest a way to do >> >> this. >> >> Note that, we need to make this modification only for HS200 mode. For >> DDR mode, it is required that we keep the current way (i.e. setting >> BUS_WIDTH after HS_TIMING). >> >> > >> > Any inputs on this >> > >> >>> >> >>> Regards >> >>> Saugata >> >>> >> >>> >> >>> On 5 December 2011 16:59, Subhash Jadavani >> <subhashj@xxxxxxxxxxxxxx> wrote: >> >>>> >> >>>> >> >>>>> -----Original Message----- >> >>>>> From: Girish K S [mailto:girish.shivananjappa@xxxxxxxxxx] >> >>>>> Sent: Monday, December 05, 2011 12:20 PM >> >>>>> To: Subhash Jadavani >> >>>>> Cc: linux-mmc@xxxxxxxxxxxxxxx; patches@xxxxxxxxxx; linux-samsung- >> >>>>> soc@xxxxxxxxxxxxxxx; Chris Ball >> >>>>> Subject: Re: [PATCH V5] mmc: core: HS200 mode support for eMMC >> 4.5 >> >>>>> >> >>>>> On 5 December 2011 11:46, Subhash Jadavani >> <subhashj@xxxxxxxxxxxxxx> >> >>>>> wrote: >> >>>>> > >> >>>>> > >> >>>>> >> -----Original Message----- >> >>>>> >> From: Girish K S [mailto:girish.shivananjappa@xxxxxxxxxx] >> >>>>> >> Sent: Friday, December 02, 2011 5:08 PM >> >>>>> >> To: Subhash Jadavani >> >>>>> >> Cc: linux-mmc@xxxxxxxxxxxxxxx; patches@xxxxxxxxxx; linux- >> samsung- >> >>>>> >> soc@xxxxxxxxxxxxxxx; Chris Ball >> >>>>> >> Subject: Re: [PATCH V5] mmc: core: HS200 mode support for eMMC >> 4.5 >> >>>>> >> >> >>>>> >> On 2 December 2011 00:02, Subhash Jadavani >> <subhashj@xxxxxxxxxxxxxx> >> >>>>> >> wrote: >> >>>>> >> > >> >>>>> >> > >> >>>>> >> >> -----Original Message----- >> >>>>> >> >> From: linux-mmc-owner@xxxxxxxxxxxxxxx [mailto:linux-mmc- >> >>>>> >> >> owner@xxxxxxxxxxxxxxx] On Behalf Of Girish K S >> >>>>> >> >> Sent: Thursday, December 01, 2011 7:48 PM >> >>>>> >> >> To: Subhash Jadavani >> >>>>> >> >> Cc: linux-mmc@xxxxxxxxxxxxxxx; patches@xxxxxxxxxx; linux- >> samsung- >> >>>>> >> >> soc@xxxxxxxxxxxxxxx; Chris Ball >> >>>>> >> >> Subject: Re: [PATCH V5] mmc: core: HS200 mode support for >> eMMC >> >>>>> 4.5 >> >>>>> >> >> >> >>>>> >> >> On 1 December 2011 16:27, Subhash Jadavani >> >>>>> <subhashj@xxxxxxxxxxxxxx> >> >>>>> >> >> wrote: >> >>>>> >> >> > >> >>>>> >> >> > >> >>>>> >> >> >> -----Original Message----- >> >>>>> >> >> >> From: linux-mmc-owner@xxxxxxxxxxxxxxx [mailto:linux-mmc- >> >>>>> >> >> >> owner@xxxxxxxxxxxxxxx] On Behalf Of Girish K S >> >>>>> >> >> >> Sent: Thursday, December 01, 2011 3:58 PM >> >>>>> >> >> >> To: Subhash Jadavani >> >>>>> >> >> >> Cc: linux-mmc@xxxxxxxxxxxxxxx; patches@xxxxxxxxxx; >> linux- >> >>>>> samsung- >> >>>>> >> >> >> soc@xxxxxxxxxxxxxxx; Chris Ball >> >>>>> >> >> >> Subject: Re: [PATCH V5] mmc: core: HS200 mode support >> for eMMC >> >>>>> >> 4.5 >> >>>>> >> >> >> >> >>>>> >> >> >> On 1 December 2011 15:33, Subhash Jadavani >> >>>>> >> <subhashj@xxxxxxxxxxxxxx> >> >>>>> >> >> >> wrote: >> >>>>> >> >> >> > Hi Girish, >> >>>>> >> >> >> > >> >>>>> >> >> >> >> -----Original Message----- >> >>>>> >> >> >> >> From: linux-mmc-owner@xxxxxxxxxxxxxxx [mailto:linux- >> mmc- >> >>>>> >> >> >> >> owner@xxxxxxxxxxxxxxx] On Behalf Of Girish K S >> >>>>> >> >> >> >> Sent: Wednesday, November 30, 2011 2:24 PM >> >>>>> >> >> >> >> To: linux-mmc@xxxxxxxxxxxxxxx >> >>>>> >> >> >> >> Cc: patches@xxxxxxxxxx; linux-samsung- >> soc@xxxxxxxxxxxxxxx; >> >>>>> >> >> >> >> subhashj@xxxxxxxxxxxxxx; Girish K S; Chris Ball >> >>>>> >> >> >> >> Subject: [PATCH V5] mmc: core: HS200 mode support for >> eMMC >> >>>>> 4.5 >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> This patch adds the support of the HS200 bus speed >> for eMMC >> >>>>> >> 4.5 >> >>>>> >> >> >> >> devices. >> >>>>> >> >> >> >> The eMMC 4.5 devices have support for 200MHz bus >> speed.The >> >>>>> mmc >> >>>>> >> >> core >> >>>>> >> >> >> and >> >>>>> >> >> >> >> host modules have been touched to add support for >> this >> >>>>> module. >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> It is necessary to know the card type in the sdhci.c >> file >> >>>>> to >> >>>>> >> add >> >>>>> >> >> >> >> support >> >>>>> >> >> >> >> for eMMC tuning function. So card.h file is included >> to >> >>>>> import >> >>>>> >> >> the >> >>>>> >> >> >> card >> >>>>> >> >> >> >> data structure. >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> cc: Chris Ball <cjb@xxxxxxxxxx> >> >>>>> >> >> >> >> Signed-off-by: Girish K S >> <girish.shivananjappa@xxxxxxxxxx> >> >>>>> >> >> >> >> --- >> >>>>> >> >> >> >> Changes in v5: >> >>>>> >> >> >> >> Reduced the case statements for better code >> >>>>> readability. >> >>>>> >> >> >> Removed >> >>>>> >> >> >> >> unused macro definitions. Modified the tuning >> >>>>> function >> >>>>> >> >> >> prototype >> >>>>> >> >> >> >> and definition to support tuning for both SD >> and eMMC >> >>>>> >> >> cards. >> >>>>> >> >> >> >> Changes in v4: >> >>>>> >> >> >> >> Rebased onto chris-mmc/mmc-next branch. This >> patch is >> >>>>> >> >> >> >> successfully >> >>>>> >> >> >> >> applied on commit with id >> >>>>> >> >> >> >> de022ed3fdc14808299b2fa66dbb1ed5ab921912. >> >>>>> >> >> >> >> Changes in v3: >> >>>>> >> >> >> >> In the previous commits of chris-mmc/mmc-next >> branch, >> >>>>> >> the >> >>>>> >> >> >> patch >> >>>>> >> >> >> >> with >> >>>>> >> >> >> >> commit id >> (c0f22a2c92e357e7cb3988b0b13034d70b7461f9) >> >>>>> >> >> defines >> >>>>> >> >> >> >> caps2 for >> >>>>> >> >> >> >> more capabilities. This patch version deletes >> the >> >>>>> member >> >>>>> >> >> >> >> ext_caps(created >> >>>>> >> >> >> >> in my earlier patch) from struct mmc_host and >> reuses >> >>>>> >> >> already >> >>>>> >> >> >> >> accepted >> >>>>> >> >> >> >> caps2 member. >> >>>>> >> >> >> >> Changes in v2: >> >>>>> >> >> >> >> Rebased to latest chris-mmc/mmc-next branch. >> Resolved >> >>>>> >> >> >> indentation >> >>>>> >> >> >> >> problems identified in review. This patch has >> to be >> >>>>> >> applied >> >>>>> >> >> >> >> before >> >>>>> >> >> >> >> the patch released for modifying the printk >> messages. >> >>>>> >> >> >> >> Changes in v1: >> >>>>> >> >> >> >> Case statements in switch that produce same >> result >> >>>>> have >> >>>>> >> >> >> >> been combined to reduce repeated assignments. >> >>>>> >> >> >> >> patch recreated after rebase to chris balls >> mmc-next >> >>>>> >> >> branch. >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> drivers/mmc/core/bus.c | 3 +- >> >>>>> >> >> >> >> drivers/mmc/core/mmc.c | 77 >> >>>>> >> >> >> >> ++++++++++++++++++++++++++++++++++++++++---- >> >>>>> >> >> >> >> drivers/mmc/core/sd.c | 3 +- >> >>>>> >> >> >> >> drivers/mmc/core/sdio.c | 4 ++- >> >>>>> >> >> >> >> drivers/mmc/host/sdhci.c | 38 +++++++++++++++++-- >> --- >> >>>>> >> >> >> >> include/linux/mmc/card.h | 3 ++ >> >>>>> >> >> >> >> include/linux/mmc/host.h | 11 ++++++- >> >>>>> >> >> >> >> include/linux/mmc/mmc.h | 66 >> >>>>> >> >> >> >> ++++++++++++++++++++++++++++++++++++++- >> >>>>> >> >> >> >> include/linux/mmc/sdhci.h | 1 + >> >>>>> >> >> >> >> 9 files changed, 185 insertions(+), 21 deletions(-) >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> diff --git a/drivers/mmc/core/bus.c >> >>>>> b/drivers/mmc/core/bus.c >> >>>>> >> >> >> >> index 5639fdf..83c9f8d 100644 >> >>>>> >> >> >> >> --- a/drivers/mmc/core/bus.c >> >>>>> >> >> >> >> +++ b/drivers/mmc/core/bus.c >> >>>>> >> >> >> >> @@ -301,10 +301,11 @@ int mmc_add_card(struct >> mmc_card >> >>>>> *card) >> >>>>> >> >> >> >> mmc_card_ddr_mode(card) ? "DDR >> " : >> >>>>> "", >> >>>>> >> >> >> >> type); >> >>>>> >> >> >> >> } else { >> >>>>> >> >> >> >> - printk(KERN_INFO "%s: new %s%s%s card >> at >> >>>>> address >> >>>>> >> >> >> %04x\n", >> >>>>> >> >> >> >> + pr_info("%s: new %s%s%s%s card at >> address >> >>>>> >> %04x\n", >> >>>>> >> >> >> >> mmc_hostname(card->host), >> >>>>> >> >> >> >> mmc_card_uhs(card) ? "ultra >> high >> >>>>> speed " >> >>>>> >> : >> >>>>> >> >> >> >> (mmc_card_highspeed(card) ? >> "high >> >>>>> speed >> >>>>> >> " : >> >>>>> >> >> >> ""), >> >>>>> >> >> >> >> + (mmc_card_hs200(card) ? "HS200 >> " : >> >>>>> ""), >> >>>>> >> >> >> >> mmc_card_ddr_mode(card) ? "DDR >> " : >> >>>>> "", >> >>>>> >> >> >> >> type, card->rca); >> >>>>> >> >> >> >> } >> >>>>> >> >> >> >> diff --git a/drivers/mmc/core/mmc.c >> >>>>> b/drivers/mmc/core/mmc.c >> >>>>> >> >> >> >> index a1223bd..f4124d6 100644 >> >>>>> >> >> >> >> --- a/drivers/mmc/core/mmc.c >> >>>>> >> >> >> >> +++ b/drivers/mmc/core/mmc.c >> >>>>> >> >> >> >> @@ -285,6 +285,27 @@ static int >> mmc_read_ext_csd(struct >> >>>>> >> mmc_card >> >>>>> >> >> >> *card, >> >>>>> >> >> >> >> u8 *ext_csd) >> >>>>> >> >> >> >> } >> >>>>> >> >> >> >> card->ext_csd.raw_card_type = >> >>>>> >> ext_csd[EXT_CSD_CARD_TYPE]; >> >>>>> >> >> >> >> switch (ext_csd[EXT_CSD_CARD_TYPE] & >> >>>>> >> >> EXT_CSD_CARD_TYPE_MASK) { >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_ALL: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52: >> >>>>> >> >> >> >> + card->ext_csd.hs_max_dtr = 200000000; >> >>>>> >> >> >> >> + card->ext_csd.card_type = >> >>>>> >> >> EXT_CSD_CARD_TYPE_SDR_200; >> >>>>> >> >> >> >> + break; >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_1_2V_ALL: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52: >> >>>>> >> >> >> >> + card->ext_csd.hs_max_dtr = 200000000; >> >>>>> >> >> >> >> + card->ext_csd.card_type = >> >>>>> >> >> EXT_CSD_CARD_TYPE_SDR_1_2V; >> >>>>> >> >> >> >> + break; >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_1_8V_ALL: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V: >> >>>>> >> >> >> >> + case EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52: >> >>>>> >> >> >> >> + card->ext_csd.hs_max_dtr = 200000000; >> >>>>> >> >> >> >> + card->ext_csd.card_type = >> >>>>> >> >> EXT_CSD_CARD_TYPE_SDR_1_8V; >> >>>>> >> >> >> >> + break; >> >>>>> >> >> >> >> case EXT_CSD_CARD_TYPE_DDR_52 | >> EXT_CSD_CARD_TYPE_52 >> >>>>> | >> >>>>> >> >> >> >> EXT_CSD_CARD_TYPE_26: >> >>>>> >> >> >> >> card->ext_csd.hs_max_dtr = 52000000; >> >>>>> >> >> >> >> @@ -699,6 +720,7 @@ static int mmc_init_card(struct >> >>>>> mmc_host >> >>>>> >> >> *host, >> >>>>> >> >> >> u32 >> >>>>> >> >> >> >> ocr, >> >>>>> >> >> >> >> { >> >>>>> >> >> >> >> struct mmc_card *card; >> >>>>> >> >> >> >> int err, ddr = 0; >> >>>>> >> >> >> >> + int hs_sdr = 0; >> >>>>> >> >> >> >> u32 cid[4]; >> >>>>> >> >> >> >> unsigned int max_dtr; >> >>>>> >> >> >> >> u32 rocr; >> >>>>> >> >> >> >> @@ -894,11 +916,16 @@ static int mmc_init_card(struct >> >>>>> mmc_host >> >>>>> >> >> >> *host, >> >>>>> >> >> >> >> u32 ocr, >> >>>>> >> >> >> >> /* >> >>>>> >> >> >> >> * Activate high speed (if supported) >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> - if ((card->ext_csd.hs_max_dtr != 0) && >> >>>>> >> >> >> >> - (host->caps & MMC_CAP_MMC_HIGHSPEED)) { >> >>>>> >> >> >> >> - err = mmc_switch(card, >> >>>>> EXT_CSD_CMD_SET_NORMAL, >> >>>>> >> >> >> >> - EXT_CSD_HS_TIMING, 1, >> >>>>> >> >> >> >> - card- >> >>>>> >> >ext_csd.generic_cmd6_time); >> >>>>> >> >> >> >> + if (card->ext_csd.hs_max_dtr != 0) { >> >>>>> >> >> >> >> + err = 0; >> >>>>> >> >> >> >> + if ((card->ext_csd.hs_max_dtr > >> 52000000) && >> >>>>> >> >> >> >> + (host->caps2 & MMC_CAP2_HS200)) >> >>>>> >> >> >> >> + err = mmc_switch(card, >> >>>>> >> >> EXT_CSD_CMD_SET_NORMAL, >> >>>>> >> >> >> >> + >> EXT_CSD_HS_TIMING, >> >>>>> 2, >> >>>>> >> 0); >> >>>>> >> >> >> >> + else if (host->caps & >> MMC_CAP_MMC_HIGHSPEED) >> >>>>> >> >> >> >> + err = mmc_switch(card, >> >>>>> >> >> EXT_CSD_CMD_SET_NORMAL, >> >>>>> >> >> >> >> + >> EXT_CSD_HS_TIMING, >> >>>>> 1, >> >>>>> >> 0); >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> if (err && err != -EBADMSG) >> >>>>> >> >> >> >> goto free_card; >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> @@ -907,7 +934,11 @@ static int mmc_init_card(struct >> >>>>> mmc_host >> >>>>> >> >> *host, >> >>>>> >> >> >> >> u32 ocr, >> >>>>> >> >> >> >> mmc_hostname(card- >> >host)); >> >>>>> >> >> >> >> err = 0; >> >>>>> >> >> >> >> } else { >> >>>>> >> >> >> >> - mmc_card_set_highspeed(card); >> >>>>> >> >> >> >> + if ((card->ext_csd.hs_max_dtr > >> >>>>> >> 52000000) >> >>>>> >> >> && >> >>>>> >> >> >> >> + (host->caps2 & >> MMC_CAP2_HS200)) >> >>>>> >> >> >> >> + >> mmc_card_set_hs200(card); >> >>>>> >> >> >> >> + else >> >>>>> >> >> >> >> + >> mmc_card_set_highspeed(card); >> >>>>> >> >> >> >> mmc_set_timing(card->host, >> >>>>> >> >> MMC_TIMING_MMC_HS); >> >>>>> >> >> >> > >> >>>>> >> >> >> > MMC_TIMING_MMC_HS200 is defined but still not used. >> >>>>> >> >> >> > >> >>>>> >> >> >> > So I guess it should be like this :: >> >>>>> >> >> >> > + if ((card->ext_csd.hs_max_dtr >> > >> >>>>> >> 52000000) >> >>>>> >> >> && >> >>>>> >> >> >> > + (host->caps2 & >> MMC_CAP2_HS200)) >> >>>>> { >> >>>>> >> >> >> > + >> mmc_card_set_hs200(card); >> >>>>> >> >> >> > + mmc_set_timing(card->host, >> >>>>> >> >> >> MMC_TIMING_MMC_HS200) >> >>>>> >> >> >> > + } else { >> >>>>> >> >> >> > + >> >>>>> mmc_card_set_highspeed(card); >> >>>>> >> >> >> > + mmc_set_timing(card- >> >host, >> >>>>> >> >> >> > MMC_TIMING_MMC_HS) >> >>>>> >> >> >> > + } >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> >> } >> >>>>> >> >> >> >> } >> >>>>> >> >> >> >> @@ -933,7 +964,7 @@ static int mmc_init_card(struct >> >>>>> mmc_host >> >>>>> >> >> *host, >> >>>>> >> >> >> u32 >> >>>>> >> >> >> >> ocr, >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> max_dtr = (unsigned int)-1; >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> - if (mmc_card_highspeed(card)) { >> >>>>> >> >> >> >> + if (mmc_card_highspeed(card) || >> mmc_card_hs200(card)) >> >>>>> { >> >>>>> >> >> >> >> if (max_dtr > card->ext_csd.hs_max_dtr) >> >>>>> >> >> >> >> max_dtr = card- >> >ext_csd.hs_max_dtr; >> >>>>> >> >> >> >> } else if (max_dtr > card->csd.max_dtr) { >> >>>>> >> >> >> >> @@ -959,6 +990,18 @@ static int mmc_init_card(struct >> >>>>> mmc_host >> >>>>> >> >> *host, >> >>>>> >> >> >> >> u32 ocr, >> >>>>> >> >> >> >> } >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> /* >> >>>>> >> >> >> >> + * Indicate HS200 SDR mode (if supported). >> >>>>> >> >> >> >> + */ >> >>>>> >> >> >> >> + if (mmc_card_hs200(card)) { >> >>>>> >> >> >> >> + if ((card->ext_csd.card_type & >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_SDR_1_8V) >> >>>>> >> >> >> >> + && (host->caps2 & >> >>>>> >> MMC_CAP2_HS200_1_8V_SDR)) >> >>>>> >> >> >> >> + hs_sdr = >> MMC_1_8V_SDR_MODE; >> >>>>> >> >> >> >> + else if ((card->ext_csd.card_type & >> >>>>> >> >> >> >> EXT_CSD_CARD_TYPE_SDR_1_2V) >> >>>>> >> >> >> >> + && (host->caps2 & >> >>>>> >> MMC_CAP2_HS200_1_2V_SDR)) >> >>>>> >> >> >> >> + hs_sdr = >> MMC_1_2V_SDR_MODE; >> >>>>> >> >> >> >> + } >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> + /* >> >>>>> >> >> >> >> * Activate wide bus and DDR (if supported). >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> if ((card->csd.mmca_vsn >= CSD_SPEC_VER_4) && >> >>>>> >> >> >> >> @@ -998,6 +1041,17 @@ static int mmc_init_card(struct >> >>>>> mmc_host >> >>>>> >> >> >> *host, >> >>>>> >> >> >> >> u32 ocr, >> >>>>> >> >> >> >> if (!err) { >> >>>>> >> >> >> >> mmc_set_bus_width(card- >> >host, >> >>>>> >> >> >> bus_width); >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> + if ((host->caps2 & >> >>>>> >> MMC_CAP2_HS200) >> >>>>> >> >> && >> >>>>> >> >> >> >> + card->host->ops- >> >>>>> >> >> >execute_tuning) >> >>>>> >> >> >> >> + err = card- >> >host- >> >>>>> >ops-> >> >>>>> >> \ >> >>>>> >> >> >> >> + >> >>>>> >> execute_tuning(card- >> >>>>> >> >> >> >host, >> >>>>> >> >> >> >> + >> >>>>> >> >> >> > MMC_SEND_TUNING_BLOCK_HS200); >> >>>>> >> >> >> > >> >>>>> >> >> >> > >> >>>>> >> >> >> > execute_tuning should be done right after the timing >> is >> >>>>> changed >> >>>>> >> to >> >>>>> >> >> >> HS200 and >> >>>>> >> >> >> > clock rate is changed to 200Mhz. This is not the >> correct >> >>>>> >> sequence >> >>>>> >> >> to >> >>>>> >> >> >> call >> >>>>> >> >> >> > the execute_tuning(). >> >>>>> >> >> >> > As told earlier, It is mentioned in the spec that >> tuning >> >>>>> should >> >>>>> >> be >> >>>>> >> >> >> executed after change of buswidth (mandatory). Also it >> >>>>> mentions >> >>>>> >> that >> >>>>> >> >> >> "The host may invoke the HS200 tuning sequence, by >> sending >> >>>>> CMD21 >> >>>>> >> to >> >>>>> >> >> the >> >>>>> >> >> >> device". It means that >> >>>>> >> >> >> after setting the HS200 mode, Changing to freq > 52Mhz >> and >> >>>>> >> changing >> >>>>> >> >> >> the bus width tuning can be executed anytime to identify >> the >> >>>>> >> >> sampling >> >>>>> >> >> >> point to read.(By anytime i mean before actual block >> read >> >>>>> >> >> Operation). >> >>>>> >> >> >> Can you please point me to the place in the spec where >> it >> >>>>> >> specifies >> >>>>> >> >> >> tuning should be done immediately after freq change (may >> be i >> >>>>> >> missed >> >>>>> >> >> >> to read it). >> >>>>> >> >> > >> >>>>> >> >> > >> >>>>> >> >> > Ok. let me ask you this. Why do we run the >> execute_tuning()? >> >>>>> It's >> >>>>> >> to >> >>>>> >> >> tune >> >>>>> >> >> > the sampling clock generator of host controller before >> you >> >>>>> start >> >>>>> >> any >> >>>>> >> >> read >> >>>>> >> >> > operation (on command line or data line) from card. If >> you >> >>>>> don't >> >>>>> >> tune >> >>>>> >> >> the >> >>>>> >> >> > sampling clock generator before the read operation (after >> >>>>> changing >> >>>>> >> >> the >> >>>>> >> >> > timing to HS200 and clock rate to 200mhz), you can't be >> sure >> >>>>> that >> >>>>> >> >> read >> >>>>> >> >> > operation from card will be completed without errors. You >> may >> >>>>> get >> >>>>> >> the >> >>>>> >> >> data / >> >>>>> >> >> > cmd response CRC errors. At least this will surely fail >> on our >> >>>>> MSM >> >>>>> >> >> SDCC host >> >>>>> >> >> > controller. That's what we had faced with SD3.0 UHS-I >> tuning as >> >>>>> >> well >> >>>>> >> >> as >> >>>>> >> >> > mentioned in http://www.spinics.net/lists/linux-arm- >> >>>>> >> >> msm/msg03867.html. >> >>>>> >> > >> >>>>> >> >> > this tuning is done before any read opration for the best >> bus >> >>>>> >> width >> >>>>> >> >> supported. >> >>>>> >> > Agreed. But can we be sure that "command response" for bus >> width >> >>>>> >> change via >> >>>>> >> > CMD6, will not have any command CRC failures if tuning is >> not >> >>>>> done? >> >>>>> >> All responses are sent on CMD line not on data lines, And >> sampling >> >>>>> is >> >>>>> >> done for Data lines before reading. So command CRC failure >> doesnt >> >>>>> >> depend on tuning. If you get error during CMD6 it could be >> that >> >>>>> device >> >>>>> >> cannot support the bus width at the set frequency. >> >>>>> > >> >>>>> > I guess it's not the correct assumption here. Sampling point >> tuning >> >>>>> is to >> >>>>> Its Not assumption "Specification says responses are all sent on >> CMD >> >>>>> only" >> >>>> >> >>>> >> >>>> >> >>>> Where does it say that tuning is not required for data received on >> command >> >>>> line? If the 200Mhz clock can effect the data received on DATA >> lines then >> >>>> why it won't affect the data (responses) received on CMD lines? >> >>>> If you still have doubt, I would suggest to get the clarification >> from >> >>>> JEDEC. From SD3.01 spec, for sure CMD lines also requires tuning. >> >>>> >> >>>> "Sampling clock generation" on our host controller also says that >> tuning is >> >>>> required for data transfer on both DATA and CMD lines. >> >>>> >> >>>> I am not sure what is the issue with doing the tuning immediately >> after >> >>>> changing to bus speed mode to HS200 (changing controller timing, >> changing >> >>>> clock etc ...)? This is what we are doing it for SD3.0 cards as >> well. >> >>>> >> >>>> Your current implementation is not going to work with all host >> controllers. >> >>>> >> >>>> >> >>>> >> >>>> >> >>>> >> >>>> >> >>>>> > tune the sampling point for data received on both CMD and DATA >> lines >> >>>>> (not >> >>>>> > just data lines). I can't find detailed mentioning of this in >> eMMC4.5 >> >>>>> Pls check the section 6.6.7.1. the 2nd paragraph quotes "which in >> turn >> >>>>> uses it to find the >> >>>>> optimal sampling point for the data lines" >> >>>>> > (that's the documentation short coming, you can even confirm >> whether >> >>>>> tuning >> >>>>> > procedure is required for CMD line or not from JEDEC) but >> SD3.01 >> >>>>> > specification does mention this tuning procedure in great >> details. >> >>>>> NOTE: >> >>>>> > eMMC4.5 HS200 mode is mostly inspired from SD3.01 UHS-I bus >> speed >> >>>>> modes. >> >>>>> > >> >>>>> > Section " 4.2.4.5 Tuning Command" in "SD3.01 - Simplified >> >>>>> > >> >>>>> >> (Part_1_Physical_Layer_Simplified_Specification_Ver_3.01_Final_100518)" >> >>>>> > specification(can be downloaded from here: >> >>>>> > https://www.sdcard.org/downloads/pls/), clearly states this: >> >>>>> > >> >>>>> > 4.2.4.5 Tuning Command >> >>>>> > CMD19 is defined for Send Tuning Block Command. R1 type >> response is >> >>>>> defined. >> >>>>> > CMD19 can be >> >>>>> > executed in transfer state of 1.8V signaling mode while the >> card is >> >>>>> > unlocked. The other case, CMD19 is >> >>>>> > treated as illegal command. Data block, carried by DAT[3:0], >> contains >> >>>>> a >> >>>>> > pattern for tuning sampling >> >>>>> > position to receive data on the CMD and DAT[3:0] line. The >> block >> >>>>> length of >> >>>>> > CMD19 is fixed and CMD16 >> >>>>> > is not required. >> >>>>> > I have no idea of the SD spec. I have just seen the eMMC spec >> and >> >>>>> above quotes might answer your doubt >> >>>>> > So before tuning, you may get the Command CRC errors in HS200 >> mode. >> >>>>> > >> >>>>> > Regards, >> >>>>> > Subhash >> >>>>> > >> >>>>> >> > >> >>>>> >> >> ps:Chris need your comment on this >> >>>>> >> >> > >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> + if (err) { >> >>>>> >> >> >> >> + >> pr_warning("tuning >> >>>>> >> >> execution >> >>>>> >> >> >> > failed\n"); >> >>>>> >> >> >> >> + continue; >> >>>>> >> >> >> >> + } >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> /* >> >>>>> >> >> >> >> * If controller can't >> handle >> >>>>> >> bus >> >>>>> >> >> >> width >> >>>>> >> >> >> > test, >> >>>>> >> >> >> >> * compare ext_csd >> previously >> >>>>> >> read >> >>>>> >> >> in >> >>>>> >> >> >> 1 bit >> >>>>> >> >> >> >> mode >> >>>>> >> >> >> >> @@ -1056,6 +1110,15 @@ static int >> mmc_init_card(struct >> >>>>> >> mmc_host >> >>>>> >> >> >> *host, >> >>>>> >> >> >> >> u32 ocr, >> >>>>> >> >> >> >> mmc_card_set_ddr_mode(card); >> >>>>> >> >> >> >> mmc_set_timing(card->host, >> >>>>> >> >> >> MMC_TIMING_UHS_DDR50); >> >>>>> >> >> >> >> mmc_set_bus_width(card->host, >> >>>>> >> bus_width); >> >>>>> >> >> >> >> + } else if (hs_sdr) { >> >>>>> >> >> >> >> + if (hs_sdr == >> >>>>> >> EXT_CSD_CARD_TYPE_SDR_1_2V) { >> >>>>> >> >> >> >> + err = >> >>>>> >> mmc_set_signal_voltage(host, >> >>>>> >> >> >> >> + >> >>>>> MMC_SIGNAL_VOLTAGE_120, >> >>>>> >> 0); >> >>>>> >> >> >> >> + if (err) >> >>>>> >> >> >> >> + goto err; >> >>>>> >> >> >> >> + } >> >>>>> >> >> >> >> + mmc_set_timing(card->host, >> >>>>> >> >> MMC_TIMING_MMC_HS); >> >>>>> >> >> >> >> + mmc_set_bus_width(card->host, >> >>>>> >> bus_width); >> >>>>> >> >> >> >> } >> >>>>> >> >> >> >> } >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> diff --git a/drivers/mmc/core/sd.c >> b/drivers/mmc/core/sd.c >> >>>>> >> >> >> >> index 1d5a3bd..c1d3ee3 100644 >> >>>>> >> >> >> >> --- a/drivers/mmc/core/sd.c >> >>>>> >> >> >> >> +++ b/drivers/mmc/core/sd.c >> >>>>> >> >> >> >> @@ -660,7 +660,8 @@ static int >> mmc_sd_init_uhs_card(struct >> >>>>> >> >> mmc_card >> >>>>> >> >> >> >> *card) >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> /* SPI mode doesn't define CMD19 */ >> >>>>> >> >> >> >> if (!mmc_host_is_spi(card->host) && card->host- >> >ops- >> >>>>> >> >> >> >> >execute_tuning) >> >>>>> >> >> >> >> - err = card->host->ops- >> >execute_tuning(card- >> >>>>> >> >host); >> >>>>> >> >> >> >> + err = card->host->ops- >> >execute_tuning(card- >> >>>>> >> >host, >> >>>>> >> >> >> \ >> >>>>> >> >> >> >> + >> >>>>> >> >> >> > MMC_SEND_TUNING_BLOCK); >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> out: >> >>>>> >> >> >> >> kfree(status); >> >>>>> >> >> >> >> diff --git a/drivers/mmc/core/sdio.c >> >>>>> b/drivers/mmc/core/sdio.c >> >>>>> >> >> >> >> index 8c04f7f..8ef8817 100644 >> >>>>> >> >> >> >> --- a/drivers/mmc/core/sdio.c >> >>>>> >> >> >> >> +++ b/drivers/mmc/core/sdio.c >> >>>>> >> >> >> >> @@ -14,6 +14,7 @@ >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> #include <linux/mmc/host.h> >> >>>>> >> >> >> >> #include <linux/mmc/card.h> >> >>>>> >> >> >> >> +#include <linux/mmc/mmc.h> >> >>>>> >> >> >> >> #include <linux/mmc/sdio.h> >> >>>>> >> >> >> >> #include <linux/mmc/sdio_func.h> >> >>>>> >> >> >> >> #include <linux/mmc/sdio_ids.h> >> >>>>> >> >> >> >> @@ -556,7 +557,8 @@ static int >> >>>>> mmc_sdio_init_uhs_card(struct >> >>>>> >> >> >> mmc_card >> >>>>> >> >> >> >> *card) >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> /* Initialize and start re-tuning timer */ >> >>>>> >> >> >> >> if (!mmc_host_is_spi(card->host) && card->host- >> >ops- >> >>>>> >> >> >> >> >execute_tuning) >> >>>>> >> >> >> >> - err = card->host->ops- >> >execute_tuning(card- >> >>>>> >> >host); >> >>>>> >> >> >> >> + err = card->host->ops- >> >execute_tuning(card- >> >>>>> >> >host, >> >>>>> >> >> >> >> + >> >>>>> >> >> >> > MMC_SEND_TUNING_BLOCK); >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> out: >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> diff --git a/drivers/mmc/host/sdhci.c >> >>>>> >> b/drivers/mmc/host/sdhci.c >> >>>>> >> >> >> >> index a7c2311..13d74bb 100644 >> >>>>> >> >> >> >> --- a/drivers/mmc/host/sdhci.c >> >>>>> >> >> >> >> +++ b/drivers/mmc/host/sdhci.c >> >>>>> >> >> >> >> @@ -49,7 +49,7 @@ static void >> sdhci_finish_data(struct >> >>>>> >> sdhci_host >> >>>>> >> >> >> *); >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> static void sdhci_send_command(struct sdhci_host *, >> struct >> >>>>> >> >> >> mmc_command >> >>>>> >> >> >> >> *); >> >>>>> >> >> >> >> static void sdhci_finish_command(struct sdhci_host >> *); >> >>>>> >> >> >> >> -static int sdhci_execute_tuning(struct mmc_host >> *mmc); >> >>>>> >> >> >> >> +static int sdhci_execute_tuning(struct mmc_host >> *mmc, u32 >> >>>>> >> >> opcode); >> >>>>> >> >> >> >> static void sdhci_tuning_timer(unsigned long data); >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> #ifdef CONFIG_PM_RUNTIME >> >>>>> >> >> >> >> @@ -1016,7 +1016,8 @@ static void >> sdhci_send_command(struct >> >>>>> >> >> >> sdhci_host >> >>>>> >> >> >> >> *host, struct mmc_command *cmd) >> >>>>> >> >> >> >> flags |= SDHCI_CMD_INDEX; >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> /* CMD19 is special in that the Data Present >> Select >> >>>>> >> should >> >>>>> >> >> be >> >>>>> >> >> >> set >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> - if (cmd->data || (cmd->opcode == >> >>>>> MMC_SEND_TUNING_BLOCK)) >> >>>>> >> >> >> >> + if (cmd->data || (cmd->opcode == >> >>>>> MMC_SEND_TUNING_BLOCK) >> >>>>> >> || >> >>>>> >> >> >> >> + (cmd->opcode == >> MMC_SEND_TUNING_BLOCK_HS200)) >> >>>>> >> >> >> >> flags |= SDHCI_CMD_DATA; >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> sdhci_writew(host, SDHCI_MAKE_CMD(cmd->opcode, >> >>>>> flags), >> >>>>> >> >> >> >> SDHCI_COMMAND); >> >>>>> >> >> >> >> @@ -1287,7 +1288,7 @@ static void >> sdhci_request(struct >> >>>>> >> mmc_host >> >>>>> >> >> >> *mmc, >> >>>>> >> >> >> >> struct mmc_request *mrq) >> >>>>> >> >> >> >> if ((host->flags & >> SDHCI_NEEDS_RETUNING) && >> >>>>> >> >> >> >> !(present_state & >> (SDHCI_DOING_WRITE | >> >>>>> >> >> >> >> SDHCI_DOING_READ))) { >> >>>>> >> >> >> >> spin_unlock_irqrestore(&host- >> >lock, >> >>>>> >> flags); >> >>>>> >> >> >> >> - sdhci_execute_tuning(mmc); >> >>>>> >> >> >> >> + sdhci_execute_tuning(mmc, mrq- >> >cmd- >> >>>>> >> >> >opcode); >> >>>>> >> >> >> >> spin_lock_irqsave(&host->lock, >> >>>>> flags); >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> /* Restore original mmc_request >> >>>>> >> structure >> >>>>> >> >> */ >> >>>>> >> >> >> >> @@ -1673,7 +1674,7 @@ static int >> >>>>> >> >> >> >> sdhci_start_signal_voltage_switch(struct mmc_host >> *mmc, >> >>>>> >> >> >> >> return err; >> >>>>> >> >> >> >> } >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> -static int sdhci_execute_tuning(struct mmc_host >> *mmc) >> >>>>> >> >> >> >> +static int sdhci_execute_tuning(struct mmc_host >> *mmc, u32 >> >>>>> >> >> opcode) >> >>>>> >> >> >> >> { >> >>>>> >> >> >> >> struct sdhci_host *host; >> >>>>> >> >> >> >> u16 ctrl; >> >>>>> >> >> >> >> @@ -1694,10 +1695,13 @@ static int >> >>>>> sdhci_execute_tuning(struct >> >>>>> >> >> >> mmc_host >> >>>>> >> >> >> >> *mmc) >> >>>>> >> >> >> >> * Host Controller needs tuning only in case of >> >>>>> SDR104 >> >>>>> >> mode >> >>>>> >> >> >> >> * and for SDR50 mode when Use Tuning for SDR50 >> is >> >>>>> set >> >>>>> >> in >> >>>>> >> >> >> >> * Capabilities register. >> >>>>> >> >> >> >> + * If the Host Controller supports the HS200 >> mode >> >>>>> then >> >>>>> >> >> tuning >> >>>>> >> >> >> >> + * function has to be executed. >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> if (((ctrl & SDHCI_CTRL_UHS_MASK) == >> >>>>> >> SDHCI_CTRL_UHS_SDR104) >> >>>>> >> >> || >> >>>>> >> >> >> >> (((ctrl & SDHCI_CTRL_UHS_MASK) == >> >>>>> >> SDHCI_CTRL_UHS_SDR50) >> >>>>> >> >> && >> >>>>> >> >> >> >> - (host->flags & SDHCI_SDR50_NEEDS_TUNING))) >> >>>>> >> >> >> >> + (host->flags & SDHCI_SDR50_NEEDS_TUNING)) >> || >> >>>>> >> >> >> >> + (host->flags & SDHCI_HS200_NEEDS_TUNING)) >> >>>>> >> >> >> >> ctrl |= SDHCI_CTRL_EXEC_TUNING; >> >>>>> >> >> >> >> else { >> >>>>> >> >> >> >> spin_unlock(&host->lock); >> >>>>> >> >> >> >> @@ -1733,7 +1737,7 @@ static int >> >>>>> sdhci_execute_tuning(struct >> >>>>> >> >> >> mmc_host >> >>>>> >> >> >> >> *mmc) >> >>>>> >> >> >> >> if (!tuning_loop_counter && !timeout) >> >>>>> >> >> >> >> break; >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> - cmd.opcode = MMC_SEND_TUNING_BLOCK; >> >>>>> >> >> >> >> + cmd.opcode = opcode; >> >>>>> >> >> >> >> cmd.arg = 0; >> >>>>> >> >> >> >> cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; >> >>>>> >> >> >> >> cmd.retries = 0; >> >>>>> >> >> >> >> @@ -1748,7 +1752,17 @@ static int >> >>>>> sdhci_execute_tuning(struct >> >>>>> >> >> >> mmc_host >> >>>>> >> >> >> >> *mmc) >> >>>>> >> >> >> >> * block to the Host Controller. So we >> set >> >>>>> the >> >>>>> >> >> block >> >>>>> >> >> >> size >> >>>>> >> >> >> >> * to 64 here. >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> - sdhci_writew(host, SDHCI_MAKE_BLKSZ(7, >> 64), >> >>>>> >> >> >> >> SDHCI_BLOCK_SIZE); >> >>>>> >> >> >> >> + if (cmd.opcode == >> >>>>> MMC_SEND_TUNING_BLOCK_HS200) { >> >>>>> >> >> >> >> + if (mmc->ios.bus_width == >> >>>>> >> MMC_BUS_WIDTH_8) >> >>>>> >> >> >> >> + sdhci_writew(host, >> >>>>> >> >> SDHCI_MAKE_BLKSZ(7, >> >>>>> >> >> >> 128), >> >>>>> >> >> >> >> + >> >>>>> SDHCI_BLOCK_SIZE); >> >>>>> >> >> >> >> + else if (mmc->ios.bus_width == >> >>>>> >> >> >> MMC_BUS_WIDTH_4) >> >>>>> >> >> >> >> + sdhci_writew(host, >> >>>>> >> >> SDHCI_MAKE_BLKSZ(7, >> >>>>> >> >> >> 64), >> >>>>> >> >> >> >> + >> >>>>> SDHCI_BLOCK_SIZE); >> >>>>> >> >> >> >> + } else { >> >>>>> >> >> >> >> + sdhci_writew(host, >> >>>>> SDHCI_MAKE_BLKSZ(7, >> >>>>> >> 64), >> >>>>> >> >> >> >> + SDHCI_BLOCK_SIZE); >> >>>>> >> >> >> >> + } >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> /* >> >>>>> >> >> >> >> * The tuning block is sent by the card >> to >> >>>>> the >> >>>>> >> host >> >>>>> >> >> >> >> controller. >> >>>>> >> >> >> >> @@ -2131,12 +2145,14 @@ static void >> >>>>> >> sdhci_show_adma_error(struct >> >>>>> >> >> >> >> sdhci_host *host) { } >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> static void sdhci_data_irq(struct sdhci_host *host, >> u32 >> >>>>> >> intmask) >> >>>>> >> >> >> >> { >> >>>>> >> >> >> >> + u32 command; >> >>>>> >> >> >> >> BUG_ON(intmask == 0); >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> /* CMD19 generates _only_ Buffer Read Ready >> interrupt >> >>>>> */ >> >>>>> >> >> >> >> if (intmask & SDHCI_INT_DATA_AVAIL) { >> >>>>> >> >> >> >> - if (SDHCI_GET_CMD(sdhci_readw(host, >> >>>>> >> SDHCI_COMMAND)) >> >>>>> >> >> == >> >>>>> >> >> >> >> - MMC_SEND_TUNING_BLOCK) { >> >>>>> >> >> >> >> + command = >> SDHCI_GET_CMD(sdhci_readw(host, >> >>>>> >> >> >> SDHCI_COMMAND)); >> >>>>> >> >> >> >> + if ((command == MMC_SEND_TUNING_BLOCK) >> || >> >>>>> >> >> >> >> + (command == >> MMC_SEND_TUNING_BLOCK_HS200)) >> >>>>> { >> >>>>> >> >> >> >> host->tuning_done = 1; >> >>>>> >> >> >> >> wake_up(&host->buf_ready_int); >> >>>>> >> >> >> >> return; >> >>>>> >> >> >> >> @@ -2741,6 +2757,10 @@ int sdhci_add_host(struct >> sdhci_host >> >>>>> >> >> *host) >> >>>>> >> >> >> >> if (caps[1] & SDHCI_USE_SDR50_TUNING) >> >>>>> >> >> >> >> host->flags |= >> SDHCI_SDR50_NEEDS_TUNING; >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> + /* Does the host needs tuning for HS200? */ >> >>>>> >> >> >> >> + if (mmc->caps2 & MMC_CAP2_HS200) >> >>>>> >> >> >> >> + host->flags |= >> SDHCI_HS200_NEEDS_TUNING; >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> /* Driver Type(s) (A, C, D) supported by the >> host */ >> >>>>> >> >> >> >> if (caps[1] & SDHCI_DRIVER_TYPE_A) >> >>>>> >> >> >> >> mmc->caps |= MMC_CAP_DRIVER_TYPE_A; >> >>>>> >> >> >> >> diff --git a/include/linux/mmc/card.h >> >>>>> >> b/include/linux/mmc/card.h >> >>>>> >> >> >> >> index 534974c..e76f649 100644 >> >>>>> >> >> >> >> --- a/include/linux/mmc/card.h >> >>>>> >> >> >> >> +++ b/include/linux/mmc/card.h >> >>>>> >> >> >> >> @@ -209,6 +209,7 @@ struct mmc_card { >> >>>>> >> >> >> >> #define MMC_STATE_HIGHSPEED_DDR (1<<4) >> /* >> >>>>> card >> >>>>> >> is >> >>>>> >> >> in >> >>>>> >> >> >> high >> >>>>> >> >> >> >> speed mode */ >> >>>>> >> >> >> >> #define MMC_STATE_ULTRAHIGHSPEED (1<<5) >> /* >> >>>>> card >> >>>>> >> is >> >>>>> >> >> in >> >>>>> >> >> >> ultra >> >>>>> >> >> >> >> high speed mode */ >> >>>>> >> >> >> >> #define MMC_CARD_SDXC (1<<6) >> /* >> >>>>> card >> >>>>> >> is >> >>>>> >> >> >> SDXC */ >> >>>>> >> >> >> >> +#define MMC_STATE_HIGHSPEED_200 (1<<7) /* card >> is in >> >>>>> >> HS200 >> >>>>> >> >> >> >> mode */ >> >>>>> >> >> >> >> unsigned int quirks; /* card >> >>>>> quirks >> >>>>> >> */ >> >>>>> >> >> >> >> #define MMC_QUIRK_LENIENT_FN0 (1<<0) >> /* >> >>>>> allow >> >>>>> >> >> SDIO >> >>>>> >> >> >> FN0 >> >>>>> >> >> >> >> writes outside of the VS CCCR range */ >> >>>>> >> >> >> >> #define MMC_QUIRK_BLKSZ_FOR_BYTE_MODE (1<<1) /* use >> func- >> >>>>> >> >> >> >> >cur_blksize */ >> >>>>> >> >> >> >> @@ -365,6 +366,7 @@ static inline void __maybe_unused >> >>>>> >> >> >> >> remove_quirk(struct mmc_card *card, int data) >> >>>>> >> >> >> >> #define mmc_card_present(c) ((c)->state & >> >>>>> MMC_STATE_PRESENT) >> >>>>> >> >> >> >> #define mmc_card_readonly(c) ((c)->state & >> >>>>> >> MMC_STATE_READONLY) >> >>>>> >> >> >> >> #define mmc_card_highspeed(c) ((c)->state & >> >>>>> >> >> >> MMC_STATE_HIGHSPEED) >> >>>>> >> >> >> >> +#define mmc_card_hs200(c) ((c)->state & >> >>>>> >> >> MMC_STATE_HIGHSPEED_200) >> >>>>> >> >> >> >> #define mmc_card_blockaddr(c) ((c)->state & >> >>>>> >> >> >> MMC_STATE_BLOCKADDR) >> >>>>> >> >> >> >> #define mmc_card_ddr_mode(c) ((c)->state & >> >>>>> >> >> MMC_STATE_HIGHSPEED_DDR) >> >>>>> >> >> >> >> #define mmc_card_uhs(c) ((c)->state & >> >>>>> >> >> >> >> MMC_STATE_ULTRAHIGHSPEED) >> >>>>> >> >> >> >> @@ -374,6 +376,7 @@ static inline void __maybe_unused >> >>>>> >> >> >> >> remove_quirk(struct mmc_card *card, int data) >> >>>>> >> >> >> >> #define mmc_card_set_present(c) ((c)->state |= >> >>>>> >> >> >> MMC_STATE_PRESENT) >> >>>>> >> >> >> >> #define mmc_card_set_readonly(c) ((c)->state |= >> >>>>> >> >> MMC_STATE_READONLY) >> >>>>> >> >> >> >> #define mmc_card_set_highspeed(c) ((c)->state |= >> >>>>> >> >> >> MMC_STATE_HIGHSPEED) >> >>>>> >> >> >> >> +#define mmc_card_set_hs200(c) ((c)->state |= >> >>>>> >> >> >> >> MMC_STATE_HIGHSPEED_200) >> >>>>> >> >> >> >> #define mmc_card_set_blockaddr(c) ((c)->state |= >> >>>>> >> >> >> MMC_STATE_BLOCKADDR) >> >>>>> >> >> >> >> #define mmc_card_set_ddr_mode(c) ((c)->state |= >> >>>>> >> >> >> >> MMC_STATE_HIGHSPEED_DDR) >> >>>>> >> >> >> >> #define mmc_card_set_uhs(c) ((c)->state |= >> >>>>> >> >> >> MMC_STATE_ULTRAHIGHSPEED) >> >>>>> >> >> >> >> diff --git a/include/linux/mmc/host.h >> >>>>> >> b/include/linux/mmc/host.h >> >>>>> >> >> >> >> index 706f722..5eac57a 100644 >> >>>>> >> >> >> >> --- a/include/linux/mmc/host.h >> >>>>> >> >> >> >> +++ b/include/linux/mmc/host.h >> >>>>> >> >> >> >> @@ -50,6 +50,7 @@ struct mmc_ios { >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> #define MMC_TIMING_LEGACY 0 >> >>>>> >> >> >> >> #define MMC_TIMING_MMC_HS 1 >> >>>>> >> >> >> >> +#define MMC_TIMING_MMC_HS200 2 >> >>>>> >> >> >> >> #define MMC_TIMING_SD_HS 2 >> >>>>> >> >> >> >> #define MMC_TIMING_UHS_SDR12 MMC_TIMING_LEGACY >> >>>>> >> >> >> >> #define MMC_TIMING_UHS_SDR25 MMC_TIMING_SD_HS >> >>>>> >> >> >> >> @@ -60,6 +61,8 @@ struct mmc_ios { >> >>>>> >> >> >> >> #define MMC_SDR_MODE 0 >> >>>>> >> >> >> >> #define MMC_1_2V_DDR_MODE 1 >> >>>>> >> >> >> >> #define MMC_1_8V_DDR_MODE 2 >> >>>>> >> >> >> >> +#define MMC_1_2V_SDR_MODE 3 >> >>>>> >> >> >> >> +#define MMC_1_8V_SDR_MODE 4 >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> unsigned char signal_voltage; /* >> signalling >> >>>>> >> >> voltage >> >>>>> >> >> >> >> (1.8V or 3.3V) */ >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> @@ -148,7 +151,9 @@ struct mmc_host_ops { >> >>>>> >> >> >> >> void (*init_card)(struct mmc_host *host, >> struct >> >>>>> >> mmc_card >> >>>>> >> >> >> *card); >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> int (*start_signal_voltage_switch)(struct >> >>>>> mmc_host >> >>>>> >> >> *host, >> >>>>> >> >> >> >> struct mmc_ios *ios); >> >>>>> >> >> >> >> - int (*execute_tuning)(struct mmc_host >> *host); >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> + /* The tuning command opcode value is different >> for >> >>>>> SD >> >>>>> >> and >> >>>>> >> >> >> eMMC >> >>>>> >> >> >> >> cards */ >> >>>>> >> >> >> >> + int (*execute_tuning)(struct mmc_host >> *host, u32 >> >>>>> >> >> opcode); >> >>>>> >> >> >> >> void (*enable_preset_value)(struct mmc_host >> *host, >> >>>>> >> bool >> >>>>> >> >> >> enable); >> >>>>> >> >> >> >> int (*select_drive_strength)(unsigned int >> >>>>> max_dtr, >> >>>>> >> int >> >>>>> >> >> >> >> host_drv, int card_drv); >> >>>>> >> >> >> >> void (*hw_reset)(struct mmc_host *host); >> >>>>> >> >> >> >> @@ -242,6 +247,10 @@ struct mmc_host { >> >>>>> >> >> >> >> #define MMC_CAP2_CACHE_CTRL (1 << 1) /* >> Allow >> >>>>> cache >> >>>>> >> >> control >> >>>>> >> >> >> */ >> >>>>> >> >> >> >> #define MMC_CAP2_POWEROFF_NOTIFY (1 << 2) /* >> Notify >> >>>>> >> poweroff >> >>>>> >> >> >> >> supported */ >> >>>>> >> >> >> >> #define MMC_CAP2_NO_MULTI_READ (1 << 3) >> /* >> >>>>> >> >> Multiblock >> >>>>> >> >> >> reads >> >>>>> >> >> >> >> don't work */ >> >>>>> >> >> >> >> +#define MMC_CAP2_HS200_1_8V_SDR (1 << 4) >> /* >> >>>>> can >> >>>>> >> >> support >> >>>>> >> >> >> */ >> >>>>> >> >> >> >> +#define MMC_CAP2_HS200_1_2V_SDR (1 << 5) >> /* >> >>>>> can >> >>>>> >> >> support >> >>>>> >> >> >> */ >> >>>>> >> >> >> >> +#define MMC_CAP2_HS200 >> >>>>> (MMC_CAP2_HS200_1_8V_SDR >> >>>>> >> | >> >>>>> >> >> \ >> >>>>> >> >> >> >> + >> MMC_CAP2_HS200_1_2V_SDR) >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> mmc_pm_flag_t pm_caps; /* >> supported >> >>>>> pm >> >>>>> >> >> >> features */ >> >>>>> >> >> >> >> unsigned int power_notify_type; >> >>>>> >> >> >> >> diff --git a/include/linux/mmc/mmc.h >> >>>>> b/include/linux/mmc/mmc.h >> >>>>> >> >> >> >> index 0e71356..7996272 100644 >> >>>>> >> >> >> >> --- a/include/linux/mmc/mmc.h >> >>>>> >> >> >> >> +++ b/include/linux/mmc/mmc.h >> >>>>> >> >> >> >> @@ -51,6 +51,7 @@ >> >>>>> >> >> >> >> #define MMC_READ_SINGLE_BLOCK 17 /* adtc [31:0] >> data >> >>>>> >> addr >> >>>>> >> >> R1 >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> #define MMC_READ_MULTIPLE_BLOCK 18 /* adtc [31:0] >> data >> >>>>> >> addr >> >>>>> >> >> R1 >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> #define MMC_SEND_TUNING_BLOCK 19 /* adtc >> >>>>> >> >> R1 >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> +#define MMC_SEND_TUNING_BLOCK_HS200 21 /* adtc >> R1 >> >>>>> */ >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> /* class 3 */ >> >>>>> >> >> >> >> #define MMC_WRITE_DAT_UNTIL_STOP 20 /* adtc [31:0] >> data >> >>>>> >> addr >> >>>>> >> >> R1 >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> @@ -333,13 +334,76 @@ struct _mmc_csd { >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> #define EXT_CSD_CARD_TYPE_26 (1<<0) /* Card can run >> at >> >>>>> 26MHz >> >>>>> >> */ >> >>>>> >> >> >> >> #define EXT_CSD_CARD_TYPE_52 (1<<1) /* Card can run >> at >> >>>>> 52MHz >> >>>>> >> */ >> >>>>> >> >> >> >> -#define EXT_CSD_CARD_TYPE_MASK 0xF /* Mask >> out >> >>>>> >> >> reserved >> >>>>> >> >> >> bits */ >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_MASK 0x3F /* Mask >> out >> >>>>> >> >> reserved >> >>>>> >> >> >> bits */ >> >>>>> >> >> >> >> #define EXT_CSD_CARD_TYPE_DDR_1_8V (1<<2) /* Card >> can >> >>>>> run >> >>>>> >> at >> >>>>> >> >> >> 52MHz >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> /* DDR >> mode >> >>>>> @1.8V >> >>>>> >> or >> >>>>> >> >> 3V >> >>>>> >> >> >> I/O */ >> >>>>> >> >> >> >> #define EXT_CSD_CARD_TYPE_DDR_1_2V (1<<3) /* Card >> can >> >>>>> run >> >>>>> >> at >> >>>>> >> >> >> 52MHz >> >>>>> >> >> >> >> */ >> >>>>> >> >> >> >> /* DDR >> mode >> >>>>> @1.2V >> >>>>> >> I/O >> >>>>> >> >> */ >> >>>>> >> >> >> >> #define EXT_CSD_CARD_TYPE_DDR_52 >> >>>>> >> >> (EXT_CSD_CARD_TYPE_DDR_1_8V >> >>>>> >> >> >> \ >> >>>>> >> >> >> >> | >> >>>>> >> >> EXT_CSD_CARD_TYPE_DDR_1_2V) >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_8V (1<<4) /* Card >> can >> >>>>> run >> >>>>> >> at >> >>>>> >> >> >> >> 200MHz */ >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_2V (1<<5) /* Card >> can >> >>>>> run >> >>>>> >> at >> >>>>> >> >> >> >> 200MHz */ >> >>>>> >> >> >> >> + /* SDR >> mode >> >>>>> >> @1.2V >> >>>>> >> >> I/O >> >>>>> >> >> >> */ >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_200 >> >>>>> >> (EXT_CSD_CARD_TYPE_SDR_1_8V >> >>>>> >> >> >> \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_SDR_1_2V) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_ALL >> >>>>> >> (EXT_CSD_CARD_TYPE_SDR_200 >> >>>>> >> >> >> \ >> >>>>> >> >> >> >> + | >> >>>>> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> \ >> >>>>> >> >> >> >> + | >> >>>>> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_2V_ALL >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_1_2V \ >> >>>>> >> >> >> >> + | >> >>>>> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> \ >> >>>>> >> >> >> >> + | >> >>>>> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_8V_ALL >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_1_8V \ >> >>>>> >> >> >> >> + | >> >>>>> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> \ >> >>>>> >> >> >> >> + | >> >>>>> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_8V >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_1_2V \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_1_8V >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_8V >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_1_8V \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_1_8V >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_1_2V >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_1_2V \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_1_2V >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_1_2V >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_1_8V \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_1_2V >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_2V_DDR_52 >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_1_2V \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_1_8V_DDR_52 >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_1_8V \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_8V >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_200 \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_1_8V >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_1_2V >> >>>>> >> >> >> >> (EXT_CSD_CARD_TYPE_SDR_200 \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_1_2V >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> + >> >>>>> >> >> >> >> +#define EXT_CSD_CARD_TYPE_SDR_ALL_DDR_52 >> >>>>> >> >> >> (EXT_CSD_CARD_TYPE_SDR_200 >> >>>>> >> >> >> >> \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_DDR_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> EXT_CSD_CARD_TYPE_52 >> >>>>> >> >> >> > \ >> >>>>> >> >> >> >> + | >> >>>>> >> >> >> EXT_CSD_CARD_TYPE_26) >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> #define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 >> bit >> >>>>> mode >> >>>>> >> */ >> >>>>> >> >> >> >> #define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 >> bit >> >>>>> mode >> >>>>> >> */ >> >>>>> >> >> >> >> diff --git a/include/linux/mmc/sdhci.h >> >>>>> >> >> b/include/linux/mmc/sdhci.h >> >>>>> >> >> >> >> index e4b6935..d9a2222 100644 >> >>>>> >> >> >> >> --- a/include/linux/mmc/sdhci.h >> >>>>> >> >> >> >> +++ b/include/linux/mmc/sdhci.h >> >>>>> >> >> >> >> @@ -121,6 +121,7 @@ struct sdhci_host { >> >>>>> >> >> >> >> #define SDHCI_AUTO_CMD23 (1<<7) /* Auto CMD23 >> support >> >>>>> */ >> >>>>> >> >> >> >> #define SDHCI_PV_ENABLED (1<<8) /* Preset value >> >>>>> enabled >> >>>>> >> */ >> >>>>> >> >> >> >> #define SDHCI_SDIO_IRQ_ENABLED (1<<9) /* SDIO >> irq >> >>>>> >> enabled >> >>>>> >> >> */ >> >>>>> >> >> >> >> +#define SDHCI_HS200_NEEDS_TUNING (1<<10) /* >> HS200 >> >>>>> needs >> >>>>> >> >> tuning >> >>>>> >> >> >> */ >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> unsigned int version; /* SDHCI spec. version >> */ >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> -- >> >>>>> >> >> >> >> 1.7.1 >> >>>>> >> >> >> >> >> >>>>> >> >> >> >> -- >> >>>>> >> >> >> >> To unsubscribe from this list: send the line >> "unsubscribe >> >>>>> >> linux- >> >>>>> >> >> mmc" >> >>>>> >> >> >> in >> >>>>> >> >> >> >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> >>>>> >> >> >> >> More majordomo info at >> http://vger.kernel.org/majordomo- >> >>>>> >> >> info.html >> >>>>> >> >> >> > >> >>>>> >> >> >> > -- >> >>>>> >> >> >> > To unsubscribe from this list: send the line >> "unsubscribe >> >>>>> >> linux- >> >>>>> >> >> mmc" >> >>>>> >> >> >> in >> >>>>> >> >> >> > the body of a message to majordomo@xxxxxxxxxxxxxxx >> >>>>> >> >> >> > More majordomo info at >> http://vger.kernel.org/majordomo- >> >>>>> >> info.html >> >>>>> >> >> >> > >> >>>>> >> >> >> -- >> >>>>> >> >> >> To unsubscribe from this list: send the line >> "unsubscribe >> >>>>> linux- >> >>>>> >> mmc" >> >>>>> >> >> in >> >>>>> >> >> >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> >>>>> >> >> >> More majordomo info at >> http://vger.kernel.org/majordomo- >> >>>>> >> info.html >> >>>>> >> >> > >> >>>>> >> >> -- >> >>>>> >> >> To unsubscribe from this list: send the line "unsubscribe >> linux- >> >>>>> mmc" >> >>>>> >> in >> >>>>> >> >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> >>>>> >> >> More majordomo info at http://vger.kernel.org/majordomo- >> >>>>> info.html >> >>>>> >> > >> >>>>> > >> >>>> >> >>>> -- >> >>>> To unsubscribe from this list: send the line "unsubscribe linux- >> mmc" in >> >>>> the body of a message to majordomo@xxxxxxxxxxxxxxx >> >>>> More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html