From patchwork Mon Feb 24 10:10:41 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 3708601 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id A06799F2ED for ; Mon, 24 Feb 2014 11:04:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8E0CD2013A for ; Mon, 24 Feb 2014 11:04:47 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 87B9620035 for ; Mon, 24 Feb 2014 11:04:46 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WHsZS-0000zT-KG; Mon, 24 Feb 2014 10:15:35 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1WHsYy-0006iO-4Y; Mon, 24 Feb 2014 10:15:04 +0000 Received: from mailout1.w1.samsung.com ([210.118.77.11]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1WHsX1-0006ID-4m for linux-arm-kernel@lists.infradead.org; Mon, 24 Feb 2014 10:13:16 +0000 Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N1H008CJWB16C30@mailout1.w1.samsung.com> for linux-arm-kernel@lists.infradead.org; Mon, 24 Feb 2014 10:11:25 +0000 (GMT) X-AuditID: cbfec7f4-b7f796d000005a13-76-530b1accc046 Received: from eusync1.samsung.com ( [203.254.199.211]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id E4.F9.23059.CCA1B035; Mon, 24 Feb 2014 10:11:24 +0000 (GMT) Received: from AMDC1943.digital.local ([106.116.151.171]) by eusync1.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0N1H00JSEWAG6E50@eusync1.samsung.com>; Mon, 24 Feb 2014 10:11:24 +0000 (GMT) From: Krzysztof Kozlowski To: Chanwoo Choi , Samuel Ortiz , Lee Jones , Mark Brown , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Dmitry Eremin-Solenikov , David Woodhouse Subject: [PATCH v4 16/16] regulator: max14577: Implement SUSPEND mode for MAX77836 LDO-s Date: Mon, 24 Feb 2014 11:10:41 +0100 Message-id: <1393236641-14977-17-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1393236641-14977-1-git-send-email-k.kozlowski@samsung.com> References: <1393236641-14977-1-git-send-email-k.kozlowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprPLMWRmVeSWpSXmKPExsVy+t/xy7pnpLiDDRZNE7fYOGM9q8XUh0/Y LK5/ec5qMenJe2aLiSsnM1u8fmFocbbpDbvF/a9HGS02Pb7GanF51xw2i7VH7rJbnO5mtVg/ 4zWLA6/Hzll32T02r9Dy2LSqk83jzrU9bB7zTgZ6bF5S79G3ZRWjx+dNcgEcUVw2Kak5mWWp Rfp2CVwZd3d/YSq4r1Txv72JqYFxp2wXIyeHhICJxMK2jYwQtpjEhXvr2boYuTiEBJYySuy4 vYAZwuljklh5YhszSBWbgLHE5uVLwKpEBLYwSfR++MII4jALPGeU+LhoJjtIlbBAlMT8aZfB bBYBVYl9jftYQWxeAQ+JNZPWA03iANqnIDFnkg1ImBMofLflAViJkIC7xLd511kmMPIuYGRY xSiaWppcUJyUnmuoV5yYW1yal66XnJ+7iRESqF92MC4+ZnWIUYCDUYmHV6KaK1iINbGsuDL3 EKMEB7OSCK8ZL3ewEG9KYmVValF+fFFpTmrxIUYmDk6pBsaWz++mfrs6JXI9n5PHdec9x7pX ecWrzzW8WGKgr3vpR1jumocbqnkTZrEIfNy0OP7YSve4Qq6dSmYSBtPXxghszV7Wt1HLMblk wlT5hCk97Nur3ETe317xLH1/3TN/9UK9hWmKf39Mvnx1qazeu2t+ugZCXWuTYs/XR7/Lrv4y sz9pmz7j9zYlluKMREMt5qLiRACw3l/4MgIAAA== X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140224_051303_354846_7A1B85E9 X-CRM114-Status: GOOD ( 18.41 ) X-Spam-Score: -3.8 (---) Cc: Krzysztof Kozlowski , Kyungmin Park , Bartlomiej Zolnierkiewicz , Tomasz Figa , Marek Szyprowski X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-1.1 required=5.0 tests=BAYES_00,KHOP_BIG_TO_CC, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The MAX77836 LDO regulators support low power mode. In this mode the maximum load current is 5 mA and the quiescent supply current is 1.5 uA. This patch adds support for mode REGULATOR_MODE_STANDBY (and NORMAL) to LDO regulators by implementing the set_mode() and get_mode() operations. However the necessary regulator constraints (valid modes) are not parsed by of_regulator_match() so the driver adds them manually. Signed-off-by: Krzysztof Kozlowski --- drivers/regulator/max14577.c | 61 ++++++++++++++++++++++++++++++++-- include/linux/mfd/max14577-private.h | 2 ++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/drivers/regulator/max14577.c b/drivers/regulator/max14577.c index 6547cb3146e3..79981af198bf 100644 --- a/drivers/regulator/max14577.c +++ b/drivers/regulator/max14577.c @@ -18,9 +18,10 @@ #include #include #include +#include +#include #include #include -#include static int max14577_reg_is_enabled(struct regulator_dev *rdev) { @@ -85,6 +86,45 @@ static int max14577_reg_set_current_limit(struct regulator_dev *rdev, reg_data); } +static unsigned int max77836_reg_ldo_get_mode(struct regulator_dev *rdev) +{ + u8 reg_data; + int err; + + err = max14577_read_reg(rdev->regmap, rdev->desc->enable_reg, + ®_data); + if (err) { + dev_err(rdev_get_dev(rdev), + "Error reading control register for %d: %d\n", + rdev_get_id(rdev), err); + return REGULATOR_MODE_NORMAL; + } + + reg_data &= rdev->desc->enable_mask; + + if (reg_data == MAX77836_CNFG1_LDO_PWRMD_LOW_POWER) + return REGULATOR_MODE_STANDBY; + + return REGULATOR_MODE_NORMAL; +} + +static int max77836_reg_ldo_set_mode(struct regulator_dev *rdev, + unsigned int mode) +{ + switch (mode) { + case REGULATOR_MODE_STANDBY: + return max14577_update_reg(rdev->regmap, + rdev->desc->enable_reg, rdev->desc->enable_mask, + MAX77836_CNFG1_LDO_PWRMD_LOW_POWER); + + case REGULATOR_MODE_NORMAL: + return regulator_enable_regmap(rdev); + + default: + return -EINVAL; + } +} + static struct regulator_ops max14577_safeout_ops = { .is_enabled = regulator_is_enabled_regmap, .enable = regulator_enable_regmap, @@ -131,7 +171,8 @@ static struct regulator_ops max77836_ldo_ops = { .map_voltage = regulator_map_voltage_linear, .get_voltage_sel = regulator_get_voltage_sel_regmap, .set_voltage_sel = regulator_set_voltage_sel_regmap, - /* TODO: add .set_suspend_mode */ + .get_mode = max77836_reg_ldo_get_mode, + .set_mode = max77836_reg_ldo_set_mode, }; static const struct regulator_desc max77836_supported_regulators[] = { @@ -198,6 +239,19 @@ static struct of_regulator_match max77836_regulator_matches[] = { { .name = "LDO2", }, }; +static void +max77836_regulator_init_constraints(struct of_regulator_match *matches) +{ + int i; + struct regulation_constraints *c; + + for (i = MAX77836_LDO1; i <= MAX77836_LDO2; i++) { + c = &matches[i].init_data->constraints; + c->valid_modes_mask = REGULATOR_MODE_NORMAL + | REGULATOR_MODE_STANDBY; + } +} + static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev, enum maxim_device_type dev_type) { @@ -232,6 +286,9 @@ static int max14577_regulator_dt_parse_pdata(struct platform_device *pdev, of_node_put(np); + if (dev_type == MAXIM_DEVICE_TYPE_MAX77836) + max77836_regulator_init_constraints(regulator_matches); + return ret; } diff --git a/include/linux/mfd/max14577-private.h b/include/linux/mfd/max14577-private.h index 33700662fbb4..5eb164d91625 100644 --- a/include/linux/mfd/max14577-private.h +++ b/include/linux/mfd/max14577-private.h @@ -333,6 +333,8 @@ enum max77836_pmic_reg { #define MAX77836_CNFG1_LDO_TV_SHIFT 0 #define MAX77836_CNFG1_LDO_PWRMD_MASK (0x3 << MAX77836_CNFG1_LDO_PWRMD_SHIFT) #define MAX77836_CNFG1_LDO_TV_MASK (0x3f << MAX77836_CNFG1_LDO_TV_SHIFT) +/* Value to write to CONFIG1/PWRMD field for enabling low power mode */ +#define MAX77836_CNFG1_LDO_PWRMD_LOW_POWER BIT(MAX77836_CNFG1_LDO_PWRMD_SHIFT) /* LDO1/LDO2 CONFIG2 register */ #define MAX77836_CNFG2_LDO_OVCLMPEN_SHIFT 7