Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp449341ybt; Fri, 10 Jul 2020 04:10:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwmTB5rBP41ZUuT+YjExRaIvDDg6TtdA56KRG3ruCm68K2zUp+Eha/3iujA5MGA1AweIh+p X-Received: by 2002:a17:907:11db:: with SMTP id va27mr63547381ejb.175.1594379432345; Fri, 10 Jul 2020 04:10:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594379432; cv=none; d=google.com; s=arc-20160816; b=mvqcTGjTwx1N+lk7NedwAH6QKe3AjJNV/68OD8zghkHY4QqhJ1/ESKp2WNly5hmIs3 n6nuuGt57GlqK3hxSNxvt0HPXk8/tUXp4v/RwEDWrGhNTIZTEwVDpg1nDBCeSDO2o55S TiSFQZ3iS0DcgMAXjXMr91l09dVP7PY253M+08IeKR35KaVIc72QXNa5MUT4AqGfxB0G OTPOWwtt9LZpceNsotUQaPNgCgzOs6C+JQctBU22joVz1rO1FGSfHUEeDPAAJqmOwsZy M/qKUWjI3gQ8S/PCnJcA2k+VGZ7sE/fUc4Zna0RTpg9RCY/uJms3KfduOUdFUSGVBgUb 9mow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=XOFeEnxeFd3DTgaPl4GKh005ARvuiNKhOn7oW5FdfWA=; b=oEx7Dd2Kd2GW9WtVIPfyNLV3pcOnPaB1nWMRW2Hy18fuQMk5QSUQYCx3PAKbZx1IUb NHawfLF1R2CLX77LoNXTDSbch72XBbNn035DOEYU5+LsvBprY7b3DiARMqATz9ctp//j Fri33LAf4akS31c7GQiFTXGj1El7UCjt+JA7gna4ODicPjlZZDbVC1yoIIcTcsyvRbch mWDFomCToRYPtU6aJkh6tVKO4vuNFqg8SsNA5dH+FK3VX+yKcuLLlsVuuorqiMqDxhFk F31MLrTLVHR5lgoq4Ywhl8bWIfc+Br1E15v3Cm8TBZxvJ5/U8ph7emx16roTCps4tOTf OUQQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=mkPU8GVR; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 1si3870100ejo.509.2020.07.10.04.10.08; Fri, 10 Jul 2020 04:10:32 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=mkPU8GVR; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727901AbgGJLHp (ORCPT + 99 others); Fri, 10 Jul 2020 07:07:45 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40878 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727772AbgGJLHo (ORCPT ); Fri, 10 Jul 2020 07:07:44 -0400 Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 945D2C08C5CE; Fri, 10 Jul 2020 04:07:44 -0700 (PDT) Received: by mail-pf1-x441.google.com with SMTP id x72so2397535pfc.6; Fri, 10 Jul 2020 04:07:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=XOFeEnxeFd3DTgaPl4GKh005ARvuiNKhOn7oW5FdfWA=; b=mkPU8GVR/yDq0XPj/516OIDXgA96qCnU4BWC7k2KfShqtnBia8e1z9CMjuca2lE1e+ N95N12QLmfteMfdRPlCDnEG2Bbv8PoINu7Yf9cwjsExFnK4KK50HsheboxiA5/wnRcqE +DCPagF7PKOKzpc/mSkXZXCwv33dxV99ZU0aYyvPQuSUjVzaS9FZJKU/mNrhjG+DVQ5I 5VC2Z8Rvx0eZiCobwODBQ94hlgjU73cdHJ2558KMAtqMGNnX5oiSAa0ijumyVg/5llX1 ejOr5WTJXiVTjYrVgJxSFrpdcot4MYtiprK1ffXfkZSVDxantUTqmmDlVrm67ksqoufC H9yg== 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:mime-version :content-transfer-encoding; bh=XOFeEnxeFd3DTgaPl4GKh005ARvuiNKhOn7oW5FdfWA=; b=uIHHnMwlZu+N6Ia7S/RGfsUZcj7azmJCFBJea9+1Ht9TLuw0xw4i+Gos4agOIPAWjR fxW8MPv8gaWIgCjHisI+oDvsI0IqYQyy3iUfN2R61FQvUgswQO2eqtcapyZKiBDoRbb3 X62hTXZKaJIOraZcwHpVv+o4wOt2/RIxRHBcdQDWUjruiwVjAUEqhmRay2u9j6mdhncd D2hJlAPfrXeMnlvatm114d79R2Dj2VWNbNbYZjYjaavdIR0vzzfuAikIrQlzoMGYo1YU vpBZbvd9jgBgszMlvWlsSJksPdt4x0nb2+eC+dI7chX4dah2gLsNMIenhiTbe1PC+vix lceQ== X-Gm-Message-State: AOAM533InLDXuhkCmYFhzaKJV0BU12eht7PGtKiIcFDzMFwCluLTJly0 +V7YfeJOb4DCyqS3PULlYeE6Edqd X-Received: by 2002:a62:ce46:: with SMTP id y67mr58779108pfg.118.1594379264093; Fri, 10 Jul 2020 04:07:44 -0700 (PDT) Received: from gli-arch.genesyslogic.com.tw (60-251-58-169.HINET-IP.hinet.net. [60.251.58.169]) by smtp.gmail.com with ESMTPSA id k3sm5463656pjl.15.2020.07.10.04.07.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Jul 2020 04:07:43 -0700 (PDT) From: Ben Chuang To: adrian.hunter@intel.com, ulf.hansson@linaro.org Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org, ben.chuang@genesyslogic.com.tw, takahiro.akashi@linaro.org, greg.tu@genesyslogic.com.tw, Ben Chuang Subject: [RFC PATCH V3 02/21] mmc: core: UHS-II support, modify power-up sequence Date: Fri, 10 Jul 2020 19:08:19 +0800 Message-Id: <20200710110819.28965-1-benchuanggli@gmail.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: AKASHI Takahiro According to Fig. 3-35 in "SD Host Controller Simplified Spec. Ver4.20": - Prepare vdd1, vdd2 and ios.timing for using after/in step (2) - chip_select is not used in UHS-II, used to return to the legacy flow Signed-off-by: Ben Chuang Signed-off-by: AKASHI Takahiro --- drivers/mmc/core/core.c | 62 ++++++++++++++++++++++++------------ drivers/mmc/core/regulator.c | 14 ++++++++ 2 files changed, 56 insertions(+), 20 deletions(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 8d2b808e9b58..85c83c82ad0c 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1315,33 +1315,51 @@ void mmc_power_up(struct mmc_host *host, u32 ocr) if (host->ios.power_mode == MMC_POWER_ON) return; - mmc_pwrseq_pre_power_on(host); + if (host->flags & MMC_UHS2_SUPPORT) { + /* TODO: handle 'ocr' parameter */ + host->ios.vdd = fls(host->ocr_avail) - 1; + host->ios.vdd2 = fls(host->ocr_avail_uhs2) - 1; + if (mmc_host_is_spi(host)) + host->ios.chip_select = MMC_CS_HIGH; + else + host->ios.chip_select = MMC_CS_DONTCARE; + host->ios.timing = MMC_TIMING_UHS2; + } else { + mmc_pwrseq_pre_power_on(host); - host->ios.vdd = fls(ocr) - 1; - host->ios.power_mode = MMC_POWER_UP; - /* Set initial state and call mmc_set_ios */ - mmc_set_initial_state(host); + host->ios.vdd = fls(ocr) - 1; + host->ios.power_mode = MMC_POWER_UP; + /* Set initial state and call mmc_set_ios */ + mmc_set_initial_state(host); - mmc_set_initial_signal_voltage(host); + mmc_set_initial_signal_voltage(host); - /* - * This delay should be sufficient to allow the power supply - * to reach the minimum voltage. - */ - mmc_delay(host->ios.power_delay_ms); - - mmc_pwrseq_post_power_on(host); + /* + * This delay should be sufficient to allow the power supply + * to reach the minimum voltage. + */ + mmc_delay(host->ios.power_delay_ms); + mmc_pwrseq_post_power_on(host); + } host->ios.clock = host->f_init; - host->ios.power_mode = MMC_POWER_ON; + mmc_set_ios(host); - /* - * This delay must be at least 74 clock sizes, or 1 ms, or the - * time required to reach a stable voltage. - */ - mmc_delay(host->ios.power_delay_ms); + if (host->flags & MMC_UHS2_SUPPORT) + /* + * This delay should be sufficient to allow the power supply + * to reach the minimum voltage. + */ + /* TODO: avoid an immediate value */ + mmc_delay(10); + else + /* + * This delay must be at least 74 clock sizes, or 1 ms, or the + * time required to reach a stable voltage. + */ + mmc_delay(host->ios.power_delay_ms); } void mmc_power_off(struct mmc_host *host) @@ -2307,7 +2325,11 @@ void mmc_start_host(struct mmc_host *host) if (!(host->caps2 & MMC_CAP2_NO_PRESCAN_POWERUP)) { mmc_claim_host(host); - mmc_power_up(host, host->ocr_avail); + + /* Power up here will make UHS2 init ugly. */ + if (!(host->caps & MMC_CAP_UHS2)) + mmc_power_up(host, host->ocr_avail); + mmc_release_host(host); } diff --git a/drivers/mmc/core/regulator.c b/drivers/mmc/core/regulator.c index 96b1d15045d6..05556225d9ac 100644 --- a/drivers/mmc/core/regulator.c +++ b/drivers/mmc/core/regulator.c @@ -247,6 +247,7 @@ int mmc_regulator_get_supply(struct mmc_host *mmc) mmc->supply.vmmc = devm_regulator_get_optional(dev, "vmmc"); mmc->supply.vqmmc = devm_regulator_get_optional(dev, "vqmmc"); + mmc->supply.vmmc2 = devm_regulator_get_optional(dev, "vmmc2"); if (IS_ERR(mmc->supply.vmmc)) { if (PTR_ERR(mmc->supply.vmmc) == -EPROBE_DEFER) @@ -266,6 +267,19 @@ int mmc_regulator_get_supply(struct mmc_host *mmc) dev_dbg(dev, "No vqmmc regulator found\n"); } + if (IS_ERR(mmc->supply.vmmc2)) { + if (PTR_ERR(mmc->supply.vmmc2) == -EPROBE_DEFER) + return -EPROBE_DEFER; + dev_dbg(dev, "No vmmc2 regulator found\n"); + } else { + ret = mmc_regulator_get_ocrmask(mmc->supply.vmmc2); + if (ret > 0) + mmc->ocr_avail_uhs2 = ret; + else + dev_warn(dev, "Failed getting UHS2 OCR mask: %d\n", + ret); + } + return 0; } EXPORT_SYMBOL_GPL(mmc_regulator_get_supply); -- 2.27.0