From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754548AbcH0AUS (ORCPT ); Fri, 26 Aug 2016 20:20:18 -0400 Received: from mail-pa0-f45.google.com ([209.85.220.45]:33390 "EHLO mail-pa0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751671AbcH0AUR (ORCPT ); Fri, 26 Aug 2016 20:20:17 -0400 Date: Fri, 26 Aug 2016 17:20:14 -0700 From: Matthias Kaehlcke To: Liam Girdwood , Mark Brown , Javier Martinez Canillas Cc: Doug Anderson , linux-kernel@vger.kernel.org Subject: [PATCH v2] pwm-regulator: Add support for a fixed delay after duty cycle changes Message-ID: <20160827002014.GB92391@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A change of the duty cycle doesn't necessarily cause an inmediate switch to the target voltage. The voltage change may be gradual and complete with a certain delay. This change introduces the device tree properties "settle-time-up-us" and "settle-time-down-us", which allow to specify a fixed delay after a voltage increase or decrease. Often it is not strictly necessary for a voltage decrease to complete, therefore the delays may be asymmetric. For regulators with a ramp delay the corresponding settle time is added to the ramp delay. Signed-off-by: Matthias Kaehlcke --- .../bindings/regulator/pwm-regulator.txt | 10 +++++++++ drivers/regulator/pwm-regulator.c | 25 ++++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/Documentation/devicetree/bindings/regulator/pwm-regulator.txt b/Documentation/devicetree/bindings/regulator/pwm-regulator.txt index 3aeba9f..42b6819 100644 --- a/Documentation/devicetree/bindings/regulator/pwm-regulator.txt +++ b/Documentation/devicetree/bindings/regulator/pwm-regulator.txt @@ -29,6 +29,16 @@ Required properties: - pwms: PWM specification (See: ../pwm/pwm.txt) +Optional properties: +-------------------- +- settle-time-up-us: Time to settle down after a voltage increase + (unit: us). For regulators with a ramp delay + the two values are added. + +- settle-time-down-us: Time to settle down after a voltage decrease + (unit: us). For regulators with a ramp delay + the two values are added. + Only required for Voltage Table Mode: - voltage-table: Voltage and Duty-Cycle table consisting of 2 cells First cell is voltage in microvolts (uV) diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c index c245242..51fe4da 100644 --- a/drivers/regulator/pwm-regulator.c +++ b/drivers/regulator/pwm-regulator.c @@ -46,6 +46,9 @@ struct pwm_regulator_data { int state; + u32 settle_time_up_us; + u32 settle_time_down_us; + /* Enable GPIO */ struct gpio_desc *enb_gpio; }; @@ -195,6 +198,7 @@ static int pwm_regulator_set_voltage(struct regulator_dev *rdev, unsigned int max_uV_duty = drvdata->continuous.max_uV_dutycycle; unsigned int duty_unit = drvdata->continuous.dutycycle_unit; unsigned int ramp_delay = rdev->constraints->ramp_delay; + unsigned int delay; int min_uV = rdev->constraints->min_uV; int max_uV = rdev->constraints->max_uV; int diff_uV = max_uV - min_uV; @@ -233,12 +237,20 @@ static int pwm_regulator_set_voltage(struct regulator_dev *rdev, return ret; } - if ((ramp_delay == 0) || !pwm_regulator_is_enabled(rdev)) + if (req_min_uV > old_uV) + delay = drvdata->settle_time_up_us; + else + delay = drvdata->settle_time_down_us; + + if (!pwm_regulator_is_enabled(rdev) || + ((delay == 0) && (ramp_delay == 0))) return 0; - /* Ramp delay is in uV/uS. Adjust to uS and delay */ - ramp_delay = DIV_ROUND_UP(abs(req_min_uV - old_uV), ramp_delay); - usleep_range(ramp_delay, ramp_delay + DIV_ROUND_UP(ramp_delay, 10)); + if (ramp_delay != 0) + /* Adjust ramp delay to uS and add to settle time. */ + delay += DIV_ROUND_UP(abs(req_min_uV - old_uV), ramp_delay); + + usleep_range(delay, delay + DIV_ROUND_UP(delay, 10)); return 0; } @@ -368,6 +380,11 @@ static int pwm_regulator_probe(struct platform_device *pdev) if (!init_data) return -ENOMEM; + of_property_read_u32(np, "settle-time-up-us", + &drvdata->settle_time_up_us); + of_property_read_u32(np, "settle-time-down-us", + &drvdata->settle_time_down_us); + config.of_node = np; config.dev = &pdev->dev; config.driver_data = drvdata; -- 2.6.6