From patchwork Thu Nov 22 10:01:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Loic Poulain X-Patchwork-Id: 151744 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp529034ljp; Thu, 22 Nov 2018 02:01:06 -0800 (PST) X-Google-Smtp-Source: AFSGD/X5UcvhdMOP3aCzdAIeBqeYJXlMgK+BnkioUO59Hm6IE0gStCCv+/DzQRAnV4HXzdNKY5T7 X-Received: by 2002:a62:1c96:: with SMTP id c144mr6080704pfc.129.1542880866279; Thu, 22 Nov 2018 02:01:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542880866; cv=none; d=google.com; s=arc-20160816; b=PaZfkh3OpVao0nC1ze+xDYZMWlZvd1la0PR3YsoLi+IlsFIrYDokCT1IYrD+vkNn9F Q1tSfBlP329/WGx5R7y+wGmnVofvIlwEtfHJl720KifPJU77YZshS15Rc7uE9kK0Gakr IRH1nXzbZglIUQ1z/wfypVgJOfvMHF1ZSFurA4vVBq10LVxLKq8od45eoj4MIWZ9ECLu 8Bx7b6oeMm9r9CUFInb58zqDo9lRYKLUcpSxg+lHHkb9j+4F5vHVXcOiIzmyryysGoY/ BqVlV0hUW8lVIRovIoSh2ExxTP72LoROjwJk5/rYki6HqoQMgfppQb7KTTmO1g0/vhF3 cYdw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=G/6c5XaB7ndUUHv/xjTQ365uz2vFLVJDGriphJ8ub+c=; b=RlvB7X79K3kg889KOTrky7DCbD71kJ7nPgsZTdw+aQukSuaW/0U8wuLnrrO8Vl5Fre zWRiOa8Q6ITL61r+6CpgcWQRfPoIbjaNrSai6c+TfUjl1NKrWOj8Nrq6nq4VgoTt58Rv 8eryLkF01SS3py1D/v5FvgzT56yurksdm6jtQEl5TQWBZm6/x5keb6JvUd4to8ydB5Rb JYf1VTePFcRUltPoL4PUqxlj7x5L3N3fz0lUQG3yTBq88sHgcOJfYS1z/5KuMSVYKtSg WKdXH54utmPsDapz7zmduvztgRq/j0mDhEslTHMICcdMs8ppkH9T8YfYXdMNyeHV/TFQ 9AAQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=QzHZmBWI; spf=pass (google.com: best guess record for domain of linux-mmc-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-mmc-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 p9si46323564pgc.448.2018.11.22.02.01.05; Thu, 22 Nov 2018 02:01:06 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-mmc-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=QzHZmBWI; spf=pass (google.com: best guess record for domain of linux-mmc-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-mmc-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 S2390158AbeKVUjt (ORCPT + 5 others); Thu, 22 Nov 2018 15:39:49 -0500 Received: from mail-wm1-f68.google.com ([209.85.128.68]:55469 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390006AbeKVUjt (ORCPT ); Thu, 22 Nov 2018 15:39:49 -0500 Received: by mail-wm1-f68.google.com with SMTP id y139so8257742wmc.5 for ; Thu, 22 Nov 2018 02:01:03 -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; bh=G/6c5XaB7ndUUHv/xjTQ365uz2vFLVJDGriphJ8ub+c=; b=QzHZmBWIjRTqk2toLJHuIMPkEhXNU7CERMh+gsdvd/9p63maaqnB79O0b3+/eTWBqN 1lrWNITrl+sMlAAzNJ5Rlez2peQIG8R8AZt43b9M/5nVJZUOqYAyXXwBa43zmhqFKDBb 98/6itp+2aikJ4tPpgG5xAZcpjB/dOEBkVQSw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=G/6c5XaB7ndUUHv/xjTQ365uz2vFLVJDGriphJ8ub+c=; b=NYcb+XojQ1PJLRIoeSeLAN5DfdoS7Vb2ftGdcxCJaPwNa6GAq92DqsU3XLcY0Qt4y2 7yycE/9c8fjjmpXO64ByBzqeGafFRs10IQOP6zlSanXUdv46e2l1WfTrkGOfEMJXjRyt fQOaf2sKVRPQnR5E4XiIUdBZ3o0LG26UzwS1ys2E+QG/v5oLRX/jTUNNZPS3oNU5E+mF FjRE7Ticz7ds98htfhUakyUwDgweJSXY+5EWiQ7+XTht/5/cYrPMOuceIPKbZuQJ/V2H y94LbO+KlKo6ZQhUBUj1WnY7ZxFUcpcfUJjqYYELfRjowOxQPyTXzQ2Fu37OeOSI7gQv jJEQ== X-Gm-Message-State: AA+aEWafkPUWyiaSt76JhQWotz/Ae2r3z/xrNPKd89IbIWvJhlGBEgWs 4A/55PYT6o7rWEIRmXGRbtwDog== X-Received: by 2002:a1c:170e:: with SMTP id 14mr8908196wmx.113.1542880863100; Thu, 22 Nov 2018 02:01:03 -0800 (PST) Received: from lpoulain-ThinkPad-T470p.home (atoulouse-654-1-394-222.w90-55.abo.wanadoo.fr. [90.55.193.222]) by smtp.gmail.com with ESMTPSA id q2sm31492932wru.56.2018.11.22.02.01.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 22 Nov 2018 02:01:02 -0800 (PST) From: Loic Poulain To: adrian.hunter@intel.com, ulf.hansson@linaro.org Cc: linux-arm-msm@vger.kernel.org, linux-mmc@vger.kernel.org, migusa@arrowjapan.com, Loic Poulain Subject: [PATCH] mmc: sdhci-msm: Disable CDR function on TX Date: Thu, 22 Nov 2018 11:01:01 +0100 Message-Id: <1542880861-20515-1-git-send-email-loic.poulain@linaro.org> X-Mailer: git-send-email 2.7.4 Sender: linux-mmc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mmc@vger.kernel.org The Clock Data Recovery (CDR) circuit allows to automatically adjust the RX sampling-point/phase for high frequency cards (SDR104, HS200...). CDR is automatically enable during DLL configuration. However according to the APQ8016 reference manual, this function must be disabled during TX and tuning phase. Goal being to prevent CDR to use TX timings for phase adjustement (requested fo RX) and avoid the mechanism to interfere during tuning challenges. This patch enable/disable CDR according to the transfer configured transfer mode. This fixes sporadic write transfer issues observed with some SDR104 and HS200 cards. Inspired by sdhci-msm downstream patch: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/432516/ Reported-by: Leonid Segal Reported-by: Manabu Igusa Signed-off-by: Loic Poulain --- drivers/mmc/host/sdhci-msm.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) -- 2.7.4 diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index a28f5fe..7495854 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -260,6 +260,8 @@ struct sdhci_msm_host { const struct sdhci_msm_variant_ops *var_ops; const struct sdhci_msm_offset *offset; struct icc_path *path; + bool use_cdr; + u32 transfer_mode; }; static const struct sdhci_msm_offset *sdhci_priv_msm_offset(struct sdhci_host *host) @@ -1027,6 +1029,27 @@ static int sdhci_msm_hs400_dll_calibration(struct sdhci_host *host) return ret; } +static void sdhci_msm_set_cdr(struct sdhci_host *host, bool enable) +{ + const struct sdhci_msm_offset *msm_offset = sdhci_priv_msm_offset(host); + u32 config, oldconfig = readl_relaxed(host->ioaddr + + msm_offset->core_dll_config); + + config = oldconfig; + if (enable) { + config |= CORE_CDR_EN; + config &= ~CORE_CDR_EXT_EN; + } else { + config &= ~CORE_CDR_EN; + config |= CORE_CDR_EXT_EN; + } + + if (config != oldconfig) { + writel_relaxed(config, host->ioaddr + + msm_offset->core_dll_config); + } +} + static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode) { struct sdhci_host *host = mmc_priv(mmc); @@ -1044,8 +1067,14 @@ static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode) if (host->clock <= CORE_FREQ_100MHZ || !(ios.timing == MMC_TIMING_MMC_HS400 || ios.timing == MMC_TIMING_MMC_HS200 || - ios.timing == MMC_TIMING_UHS_SDR104)) + ios.timing == MMC_TIMING_UHS_SDR104)) { + msm_host->use_cdr = false; + sdhci_msm_set_cdr(host, false); return 0; + } + + /* Clock-Data-Recovery used to dynamically adjust RX sampling point */ + msm_host->use_cdr = true; /* * For HS400 tuning in HS200 timing requires: @@ -1527,6 +1556,19 @@ static int __sdhci_msm_check_write(struct sdhci_host *host, u16 val, int reg) case SDHCI_POWER_CONTROL: req_type = !val ? REQ_BUS_OFF : REQ_BUS_ON; break; + case SDHCI_TRANSFER_MODE: + msm_host->transfer_mode = val; + break; + case SDHCI_COMMAND: + if (!msm_host->use_cdr) + break; + if ((msm_host->transfer_mode & SDHCI_TRNS_READ) && + (SDHCI_GET_CMD(val) != MMC_SEND_TUNING_BLOCK_HS200) && + (SDHCI_GET_CMD(val) != MMC_SEND_TUNING_BLOCK)) + sdhci_msm_set_cdr(host, true); + else + sdhci_msm_set_cdr(host, false); + break; } if (req_type) {