From patchwork Tue Mar 27 16:33:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Heider X-Patchwork-Id: 891756 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-tegra-owner@vger.kernel.org; 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="MaN8vyKg"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 409dc02fK0z9ryk for ; Wed, 28 Mar 2018 04:41:36 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752338AbeC0Rle (ORCPT ); Tue, 27 Mar 2018 13:41:34 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:37252 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754085AbeC0Qdz (ORCPT ); Tue, 27 Mar 2018 12:33:55 -0400 Received: by mail-wm0-f68.google.com with SMTP id r131so21242wmb.2 for ; Tue, 27 Mar 2018 09:33:54 -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:in-reply-to:references; bh=ZKgnWuV3EIZCWwsv+Tz1MHHaWCtm01XBM5LI/xlBYYw=; b=MaN8vyKgAvYL1VGeEFU3JZLBk5vP9y20l2WmXxl2q+npks4ZO5TD5sQQuSggRvyzyS iys1WHhekoeVoA+4q8+5XjQIgd62BnoVDji3FC/zVBpaXM2UslU+i2AiD8Ke3giORTIO m59j0JZLXMiKECfnB4NBiDImkdC0xurvKHI8ej0qklFVFjvkhMLcDNPNtFtZ5AJZ1Vo5 7p4St473RsiZIXV7QSxk4BDq5JV+f1RjngzmQDIocxXEEbu0MiP9ZUSSx99UMpWjc4/x gX1hsOJBIR+IdtEdlwKSD+aPCLq5lk4RBQm9Nuwu4hiPNhf2J7vAd3n6Jxt0IC1je46+ ebIA== 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; bh=ZKgnWuV3EIZCWwsv+Tz1MHHaWCtm01XBM5LI/xlBYYw=; b=ReYEPWVlbMk7/dfji3QpZZOoqFD3YPo6RgqyQzZAT0ngGedMTCj8HKw/nomw8lXHy3 SxDY9cOb6omc8o9ijO2hAfxb3fhtz1XkBFnYX6V8rlnealAw27r56CWh9Me0tlj88lic eRk36NaX9U40b2O7eIW/N7v49lwY5zcihLhJ75iw3EjYr1WU0HdNrKZdJOguYUwQTWxC oF5lOadgUqx+v5k59+HlMqr2CnMotR8YonFkn3+0WwvJLSRwhY/b+mdYLfn2aKc4MOci OnTBcWYaVKnay5ZAxn3U2DRO25bTW7q5TisrLk2OgEaSzj7efvo9asAlGZQUXyEVNGuz yTgg== X-Gm-Message-State: AElRT7F/fHAUlQPrrv5bcAdlF5Imo52VoqEAS6a7BGzcITR9cC6UNKTR bjd7uNY6NHLiGbx7uOYRdoI= X-Google-Smtp-Source: AIpwx4+xwjNwSJlx7Xkt0dby70cwGOQvgtkgQZDbkEy/L6/8fl6i7VpOn7yWXCZZ5FbKtpb2/y4kaw== X-Received: by 10.28.153.12 with SMTP id b12mr45798wme.104.1522168433702; Tue, 27 Mar 2018 09:33:53 -0700 (PDT) Received: from mamamia.internal (a89-182-183-34.net-htp.de. [89.182.183.34]) by smtp.gmail.com with ESMTPSA id h197sm1891065wmd.3.2018.03.27.09.33.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 27 Mar 2018 09:33:53 -0700 (PDT) From: Andre Heider To: thierry.reding@gmail.com, mperttunen@nvidia.com Cc: linux-tegra@vger.kernel.org, swtcr0@gmail.com Subject: [PATCH 2/6] sdhci: introduce ops->pre_voltage_switch and extend voltage_switch Date: Tue, 27 Mar 2018 18:33:46 +0200 Message-Id: <20180327163350.15862-2-a.heider@gmail.com> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180327163350.15862-1-a.heider@gmail.com> References: <20180327163350.15862-1-a.heider@gmail.com> Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: SwtcR Provide a hook to be called *before* a voltage switch takes place. This may be required, for example, to configure pins as 3.3V tolerant prior to switching back from 1.8V to 3.3V. This adds a 'struct mmc_ios' arg to voltage_switch to signal which voltage we have just switched to. Signed-off-by: SwtcR Signed-off-by: Andre Heider --- drivers/mmc/host/sdhci-tegra.c | 2 +- drivers/mmc/host/sdhci.c | 16 +++++++++++++++- drivers/mmc/host/sdhci.h | 4 +++- drivers/mmc/host/sdhci_f_sdh30.c | 7 ++++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index b877c13184c2..c545f0f34bf9 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -289,7 +289,7 @@ static int tegra_sdhci_execute_tuning(struct sdhci_host *host, u32 opcode) return mmc_send_tuning(host->mmc, opcode, NULL); } -static void tegra_sdhci_voltage_switch(struct sdhci_host *host) +static void tegra_sdhci_voltage_switch(struct sdhci_host *host, struct mmc_ios *ios) { struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host); diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 2020e57ffa7e..6a6ca87e9859 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1929,6 +1929,10 @@ int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, case MMC_SIGNAL_VOLTAGE_330: if (!(host->flags & SDHCI_SIGNALING_330)) return -EINVAL; + + if (host->ops->pre_voltage_switch) + host->ops->pre_voltage_switch(host, ios); + /* Set 1.8V Signal Enable in the Host Control2 register to 0 */ ctrl &= ~SDHCI_CTRL_VDD_180; sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); @@ -1941,6 +1945,11 @@ int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, return -EIO; } } + + /* Some controller need to do more when switching */ + if (host->ops->voltage_switch) + host->ops->voltage_switch(host, ios); + /* Wait for 5ms */ usleep_range(5000, 5500); @@ -1956,6 +1965,11 @@ int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, case MMC_SIGNAL_VOLTAGE_180: if (!(host->flags & SDHCI_SIGNALING_180)) return -EINVAL; + + /* Some controller need to do more when switching */ + if (host->ops->pre_voltage_switch) + host->ops->pre_voltage_switch(host, ios); + if (!IS_ERR(mmc->supply.vqmmc)) { ret = mmc_regulator_set_vqmmc(mmc, ios); if (ret) { @@ -1974,7 +1988,7 @@ int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, /* Some controller need to do more when switching */ if (host->ops->voltage_switch) - host->ops->voltage_switch(host); + host->ops->voltage_switch(host, ios); /* 1.8V regulator output should be stable within 5 ms */ ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index c95b0a4a7594..57a0ea885d1f 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -587,7 +587,9 @@ struct sdhci_ops { void (*hw_reset)(struct sdhci_host *host); void (*adma_workaround)(struct sdhci_host *host, u32 intmask); void (*card_event)(struct sdhci_host *host); - void (*voltage_switch)(struct sdhci_host *host); + void (*pre_voltage_switch)(struct sdhci_host *host, + struct mmc_ios *ios); + void (*voltage_switch)(struct sdhci_host *host, struct mmc_ios *ios); }; #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS diff --git a/drivers/mmc/host/sdhci_f_sdh30.c b/drivers/mmc/host/sdhci_f_sdh30.c index 485f7591fae4..d902b1fa6b2c 100644 --- a/drivers/mmc/host/sdhci_f_sdh30.c +++ b/drivers/mmc/host/sdhci_f_sdh30.c @@ -53,11 +53,16 @@ struct f_sdhost_priv { bool enable_cmd_dat_delay; }; -static void sdhci_f_sdh30_soft_voltage_switch(struct sdhci_host *host) +static void sdhci_f_sdh30_soft_voltage_switch(struct sdhci_host *host, + struct mmc_ios *ios) { struct f_sdhost_priv *priv = sdhci_priv(host); u32 ctrl = 0; + // FIXME: do something when switching back to 3.3V? + if (ios->signal_voltage != MMC_SIGNAL_VOLTAGE_180) + return; + usleep_range(2500, 3000); ctrl = sdhci_readl(host, F_SDH30_IO_CONTROL2); ctrl |= F_SDH30_CRES_O_DN;