Received: by 2002:ac0:aa62:0:0:0:0:0 with SMTP id w31-v6csp1954217ima; Thu, 25 Oct 2018 07:31:18 -0700 (PDT) X-Google-Smtp-Source: AJdET5eyggKBfFutMLXqvvKyibn2/xTNz4It6L1mHIeQv9MVhxB34a2oVgVcoIKPSvbZcxd//Gi4 X-Received: by 2002:a17:902:860a:: with SMTP id f10-v6mr1764682plo.96.1540477878657; Thu, 25 Oct 2018 07:31:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540477878; cv=none; d=google.com; s=arc-20160816; b=EZLj86MFxU8gQVmjYj2eBM6/pTdJgBtQV2sxUNzMQ7aSFcDDOW/QB2XIKJm/LtAH6r 2muztXj/zFJvnU9GUy2y1QRvqkmSBJd7RTH78+KxbHVk7mTRu0tlGfRK5JEv83AQGm3I OxToHcq5o1gBBhFU1jcWbu51sy7mgByjDLU4DV4xYVnjQa611s7ftk0EyK4Jb5FRwaRU 8rJvkqAqOS5Eof2ZL+5kWgSkIq6PAdOMQZQ2kMoO4KYKlovoauhzFqOJ3dnn1Yd0Myxc kaMcC+g1mFECUM0igmTuv2p2zOurpQqayzz9MnCyg95dz7Yc1f+EDa/6oi+howxrSdL9 885g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=JVJCbWnmy0VRrpxdpJ6OtGJmRpuNXdSQtHYMZDRctXA=; b=ksDzdviarN4y0xnsWj7ySFpMLpeNyK7Nb2ca4IuI46+OYJKrQPphpQW7Mp9+zS99mB miWOy2XW9w7e59CZlm8mkiDfq7BFJPFswkH2xG0VvL2vyUERcIsJNvnTtfFe8X689O71 yoRhERspW6bg0bsVu6lK08nDhDKF8Rvi6IVdfyn0FMyjwCQGaFMiM3KnVTYoqfMldxTE WFmradG9215fklHchPdxiy1S/Lmb4rgx5DoXymgwDVvc/9cSxRuqm+CH0u7bQkur+dV4 85yiuSCSl7OYwsCW9KqxDwBlRULyqG14Gd1GnThfJGluDt3e0FkUbHVxGJHuk8gzM4oY UEqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=y0Zmxu1P; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n4-v6si8570215pgt.510.2018.10.25.07.30.43; Thu, 25 Oct 2018 07:31:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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=@kernel.org header.s=default header.b=y0Zmxu1P; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730360AbeJYWwH (ORCPT + 99 others); Thu, 25 Oct 2018 18:52:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:34000 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730290AbeJYWwG (ORCPT ); Thu, 25 Oct 2018 18:52:06 -0400 Received: from sasha-vm.mshome.net (unknown [167.98.65.38]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id AC8422085B; Thu, 25 Oct 2018 14:19:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1540477148; bh=21Ks0DfgFNjClGDMQ+ItP2+sz5lw4/BqrtX2RT/696s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=y0Zmxu1P8FhEiy+U2/nlU0a/rr1grdwBMpYIxgdvxSuce4wcTTw6+/TM7bxOtn5uj 45MiF7D3eSqxalpYSX97Kbgc6/+K46GNJ1+CxdYQslOCAXmJLBTGDXhqWyjsnoMlA+ yOsQ5t3gLpnLwj4B3sfQKY8EE/XFcPtQco+zNyNs= From: Sasha Levin To: stable@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Jisheng Zhang , Ulf Hansson , Sasha Levin Subject: [PATCH AUTOSEL 3.18 07/98] mmc: sdhci: restore behavior when setting VDD via external regulator Date: Thu, 25 Oct 2018 10:17:22 -0400 Message-Id: <20181025141853.214051-7-sashal@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181025141853.214051-1-sashal@kernel.org> References: <20181025141853.214051-1-sashal@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jisheng Zhang [ Upstream commit 918f4cbd4340ddd1eb389cd8efa3b07ac74ec4c0 ] After commit 52221610dd84 ("mmc: sdhci: Improve external VDD regulator support"), for the VDD is supplied via external regulators, we ignore the code to convert a VDD voltage request into one of the standard SDHCI voltage levels, then program it in the SDHCI_POWER_CONTROL. This brings two issues: 1. SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON quirk isn't handled properly any more. 2. What's more, once SDHCI_POWER_ON bit is set, some controllers such as the sdhci-pxav3 used in marvell berlin SoCs require the voltage levels programming in the SDHCI_POWER_CONTROL register, even the VDD is supplied by external regulator. So the host in marvell berlin SoCs still works fine after the commit. However, commit 3cbc6123a93d ("mmc: sdhci: Set SDHCI_POWER_ON with external vmmc") sets the SDHCI_POWER_ON bit, this would make the host in marvell berlin SoCs won't work any more with external vmmc. This patch restores the behavior when setting VDD through external regulator by moving the call of mmc_regulator_set_ocr() to the end of sdhci_set_power() function. After this patch, the sdcard on Marvell Berlin SoC boards work again. Signed-off-by: Jisheng Zhang Fixes: 52221610dd84 ("mmc: sdhci: Improve external VDD ...") Reviewed-by: Ludovic Desroches Tested-by: Ludovic Desroches Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin --- drivers/mmc/host/sdhci.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 56578504fd24..2295bf6e94a1 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -1248,19 +1248,6 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, struct mmc_host *mmc = host->mmc; u8 pwr = 0; - if (!IS_ERR(mmc->supply.vmmc)) { - spin_unlock_irq(&host->lock); - mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); - spin_lock_irq(&host->lock); - - if (mode != MMC_POWER_OFF) - sdhci_writeb(host, SDHCI_POWER_ON, SDHCI_POWER_CONTROL); - else - sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); - - return; - } - if (mode != MMC_POWER_OFF) { switch (1 << vdd) { case MMC_VDD_165_195: @@ -1319,6 +1306,12 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER) mdelay(10); } + + if (!IS_ERR(mmc->supply.vmmc)) { + spin_unlock_irq(&host->lock); + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); + spin_lock_irq(&host->lock); + } } /*****************************************************************************\ -- 2.17.1