Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp4201870pxu; Mon, 30 Nov 2020 21:38:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJzYjXJJkMhv0HkmFjnCQubLWn9l79WYaMackvjrUlSHrtp/11PdZD0vWRBCQPaSWIhYzwpY X-Received: by 2002:a17:907:3fa3:: with SMTP id hr35mr1413847ejc.71.1606801103664; Mon, 30 Nov 2020 21:38:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606801103; cv=none; d=google.com; s=arc-20160816; b=GBWHJ2+NYfqYZGjwXUmGqOO7uFNHIZmQmpfHpO7nCtSFxM/ELnZykvgQKdRlIbgr3H 1jySuPOYZsaLFNVbYkEs7hHo2sk2CtYzotWYlQahnLuBMBvkRtBYd7p4P2gbsaOxf8oX YQDFXsDmy9CeQEsLdrYSpcIizXrw/TXm+TV26QeMSkjagRG+dxe73euO0wGQBzDaiycR jdyQ8+tM1utTxP//2zs26I8uwP//C+OxYFlwSwNYd0Sq2H7hQO+anzFgt9PTgnQZh0KT KlYkOlfRS56cCpmVa5fUh3P08YVYbjlOQH4Mc7VfF6PAwpj2P2Yp/OTUzh+Ik6coNpNC aYdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:mail-followup-to:message-id:subject:cc:to:from:date :dkim-signature; bh=EXoDwvSjt22E8mrtUvILlvBbztf50ITW2DwnFsqDqOY=; b=O3Q3Y5qRAVWO2+XBX+K5Sj7kShHQFtApNwBkCUB3XiCptNVWNvFQ4pQFuWFk9IKX+d XWyTFJ9YfSdzPfd5xAS23m2TzbZK8K3jS9kRhMW5igsoCwrMwCW/qMvaL9/BF2aiUYYX I/mcsx2VsKJVfuo/Ui1bhgLY7+buzEDn46hLSulgoII/LSc3lna2y4WUxaMT8QZEZHIa kgw2KU+8bGGJ8/JNKTXYLmb2bD0D1O7kRODYrmrNWcKgxcESWMKMxlR9h9EtVGd08vAN yZNGClfc/aLHmDvlLIl1y6wiE+z852oCNTR71WKZLEQWRQ75ZYzIfXVyHuy2z/bIKiav sMvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="Tz/zcBvQ"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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. [23.128.96.18]) by mx.google.com with ESMTP id q15si474868edr.58.2020.11.30.21.38.01; Mon, 30 Nov 2020 21:38:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="Tz/zcBvQ"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S1726861AbgLAC3P (ORCPT + 99 others); Mon, 30 Nov 2020 21:29:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46848 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726658AbgLAC3O (ORCPT ); Mon, 30 Nov 2020 21:29:14 -0500 Received: from mail-pj1-x1041.google.com (mail-pj1-x1041.google.com [IPv6:2607:f8b0:4864:20::1041]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E099C0613D2 for ; Mon, 30 Nov 2020 18:28:28 -0800 (PST) Received: by mail-pj1-x1041.google.com with SMTP id j13so292402pjz.3 for ; Mon, 30 Nov 2020 18:28:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-disposition:in-reply-to; bh=EXoDwvSjt22E8mrtUvILlvBbztf50ITW2DwnFsqDqOY=; b=Tz/zcBvQZ/T+ZZV4+7cBfs7h72J4yEszVWGaNb+QjOSynIFfPbkdzYzzU9S9dcMqkN ZYLM8GzMd+GKqE8h6xMRYG7DXjkPkp1ErVmKyvKTbhLiSUf43H9cEibz8HalldOdrxkr +CkxOIDM4cj4Uorv6QlE/ZLIaBz04xDjOnQrSRmXNIfNy0VLsmT+1JoE0k4KzBmuXGSJ kHQjG+IdinN9eTF2AFjXUsaP7gnztXDYelca5W6tIS7k7jEUqC1lchgWrdYjAmMomkbn FzMW2MoBAMVFGztjUwnIYaozuR3n8QXQQ+EdBnpDwhvjJBupzFFyUQPwbpwEqyWvqTAN ljng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id :mail-followup-to:references:mime-version:content-disposition :in-reply-to; bh=EXoDwvSjt22E8mrtUvILlvBbztf50ITW2DwnFsqDqOY=; b=WLCV/xWe5NB/ZyiC0Gk+bUpUTdtmnKtbJ3NBWHZkiv71rLmRXvoZmXs/3wXPClSVot fSgoEsh+FaHtBHqVz6U1j4TQT2KbryGCd2IhSP0TOcBig+e9t28gbS3He6jFbZnEEafy qhtnVCYgXAjrSeRZ4CP4ousBYiY4OVqj4hd+d/tAVwoDAhpcLxjGfwNVTXzxHfYBzz41 QSHwtjq8QaU9NxWcKRhSLJNhdi8zGd8EDF0w5q7cOjd0HSdFCd+hcwoNEwGoDPrXCVDR 77BjO01saqyn2qT9irMy5vH/tQarqNnAy6oH3pje0rTyER6sAPOOmiMC8j9tnG5olIT6 8wyg== X-Gm-Message-State: AOAM5334D94/2qnhZaQfWxDJnaxcsrs9mqggElk0PrbqI5Byt6M2eJ0J ihb46uqDg37y7BIc1bidx2zXQkQixQuCdA== X-Received: by 2002:a17:902:b90b:b029:da:97e2:722d with SMTP id bf11-20020a170902b90bb02900da97e2722dmr664648plb.3.1606789707973; Mon, 30 Nov 2020 18:28:27 -0800 (PST) Received: from laputa (p784a5642.tkyea130.ap.so-net.ne.jp. [120.74.86.66]) by smtp.gmail.com with ESMTPSA id s11sm363266pfh.128.2020.11.30.18.28.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Nov 2020 18:28:27 -0800 (PST) Date: Tue, 1 Dec 2020 11:28:23 +0900 From: AKASHI Takahiro To: Adrian Hunter Cc: ulf.hansson@linaro.org, linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, ben.chuang@genesyslogic.com.tw, greg.tu@genesyslogic.com.tw Subject: Re: [RFC PATCH v3.1 19/27] mmc: sdhci-uhs2: add set_reg() to initialise the interface Message-ID: <20201201022823.GC43403@laputa> Mail-Followup-To: AKASHI Takahiro , Adrian Hunter , ulf.hansson@linaro.org, linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, ben.chuang@genesyslogic.com.tw, greg.tu@genesyslogic.com.tw References: <20201106022726.19831-1-takahiro.akashi@linaro.org> <20201106022726.19831-20-takahiro.akashi@linaro.org> <2356a6bc-bb19-0689-3b69-93f612ccb719@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2356a6bc-bb19-0689-3b69-93f612ccb719@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Nov 26, 2020 at 10:18:26AM +0200, Adrian Hunter wrote: > On 6/11/20 4:27 am, AKASHI Takahiro wrote: > > This is a sdhci version of mmc's uhs2_set_reg operation. > > UHS-II interface (related registers) will be initialised here. > > > > Signed-off-by: Ben Chuang > > Signed-off-by: AKASHI Takahiro > > --- > > drivers/mmc/host/sdhci-uhs2.c | 103 ++++++++++++++++++++++++++++++++++ > > 1 file changed, 103 insertions(+) > > > > diff --git a/drivers/mmc/host/sdhci-uhs2.c b/drivers/mmc/host/sdhci-uhs2.c > > index 55362ace1857..d8afb99a9918 100644 > > --- a/drivers/mmc/host/sdhci-uhs2.c > > +++ b/drivers/mmc/host/sdhci-uhs2.c > > @@ -332,6 +332,68 @@ static void __sdhci_uhs2_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) > > spin_unlock_irqrestore(&host->lock, flags); > > } > > > > +/* TODO: move this function to sdhci.c */ > > +static void sdhci_clear_set_irqs(struct sdhci_host *host, u32 clear, u32 set) > > +{ > > + u32 ier; > > + > > + ier = sdhci_readl(host, SDHCI_INT_ENABLE); > > + ier &= ~clear; > > + ier |= set; > > + sdhci_writel(host, ier, SDHCI_INT_ENABLE); > > + sdhci_writel(host, ier, SDHCI_SIGNAL_ENABLE); > > +} > > + > > +static void sdhci_uhs2_set_config(struct sdhci_host *host) > > +{ > > + u32 value; > > + u16 sdhci_uhs2_set_ptr = sdhci_readw(host, SDHCI_UHS2_SET_PTR); > > + u16 sdhci_uhs2_gen_set_reg = (sdhci_uhs2_set_ptr + 0); > > + u16 sdhci_uhs2_phy_set_reg = (sdhci_uhs2_set_ptr + 4); > > + u16 sdhci_uhs2_tran_set_reg = (sdhci_uhs2_set_ptr + 8); > > + u16 sdhci_uhs2_tran_set_1_reg = (sdhci_uhs2_set_ptr + 12); > > + > > + /* Set Gen Settings */ > > + sdhci_writel(host, host->mmc->uhs2_caps.n_lanes_set << > > + SDHCI_UHS2_GEN_SET_N_LANES_POS, sdhci_uhs2_gen_set_reg); > > + > > + /* Set PHY Settings */ > > + value = (host->mmc->uhs2_caps.n_lss_dir_set << > > + SDHCI_UHS2_PHY_SET_N_LSS_DIR_POS) | > > + (host->mmc->uhs2_caps.n_lss_sync_set << > > + SDHCI_UHS2_PHY_SET_N_LSS_SYN_POS); > > + if (host->mmc->flags & MMC_UHS2_SPEED_B) > > + value |= 1 << SDHCI_UHS2_PHY_SET_SPEED_POS; > > + sdhci_writel(host, value, sdhci_uhs2_phy_set_reg); > > + > > + /* Set LINK-TRAN Settings */ > > + value = (host->mmc->uhs2_caps.max_retry_set << > > + SDHCI_UHS2_TRAN_SET_RETRY_CNT_POS) | > > + (host->mmc->uhs2_caps.n_fcu_set << > > + SDHCI_UHS2_TRAN_SET_N_FCU_POS); > > + sdhci_writel(host, value, sdhci_uhs2_tran_set_reg); > > + sdhci_writel(host, host->mmc->uhs2_caps.n_data_gap_set, > > + sdhci_uhs2_tran_set_1_reg); > > +} > > + > > +static int sdhci_uhs2_check_dormant(struct sdhci_host *host) > > +{ > > + int timeout = 100; > > + > > + while (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & > > + SDHCI_UHS2_IN_DORMANT_STATE)) { > > Can use read_poll_timeout(sdhci_readl,..., host, SDHCI_PRESENT_STATE) Okay -Takahiro Akashi > > + if (timeout == 0) { > > + pr_warn("%s: UHS2 IN_DORMANT fail in 100ms.\n", > > + mmc_hostname(host->mmc)); > > + sdhci_dumpregs(host); > > + return -EIO; > > + } > > + timeout--; > > + mdelay(1); > > + } > > + return 0; > > +} > > + > > /*****************************************************************************\ > > * * > > * MMC callbacks * > > @@ -422,6 +484,45 @@ static void sdhci_uhs2_enable_clk(struct mmc_host *mmc) > > } > > } > > > > +static int sdhci_uhs2_set_reg(struct mmc_host *mmc, enum uhs2_act act) > > +{ > > + struct sdhci_host *host = mmc_priv(mmc); > > + unsigned long flags; > > + int err = 0; > > + u16 sdhci_uhs2_set_ptr = sdhci_readw(host, SDHCI_UHS2_SET_PTR); > > + u16 sdhci_uhs2_phy_set_reg = (sdhci_uhs2_set_ptr + 4); > > + > > + DBG("Begin sdhci_uhs2_set_reg, act %d.\n", act); > > + spin_lock_irqsave(&host->lock, flags); > > + > > + switch (act) { > > + case SET_CONFIG: > > + sdhci_uhs2_set_config(host); > > + break; > > + case ENABLE_INT: > > + sdhci_clear_set_irqs(host, 0, SDHCI_INT_CARD_INT); > > + break; > > + case DISABLE_INT: > > + sdhci_clear_set_irqs(host, SDHCI_INT_CARD_INT, 0); > > + break; > > + case SET_SPEED_B: > > + sdhci_writeb(host, 1 << SDHCI_UHS2_PHY_SET_SPEED_POS, > > + sdhci_uhs2_phy_set_reg); > > + break; > > + case CHECK_DORMANT: > > + err = sdhci_uhs2_check_dormant(host); > > + break; > > + default: > > + pr_err("%s: input action %d is wrong!\n", > > + mmc_hostname(host->mmc), act); > > + err = -EIO; > > + break; > > + } > > + > > + spin_unlock_irqrestore(&host->lock, flags); > > + return err; > > +} > > + > > /*****************************************************************************\ > > * * > > * Driver init/exit * > > @@ -597,6 +698,8 @@ static int sdhci_uhs2_host_ops_init(struct sdhci_host *host) > > host->mmc_host_ops.uhs2_disable_clk = sdhci_uhs2_disable_clk; > > if (!host->mmc_host_ops.uhs2_enable_clk) > > host->mmc_host_ops.uhs2_enable_clk = sdhci_uhs2_enable_clk; > > + if (!host->mmc_host_ops.uhs2_set_reg) > > + host->mmc_host_ops.uhs2_set_reg = sdhci_uhs2_set_reg; > > > > return 0; > > } > > >