From patchwork Sun Nov 10 15:40:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Vasut X-Patchwork-Id: 1192628 X-Patchwork-Delegate: van.freenix@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="UD5O8Tbn"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 479ytz0f3Yz9sPJ for ; Mon, 11 Nov 2019 02:42:35 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id C1C32C21E9F; Sun, 10 Nov 2019 15:41:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id E3680C21E08; Sun, 10 Nov 2019 15:41:19 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 18649C21C2C; Sun, 10 Nov 2019 15:40:45 +0000 (UTC) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by lists.denx.de (Postfix) with ESMTPS id E806CC21E02 for ; Sun, 10 Nov 2019 15:40:42 +0000 (UTC) Received: by mail-wr1-f68.google.com with SMTP id t1so12009375wrv.4 for ; Sun, 10 Nov 2019 07:40:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SBXLZE/BCq0HWTV1XLChqT3rqVqP7VKSBDhQ8+UOsHM=; b=UD5O8Tbn34g1ttedwH6pGs5p7/X6tO5pjVHN9a1s+G2XVnoh26zP+qTFZoPjHlvJ90 n5xTbpfVSNzU9p2SMPv1XZArXnUzeTkl2bTrUOzYpObsk7zVbJVo/fVd9TUz8Otkxr2Z yxNyWK+OMXLEnNBvnOM5d/S0+kctYHa5VWt6cUW6gIX8UuCt5P5hrljcXz1oYIEjdNNs mbSYa03n7E6YekUV5BYhOzZ+FVidgdeByA2SRXIAc6Otha77GJU0+E0qFnnlaLoZ1cG0 q50DgtaqRVn/0JubRnUZuBsmHj+HoxLqJ+UDNJQi99L5AQtoCXarZ12x4h1oMmM9HkOD 8gdg== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=SBXLZE/BCq0HWTV1XLChqT3rqVqP7VKSBDhQ8+UOsHM=; b=fSXp3jfTdfxZZPpxzKY1ODggBua5zTZ3iM64d5wXwx/1COh9xz+j84R3mwd4RWb/Ub X3uhmTRF68o1d4evEz/Gn0MW0wZpC3xeA7vxg6M9yYCXSTk7fUY0lFnkalAD/h0DdDjm mDZ3qfgWEFyIjA5hDcmXgImnI8uPFqe7jOO/q1OHt8Dh7meLaM7cDXUmUxAFd+pZg/40 w01yiVTl0NN9emKc5WmPONkuz1aGVvjcqDxTg/KiInhTUtAhXXzaapBICkyx1541nISp Z84WTuyfGwxZubMufYaOBkW07KnIPa/7PYxQZnpxJVr3CaK5pOcCCmwn0isuMUWWGxtL 0dYQ== X-Gm-Message-State: APjAAAURwuA+Fa6g0p/36uuh9eyan67fJxlfN1nnkGcaPYYJtwz5jzo/ 8vMRopFcIgGOMlttCc6d61EV7RD+x28= X-Google-Smtp-Source: APXvYqxGg14Baa/0E59D1+XAJpHSzWFNKoPi7BEUMbk1H0rJA4Iyydv9qMuYZRvZ/FgWEcaLj1pENw== X-Received: by 2002:adf:e449:: with SMTP id t9mr17796781wrm.196.1573400442298; Sun, 10 Nov 2019 07:40:42 -0800 (PST) Received: from chi.lan (p578adb1c.dip0.t-ipconnect.de. [87.138.219.28]) by smtp.gmail.com with ESMTPSA id v10sm24948918wmg.48.2019.11.10.07.40.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 10 Nov 2019 07:40:41 -0800 (PST) From: Marek Vasut X-Google-Original-From: Marek Vasut To: u-boot@lists.denx.de Date: Sun, 10 Nov 2019 16:40:10 +0100 Message-Id: <20191110154012.24603-7-marek.vasut+renesas@gmail.com> X-Mailer: git-send-email 2.24.0.rc1 In-Reply-To: <20191110154012.24603-1-marek.vasut+renesas@gmail.com> References: <20191110154012.24603-1-marek.vasut+renesas@gmail.com> MIME-Version: 1.0 Cc: Marek Vasut Subject: [U-Boot] [PATCH 7/9] mmc: tmio: sdhi: Add SCC error checking X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Check SCC for errors after check command if applicable and optionally adjust the bus skew settings accordingly. Signed-off-by: Marek Vasut Cc: Masahiro Yamada --- drivers/mmc/renesas-sdhi.c | 85 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/drivers/mmc/renesas-sdhi.c b/drivers/mmc/renesas-sdhi.c index 8c690a27b2..dcc77dd86c 100644 --- a/drivers/mmc/renesas-sdhi.c +++ b/drivers/mmc/renesas-sdhi.c @@ -34,7 +34,12 @@ #define RENESAS_SDHI_SCC_RVSCNTL_RVSEN BIT(0) #define RENESAS_SDHI_SCC_RVSREQ 0x814 #define RENESAS_SDHI_SCC_RVSREQ_RVSERR BIT(2) +#define RENESAS_SDHI_SCC_RVSREQ_REQTAPUP BIT(1) +#define RENESAS_SDHI_SCC_RVSREQ_REQTAPDOWN BIT(0) #define RENESAS_SDHI_SCC_SMPCMP 0x818 +#define RENESAS_SDHI_SCC_SMPCMP_CMD_ERR (BIT(24) | BIT(8)) +#define RENESAS_SDHI_SCC_SMPCMP_CMD_REQUP BIT(24) +#define RENESAS_SDHI_SCC_SMPCMP_CMD_REQDOWN BIT(8) #define RENESAS_SDHI_SCC_TMPPORT2 0x81c #define RENESAS_SDHI_SCC_TMPPORT2_HS400EN BIT(31) #define RENESAS_SDHI_SCC_TMPPORT2_HS400OSEL BIT(4) @@ -87,6 +92,84 @@ static void sd_scc_tmpport_write32(struct tmio_sd_priv *priv, u32 addr, u32 val) tmio_sd_writel(priv, 0, RENESAS_SDHI_SCC_TMPPORT4); } +static bool renesas_sdhi_check_scc_error(struct udevice *dev) +{ + struct tmio_sd_priv *priv = dev_get_priv(dev); + struct mmc *mmc = mmc_get_mmc_dev(dev); + unsigned long new_tap = priv->tap_set; + u32 reg, smpcmp; + + if ((priv->caps & TMIO_SD_CAP_RCAR_UHS) && + (mmc->selected_mode != UHS_SDR104) && + (mmc->selected_mode != MMC_HS_200) && + (mmc->selected_mode != MMC_HS_400) && + (priv->nrtaps != 4)) + return false; + + reg = tmio_sd_readl(priv, RENESAS_SDHI_SCC_RVSCNTL); + /* Handle automatic tuning correction */ + if (reg & RENESAS_SDHI_SCC_RVSCNTL_RVSEN) { + reg = tmio_sd_readl(priv, RENESAS_SDHI_SCC_RVSREQ); + if (reg & RENESAS_SDHI_SCC_RVSREQ_RVSERR) { + tmio_sd_writel(priv, 0, RENESAS_SDHI_SCC_RVSREQ); + return true; + } + + return false; + } + + /* Handle manual tuning correction */ + reg = tmio_sd_readl(priv, RENESAS_SDHI_SCC_RVSREQ); + if (!reg) /* No error */ + return false; + + tmio_sd_writel(priv, 0, RENESAS_SDHI_SCC_RVSREQ); + + if (mmc->selected_mode == MMC_HS_400) { + /* + * Correction Error Status contains CMD and DAT signal status. + * In HS400, DAT signal based on DS signal, not CLK. + * Therefore, use only CMD status. + */ + smpcmp = tmio_sd_readl(priv, RENESAS_SDHI_SCC_SMPCMP) & + RENESAS_SDHI_SCC_SMPCMP_CMD_ERR; + + switch (smpcmp) { + case 0: + return false; /* No error in CMD signal */ + case RENESAS_SDHI_SCC_SMPCMP_CMD_REQUP: + new_tap = (priv->tap_set + + priv->tap_num + 1) % priv->tap_num; + break; + case RENESAS_SDHI_SCC_SMPCMP_CMD_REQDOWN: + new_tap = (priv->tap_set + + priv->tap_num - 1) % priv->tap_num; + break; + default: + return true; /* Need re-tune */ + } + + priv->tap_set = new_tap; + } else { + if (reg & RENESAS_SDHI_SCC_RVSREQ_RVSERR) + return true; /* Need re-tune */ + else if (reg & RENESAS_SDHI_SCC_RVSREQ_REQTAPUP) + priv->tap_set = (priv->tap_set + + priv->tap_num + 1) % priv->tap_num; + else if (reg & RENESAS_SDHI_SCC_RVSREQ_REQTAPDOWN) + priv->tap_set = (priv->tap_set + + priv->tap_num - 1) % priv->tap_num; + else + return false; + } + + /* Set TAP position */ + tmio_sd_writel(priv, priv->tap_set >> ((priv->nrtaps == 4) ? 1 : 0), + RENESAS_SDHI_SCC_TAPSET); + + return false; +} + static void renesas_sdhi_adjust_hs400_mode_enable(struct tmio_sd_priv *priv) { u32 calib_code; @@ -536,6 +619,8 @@ static int renesas_sdhi_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, CONFIG_IS_ENABLED(MMC_HS400_SUPPORT) struct tmio_sd_priv *priv = dev_get_priv(dev); + renesas_sdhi_check_scc_error(dev); + if (cmd->cmdidx == MMC_CMD_SEND_STATUS) renesas_sdhi_adjust_hs400_mode_enable(priv); #endif