From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932308AbcFCI1C (ORCPT ); Fri, 3 Jun 2016 04:27:02 -0400 Received: from down.free-electrons.com ([37.187.137.238]:45911 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752416AbcFCIX1 (ORCPT ); Fri, 3 Jun 2016 04:23:27 -0400 From: Boris Brezillon To: Thierry Reding , linux-pwm@vger.kernel.org, Mark Brown , Liam Girdwood Cc: Heiko Stuebner , linux-rockchip@lists.infradead.org, Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Milo Kim , Doug Anderson , Caesar Wang , Stephen Barber , Brian Norris , Ajit Pal Singh , Srinivas Kandagatla , Maxime Coquelin , Patrice Chotard , kernel@stlinux.com, Boris Brezillon Subject: [PATCH 07/14] pwm: sti: Add support for hardware readout Date: Fri, 3 Jun 2016 10:23:05 +0200 Message-Id: <1464942192-25967-8-git-send-email-boris.brezillon@free-electrons.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1464942192-25967-1-git-send-email-boris.brezillon@free-electrons.com> References: <1464942192-25967-1-git-send-email-boris.brezillon@free-electrons.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Implement ->get_state() to provide support for initial state retrieval. Signed-off-by: Boris Brezillon --- drivers/pwm/pwm-sti.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/drivers/pwm/pwm-sti.c b/drivers/pwm/pwm-sti.c index 92abbd5..6300d3e 100644 --- a/drivers/pwm/pwm-sti.c +++ b/drivers/pwm/pwm-sti.c @@ -238,6 +238,43 @@ static void sti_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) mutex_unlock(&pc->sti_pwm_lock); } +static void sti_pwm_get_state(struct pwm_chip *chip, + struct pwm_device *pwm, + struct pwm_state *state) +{ + struct sti_pwm_chip *pc = to_sti_pwmchip(chip); + unsigned int regval, prescaler; + int ret; + + /* The clock has to be enabled to access PWM registers */ + ret = clk_enable(pc->clk); + if (ret) { + dev_err(chip->dev, "Failed to enable PWM clk"); + return; + } + + regmap_field_read(pc->prescale_high, ®val); + prescaler = regval << 4; + regmap_field_read(pc->prescale_low, ®val); + prescaler |= regval; + state->period = DIV_ROUND_CLOSEST_ULL((u64)(prescaler + 1) * + NSEC_PER_SEC * + (pc->cdata->max_pwm_cnt + 1), + pc->clk_rate); + + regmap_read(pc->regmap, STI_DS_REG(pwm->hwpwm), ®val); + state->duty_cycle = DIV_ROUND_CLOSEST_ULL((u64)(regval + 1) * + state->period, + pc->cdata->max_pwm_cnt + 1); + + regmap_field_read(pc->pwm_en, ®val); + state->enabled = regval; + + state->polarity = PWM_POLARITY_NORMAL; + + clk_disable(pc->clk); +} + static void sti_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) { struct sti_pwm_chip *pc = to_sti_pwmchip(chip); @@ -249,6 +286,7 @@ static const struct pwm_ops sti_pwm_ops = { .config = sti_pwm_config, .enable = sti_pwm_enable, .disable = sti_pwm_disable, + .get_state = sti_pwm_get_state, .free = sti_pwm_free, .owner = THIS_MODULE, }; -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Brezillon Subject: [PATCH 07/14] pwm: sti: Add support for hardware readout Date: Fri, 3 Jun 2016 10:23:05 +0200 Message-ID: <1464942192-25967-8-git-send-email-boris.brezillon@free-electrons.com> References: <1464942192-25967-1-git-send-email-boris.brezillon@free-electrons.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1464942192-25967-1-git-send-email-boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+glpar-linux-rockchip=m.gmane.org-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org To: Thierry Reding , linux-pwm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Mark Brown , Liam Girdwood Cc: Mark Rutland , devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Heiko Stuebner , Pawel Moll , Ian Campbell , Srinivas Kandagatla , Brian Norris , linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Patrice Chotard , Doug Anderson , Milo Kim , linux-rockchip-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Rob Herring , kernel-F5mvAk5X5gdBDgjK7y7TUQ@public.gmane.org, Boris Brezillon , Kumar Gala , Maxime Coquelin , Stephen Barber , Ajit Pal Singh , linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, Caesar Wang List-Id: devicetree@vger.kernel.org Implement ->get_state() to provide support for initial state retrieval. Signed-off-by: Boris Brezillon --- drivers/pwm/pwm-sti.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/drivers/pwm/pwm-sti.c b/drivers/pwm/pwm-sti.c index 92abbd5..6300d3e 100644 --- a/drivers/pwm/pwm-sti.c +++ b/drivers/pwm/pwm-sti.c @@ -238,6 +238,43 @@ static void sti_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) mutex_unlock(&pc->sti_pwm_lock); } +static void sti_pwm_get_state(struct pwm_chip *chip, + struct pwm_device *pwm, + struct pwm_state *state) +{ + struct sti_pwm_chip *pc = to_sti_pwmchip(chip); + unsigned int regval, prescaler; + int ret; + + /* The clock has to be enabled to access PWM registers */ + ret = clk_enable(pc->clk); + if (ret) { + dev_err(chip->dev, "Failed to enable PWM clk"); + return; + } + + regmap_field_read(pc->prescale_high, ®val); + prescaler = regval << 4; + regmap_field_read(pc->prescale_low, ®val); + prescaler |= regval; + state->period = DIV_ROUND_CLOSEST_ULL((u64)(prescaler + 1) * + NSEC_PER_SEC * + (pc->cdata->max_pwm_cnt + 1), + pc->clk_rate); + + regmap_read(pc->regmap, STI_DS_REG(pwm->hwpwm), ®val); + state->duty_cycle = DIV_ROUND_CLOSEST_ULL((u64)(regval + 1) * + state->period, + pc->cdata->max_pwm_cnt + 1); + + regmap_field_read(pc->pwm_en, ®val); + state->enabled = regval; + + state->polarity = PWM_POLARITY_NORMAL; + + clk_disable(pc->clk); +} + static void sti_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) { struct sti_pwm_chip *pc = to_sti_pwmchip(chip); @@ -249,6 +286,7 @@ static const struct pwm_ops sti_pwm_ops = { .config = sti_pwm_config, .enable = sti_pwm_enable, .disable = sti_pwm_disable, + .get_state = sti_pwm_get_state, .free = sti_pwm_free, .owner = THIS_MODULE, }; -- 2.7.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: boris.brezillon@free-electrons.com (Boris Brezillon) Date: Fri, 3 Jun 2016 10:23:05 +0200 Subject: [PATCH 07/14] pwm: sti: Add support for hardware readout In-Reply-To: <1464942192-25967-1-git-send-email-boris.brezillon@free-electrons.com> References: <1464942192-25967-1-git-send-email-boris.brezillon@free-electrons.com> Message-ID: <1464942192-25967-8-git-send-email-boris.brezillon@free-electrons.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Implement ->get_state() to provide support for initial state retrieval. Signed-off-by: Boris Brezillon --- drivers/pwm/pwm-sti.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/drivers/pwm/pwm-sti.c b/drivers/pwm/pwm-sti.c index 92abbd5..6300d3e 100644 --- a/drivers/pwm/pwm-sti.c +++ b/drivers/pwm/pwm-sti.c @@ -238,6 +238,43 @@ static void sti_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) mutex_unlock(&pc->sti_pwm_lock); } +static void sti_pwm_get_state(struct pwm_chip *chip, + struct pwm_device *pwm, + struct pwm_state *state) +{ + struct sti_pwm_chip *pc = to_sti_pwmchip(chip); + unsigned int regval, prescaler; + int ret; + + /* The clock has to be enabled to access PWM registers */ + ret = clk_enable(pc->clk); + if (ret) { + dev_err(chip->dev, "Failed to enable PWM clk"); + return; + } + + regmap_field_read(pc->prescale_high, ®val); + prescaler = regval << 4; + regmap_field_read(pc->prescale_low, ®val); + prescaler |= regval; + state->period = DIV_ROUND_CLOSEST_ULL((u64)(prescaler + 1) * + NSEC_PER_SEC * + (pc->cdata->max_pwm_cnt + 1), + pc->clk_rate); + + regmap_read(pc->regmap, STI_DS_REG(pwm->hwpwm), ®val); + state->duty_cycle = DIV_ROUND_CLOSEST_ULL((u64)(regval + 1) * + state->period, + pc->cdata->max_pwm_cnt + 1); + + regmap_field_read(pc->pwm_en, ®val); + state->enabled = regval; + + state->polarity = PWM_POLARITY_NORMAL; + + clk_disable(pc->clk); +} + static void sti_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) { struct sti_pwm_chip *pc = to_sti_pwmchip(chip); @@ -249,6 +286,7 @@ static const struct pwm_ops sti_pwm_ops = { .config = sti_pwm_config, .enable = sti_pwm_enable, .disable = sti_pwm_disable, + .get_state = sti_pwm_get_state, .free = sti_pwm_free, .owner = THIS_MODULE, }; -- 2.7.4