From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934733AbdCVR3g (ORCPT ); Wed, 22 Mar 2017 13:29:36 -0400 Received: from mail-by2nam03on0079.outbound.protection.outlook.com ([104.47.42.79]:15040 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1760820AbdCVR3V (ORCPT ); Wed, 22 Mar 2017 13:29:21 -0400 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=fail action=none header.from=nxp.com; From: Leonard Crestez To: Mark Brown , Liam Girdwood , Viresh Kumar , "Rafael J. Wysocki" , Shawn Guo , Sascha Hauer CC: Leonard Crestez , Robin Gong , Anson Huang , Irina Tirdea , Rob Herring , Mark Rutland , Fabio Estevam , Octavian Purdila , , , , Subject: [RFC 4/8] regulator: core: Check enabling bypass respects constraints Date: Wed, 22 Mar 2017 18:53:06 +0200 Message-ID: <1edff9bc610969b0c53fa1080d5db021c8e00b2d.1490199005.git.leonard.crestez@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: X-EOPAttributedMessage: 0 X-Matching-Connectors: 131346752222383112;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(336005)(39450400003)(39860400002)(39850400002)(39400400002)(39410400002)(39840400002)(39380400002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(9170700003)(305945005)(48376002)(356003)(86362001)(77096006)(33646002)(47776003)(6666003)(38730400002)(39060400002)(106466001)(4326008)(50226002)(8936002)(85426001)(5003940100001)(189998001)(2950100002)(50466002)(104016004)(36756003)(50986999)(5660300001)(8676002)(54906002)(105606002)(53936002)(7416002)(81166006)(8656002)(118296001)(76176999)(2906002);DIR:OUT;SFP:1101;SCL:1;SRVR:SN2PR03MB2272;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;MLV:ovrnspm;A:1;MX:1;PTR:InfoDomainNonexistent;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD041;1:uXYaiGOH+omOEZzhkyAl5Dx/TWSx6A3R/SjIAQ9JfZN7l3385A9wh660RLFeBpRZ5InsUh6EqTJ9vkmD/Y3bz5ucd8LcfgpWzyAgcFQHjy5uh0F1LvpwaUsEEuP/j0V6AhFLQNYc++0UTQax6BxvQNqascljL2oZYNORLAmd/32MP3OKgvqn2QgitgC/uZmzjNAQkZCGqLz4ldPpsNMA6vX7ihD+h7RtQ0shwz363z/xXqqIbDYq0MzdxwrdatqUzc/DZrx6fBU/geoNi2FtDiMPdKMEaSlNIoetRSm9bCKgivmY9LXVC7c/Aj5wT640+55q6iByaLav9pJ9Mi4xahq6wftTeCSrCpqq3xJwhCcPwGtIUWHBlNQer8UOCU5WFHesF856t0GXVun35ziBGwSW0qY6Fuli5IVTh7i2ZlP3psSuHBgNF1aDJfpU6UAS6Q5HG5+kcqh747VUsvrXLLqrG4j52c6ryOGPs3wNdrFS8sdiXYvtk/BkfRUcHR9IkBLYvArQtYlNQUaVRx/WrD2lojsGrKYo6wuBtb1GkV/neTv6TouKz6mngDZoe1QkOumrEN4K89QXTyPY8bTGX5VBAgNR/rjnkwjCdK7VWOtD1fLiZJaxFFa7wwnai4Ua MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 85588de1-a921-4492-cc08-08d47143ff14 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:SN2PR03MB2272; X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB2272;3:6mG94Nemb8o2Aeo2x8VGxPY+Z0Xps5M18YDDhI1mGOgosXRoZVlglIHI3DenmqsV5Hlfa6O5f72uNXNvna5PlFUGNtSPMAXjL79gO6hc4vax3iDUx9zJ6oBxO1cDLwEv431gYWxnlt+ChLUvH1s5fyXE4qobdLWhnsRS6R85VlwOzMYIA7TdonKopW3PMcAZdz8ZxrKtfNuqD4rSZXTzLBeN2l5b8oe5yVttedyNhDtISeRtHTWZeSbV3Vj8kKk4IQCfCevREaGayDAKgU2gLG6tWiZgmSLO9DXVlpmb25ndzi2pngonklGlbCxYwNi18XFI2zfZkXEtwpOa9Ug/38K642j9JsstnOhWVjUHuVyWdpClDUAIoINXV39XLrXE;25:r41hDF6JAUux57qS6QxFK8gUEsZXREeCKe7ZtoocZ57RavItQ9nGdxy11rh/LEtOqRJMzYbC80SW+TnWk5a77U5OU6HfaKSQuqJMBt4sKhbmnEcid3E9CWezO5dAXMJNpjp+zriJEU4aWva3EzjzkYGoEPfEe69zQz2QTiu4sLigCR6RUEfrOZ2LTjDqT+D6j0W8Z+seDUBKJJQGS2wgxkU+tV3alYb26kcSrOkXBUwLXVk6udgE73ySTI0BT7WpksYJLEk0Myo90xAB4g/VZSkXdkLfDfiIRh8MTAypMlE0hanlkd3wBF9fs2eAWUgtj7PTW5JoKWwlhI45/WJutQ5/7k35zQ4suonDPo8NftNrbet05+eaZ5y9pUA5Rv12g9c6c1Dg3gm2Ekthl99+GcUvaDaW6qFsnPdtE/mfCA9f8m3WdZXk5WPjUesG2kcvJHlRx0UrzzJQiq/Wzk2Fgw== X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB2272;31:/5kqp0FD2/eFHriq8/6DIT6ZtlzSvyRsC+4zqUNLYt3p7g7EAdJxPqHggLb4sgAmUJl6D60kMWTLlJh8zpTS5AaL/Y6QwgecLl+VUCKyrLXAtSE9AA1f+IJwfD9/lJURCdE3AY4CBmH4ZFIO606OgUI9nkcIuYOvUn+ECMQ97wNOQljWoymrIUjZBmTOHnfxE5vdo1x4t0AU+aQRfl9t0aVGtGLdKnoSZJPGRWCDIi44maCWyfPhp12v1xxDR/99kU+Zu02nXSFdQqFiXPmAMA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6095060)(601004)(2401047)(13023025)(13015025)(5005006)(13017025)(8121501046)(13024025)(13018025)(3002001)(10201501046)(6055026)(6096035)(20161123559025)(20161123556025)(20161123565025)(20161123563025)(20161123561025);SRVR:SN2PR03MB2272;BCL:0;PCL:0;RULEID:(400006);SRVR:SN2PR03MB2272; X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB2272;4:O1bLO4+8GOZDL0NhVGA7Sba18U650gf5BFNKWYvzSmWpV0TB6sjGmegMTEwD/FoY88cMvmsJAC0DMvR3cBUhK80mxryhHnJrUxllj5/vhfcb+oxintfeT3EY0+MJiOKIsONoyt7H0lfwzqlwtpI1GqvNvxwCjcXVd9YX97l/AQiBbOB/xryK8EjzdOjZ9Avt0mGy/pZihYsbtbUWZ5OFUYK0Fx2jNDfXE3+Jk0KJACQfoF9MFZYAhuI2vFXNQVXMQtFzE34gga8oEfp79SNkSEUk8mQsyGGtpFGdjOX1GHfgcYN/WwVR0JfCEwY6wdF2HbxAIUnsohuUzG/PQBbBBVeUe+NH133e2uEA0qMapDcFnBxVqNxAYEjsc9tnZlfOOq9k1e+j5L+fjcW+OHZSlTlGuLV4CtuTjUeQ16cCFC9m9tAA6OSxmhkXU4eLKzzlHvG5ZJCjytMlZd42KwCA4wAlNe/5OPJxFkIBp+G1js04N3UksdvgJyx5UBUIYRTQZDMNDT1thj8pTCWf1p5ovOvtk5ldISGnJ9hCS+vCpfTuLKh/Z+0zphmzEa2tY2Xx224wXeVnARsDYdfv8YO8iUS2aXJpVBLYu5pRGy+rUWLy20E6P/uUy01MaXACjZsmIXNExh1iYsIXXqAtVBOFxxCdWVtDOpt6q+I8nB9qOjWJXqeO2R9dcUb9U3O10omtNScMoNAQDSAotnOXNoqOZBvM5W2Mm+j7KIsCXiu+9zWcXw6wD+yOEB7Bvgmumx1D X-Forefront-PRVS: 02543CD7CD X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;SN2PR03MB2272;23:4JUBHz4Lb92vKYdqyIeX0E5qunsCN1NFSmFqDQPaQ?= =?us-ascii?Q?EoJ9vVRfFUdCWdLcjp5E+M2R6L5crHHl6ySy6jAFP0nfyZCfMsHMzfYYxkYc?= =?us-ascii?Q?OyWG5W2cEKAmWamJhlJH5s+bMdb9G5tBX1WFzN6CMyOxTdjYmYQLEV2kJuGm?= =?us-ascii?Q?5HKs5R6OOu+Sx6LzghhLIiSJ6zYcc5yGBK0LLukaUgM8q9ngCxj+9oXn29hk?= =?us-ascii?Q?NEG0wlmiuMlumcVcFdOH6fxMded7+ucPPlwNydLKLR1SdyIWzywUEcawlJ2R?= =?us-ascii?Q?w4HkxcuZO4I+4Ksfws7EbIIFXXNZ+HH+2iKZf0v0PSDlfjfnumJKKQlbz55j?= =?us-ascii?Q?D+xbf+Nps5vXgP3U8xu61dPjUiur91fnUrXb+ZgcgKx1ZZl/prXUDrjisP1n?= =?us-ascii?Q?CNWkH7jTTTwvnasGP2ED5j3KwBthGI/OlAq2g/UmD3XOghTH06M0BtPtkYAs?= =?us-ascii?Q?iiba+nfOnb5nf2AVvVvBwBkaRXKA7CqoFpDiXBMn780UMMTdOqxunJta1dHv?= =?us-ascii?Q?PZfMdAeSUGDPraVuL7GX2uxLGoMMUDUNephzrS8sr6OMHJKG6hXcLcgDaQ7d?= =?us-ascii?Q?g9SrrB3n/o/+LaVBmFPf2+/clxlS0bvyo5wcZQ2yyDSdjnfzbD94Z8XUcOjq?= =?us-ascii?Q?dZtkS/38k1YZZ5AnRb8x0s3Wt/yCIZbM/1QZjiPghElFlue4HMSRvZTqy0sg?= =?us-ascii?Q?P+K83FpQP6YyPI72xEaaQHBVC4WxP8OoSKnin+OjUyZUlvOsv/+HUXOQl+ni?= =?us-ascii?Q?52z+i05G+YZRXJmpiY+mQzto6h8el7j5w2fq2Kebwf62M5yJT7diAyeM7FdP?= =?us-ascii?Q?ifSO18LZWQm0jUjLk1UYtP97QqVo5sDzM94+iPRnhwj2xTSk2oj5AIrVSkRO?= =?us-ascii?Q?OsIugtu46xpJwMEbuYaKOQttyEj0QYeAqqNznH+RVNgwVUjtxFhcF994xrMx?= =?us-ascii?Q?CiO3qfRYjJRo552ozyPk14C44PXLU1avcKDEGW2O549XEszEMBguzCNjmQmw?= =?us-ascii?Q?an4xKUNtDrnG8GFL8UwTDOCfRg05gXRkYy52AL9QDafdbiuo3oMQFA6kM5IM?= =?us-ascii?Q?MIj0JvrGGy7XpbW2A3rvGNNbuP+aCU9ypcXjoBN2P7Bc+cjD/jhRWIMYX4zA?= =?us-ascii?Q?1n3qNQeJ5G2KuCt3/AMq67KQ34nl9jZNNnihZNYobc/ZzSt4AH0xJLoqn3hr?= =?us-ascii?Q?U61oJTYmg3iCFV9WaxLlOixT6G3I/hTN/qC1LvOYWexCZnLBaaXt6Hf4w=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB2272;6:ee+5YmPhPDzeqVTvVWqGs/S/14AaaKDnvuiaQEtkkdCWMgJTqr3DygkGBtCsHg8yNPTWTg3pug+efgh391y2LzPvfuXudLU7sDflgQwesrn9SJ4V5DmdaNd2mfwIoJNGRbcVPKxUB5Yd0cQ1C9rdFUnLVbjJDgiOIL3Ef17LaacewfkwwDYKE8SCj/vfLXsdFDNELs6A4oYPdIItP2omNNE9uzy/38QHuuolDd7aZ1gz7LV00Lxls6WBuMXi2g7NtC2NJbhCsbX3BF+PFqO2NsU2Q/Jk79+sQnW9SJrOrVlRzljeHsrwe4bL2dsgKtb8RiDSYenwbYfRqJY/RWVTHEMcUWt4Lb8BXdss8vvO4AA21pHXsTr9DmhAZXrcs+c9HoavzRejKmQSsaKOwy19+QDMDV9BTRrOH0/+uOMoi38=;5:QOgDWDX5AqPmEqJCVuMOQwdkpWcVP5/pFR1WXB3+SpUoTSB/Gw+/i56KrA6NEpSlaeQf1Tt69oxsUGCHuwD84rBcHpX2sCazMVTyoTgmXaQbUpf2Eyt0HHF+i9HCOpxL7KExpqN3kdQqnTfS1u4QBcnskjIWbSAX3XWs276rbVE91Bi748KlmY8787sFtlAn;24:I+lEuZXV8sNFQVQh2pK2tuqXcTlif9PDtLy+ckYdrQhqbqIelhok5hxOrHkhKGgaPW/AKaHbB1jKvrj98cYjh+OqklGT7BfsT93yUDmcqNE= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;SN2PR03MB2272;7:8AGjnKmlvlMvSIC9irCBtchPXQ+TcL1KMDSOgtSNTw9UrxBhTeEkCmv7lLEn2aLdlr+3+e9R9pFbFyWntp0FHgH5dwwO/ugWTaCdoBny/PpYok8nTzVt3hgySW/CpHn4N4McQ30XUhZHMARaw4Z8POZQzdAv/3FPo7Hn5qzNERw8RiuMLdzNFyVi49jgvyTDijMFy7jgi236zzUq0qdnDR1i6RfQ6B/gapKRegNLK9MRSXu3mAnpDaqjAiKVydf9EPjlJ8ZmPHmmWvsr99WPaVjylQqrCiL9yhkBvnkw44+2mjWW1prfBFsuadeUtKSf7NyS1cvx7vAavInq9jdq7w== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Mar 2017 16:53:42.0043 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN2PR03MB2272 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Enabling bypass mode makes a regulator passthrough the supply voltage directly. It is possible that the supply voltage is set high enough that it violates machine constraints so let's check for that. The supply voltage might be higher because of min_dropout_uV or maybe there is just an unrelated consumer who requested a higher voltage. Signed-off-by: Leonard Crestez --- drivers/regulator/core.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 53d4fc7..9d893aa 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -3453,6 +3453,54 @@ int regulator_set_load(struct regulator *regulator, int uA_load) } EXPORT_SYMBOL_GPL(regulator_set_load); +static int _regulator_set_bypass(struct regulator *regulator, bool bypass) +{ + struct regulator_dev *rdev = regulator->rdev; + int output_voltage; + int supply_voltage; + + if (bypass && !rdev->supply) { + rdev_err(rdev, "Refuse to set bypass on regulator with no supply!\n"); + return -EINVAL; + } + + /* Check that enabling bypass won't break constraints */ + if (bypass && _regulator_is_enabled(rdev)) { + output_voltage = _regulator_get_voltage(rdev); + if (output_voltage < 0) { + rdev_err(rdev, "Failed to get old output voltage before" + " enabling bypass: %d\n", output_voltage); + return output_voltage; + } + supply_voltage = _regulator_get_voltage(rdev->supply->rdev); + if (supply_voltage < 0) { + rdev_err(rdev, "Failed to get supply voltage before" + " enabling bypass: %d\n", supply_voltage); + return supply_voltage; + } + if (supply_voltage < rdev->constraints->min_uV || + supply_voltage > rdev->constraints->max_uV) { + rdev_err(rdev, "Enabling bypass would change voltage" + " from %duV to %duV violating" + " constraint range %duV to %duV\n", + output_voltage, + supply_voltage, + rdev->constraints->min_uV, + rdev->constraints->max_uV); + return -EINVAL; + } + rdev_dbg(rdev, "Enabling bypass would change voltage" + " from %duV to %duV respecting" + " constraint range %duV to %duV\n", + output_voltage, + supply_voltage, + rdev->constraints->min_uV, + rdev->constraints->max_uV); + } + + return rdev->desc->ops->set_bypass(rdev, bypass); +} + /** * regulator_allow_bypass - allow the regulator to go into bypass mode * @@ -3481,7 +3529,7 @@ int regulator_allow_bypass(struct regulator *regulator, bool enable) rdev->bypass_count++; if (rdev->bypass_count == rdev->open_count) { - ret = rdev->desc->ops->set_bypass(rdev, enable); + ret = _regulator_set_bypass(regulator, enable); if (ret != 0) rdev->bypass_count--; } @@ -3490,7 +3538,7 @@ int regulator_allow_bypass(struct regulator *regulator, bool enable) rdev->bypass_count--; if (rdev->bypass_count != rdev->open_count) { - ret = rdev->desc->ops->set_bypass(rdev, enable); + ret = _regulator_set_bypass(regulator, enable); if (ret != 0) rdev->bypass_count++; } -- 2.7.4