From: "David Rivshin (Allworx)" <drivshin.allworx@gmail.com>
To: linux-pwm@vger.kernel.org,
Thierry Reding <thierry.reding@gmail.com>,
Neil Armstrong <narmstrong@baylibre.com>
Cc: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
Tony Lindgren <tony@atomide.com>,
Grant Erickson <marathon96@gmail.com>, NeilBrown <neilb@suse.de>,
Joachim Eastwood <manabian@gmail.com>
Subject: [PATCH 2/4] pwm: omap-dmtimer: add sanity checking for load and match values
Date: Fri, 29 Jan 2016 23:26:52 -0500 [thread overview]
Message-ID: <1454128014-22866-3-git-send-email-drivshin.allworx@gmail.com> (raw)
In-Reply-To: <1454128014-22866-1-git-send-email-drivshin.allworx@gmail.com>
From: David Rivshin <drivshin@allworx.com>
Add sanity checking to ensure that we do not program load or match values
that are out of range if a user requests period or duty_cycle values which
are not achievable. The match value cannot be less than the load value (but
can be equal), and neither can be 0xffffffff. This means that there must be
at least one fclk cycle between load and match, and another between match
and overflow.
Fixes: 6604c6556db9 ("pwm: Add PWM driver for OMAP using dual-mode timers")
Signed-off-by: David Rivshin <drivshin@allworx.com>
---
drivers/pwm/pwm-omap-dmtimer.c | 31 +++++++++++++++++++++++++++----
1 file changed, 27 insertions(+), 4 deletions(-)
diff --git a/drivers/pwm/pwm-omap-dmtimer.c b/drivers/pwm/pwm-omap-dmtimer.c
index 0083e75..103d729 100644
--- a/drivers/pwm/pwm-omap-dmtimer.c
+++ b/drivers/pwm/pwm-omap-dmtimer.c
@@ -119,15 +119,13 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
fclk = omap->pdata->get_fclk(omap->dm_timer);
if (!fclk) {
dev_err(chip->dev, "invalid pmtimer fclk\n");
- mutex_unlock(&omap->mutex);
- return -EINVAL;
+ goto err_einval;
}
clk_rate = clk_get_rate(fclk);
if (!clk_rate) {
dev_err(chip->dev, "invalid pmtimer fclk rate\n");
- mutex_unlock(&omap->mutex);
- return -EINVAL;
+ goto err_einval;
}
dev_dbg(chip->dev, "clk rate: %luHz\n", clk_rate);
@@ -142,6 +140,8 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
* The non-active time is the remainder: (DM_TIMER_MAX-match_value)
* clock cycles.
*
+ * NOTE: It is required that: load_value <= match_value < DM_TIMER_MAX
+ *
* References:
* OMAP4430/60/70 TRM sections 22.2.4.10 and 22.2.4.11
* AM335x Sitara TRM sections 20.1.3.5 and 20.1.3.6
@@ -149,6 +149,24 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
period_cycles = pwm_omap_dmtimer_get_clock_cycles(clk_rate, period_ns);
duty_cycles = pwm_omap_dmtimer_get_clock_cycles(clk_rate, duty_ns);
+ if (period_cycles < 2) {
+ dev_info(chip->dev,
+ "period %dns is too short for clock rate %luHz\n",
+ period_ns, clk_rate);
+ goto err_einval;
+ }
+ if (duty_cycles < 1) {
+ dev_dbg(chip->dev,
+ "duty cycle %dns is too short for clock rate %luHz, using minimum of 1 clock cycle\n",
+ duty_ns, clk_rate);
+ duty_cycles = 1;
+ } else if (duty_cycles >= period_cycles) {
+ dev_dbg(chip->dev,
+ "duty cycle %dns is too long for period %dns at clock rate %luHz, using maximum of 1 clock cycle less than period\n",
+ duty_ns, period_ns, clk_rate);
+ duty_cycles = period_cycles - 1;
+ }
+
load_value = (DM_TIMER_MAX - period_cycles) + 1;
match_value = load_value + duty_cycles - 1;
@@ -179,6 +197,11 @@ static int pwm_omap_dmtimer_config(struct pwm_chip *chip,
mutex_unlock(&omap->mutex);
return 0;
+
+err_einval:
+ mutex_unlock(&omap->mutex);
+
+ return -EINVAL;
}
static int pwm_omap_dmtimer_set_polarity(struct pwm_chip *chip,
--
2.5.0
next prev parent reply other threads:[~2016-01-30 4:26 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-30 4:26 [PATCH 0/4] pwm: omap-dmtimer: fix period/duty_cycle calculation David Rivshin (Allworx)
2016-01-30 4:26 ` [PATCH 1/4] pwm: omap-dmtimer: fix inaccurate " David Rivshin (Allworx)
2016-02-03 10:23 ` Neil Armstrong
2016-02-15 20:24 ` Adam Ford
2016-03-04 15:17 ` Thierry Reding
2016-01-30 4:26 ` David Rivshin (Allworx) [this message]
2016-02-01 18:35 ` [PATCH 2/4] pwm: omap-dmtimer: add sanity checking for load and match values David Rivshin (Allworx)
2016-02-03 10:24 ` Neil Armstrong
2016-01-30 4:26 ` [PATCH 3/4] pwm: omap-dmtimer: round load and match values rather than truncate David Rivshin (Allworx)
2016-02-03 10:24 ` Neil Armstrong
2016-03-04 15:18 ` Thierry Reding
2016-01-30 4:26 ` [PATCH 4/4] pwm: omap-dmtimer: add dev_dbg() message for effective period and duty cycle David Rivshin (Allworx)
2016-01-30 14:51 ` Neil Armstrong
2016-02-01 18:22 ` David Rivshin (Allworx)
2016-02-01 18:59 ` Tony Lindgren
2016-02-02 16:23 ` Thierry Reding
2016-02-02 23:44 ` David Rivshin (Allworx)
2016-02-03 14:14 ` Thierry Reding
2016-02-05 19:51 ` David Rivshin (Allworx)
2016-02-09 12:49 ` Neil Armstrong
2016-01-30 14:52 ` [PATCH 0/4] pwm: omap-dmtimer: fix period/duty_cycle calculation Neil Armstrong
2016-02-01 20:14 ` David Rivshin (Allworx)
2016-02-27 1:31 ` David Rivshin (Allworx)
2016-03-04 15:19 ` Thierry Reding
2016-03-04 16:27 ` David Rivshin (Allworx)
[not found] ` <CAHCN7xJYi8VCe8ue_QuYmqTEo-8GPSPiwzM2F_631mMUrwajSA@mail.gmail.com>
2016-03-04 20:01 ` David Rivshin (Allworx)
2016-03-04 20:03 ` Adam Ford
2016-03-04 21:18 ` Thierry Reding
2016-03-04 23:20 ` David Rivshin (Allworx)
2016-03-08 23:23 ` Adam Ford
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1454128014-22866-3-git-send-email-drivshin.allworx@gmail.com \
--to=drivshin.allworx@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=manabian@gmail.com \
--cc=marathon96@gmail.com \
--cc=narmstrong@baylibre.com \
--cc=neilb@suse.de \
--cc=thierry.reding@gmail.com \
--cc=tony@atomide.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).