From patchwork Wed Mar 30 17:32:04 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 104964 Delivered-To: patch@linaro.org Received: by 10.112.199.169 with SMTP id jl9csp2724761lbc; Wed, 30 Mar 2016 10:32:48 -0700 (PDT) X-Received: by 10.98.17.74 with SMTP id z71mr15144295pfi.30.1459359167960; Wed, 30 Mar 2016 10:32:47 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m65si7789884pfi.168.2016.03.30.10.32.23; Wed, 30 Mar 2016 10:32:47 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755093AbcC3RcW (ORCPT + 29 others); Wed, 30 Mar 2016 13:32:22 -0400 Received: from mezzanine.sirena.org.uk ([106.187.55.193]:57268 "EHLO mezzanine.sirena.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751025AbcC3RcV (ORCPT ); Wed, 30 Mar 2016 13:32:21 -0400 Received: from [64.55.107.4] (helo=finisterre) by mezzanine.sirena.org.uk with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1alJyY-0001Ug-T4; Wed, 30 Mar 2016 17:32:15 +0000 Received: from broonie by finisterre with local (Exim 4.87) (envelope-from ) id 1alJyW-0005qb-Fu; Wed, 30 Mar 2016 10:32:12 -0700 From: Mark Brown To: Jon Hunter , Liam Girdwood Cc: linux-kernel@vger.kernel.org, Mark Brown Date: Wed, 30 Mar 2016 10:32:04 -0700 Message-Id: <1459359124-22436-1-git-send-email-broonie@kernel.org> X-Mailer: git-send-email 2.8.0.rc3 X-SA-Exim-Connect-IP: 64.55.107.4 X-SA-Exim-Mail-From: broonie@sirena.org.uk X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on mezzanine.sirena.org.uk X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.3.2 Subject: [PATCH] regulator: core: Use parent voltage from the supply when bypassed X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:24:06 +0000) X-SA-Exim-Scanned: Yes (on mezzanine.sirena.org.uk) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When a regulator is in bypass mode it is functioning as a switch returning the voltage set in the regulator will not give the voltage being output by the regulator as it's just passing through its supply. This means that when we are getting the voltage from a regulator we should check to see if it is in bypass mode and if it is we should report the voltage from the supply rather than that which is set on the regulator. Reported-by: Jon Hunter Signed-off-by: Mark Brown --- Completely untested. drivers/regulator/core.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) -- 2.8.0.rc3 diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 74e8a7a3b3e8..03042e450399 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -3118,6 +3118,20 @@ EXPORT_SYMBOL_GPL(regulator_sync_voltage); static int _regulator_get_voltage(struct regulator_dev *rdev) { int sel, ret; + bool bypassed; + + if (rdev->desc->ops->get_bypass) { + ret = rdev->desc->ops->get_bypass(rdev, &bypassed); + if (ret < 0) + return ret; + if (bypassed) { + if (rdev->supply) { + ret = _regulator_get_voltage(rdev->supply->rdev); + } else { + return -EINVAL; + } + } + } if (rdev->desc->ops->get_voltage_sel) { sel = rdev->desc->ops->get_voltage_sel(rdev);