From patchwork Fri Sep 11 14:25:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adam Lee X-Patchwork-Id: 516825 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id C4813140271; Sat, 12 Sep 2015 00:26:11 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1ZaPHD-0000oX-GD; Fri, 11 Sep 2015 14:26:07 +0000 Received: from mail-pa0-f43.google.com ([209.85.220.43]) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1ZaPH8-0000nf-Fn for kernel-team@lists.ubuntu.com; Fri, 11 Sep 2015 14:26:02 +0000 Received: by padhk3 with SMTP id hk3so76416463pad.3 for ; Fri, 11 Sep 2015 07:26:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=hAxdaQ1/S0BO2nwn1A056mZzd1XxJ9wmV4jbofttojU=; b=SgqJ+d2txugWCa1DdLdVBEaYGzy0i/VzPrNwld6c9E3Ulq/vOx2P1u/w1t++FloADk rl+Btap0IELn+cCyQxOUKwlz4+b778jVutUWkhl2NKKSNJH8qUGwXDgYtnWn3JMSivHt BT7YYZOm0c8NCGM+DDxBVPB+KS6fYtKVm+fOPQVyXb0xhmnSCIa7kBiJCDRks60kZbPP +Q6KVTXu5dCfQIbT663nmKCW4Lrr24dWFsnlxKA+hcTU408t+XQ93SZGP9UpDJB7BpbX QYeDO+w2OSUUAZTfwl2z3ykTyj0xAqO1DlA1TcUkSCA/y7ICzDgGa8HmkG1tMCMrLJTN 0/fg== X-Gm-Message-State: ALoCoQmh8sgWh2W2Nq/h2f/Frg8cetNJz4QQ03vXBow2caawbBrK/ma3xFTTRccNi6KAuOnxNUD+ X-Received: by 10.68.192.9 with SMTP id hc9mr96616939pbc.57.1441981561840; Fri, 11 Sep 2015 07:26:01 -0700 (PDT) Received: from localhost (45.78.18.205.16clouds.com. [45.78.18.205]) by smtp.gmail.com with ESMTPSA id lg7sm784498pbc.1.2015.09.11.07.26.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Sep 2015 07:26:01 -0700 (PDT) From: Adam Lee To: kernel-team@lists.ubuntu.com Subject: [Utopic][PATCH][Append 2/2] mmc: sdhci: Add a quirk for AMD SDHC transfer mode register need to be cleared for cmd without data Date: Fri, 11 Sep 2015 22:25:49 +0800 Message-Id: <1441981549-8440-2-git-send-email-adam.lee@canonical.com> X-Mailer: git-send-email 2.5.1 In-Reply-To: <1441981549-8440-1-git-send-email-adam.lee@canonical.com> References: <55F2D714.90002@canonical.com> <1441981549-8440-1-git-send-email-adam.lee@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Vincent Wan BugLink: https://bugs.launchpad.net/bugs/1472843 SDHC controller in AMD chipsets require SDHC transfer mode register to be cleared for commands without data. The issue was uncovered during testing eMMC cards on KB/ML based platforms Signed-off-by: Vincent Wan Signed-off-by: Wan Zongshun Signed-off-by: Arindam Nath Tested-by: Vikram B Tested-by: Raghavendra Swamy Signed-off-by: Ulf Hansson (back ported from commit 9b8ffea6efb0d0edcac265a1ca422188fc1b6dfb) Signed-off-by: Adam Lee Conflicts: include/linux/mmc/sdhci.h --- drivers/mmc/host/sdhci.c | 9 +++++++-- include/linux/mmc/sdhci.h | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 1d92337..d5d6362 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -880,10 +880,15 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host, struct mmc_data *data = cmd->data; if (data == NULL) { + if (host->quirks2 & + SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD) { + sdhci_writew(host, 0x0, SDHCI_TRANSFER_MODE); + } else { /* clear Auto CMD settings for no data CMDs */ - mode = sdhci_readw(host, SDHCI_TRANSFER_MODE); - sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 | + mode = sdhci_readw(host, SDHCI_TRANSFER_MODE); + sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 | SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE); + } return; } diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h index 08abe99..e8b62fa 100644 --- a/include/linux/mmc/sdhci.h +++ b/include/linux/mmc/sdhci.h @@ -98,6 +98,8 @@ struct sdhci_host { #define SDHCI_QUIRK2_BROKEN_HS200 (1<<6) /* Controller does not support DDR50 */ #define SDHCI_QUIRK2_BROKEN_DDR50 (1<<7) +/* need clear transfer mode register before send cmd */ +#define SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD (1<<10) int irq; /* Device IRQ */ void __iomem *ioaddr; /* Mapped address */