From patchwork Tue Nov 22 20:56:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ulf Hansson X-Patchwork-Id: 83504 Delivered-To: patches@linaro.org Received: by 10.140.97.165 with SMTP id m34csp2310943qge; Tue, 22 Nov 2016 12:56:30 -0800 (PST) X-Received: by 10.28.143.68 with SMTP id r65mr118866wmd.95.1479848190835; Tue, 22 Nov 2016 12:56:30 -0800 (PST) Return-Path: Received: from mail-wm0-x232.google.com (mail-wm0-x232.google.com. [2a00:1450:400c:c09::232]) by mx.google.com with ESMTPS id n64si4495291wmn.101.2016.11.22.12.56.30 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 22 Nov 2016 12:56:30 -0800 (PST) Received-SPF: pass (google.com: domain of ulf.hansson@linaro.org designates 2a00:1450:400c:c09::232 as permitted sender) client-ip=2a00:1450:400c:c09::232; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: domain of ulf.hansson@linaro.org designates 2a00:1450:400c:c09::232 as permitted sender) smtp.mailfrom=ulf.hansson@linaro.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: by mail-wm0-x232.google.com with SMTP id f82so46548487wmf.1 for ; Tue, 22 Nov 2016 12:56:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=09ikq94kowsggwzbH/Yi7rGLFSSD68O9m68+GPYPQtQ=; b=gytwPEuJgfoI/dKoHo7wJQrTPuI2xIRpy/bdrnW080teiqhwSujd6q+HK3zq+Dq0t3 JPuqT+MrOmy1CXGebg8UIb1YZHEjgLgpcKK4nEey6C/cKQpFvf52A7bRgdTJHcvqsOSQ 6VD/S7gt36PTSHetMJvT65Dcn45elCOawNKqU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=09ikq94kowsggwzbH/Yi7rGLFSSD68O9m68+GPYPQtQ=; b=Lu1f1hqCyvdqkAaTrxsBfk4cO7/pl0TlFZVLIslaE+YJkuuZN2hVMBiYoBAApNjoUq 0UZl57jOunegGjM2vyp2QG9Tc5y3GBQpZNCPhW6N3RNz46AzYZsliRrAMj1IXEne1N4C tq1GRkwwW3ooM1R2r8OCQwI/8qjW543Cn0jsfRYY+Cx5rIeN+ULdsMMfIlwXVlIkUqyZ LlqCoUKQx+WYZRphhld73mvbEsKkCrIkh9IQdKvsauJFSir/Zwm+VrXeORtiXsswxqRd N83hwna/cGno5/C7gbtE9878sMNaOJbiTamGpcdl2DLnNVIDI6j40I7BdKGhsdd5rqrK ejtg== X-Gm-Message-State: AKaTC01liXdrC5r53LCyiyNeLiKi5cJPSL7xxfm25DiM9K22kxKYb2jy+ue1byf/KDRkv3mCSFE= X-Received: by 10.46.71.76 with SMTP id u73mr12201004lja.6.1479848190440; Tue, 22 Nov 2016 12:56:30 -0800 (PST) Return-Path: Received: from localhost.localdomain (h-155-4-221-67.na.cust.bahnhof.se. [155.4.221.67]) by smtp.gmail.com with ESMTPSA id 196sm6619988lff.3.2016.11.22.12.56.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 22 Nov 2016 12:56:29 -0800 (PST) From: Ulf Hansson To: linux-mmc@vger.kernel.org, Ulf Hansson Cc: Jaehoon Chung , Adrian Hunter , Linus Walleij , Chaotian Jing , Stephen Boyd , Michael Walle , Yong Mao , Shawn Lin Subject: [PATCH v2 6/7] mmc: core: Allow CMD13 polling when switching to HS mode for mmc Date: Tue, 22 Nov 2016 21:56:12 +0100 Message-Id: <1479848173-20881-7-git-send-email-ulf.hansson@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1479848173-20881-1-git-send-email-ulf.hansson@linaro.org> References: <1479848173-20881-1-git-send-email-ulf.hansson@linaro.org> In cases when the mmc host doesn't support HW busy detection, polling for a card being busy by using CMD13 is beneficial. That is because, instead of waiting a fixed amount of time, 500ms or the generic CMD6 time from EXT_CSD, we find out a lot sooner when the card stops signaling busy. This leads to a significant decreased total initialization time for the mmc card. However, to allow polling with CMD13 during a bus timing change operation, such as switching to HS mode, we first need to update the mmc host's bus timing before starting to poll. Deal with that, simply by providing MMC_TIMING_MMC_HS as the timing parameter to __mmc_switch() from mmc_select_hs(). By telling __mmc_switch() to allow polling with CMD13, also makes it validate the CMD6 status, thus we can remove the corresponding checks. When switching to HS400ES, the mmc_select_hs() function is called in one of the intermediate steps. To still prevent CMD13 polling for HS400ES, let's call the __mmc_switch() function in this path as it enables us to keep using the existing method. Signed-off-by: Ulf Hansson --- drivers/mmc/core/mmc.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) -- 1.9.1 diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index cb1cf4e..15dd51c 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -1012,13 +1012,8 @@ static int mmc_select_hs(struct mmc_card *card) err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, - card->ext_csd.generic_cmd6_time, 0, - true, false, true); - if (!err) { - mmc_set_timing(card->host, MMC_TIMING_MMC_HS); - err = mmc_switch_status(card); - } - + card->ext_csd.generic_cmd6_time, MMC_TIMING_MMC_HS, + true, true, true); if (err) pr_warn("%s: switch to high-speed failed, err:%d\n", mmc_hostname(card->host), err); @@ -1268,16 +1263,23 @@ static int mmc_select_hs400es(struct mmc_card *card) goto out_err; /* Switch card to HS mode */ - err = mmc_select_hs(card); - if (err) + err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, + EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, + card->ext_csd.generic_cmd6_time, 0, + true, false, true); + if (err) { + pr_err("%s: switch to hs for hs400es failed, err:%d\n", + mmc_hostname(host), err); goto out_err; + } - mmc_set_clock(host, card->ext_csd.hs_max_dtr); - + mmc_set_timing(host, MMC_TIMING_MMC_HS); err = mmc_switch_status(card); if (err) goto out_err; + mmc_set_clock(host, card->ext_csd.hs_max_dtr); + /* Switch card to DDR with strobe bit */ val = EXT_CSD_DDR_BUS_WIDTH_8 | EXT_CSD_BUS_WIDTH_STROBE; err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,