From 1552831f45afb45e6931764a225d9cb7e1ca3816 Mon Sep 17 00:00:00 2001 From: Pantelis Antoniou Date: Mon, 21 Jan 2013 17:05:47 +0200 Subject: [PATCH] emmc wip save --- arch/arm/boot/dts/am335x-bone-common.dtsi | 10 +- arch/arm/boot/dts/am33xx.dtsi | 1 + drivers/mmc/card/block.c | 4 + drivers/mmc/core/core.c | 107 ++++++++++++++++++---- drivers/mmc/core/mmc.c | 66 ++++++++++--- drivers/mmc/core/mmc_ops.c | 13 ++- drivers/mmc/host/omap_hsmmc.c | 37 +++++++- include/linux/mmc/core.h | 2 + 8 files changed, 202 insertions(+), 38 deletions(-) diff --git a/arch/arm/boot/dts/am335x-bone-common.dtsi b/arch/arm/boot/dts/am335x-bone-common.dtsi index fd01fb81a8b471..89261f12a3d06a 100644 --- a/arch/arm/boot/dts/am335x-bone-common.dtsi +++ b/arch/arm/boot/dts/am335x-bone-common.dtsi @@ -338,9 +338,17 @@ }; &mmc1 { - status = "okay"; + // status = "okay"; + status = "disabled"; + vmmc-supply = <&ldo3_reg>; + ti,vcc-aux-disable-is-sleep; +}; + +&mmc2 { + // status = "okay"; vmmc-supply = <&ldo3_reg>; ti,vcc-aux-disable-is-sleep; + ti,non-removable; }; &edma { diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi index 653f9b2fe8e8c5..1a54486c5ce65a 100644 --- a/arch/arm/boot/dts/am33xx.dtsi +++ b/arch/arm/boot/dts/am33xx.dtsi @@ -536,6 +536,7 @@ */ interrupts = <40 41 42 43>; ranges; + disable-napi; davinci_mdio: mdio@4a101000 { compatible = "ti,davinci_mdio"; diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 21056b9ef0a0f9..a0be436696d8d4 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -799,6 +799,10 @@ static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req, */ if (R1_CURRENT_STATE(status) == R1_STATE_DATA || R1_CURRENT_STATE(status) == R1_STATE_RCV) { + + pr_info("%s: %s: Sending %s\n", mmc_hostname(card->host), __func__, + mmc_opcode_txt(MMC_STOP_TRANSMISSION)); + err = send_stop(card, &stop_status); if (err) pr_err("%s: error %d sending stop command\n", diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index aaed7687cf094f..bc22b6e504c48c 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -79,6 +79,61 @@ MODULE_PARM_DESC( removable, "MMC/SD cards are removable and may be removed during suspend"); + +#define MMC_OP_TXT(_x) [MMC_ ## _x ] = "MMC_" # _x + +static const char *opcode_txt[] = { + MMC_OP_TXT(GO_IDLE_STATE), + MMC_OP_TXT(SEND_OP_COND), + MMC_OP_TXT(ALL_SEND_CID), + MMC_OP_TXT(SET_RELATIVE_ADDR), + MMC_OP_TXT(SET_DSR), + MMC_OP_TXT(SLEEP_AWAKE), + MMC_OP_TXT(SWITCH), + MMC_OP_TXT(SELECT_CARD), + MMC_OP_TXT(SEND_EXT_CSD), + MMC_OP_TXT(SEND_CSD), + MMC_OP_TXT(SEND_CID), + MMC_OP_TXT(READ_DAT_UNTIL_STOP), + MMC_OP_TXT(STOP_TRANSMISSION), + MMC_OP_TXT(SEND_STATUS), + MMC_OP_TXT(BUS_TEST_R), + MMC_OP_TXT(GO_INACTIVE_STATE), + MMC_OP_TXT(BUS_TEST_W), + MMC_OP_TXT(SPI_READ_OCR), + MMC_OP_TXT(SPI_CRC_ON_OFF), + MMC_OP_TXT(SET_BLOCKLEN), + MMC_OP_TXT(READ_SINGLE_BLOCK), + MMC_OP_TXT(READ_MULTIPLE_BLOCK), + MMC_OP_TXT(SEND_TUNING_BLOCK), + MMC_OP_TXT(SEND_TUNING_BLOCK_HS200), + MMC_OP_TXT(WRITE_DAT_UNTIL_STOP), + MMC_OP_TXT(SET_BLOCK_COUNT), + MMC_OP_TXT(WRITE_BLOCK), + MMC_OP_TXT(WRITE_MULTIPLE_BLOCK), + MMC_OP_TXT(PROGRAM_CID), + MMC_OP_TXT(PROGRAM_CSD), + MMC_OP_TXT(SET_WRITE_PROT), + MMC_OP_TXT(CLR_WRITE_PROT), + MMC_OP_TXT(SEND_WRITE_PROT), + MMC_OP_TXT(ERASE_GROUP_START), + MMC_OP_TXT(ERASE_GROUP_END), + MMC_OP_TXT(ERASE), + MMC_OP_TXT(FAST_IO), + MMC_OP_TXT(GO_IRQ_STATE), + MMC_OP_TXT(LOCK_UNLOCK), + MMC_OP_TXT(APP_CMD), + MMC_OP_TXT(GEN_CMD) +}; + +const char *mmc_opcode_txt(int opcode) +{ + if ((unsigned int)opcode >= ARRAY_SIZE(opcode_txt)) + return "*UNKNOWN*"; + return opcode_txt[opcode]; +} + + /* * Internal function. Schedule delayed work in the MMC work queue. */ @@ -163,8 +218,10 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq) led_trigger_event(host->led, LED_OFF); - pr_debug("%s: req done (CMD%u): %d: %08x %08x %08x %08x\n", - mmc_hostname(host), cmd->opcode, err, + pr_debug("%s: req done (CMD%u - %s): %d: %08x %08x %08x %08x\n", + mmc_hostname(host), + cmd->opcode, mmc_opcode_txt(cmd->opcode), + err, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); @@ -175,8 +232,9 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq) } if (mrq->stop) { - pr_debug("%s: (CMD%u): %d: %08x %08x %08x %08x\n", - mmc_hostname(host), mrq->stop->opcode, + pr_debug("%s: (CMD%u - %s): %d: %08x %08x %08x %08x\n", + mmc_hostname(host), + mrq->stop->opcode, mmc_opcode_txt(mrq->stop->opcode), mrq->stop->error, mrq->stop->resp[0], mrq->stop->resp[1], mrq->stop->resp[2], mrq->stop->resp[3]); @@ -200,13 +258,15 @@ mmc_start_request(struct mmc_host *host, struct mmc_request *mrq) #endif if (mrq->sbc) { - pr_debug("<%s: starting CMD%u arg %08x flags %08x>\n", - mmc_hostname(host), mrq->sbc->opcode, + pr_debug("<%s: starting CMD%u - %s arg %08x flags %08x>\n", + mmc_hostname(host), + mrq->sbc->opcode, mmc_opcode_txt(mrq->sbc->opcode), mrq->sbc->arg, mrq->sbc->flags); } - pr_debug("%s: starting CMD%u arg %08x flags %08x\n", - mmc_hostname(host), mrq->cmd->opcode, + pr_debug("%s: starting CMD%u - %s arg %08x flags %08x\n", + mmc_hostname(host), + mrq->cmd->opcode, mmc_opcode_txt(mrq->cmd->opcode), mrq->cmd->arg, mrq->cmd->flags); if (mrq->data) { @@ -219,8 +279,9 @@ mmc_start_request(struct mmc_host *host, struct mmc_request *mrq) } if (mrq->stop) { - pr_debug("%s: CMD%u arg %08x flags %08x\n", - mmc_hostname(host), mrq->stop->opcode, + pr_debug("%s: CMD%u - %s arg %08x flags %08x\n", + mmc_hostname(host), + mrq->stop->opcode, mmc_opcode_txt(mrq->stop->opcode), mrq->stop->arg, mrq->stop->flags); } @@ -300,7 +361,7 @@ void mmc_start_bkops(struct mmc_card *card, bool from_exception) } err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_BKOPS_START, 1, timeout, use_busy_signal); + EXT_CSD_BKOPS_START, 1, timeout + 1000000, use_busy_signal); if (err) { pr_warn("%s: Error %d starting bkops\n", mmc_hostname(card->host), err); @@ -350,8 +411,9 @@ static void mmc_wait_for_req_done(struct mmc_host *host, mmc_card_removed(host->card)) break; - pr_debug("%s: req failed (CMD%u): %d, retrying...\n", - mmc_hostname(host), cmd->opcode, cmd->error); + pr_debug("%s: req failed (CMD%u - %s): %d, retrying...\n", + mmc_hostname(host), cmd->opcode, + mmc_opcode_txt(cmd->opcode), cmd->error); cmd->retries--; cmd->error = 0; host->ops->request(host, mrq); @@ -1236,8 +1298,10 @@ int mmc_set_signal_voltage(struct mmc_host *host, int signal_voltage, bool cmd11 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; err = mmc_wait_for_cmd(host, &cmd, 0); - if (err) + if (err) { + WARN_ON(err != 0); return err; + } if (!mmc_host_is_spi(host) && (cmd.resp[0] & R1_ERROR)) return -EIO; @@ -1947,6 +2011,7 @@ EXPORT_SYMBOL(mmc_calc_max_discard); int mmc_set_blocklen(struct mmc_card *card, unsigned int blocklen) { struct mmc_command cmd = {0}; + int ret; if (mmc_card_blockaddr(card) || mmc_card_ddr_mode(card)) return 0; @@ -1954,7 +2019,9 @@ int mmc_set_blocklen(struct mmc_card *card, unsigned int blocklen) cmd.opcode = MMC_SET_BLOCKLEN; cmd.arg = blocklen; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; - return mmc_wait_for_cmd(card->host, &cmd, 5); + ret = mmc_wait_for_cmd(card->host, &cmd, 5); + WARN_ON(ret != 0); + return ret; } EXPORT_SYMBOL(mmc_set_blocklen); @@ -1962,13 +2029,16 @@ int mmc_set_blockcount(struct mmc_card *card, unsigned int blockcount, bool is_rel_write) { struct mmc_command cmd = {0}; + int ret; cmd.opcode = MMC_SET_BLOCK_COUNT; cmd.arg = blockcount & 0x0000FFFF; if (is_rel_write) cmd.arg |= 1 << 31; cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; - return mmc_wait_for_cmd(card->host, &cmd, 5); + ret = mmc_wait_for_cmd(card->host, &cmd, 5); + WARN_ON(ret != 0); + return ret; } EXPORT_SYMBOL(mmc_set_blockcount); @@ -2026,6 +2096,7 @@ static int mmc_do_hw_reset(struct mmc_host *host, int check) cmd.flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_AC; err = mmc_wait_for_cmd(card->host, &cmd, 0); if (!err) { + WARN_ON(err != 0); mmc_host_clk_release(host); return -ENOSYS; } @@ -2374,7 +2445,7 @@ int mmc_flush_cache(struct mmc_card *card) (card->ext_csd.cache_size > 0) && (card->ext_csd.cache_ctrl & 1)) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_FLUSH_CACHE, 1, 0); + EXT_CSD_FLUSH_CACHE, 1, 0 + 1000000); if (err) pr_err("%s: cache flush error %d\n", mmc_hostname(card->host), err); @@ -2407,7 +2478,7 @@ int mmc_cache_ctrl(struct mmc_host *host, u8 enable) if (card->ext_csd.cache_ctrl ^ enable) { timeout = enable ? card->ext_csd.generic_cmd6_time : 0; err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_CACHE_CTRL, enable, timeout); + EXT_CSD_CACHE_CTRL, enable, timeout + 1000000); if (err) pr_err("%s: cache %s error %d\n", mmc_hostname(card->host), diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index e6e39111e05b41..a7112e11ea8571 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -270,7 +270,7 @@ static void mmc_select_card_type(struct mmc_card *card) */ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) { - int err = 0, idx; + int err = 0, idx, gp_cnt; unsigned int part_size; u8 hc_erase_grp_sz = 0, hc_wp_grp_sz = 0; @@ -299,6 +299,8 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) goto out; } + pr_info("%s: EXT_CSD_REV=%d\n", mmc_hostname(card->host), card->ext_csd.rev); + card->ext_csd.raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; card->ext_csd.raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; card->ext_csd.raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; @@ -327,6 +329,10 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) u8 sa_shift = ext_csd[EXT_CSD_S_A_TIMEOUT]; card->ext_csd.part_config = ext_csd[EXT_CSD_PART_CONFIG]; + pr_info("%s: EXT_CSD_PART_CONFIG=0x%02x\n", + mmc_hostname(card->host), + (unsigned int)ext_csd[EXT_CSD_PART_CONFIG] & 0xff); + /* EXT_CSD value is in units of 10ms, but we store in ms */ card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; @@ -369,6 +375,31 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.raw_trim_mult = ext_csd[EXT_CSD_TRIM_MULT]; if (card->ext_csd.rev >= 4) { + + pr_info("%s: EXT_CSD_PARTITION_SUPPORT=0x%02x\n", + mmc_hostname(card->host), + (unsigned int)ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0xff); + pr_info("%s: EXT_CSD_PARTITION_ATTRIBUTE=0x%02x\n", + mmc_hostname(card->host), + (unsigned int)ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0xff); + pr_info("%s: EXT_CSD_HC_ERASE_GRP_SIZE=0x%02x\n", + mmc_hostname(card->host), + (unsigned int)ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] & 0xff); + pr_info("%s: EXT_CSD_HC_WP_GRP_SIZE=0x%02x\n", + mmc_hostname(card->host), + (unsigned int)ext_csd[EXT_CSD_HC_WP_GRP_SIZE] & 0xff); + pr_info("%s: EXT-offset=0x%02x%02x%02x%02x\n", + mmc_hostname(card->host), + (unsigned int)ext_csd[139] & 0xff, + (unsigned int)ext_csd[138] & 0xff, + (unsigned int)ext_csd[137] & 0xff, + (unsigned int)ext_csd[136] & 0xff); + pr_info("%s: EXT-size=0x%02x%02x%02x\n", + mmc_hostname(card->host), + (unsigned int)ext_csd[142] & 0xff, + (unsigned int)ext_csd[141] & 0xff, + (unsigned int)ext_csd[140] & 0xff); + /* * Enhanced area feature support -- check whether the eMMC * card has the Enhanced area enabled. If so, export enhanced @@ -400,6 +431,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) card->ext_csd.enhanced_area_size *= (size_t)(hc_erase_grp_sz * hc_wp_grp_sz); card->ext_csd.enhanced_area_size <<= 9; + } else { /* * If the enhanced area is not enabled, disable these @@ -422,9 +454,10 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) hc_wp_grp_sz = ext_csd[EXT_CSD_HC_WP_GRP_SIZE]; - card->ext_csd.enhanced_area_en = 1; } + gp_cnt = 0; + for (idx = 0; idx < MMC_NUM_GP_PARTITION; idx++) { if (!ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3] && !ext_csd[EXT_CSD_GP_SIZE_MULT + idx * 3 + 1] && @@ -442,6 +475,13 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) EXT_CSD_PART_CONFIG_ACC_GP0 + idx, "gp%d", idx, false, MMC_BLK_DATA_AREA_GP); + gp_cnt++; + } + if (gp_cnt > 0) { + card->ext_csd.enhanced_area_en = 1; + + pr_info("%s: turning on enchanced_area_en!\n", + mmc_hostname(card->host)); } } card->ext_csd.sec_trim_mult = @@ -740,7 +780,7 @@ static int mmc_select_powerclass(struct mmc_card *card, err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_POWER_CLASS, pwrclass_val, - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time + 1000000); } return err; @@ -799,7 +839,7 @@ static int mmc_select_hs200(struct mmc_card *card) err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, ext_csd_bits[idx], - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time + 1000000); if (err) continue; @@ -816,7 +856,7 @@ static int mmc_select_hs200(struct mmc_card *card) /* switch to HS200 mode if bus width set successfully */ if (!err) err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, - EXT_CSD_HS_TIMING, 2, 0); + EXT_CSD_HS_TIMING, 2, 0 + 1000000); err: return err; } @@ -967,7 +1007,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, (card->ext_csd.rev >= 3 && (host->caps2 & MMC_CAP2_HC_ERASE_SZ))) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_ERASE_GROUP_DEF, 1, - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time + 100000); if (err && err != -EBADMSG) goto free_card; @@ -999,7 +1039,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, card->ext_csd.part_config, - card->ext_csd.part_time); + card->ext_csd.part_time + 1000000); if (err && err != -EBADMSG) goto free_card; } @@ -1013,7 +1053,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_POWER_OFF_NOTIFICATION, EXT_CSD_POWER_ON, - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time + 100000); if (err && err != -EBADMSG) goto free_card; @@ -1036,7 +1076,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, else if (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); + card->ext_csd.generic_cmd6_time + 10000); if (err && err != -EBADMSG) goto free_card; @@ -1167,7 +1207,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, ext_csd_bits[idx][0], - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time + 1000000); if (!err) { mmc_set_bus_width(card->host, bus_width); @@ -1198,7 +1238,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, ext_csd_bits[idx][1], - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time + 1000000); } if (err) { pr_warning("%s: switch to bus width %d ddr %d " @@ -1238,7 +1278,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, if (card->ext_csd.hpi) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HPI_MGMT, 1, - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time + 1000000); if (err && err != -EBADMSG) goto free_card; if (err) { @@ -1257,7 +1297,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, card->ext_csd.cache_size > 0) { err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_CACHE_CTRL, 1, - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time + 10000000); if (err && err != -EBADMSG) goto free_card; diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index 6d8f7012d73a6a..938632adfcd4bc 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -476,7 +476,11 @@ EXPORT_SYMBOL_GPL(__mmc_switch); int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, unsigned int timeout_ms) { - return __mmc_switch(card, set, index, value, timeout_ms, true); + int ret; + + ret = __mmc_switch(card, set, index, value, timeout_ms, true); + WARN_ON(ret != 0); + return ret; } EXPORT_SYMBOL_GPL(mmc_switch); @@ -617,10 +621,13 @@ int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status) } opcode = card->ext_csd.hpi_cmd; - if (opcode == MMC_STOP_TRANSMISSION) + if (opcode == MMC_STOP_TRANSMISSION) { cmd.flags = MMC_RSP_R1B | MMC_CMD_AC; - else if (opcode == MMC_SEND_STATUS) + } else if (opcode == MMC_SEND_STATUS) { cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; + } + pr_info("%s: %s: Sending %s\n", mmc_hostname(card->host), __func__, + mmc_opcode_txt(opcode)); cmd.opcode = opcode; cmd.arg = card->rca << 16 | 1; diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 7a35c8e9fecc56..315e5cec0b26d5 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -15,6 +15,9 @@ * kind, whether express or implied. */ +#define DEBUG +#define VEBOSE_DEBUG + #include #include #include @@ -252,6 +255,9 @@ static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on, platform_get_drvdata(to_platform_device(dev)); int ret = 0; + dev_dbg(host->dev, "%s slot=%d, power_on=%d, vdd=%d\n", + __func__, slot, power_on, vdd); + /* * If we don't see a Vcc regulator, assume it's a fixed * voltage always-on regulator. @@ -313,6 +319,8 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host) struct regulator *reg; int ocr_value = 0; + dev_dbg(host->dev, "%s\n", __func__); + reg = regulator_get(host->dev, "vmmc"); if (IS_ERR(reg)) { dev_err(host->dev, "vmmc regulator missing\n"); @@ -363,6 +371,8 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host) static void omap_hsmmc_reg_put(struct omap_hsmmc_host *host) { + dev_dbg(host->dev, "%s\n", __func__); + regulator_put(host->vcc); regulator_put(host->vcc_aux); mmc_slot(host).set_power = NULL; @@ -468,6 +478,8 @@ static void omap_hsmmc_gpio_free(struct omap_mmc_platform_data *pdata) */ static void omap_hsmmc_start_clock(struct omap_hsmmc_host *host) { + dev_dbg(host->dev, "%s\n", __func__); + OMAP_HSMMC_WRITE(host->base, SYSCTL, OMAP_HSMMC_READ(host->base, SYSCTL) | CEN); } @@ -477,6 +489,8 @@ static void omap_hsmmc_start_clock(struct omap_hsmmc_host *host) */ static void omap_hsmmc_stop_clock(struct omap_hsmmc_host *host) { + dev_dbg(host->dev, "%s\n", __func__); + OMAP_HSMMC_WRITE(host->base, SYSCTL, OMAP_HSMMC_READ(host->base, SYSCTL) & ~CEN); if ((OMAP_HSMMC_READ(host->base, SYSCTL) & CEN) != 0x0) @@ -488,6 +502,8 @@ static void omap_hsmmc_enable_irq(struct omap_hsmmc_host *host, { unsigned int irq_mask; + dev_dbg(host->dev, "%s\n", __func__); + if (host->use_dma) irq_mask = INT_EN_MASK & ~(BRR_EN | BWR_EN); else @@ -504,6 +520,8 @@ static void omap_hsmmc_enable_irq(struct omap_hsmmc_host *host, static void omap_hsmmc_disable_irq(struct omap_hsmmc_host *host) { + dev_dbg(host->dev, "%s\n", __func__); + OMAP_HSMMC_WRITE(host->base, ISE, 0); OMAP_HSMMC_WRITE(host->base, IE, 0); OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR); @@ -530,6 +548,8 @@ static void omap_hsmmc_set_clock(struct omap_hsmmc_host *host) unsigned long timeout; unsigned long clkdiv; + dev_dbg(host->dev, "%s clock=%uHz\n", __func__, ios->clock); + dev_vdbg(mmc_dev(host->mmc), "Set clock to %uHz\n", ios->clock); omap_hsmmc_stop_clock(host); @@ -577,6 +597,8 @@ static void omap_hsmmc_set_bus_width(struct omap_hsmmc_host *host) struct mmc_ios *ios = &host->mmc->ios; u32 con; + dev_dbg(host->dev, "%s\n", __func__); + con = OMAP_HSMMC_READ(host->base, CON); if (ios->timing == MMC_TIMING_UHS_DDR50) con |= DDR; /* configure in DDR mode */ @@ -722,6 +744,8 @@ static void send_init_stream(struct omap_hsmmc_host *host) int reg = 0; unsigned long timeout; + dev_dbg(host->dev, "%s\n", __func__); + if (host->protect_card) return; @@ -789,8 +813,11 @@ omap_hsmmc_start_command(struct omap_hsmmc_host *host, struct mmc_command *cmd, { int cmdreg = 0, resptype = 0, cmdtype = 0; - dev_vdbg(mmc_dev(host->mmc), "%s: CMD%d, argument 0x%08x\n", - mmc_hostname(host->mmc), cmd->opcode, cmd->arg); + dev_dbg(host->dev, "%s\n", __func__); + + dev_vdbg(mmc_dev(host->mmc), "%s: CMD%d (%s), argument 0x%08x\n", + mmc_hostname(host->mmc), cmd->opcode, + mmc_opcode_txt(cmd->opcode), cmd->arg); host->cmd = cmd; omap_hsmmc_enable_irq(host, cmd); @@ -836,6 +863,8 @@ omap_hsmmc_start_command(struct omap_hsmmc_host *host, struct mmc_command *cmd, static int omap_hsmmc_get_dma_dir(struct omap_hsmmc_host *host, struct mmc_data *data) { + dev_dbg(host->dev, "%s\n", __func__); + if (data->flags & MMC_DATA_WRITE) return DMA_TO_DEVICE; else @@ -1056,8 +1085,10 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status) if (status & (CTO_EN | CCRC_EN)) end_cmd = 1; - if (status & (CTO_EN | DTO_EN)) + if (status & (CTO_EN | DTO_EN)) { + dev_dbg(mmc_dev(host->mmc), "returning ETIMEDOUT\n"); hsmmc_command_incomplete(host, -ETIMEDOUT, end_cmd); + } else if (status & (CCRC_EN | DCRC_EN)) hsmmc_command_incomplete(host, -EILSEQ, end_cmd); diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h index 5bf7c2274fcb71..5c6180b9d19a3f 100644 --- a/include/linux/mmc/core.h +++ b/include/linux/mmc/core.h @@ -200,4 +200,6 @@ static inline void mmc_claim_host(struct mmc_host *host) extern u32 mmc_vddrange_to_ocrmask(int vdd_min, int vdd_max); +const char *mmc_opcode_txt(int opcode); + #endif /* LINUX_MMC_CORE_H */