From: Stefan Wahren <wahrenst@gmx.net>
To: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Cc: linux-pwm@vger.kernel.org,
Florian Fainelli <f.fainelli@gmail.com>,
Scott Branden <sbranden@broadcom.com>,
Ray Jui <rjui@broadcom.com>, Eric Anholt <eric@anholt.net>,
Thierry Reding <thierry.reding@gmail.com>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 0/3] pwm: bcm2835: Minor fixes
Date: Sat, 24 Aug 2019 12:05:00 +0200 [thread overview]
Message-ID: <22f8e65b-2d65-84e7-de50-ba6538a84292@gmx.net> (raw)
In-Reply-To: <20190824092553.j4rjpzaz4m6yaa5t@pengutronix.de>
Hi Uwe,
Am 24.08.19 um 11:25 schrieb Uwe Kleine-König:
> Hello Stefan,
>
> On Sat, Aug 24, 2019 at 09:07:22AM +0200, Stefan Wahren wrote:
>> This small patch series contains minor fixes for clock handling and the
>> period range check.
> I'd like to understand the various different usecases of PWMs. The
> in-kernel consumers are kind of obvious, but sysfs users are not. It
> seems you are one of the latter.
>
> Would you mind sharing what you control using the PWM?
not really a PWM user with BCM2835. It's more the motivation as a
platform maintainer to keep the drivers in shape. At work we are using
sysfs interface for user applications to control ventilation (via hwmon
interface) and EV charging (IEC 61851) with a different SoC.
> Does it bother
> you that the sysfs interface doesn't allow atomic configuration?
To be honest not really, but i think a lot of user could benefit and
might stop using hacky Python scripts which manipulate the registers
directly.
>
> Assuming you have some interest in this driver: It still uses the legacy
> stuff implementing .config, .enable, .disable, .set_polarity. Are you
> willing to test (or even implement) a switch to .apply instead?
Yes, definitely. This is one of my never ending TODO list [1]. But i
would be suprised that you wont have access to a Raspberry Pi.
>
> Just from a quick lock into the driver I wonder a few things, maybe you
> can shed some light here. If there is publicly available documenation
> for this piece of hardware, feel free to point this out, then I might be
> able to work out some of the answers myself.
Fortunately yes [2]
>
> The overall (and common) design of the PWM is an input clk, a counter, a
> duty and a period register.
>
> The slightly simplified logic in .config is:
>
> scaler = DIV_ROUND_CLOSEST(NSEC_PER_SEC, rate);
> writel(DIV_ROUND_CLOSEST(duty_ns, scaler), PWM_DUTY);
> writel(DIV_ROUND_CLOSEST(period_ns, scaler), PWM_PERIOD);
>
> This is loosing precision while the calculation could be cheaper (in CPU
> cycles) and more exact when using:
>
> writel(DIV_ROUND_CLOSEST(duty_ns * rate, NSEC_PER_SEC), PWM_DUTY);
> writel(DIV_ROUND_CLOSEST(period_ns * rate, NSEC_PER_SEC), PWM_PERIOD);
>
> This is only two divisions instead of three. And assuming a rate of 9.2
> MHz and a request of duty_ns = 499945, period_ns = 999891 the original
> calculation yields
>
> DUTY = 4587
> PERIOD = 9173
>
> real_duty_ns = 498586.95652173914
> real_period_ns = 997065.2173913043
>
> error_duty_ns = 1358.0434782608645
> error_period_ns = 2825.7826086956775
>
> With my suggestion you'd get
>
> DUTY = 4599
> PERIOD = 9199
>
> real_duty_ns = 499891.3043478261
> real_period_ns = 999891.304347826
>
> error_duty_ns = 53.69565217389027
> error_period_ns = -0.30434782605152577
>
> (But having said this, I'd prefer to use rounding down instead of
> rounding closest).
>
> Also I wonder if reprogramming the hardware completes the currently
> running period and how the hardware behaves on disable. (In the latter
> case I'm interested in "Does it complete the running period?" and "Which
> state does the output stop in?")
I need to make logic analyzer traces to make any statement.
Thanks
[1] - https://github.com/lategoodbye/rpi-zero/issues/16
[2] -
https://www.raspberrypi.org/app/uploads/2012/02/BCM2835-ARM-Peripherals.pdf
>
> Best regards
> Uwe
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-08-24 10:05 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-24 7:07 [PATCH 0/3] pwm: bcm2835: Minor fixes Stefan Wahren
2019-08-24 7:07 ` [PATCH 1/3] pwm: bcm2835: suppress error message for invalid period_ns Stefan Wahren
2019-08-24 9:26 ` Uwe Kleine-König
2019-08-24 7:07 ` [PATCH 2/3] pwm: bcm2835: fix period_ns range check Stefan Wahren
2019-08-24 9:26 ` Uwe Kleine-König
2019-08-24 7:07 ` [PATCH 3/3] pwm: bcm2835: suppress error message during deferred probe Stefan Wahren
2019-08-24 9:30 ` Uwe Kleine-König
2019-08-24 9:44 ` Stefan Wahren
2019-08-24 9:25 ` [PATCH 0/3] pwm: bcm2835: Minor fixes Uwe Kleine-König
2019-08-24 10:05 ` Stefan Wahren [this message]
2019-08-24 10:56 ` Uwe Kleine-König
2019-08-24 14:17 ` Stefan Wahren
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=22f8e65b-2d65-84e7-de50-ba6538a84292@gmx.net \
--to=wahrenst@gmx.net \
--cc=eric@anholt.net \
--cc=f.fainelli@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-pwm@vger.kernel.org \
--cc=rjui@broadcom.com \
--cc=sbranden@broadcom.com \
--cc=thierry.reding@gmail.com \
--cc=u.kleine-koenig@pengutronix.de \
/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).