Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3969489imu; Mon, 10 Dec 2018 10:45:34 -0800 (PST) X-Google-Smtp-Source: AFSGD/WackE0eORmAtm65FF8GtSNOqG/DrgPlzkuzUN62LCKziWuMiXsi1BaTmzybh1lX9cxaM8I X-Received: by 2002:a62:1c06:: with SMTP id c6mr13091062pfc.157.1544467534440; Mon, 10 Dec 2018 10:45:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544467534; cv=none; d=google.com; s=arc-20160816; b=fUn27vKCt+MTjdDkUTqVsWTir/rP2tAgG6Rq6lXwijRuRLDq7HErDKKsxBjP3ecTFw 8yM5rv9r1uBW50II7I4mx9mRo6kOnNcw1S7eWE7jvXW4E8dnOhNgriPJJetnuf/cxzOq YRSN60HH9vrirU6G1x3FnNi5L1ox48C1CyfabA7QIgXq5g2ztRXZGH7Auio+Ul1J2qt1 JzijSunPtB6AXPb/a6JLuMNbtdxGECyc8DjmqrZS8XXwsIUR8pWomgC6uNz7oejEZLrj sgy0USAHrHViY+6dzsdE7QANsda61/JwRJavmkbiirA+zagGNXmI/GqNRmfoWr4BVJyp +MJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=8SOgehlweAQxUJbM0IsMjqkAIrnlbkadg1vrl6U13fE=; b=00pqeVR2IXR80DPofGR38sWbmOi3yXpHSyZCPATR6zrXdfyA2nymxVFUs9zKRA+aSe fM1MpJ9Tf6kjGACfS25sCvmGYOO6DwVpsYXfoOkMiT8pg101eb0BChU/PpaBhGrxw8ad 7kTQNCdLURWw1R0aKNeo8z4lsbeyEpcjPc5evS9Xwb7HmIijHWBpjGJTStXvlJAv8Fsi oKWUmrnocaliDwV5TTkk8KNYD6CXC77hmSqAeapY6k2wjz3Vo+InTdHiNmu70YuAtgRi mqOWq4rSwFIZ2Dc7KZcfWH1vuNChhIay/w2I5YjVqzffv/c2dnc4q/rTvq2uSwkv2vLI KlTw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@plaes.org header.s=mail header.b="O0WRi/yd"; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d10si10423240pls.170.2018.12.10.10.45.18; Mon, 10 Dec 2018 10:45:34 -0800 (PST) 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=fail header.i=@plaes.org header.s=mail header.b="O0WRi/yd"; 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 S1728965AbeLJSnH (ORCPT + 99 others); Mon, 10 Dec 2018 13:43:07 -0500 Received: from plaes.org ([188.166.43.21]:55100 "EHLO plaes.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727071AbeLJSm2 (ORCPT ); Mon, 10 Dec 2018 13:42:28 -0500 Received: from localhost (unknown [213.204.46.240]) by plaes.org (Postfix) with ESMTPSA id DA06C41289; Mon, 10 Dec 2018 18:42:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=plaes.org; s=mail; t=1544467346; bh=f2mcC9Dpd0QYLyRmz8so1Ckg3Nv64+LbaTC/FIJ10Ik=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=O0WRi/ydRMrVKhFvfrIp9rdhWemlVVSJizeZzDNYiH9lyZrQZiTltvzHazv628ABN ik2L4ipxvpqsfKM/qbJQ4CbD8bTRBZo9cWM3WNL4y7d/3dl54cr6sVi3idNrpzbbQs T7H1+TJiSgY7E4vI9oKsPFY8YwktCr81J5QHkbThIzhLh7v0FS3BNneH3+Nx5I1QaC 6PyyrBpTTy5dFGZT3jqn7S+sFel22dumtTbCGSLSEY+NPjgk0Jq3O9FZM4Lq/H9Cng 3O/KEY46u5lIuRWND//h5WUyFLRJ68BLGkiN3+vERefiOOU+t0F7boHxKgxF+W6AgA LEk5vNM2DmaBA== From: Priit Laes To: Lee Jones , Rob Herring , Mark Rutland , Chen-Yu Tsai , Maxime Ripard , Liam Girdwood , Mark Brown , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Olliver Schinagl , linux-sunxi Cc: Priit Laes Subject: [PATCH 2/8] regulator: axp20x: add support for set_ramp_delay for AXP209 Date: Mon, 10 Dec 2018 20:42:13 +0200 Message-Id: <2bfe47f173fe72a30b0036dcdeebc2123962ff33.1544466940.git-series.plaes@plaes.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Olliver Schinagl The AXP209 supports ramping up voltages on several regulators such as DCDC2 and LDO3. This patch adds preliminary support for the regulator-ramp-delay property for these 2 regulators. Note that the voltage ramp only works when regulator is already enabled. E.g. when going from say 0.7 V to 3.6 V. When turning on the regulator, no voltage ramp is performed in hardware. What this means, is that if the bootloader brings up the voltage at 0.7 V, the ramp delay property is properly applied. If however, the bootloader leaves the power off, no ramp delay is applied when the power is enabled by the regulator framework. Signed-off-by: Olliver Schinagl Signed-off-by: Priit Laes --- drivers/regulator/axp20x-regulator.c | 85 +++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+) diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c index 9a2db28..1d9fa62 100644 --- a/drivers/regulator/axp20x-regulator.c +++ b/drivers/regulator/axp20x-regulator.c @@ -51,6 +51,17 @@ #define AXP20X_PWR_OUT_DCDC2_MASK BIT_MASK(4) #define AXP20X_PWR_OUT_LDO3_MASK BIT_MASK(6) +#define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK BIT_MASK(0) +#define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE(x) \ + ((x) << 0) +#define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK BIT_MASK(1) +#define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE(x) \ + ((x) << 1) +#define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK BIT_MASK(2) +#define AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN BIT(2) +#define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK BIT_MASK(3) +#define AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN BIT(3) + #define AXP20X_LDO4_V_OUT_1250mV_START 0x0 #define AXP20X_LDO4_V_OUT_1250mV_STEPS 0 #define AXP20X_LDO4_V_OUT_1250mV_END \ @@ -346,6 +357,79 @@ .ops = &axp20x_ops_range, \ } +static const int axp209_dcdc2_ldo3_slew_rates[] = { + 1600, + 800, +}; + +static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp) +{ + struct axp20x_dev *axp20x = rdev_get_drvdata(rdev); + const struct regulator_desc *desc = rdev->desc; + u8 reg, mask, enable, cfg = 0xff; + const int *slew_rates; + int rate_count = 0; + + if (!rdev) + return -EINVAL; + + switch (axp20x->variant) { + case AXP209_ID: + if (desc->id == AXP20X_DCDC2) { + rate_count = ARRAY_SIZE(axp209_dcdc2_ldo3_slew_rates); + reg = AXP20X_DCDC2_LDO3_V_RAMP; + mask = AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_RATE_MASK | + AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN_MASK; + enable = (ramp > 0) ? + AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN : + !AXP20X_DCDC2_LDO3_V_RAMP_DCDC2_EN; + break; + } + + if (desc->id == AXP20X_LDO3) { + slew_rates = axp209_dcdc2_ldo3_slew_rates; + rate_count = ARRAY_SIZE(axp209_dcdc2_ldo3_slew_rates); + reg = AXP20X_DCDC2_LDO3_V_RAMP; + mask = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE_MASK | + AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN_MASK; + enable = (ramp > 0) ? + AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN : + !AXP20X_DCDC2_LDO3_V_RAMP_LDO3_EN; + break; + } + + if (rate_count > 0) + break; + + /* fall through */ + default: + /* Not supported for this regulator */ + return -ENOTSUPP; + } + + if (ramp == 0) { + cfg = enable; + } else { + int i; + + for (i = 0; i < rate_count; i++) { + if (ramp <= slew_rates[i]) + cfg = AXP20X_DCDC2_LDO3_V_RAMP_LDO3_RATE(i); + else + break; + } + + if (cfg == 0xff) { + dev_err(axp20x->dev, "unsupported ramp value %d", ramp); + return -EINVAL; + } + + cfg |= enable; + } + + return regmap_update_bits(axp20x->regmap, reg, mask, cfg); +} + static const struct regulator_ops axp20x_ops_fixed = { .list_voltage = regulator_list_voltage_linear, }; @@ -366,6 +450,7 @@ static const struct regulator_ops axp20x_ops = { .enable = regulator_enable_regmap, .disable = regulator_disable_regmap, .is_enabled = regulator_is_enabled_regmap, + .set_ramp_delay = axp20x_set_ramp_delay, }; static const struct regulator_ops axp20x_ops_sw = { -- git-series 0.9.1