On 14 March 2014 03:49, Seungwon Jeon <tgih.jun@xxxxxxxxxxx> wrote: > On Thu, March 13, 2014, Ulf Hansson wrote: >> On 7 March 2014 15:36, Seungwon Jeon <tgih.jun@xxxxxxxxxxx> wrote: >> > Power class is changed once only after selection of bus modes >> > including speed and bus-width finishes finally. >> > >> > Signed-off-by: Seungwon Jeon <tgih.jun@xxxxxxxxxxx> >> > --- >> > Changes in v2: >> > Cleaned up some unnecessary codes. >> > >> > drivers/mmc/core/mmc.c | 94 +++++++++++++++++++++++++++-------------------- >> > 1 files changed, 54 insertions(+), 40 deletions(-) >> > >> > diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c >> > index 0abece0..88ff217 100644 >> > --- a/drivers/mmc/core/mmc.c >> > +++ b/drivers/mmc/core/mmc.c >> > @@ -737,17 +737,13 @@ static inline unsigned int mmc_snoop_ddr(struct mmc_card *card) >> > * extended CSD register, select it by executing the >> > * mmc_switch command. >> > */ >> > -static int mmc_select_powerclass(struct mmc_card *card, >> > - unsigned int bus_width) >> > +static int __mmc_select_powerclass(struct mmc_card *card, >> > + unsigned int bus_width) >> > { >> > int err = 0; >> > unsigned int pwrclass_val = 0; >> > - struct mmc_host *host; >> > - >> > - BUG_ON(!card); >> > - >> > - host = card->host; >> > - BUG_ON(!host); >> > + struct mmc_host *host = card->host; >> > + struct mmc_ext_csd *ext_csd = &card->ext_csd; >> > >> > /* Power class selection is supported for versions >= 4.0 */ >> > if (card->csd.mmca_vsn < CSD_SPEC_VER_4) >> > @@ -759,14 +755,14 @@ static int mmc_select_powerclass(struct mmc_card *card, >> > >> > switch (1 << host->ios.vdd) { >> > case MMC_VDD_165_195: >> > - if (host->ios.clock <= 26000000) >> > - pwrclass_val = card->ext_csd.raw_pwr_cl_26_195; >> > - else if (host->ios.clock <= 52000000) >> > + if (host->ios.clock <= MMC_HIGH_26_MAX_DTR) >> > + pwrclass_val = ext_csd->raw_pwr_cl_26_195; >> > + else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR) >> > pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ? >> > - card->ext_csd.raw_pwr_cl_52_195 : >> > - card->ext_csd.raw_pwr_cl_ddr_52_195; >> > - else if (host->ios.clock <= 200000000) >> > - pwrclass_val = card->ext_csd.raw_pwr_cl_200_195; >> > + ext_csd->raw_pwr_cl_52_195 : >> > + ext_csd->raw_pwr_cl_ddr_52_195; >> > + else if (host->ios.clock <= MMC_HS200_MAX_DTR) >> > + pwrclass_val = ext_csd->raw_pwr_cl_200_195; >> > break; >> > case MMC_VDD_27_28: >> > case MMC_VDD_28_29: >> > @@ -777,14 +773,14 @@ static int mmc_select_powerclass(struct mmc_card *card, >> > case MMC_VDD_33_34: >> > case MMC_VDD_34_35: >> > case MMC_VDD_35_36: >> > - if (host->ios.clock <= 26000000) >> > - pwrclass_val = card->ext_csd.raw_pwr_cl_26_360; >> > - else if (host->ios.clock <= 52000000) >> > + if (host->ios.clock <= MMC_HIGH_26_MAX_DTR) >> > + pwrclass_val = ext_csd->raw_pwr_cl_26_360; >> > + else if (host->ios.clock <= MMC_HIGH_52_MAX_DTR) >> > pwrclass_val = (bus_width <= EXT_CSD_BUS_WIDTH_8) ? >> > - card->ext_csd.raw_pwr_cl_52_360 : >> > - card->ext_csd.raw_pwr_cl_ddr_52_360; >> > - else if (host->ios.clock <= 200000000) >> > - pwrclass_val = card->ext_csd.raw_pwr_cl_200_360; >> > + ext_csd->raw_pwr_cl_52_360 : >> > + ext_csd->raw_pwr_cl_ddr_52_360; >> > + else if (host->ios.clock <= MMC_HS200_MAX_DTR) >> > + pwrclass_val = ext_csd->raw_pwr_cl_200_360; >> > break; >> > default: >> > pr_warning("%s: Voltage range not supported " >> > @@ -810,6 +806,37 @@ static int mmc_select_powerclass(struct mmc_card *card, >> > return err; >> > } >> > >> > +static int mmc_select_powerclass(struct mmc_card *card) >> > +{ >> > + int err, ddr; >> > + u32 bus_width, ext_csd_bits; >> > + struct mmc_host *host = card->host; >> > + >> > + /* Power class selection is supported for versions >= 4.0 */ >> > + if (card->csd.mmca_vsn < CSD_SPEC_VER_4) >> > + return 0; >> > + >> > + bus_width = host->ios.bus_width; >> > + /* Power class values are defined only for 4/8 bit bus */ >> > + if (bus_width == MMC_BUS_WIDTH_1) >> > + return 0; >> > + >> > + ddr = mmc_snoop_ddr(card); >> > + if (ddr) >> > + ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? >> > + EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4; >> > + else >> > + ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? >> > + EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4; >> > + >> > + err = __mmc_select_powerclass(card, ext_csd_bits); >> > + if (err) >> > + pr_warn("%s: power class selection to bus width %d ddr %d failed\n", >> > + mmc_hostname(host), 1 << bus_width, ddr); >> > + >> > + return err; >> > +} >> > + >> > /* >> > * Selects the desired buswidth and switch to the HS200 mode >> > * if bus width set without error >> > @@ -1171,11 +1198,6 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, >> > >> > ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? >> > EXT_CSD_BUS_WIDTH_8 : EXT_CSD_BUS_WIDTH_4; >> > - err = mmc_select_powerclass(card, ext_csd_bits); >> > - if (err) >> > - pr_warning("%s: power class selection to bus width %d" >> > - " failed\n", mmc_hostname(card->host), >> > - 1 << bus_width); >> > } >> > >> > /* >> > @@ -1204,12 +1226,6 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, >> > bus_width = bus_widths[idx]; >> > if (bus_width == MMC_BUS_WIDTH_1) >> > ddr = 0; /* no DDR for 1-bit width */ >> > - err = mmc_select_powerclass(card, ext_csd_bits[idx][0]); >> > - if (err) >> > - pr_warning("%s: power class selection to " >> > - "bus width %d failed\n", >> > - mmc_hostname(card->host), >> > - 1 << bus_width); >> > >> > err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, >> > EXT_CSD_BUS_WIDTH, >> > @@ -1234,13 +1250,6 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, >> > } >> > >> > if (!err && ddr) { >> > - err = mmc_select_powerclass(card, ext_csd_bits[idx][1]); >> > - if (err) >> > - pr_warning("%s: power class selection to " >> > - "bus width %d ddr %d failed\n", >> > - mmc_hostname(card->host), >> > - 1 << bus_width, ddr); >> > - >> > err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, >> > EXT_CSD_BUS_WIDTH, >> > ext_csd_bits[idx][1], >> > @@ -1278,6 +1287,11 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, >> > } >> > >> > /* >> > + * Choose the power calss with selected bus interface >> >> One line of comment is enough. >> >> "calss" -> "class". > OK. > >> >> > + */ >> > + mmc_select_powerclass(card); >> > + >> > + /* >> > * Enable HPI feature (if supported) >> > */ >> > if (card->ext_csd.hpi) { >> > -- >> > 1.7.0.4 >> > >> > >> >> You should run checkpatch as well. > It think there was no warning & error in 3/5. > Ok. Let me check more. > You are right, this patch didn't have checkpatch warnings or errors, but some of the other in this patchset had. Sorry. Kind regards Ulf Hansson >> >> Besides these minor things, looks good - nice clean up! > > Thanks, > Seungwon Jeon >> >> Kind regards >> Ulf Hansson > -- 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