Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp8070975ybi; Tue, 23 Jul 2019 02:20:21 -0700 (PDT) X-Google-Smtp-Source: APXvYqwq+LFh746j4FkBiYbx9iLjAnuRoK1Yr+OrFQICAPPMt6odvyqkHtBAInPXlJuJecsQHirC X-Received: by 2002:a17:90a:bb0c:: with SMTP id u12mr82674247pjr.132.1563873621502; Tue, 23 Jul 2019 02:20:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563873621; cv=none; d=google.com; s=arc-20160816; b=RT9lJp7IX64M47L6+jlFh+jWZoITT38cTKKBPLREddRD0ewrPQlSpAd8T0IZFlIzJT Yxng+vFC2EpMtrrGcmfIeCSoTNAVM5uBbr8K7dXcNK32ukzwBLoEE90oVGrcmHeiht2N OU++0XNx4VhBcS52Cvi3IkxKXeUOj1LdVKw76B4rOi6R3YmAgdWxqAEBAN4NtLWhHWCv iRuqqMpccu+cEx0a7OdZirOzc6EXVDp4eKsysKn5H9R3XZz5DIRQO/XTjmon23g7pfTj 1tEi5egN5nh8IjfGmAEghSmmk53UI0Mal7ZMeqKuNXHEtlvVIUdG8QfiGndyzOlmbwsN kFJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=6z23ihiLa0fqOtrIntj5/XpQ6+8uIAMB4pCR65GZk7I=; b=O3GHBQuCAc2T4yCigsj6yu0+hI3SXmBGufJ7F5o5bjFkxxGFT/7GCtTBIsiGTf3YsY mSihMLhAnJhHoy8RCxwHUVdoDQrvRhIGDcupXH0tFJehw25tGPS8YXJ+jabv6gpUPPbN QYmmQKd9+Ud8DDlZhCLQd1Loome9FjrtE+MlgYXAoWj7Qd/KeSoPnEb2E+Y4X1O0c/5+ meTeaoIJbowLFeXt0vUpy6OUixDGAwVSX6KoUW2z4JZ4h5f2V+mzAZm1uxMilq1xWe4j 56gHKMr+HYSg0gF32cxmWMtphBchFJ5fTZnqjJyJLKujpBbh4N7lfIp3jziEtokHwHs0 8wBQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="wd/XVqFB"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 141si11107684pgh.166.2019.07.23.02.20.05; Tue, 23 Jul 2019 02:20:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="wd/XVqFB"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729393AbfGWDFi (ORCPT + 99 others); Mon, 22 Jul 2019 23:05:38 -0400 Received: from mail-oi1-f196.google.com ([209.85.167.196]:38009 "EHLO mail-oi1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726687AbfGWDFh (ORCPT ); Mon, 22 Jul 2019 23:05:37 -0400 Received: by mail-oi1-f196.google.com with SMTP id v186so31196012oie.5 for ; Mon, 22 Jul 2019 20:05:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=6z23ihiLa0fqOtrIntj5/XpQ6+8uIAMB4pCR65GZk7I=; b=wd/XVqFBZQ9/Qq6IEXQdUYgKeLYB1zy4zG7Q9ijPL8LcKG1qSoZawPTzbjWzZOp3vd AEIzUKaWCaNTImgCXWT94Hl5gVQZsbXQSx2yJWeg9zoTgo0kadqM2VxvrgemS7ghOjV6 IywrSncmS0WlVy6eRLWSXQuCeTd6935TrECAGBnTgmSU8CLjdR+hYTbINNg/jWtfQiT8 cdKY6UEFHJHpM/X5vpgxvWZp2hixaLmIZcZTOSXIaXTyLeOOB6PPbZVWWzN+C5DgmVM/ /gA+7OzRqzT7rkLSSrTdmF36koiWTIYLg/cftPJutMtkZRrn0vqxmSliyshgK5EvQH6Y hcgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=6z23ihiLa0fqOtrIntj5/XpQ6+8uIAMB4pCR65GZk7I=; b=N6C2Xo1J/fc1x8gYfRJPL/9Uh+Tb24uxOdNgb9RQ6gIxCjp5kk1FebUWCEP7SgYw3u KkXPa11kdcs+/VzXyRpGRwGQOz3q4PN0hlYpvmG3AUiuvn8AGQfWpyniNsv1i7KMqN5K UEfs+rq1IRzcu2aPM3CRs2uHJYutemrf/7QAmmW8d+ar2IXd9/q5O/oHtgqE4h5gzclK qFmB95yQLO9dqI7y4cGZ0WpSdeDpSxYqtLBZbpvWc5RpX19QOFR9flTCi9Y8h8kd+eYT crwAfsoX3TJseJ1AGRdjJH6YGI+nBNj+GgUOPjfwWwLN3w1YvrX2e0g4brk7qeKva2Tj Oxsg== X-Gm-Message-State: APjAAAXjYraLJguq4Ap9p348Os5rEi+V6Mn0cr6zvyigM2w0qBxRvvYQ L4ySJsUjytFskQL0YjB2MYDIiQM8+Z5qeg0mQ9dgbQ== X-Received: by 2002:aca:4c16:: with SMTP id z22mr617585oia.57.1563851136490; Mon, 22 Jul 2019 20:05:36 -0700 (PDT) MIME-Version: 1.0 References: <89c3ef495c367d58ca3abe99a1f82c48f8c08705.1563274904.git.baolin.wang@linaro.org> In-Reply-To: From: Baolin Wang Date: Tue, 23 Jul 2019 11:05:23 +0800 Message-ID: Subject: Re: [PATCH v4] mmc: host: sdhci-sprd: Fix the incorrect soft reset operation when runtime resuming To: Ulf Hansson Cc: Adrian Hunter , Chunyan Zhang , Orson Zhai , Vincent Guittot , "linux-mmc@vger.kernel.org" , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Ulf, On Mon, 22 Jul 2019 at 19:54, Ulf Hansson wrote: > > On Wed, 17 Jul 2019 at 04:29, Baolin Wang wrote: > > > > In sdhci_runtime_resume_host() function, we will always do software reset > > for all, which will cause Spreadtrum host controller work abnormally after > > resuming. > > What does "software reset for all" means? The SD host controller specification defines 3 types software reset: software reset for data line, software reset for command line and software reset for all. Software reset for all means this reset affects the entire Host controller except for the card detection circuit. > > > > > Thus for Spreadtrum platform that will not power down the SD/eMMC card during > > runtime suspend, we should not do software reset for all. > > Normally, sdhci hosts that enters runtime suspend doesn't power off > the card (there are some exceptions like PCI variants). Yes, same as our controller. > > So, what's so special here and how does the reset come into play? I > don't see sdhci doing a reset in sdhci_runtime_suspend|resume_host() > and nor doesn the callback from the sdhci-sprd.c variant doing it. In sdhci_runtime_resume_host(), it will issue sdhci_init(host, 0) to issue software reset for all. > > > To fix this > > issue, adding a specific reset operation that adds one condition to validate > > the power mode to decide if we can do software reset for all or just reset > > command and data lines. > > > > Signed-off-by: Baolin Wang > > --- > > Changess from v3: > > - Use ios.power_mode to validate if the card is power down or not. > > > > Changes from v2: > > - Simplify the sdhci_sprd_reset() by issuing sdhci_reset(). > > > > Changes from v1: > > - Add a specific reset operation instead of changing the core to avoid > > affecting other hardware. > > --- > > drivers/mmc/host/sdhci-sprd.c | 19 ++++++++++++++++++- > > 1 file changed, 18 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c > > index 603a5d9..94f9726 100644 > > --- a/drivers/mmc/host/sdhci-sprd.c > > +++ b/drivers/mmc/host/sdhci-sprd.c > > @@ -373,6 +373,23 @@ static unsigned int sdhci_sprd_get_max_timeout_count(struct sdhci_host *host) > > return 1 << 31; > > } > > > > +static void sdhci_sprd_reset(struct sdhci_host *host, u8 mask) > > +{ > > + struct mmc_host *mmc = host->mmc; > > + > > + /* > > + * When try to reset controller after runtime suspend, we should not > > + * reset for all if the SD/eMMC card is not power down, just reset > > + * command and data lines instead. Otherwise will meet some strange > > + * behaviors for Spreadtrum host controller. > > + */ > > + if (host->runtime_suspended && (mask & SDHCI_RESET_ALL) && > > + mmc->ios.power_mode == MMC_POWER_ON) > > + mask = SDHCI_RESET_CMD | SDHCI_RESET_DATA; > > Can sdhci_sprd_reset() be called when the host is runtime suspended? When host tries to runtime resume in sdhci_runtime_resume_host(), it will call reset operation to do software reset. > That sounds like a bug to me, no? Since our controller will meet some strange behaviors if we do software reset for all in sdhci_runtime_resume_host(), and try to avoid changing the core logic of sdhci_runtime_resume_host() used by other hardware controllers, thus I introduced a specific reset ops and added some condition to make sure we just do software reset command and data lines from runtime suspend state. > > > + > > + sdhci_reset(host, mask); > > +} > > + > > static struct sdhci_ops sdhci_sprd_ops = { > > .read_l = sdhci_sprd_readl, > > .write_l = sdhci_sprd_writel, > > @@ -381,7 +398,7 @@ static unsigned int sdhci_sprd_get_max_timeout_count(struct sdhci_host *host) > > .get_max_clock = sdhci_sprd_get_max_clock, > > .get_min_clock = sdhci_sprd_get_min_clock, > > .set_bus_width = sdhci_set_bus_width, > > - .reset = sdhci_reset, > > + .reset = sdhci_sprd_reset, > > .set_uhs_signaling = sdhci_sprd_set_uhs_signaling, > > .hw_reset = sdhci_sprd_hw_reset, > > .get_max_timeout_count = sdhci_sprd_get_max_timeout_count, > > -- > > 1.7.9.5 > > > > Kind regards > Uffe -- Baolin Wang Best Regards