From: David Lechner <dlechner@baylibre.com>
To: "Uwe Kleine-König" <u.kleine-koenig@baylibre.com>,
linux-pwm@vger.kernel.org
Cc: "Fabrice Gasnier" <fabrice.gasnier@foss.st.com>,
"Steven Rostedt" <rostedt@goodmis.org>,
"Masami Hiramatsu" <mhiramat@kernel.org>,
"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
linux-trace-kernel@vger.kernel.org,
"Michael Hennerich" <michael.hennerich@analog.com>,
"Trevor Gamblin" <tgamblin@baylibre.com>,
"Nuno Sá" <nuno.sa@analog.com>,
"Maxime Coquelin" <mcoquelin.stm32@gmail.com>,
"Alexandre Torgue" <alexandre.torgue@foss.st.com>,
linux-stm32@st-md-mailman.stormreply.com,
"Kent Gibson" <warthog618@gmail.com>
Subject: Re: [PATCH v4 0/7] pwm: New abstraction and userspace API
Date: Fri, 6 Sep 2024 14:06:18 -0500 [thread overview]
Message-ID: <6e4b7ef4-19c7-477c-b753-d4d59ed38e3a@baylibre.com> (raw)
In-Reply-To: <cover.1725635013.git.u.kleine-koenig@baylibre.com>
On 9/6/24 10:42 AM, Uwe Kleine-König wrote:
> Hello,
>
> here comes v4 of the series to add support for duty offset in PWM
> waveforms. For a single PWM output there is no gain, but if you have a
> chip with two (or more) outputs and both operate with the same period,
> you can generate an output like:
>
> ______ ______ ______ ______
> PWM #0 ___/ \_______/ \_______/ \_______/ \_______
> __ __ __ __
> PWM #1 _____/ \___________/ \___________/ \___________/ \_________
> ^ ^ ^ ^
>
While working on an ADC driver that uses these new waveform APIs, we came
across a case where we wanted wf->duty_offset_ns >= wf->period_length_ns,
which is currently not allowed. [1]
______ ______ ______ ______
PWM #0 ___/ \_______/ \_______/ \_______/ \_______
__ __ __
PWM #1 __________________/ \___________/ \___________/ \___________
^ ^ ^
We worked around it by setting:
wf->duty_offset_ns = DESIRED_NS % wf->period_length_ns
Having PWM #1 trigger too early just causes the first sample data
read to be invalid data.
But even if we allowed wf->duty_offset_ns >= wf->period_length_ns,
this offset wouldn't matter because there currently isn't a way to
enable two PWM outputs at exactly the same time.
In the ADC application we work around both of these shortcomings by not
enabling the DMA that is triggered by PWM #1 until after both PWMs are
enabled. However, there may be similar applications in the future that
also need such an offset and synchronized enable that might not be so
easy to work around, so something to keep in mind.
[1]: https://lore.kernel.org/linux-iio/20240904-ad7625_r1-v4-2-78bc7dfb2b35@baylibre.com/
>
> - The functions pwm_set_waveform_might_sleep() and
> pwm_round_waveform_might_sleep() have an unusual return value
> convention: They return 0 on success, 1 if the requested waveform
> cannot be implemented without breaking the rounding rules, or a
> negative errno if an error occurs.
> Fabrice rightfully pointed out this to be surprised by this and
> suggested to use at least a define for it.
>
> I couldn't find a decision that I'm entirely happy with here. My
> conflicts are:
>
> - I want a constant that now and in the future only means "cannot be
> done due to the rounding rules in the pwm framework". So the
> options are:
> * Introduce a new ESOMETHING and return -ESOMETHING
> I think that's hard to motivate and also myself doubt this
> would be sensible. As below, the question for a good name is
> unresolved.
> * return 1
> This is what was done in the earlier revisions and also here.
>
> - When keeping the return 1 semantics (and also for a new
> ESOMETHING):
> I agree that a name instead of a plain 1 would be nice, but I
> couldn't come up with a name I liked. Given that this can be
> introduced later without breaking anything, I don't consider that
> very urgent.
> My candidates were PWM_REQUIRES_BROKEN_ROUNDING,
> PWM_REQUIRES_FORBIDDEN_ROUNDING and PWM_ERR_ROUNDING.
> These are too long or/and imprecise.
> If you have a good idea, please tell.
To avoid using the return value for status flags, we could introduce
an optional output parameter. Consumers where best effort is good
enough can just pass NULL and consumers that care can pass an unsigned
int to receive the status flag. This could even be a bitmap of multiple
flags if it would be useful to know which rule(s) could not be met.
next prev parent reply other threads:[~2024-09-06 19:06 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-06 15:42 [PATCH v4 0/7] pwm: New abstraction and userspace API Uwe Kleine-König
2024-09-06 15:42 ` [PATCH v4 1/7] pwm: Add more locking Uwe Kleine-König
2024-09-06 19:54 ` David Lechner
2024-09-17 16:01 ` Uwe Kleine-König
2024-09-06 15:42 ` [PATCH v4 2/7] pwm: New abstraction for PWM waveforms Uwe Kleine-König
2024-09-06 17:50 ` Trevor Gamblin
2024-09-06 20:33 ` David Lechner
2024-09-06 15:42 ` [PATCH v4 3/7] pwm: Provide new consumer API functions for waveforms Uwe Kleine-König
2024-09-06 21:22 ` David Lechner
2024-09-08 12:01 ` Uwe Kleine-König
2024-09-06 15:43 ` [PATCH v4 4/7] pwm: Add support for pwmchip devices for faster and easier userspace access Uwe Kleine-König
2024-09-06 22:26 ` David Lechner
2024-09-08 14:59 ` Uwe Kleine-König
2024-09-09 20:53 ` David Lechner
2024-09-17 17:10 ` Uwe Kleine-König
2024-09-18 9:21 ` Uwe Kleine-König
2024-09-07 1:58 ` Kent Gibson
2024-09-06 15:43 ` [PATCH v4 5/7] pwm: Add tracing for waveform callbacks Uwe Kleine-König
2024-09-06 15:43 ` [PATCH v4 6/7] pwm: axi-pwmgen: Implementation of the " Uwe Kleine-König
2024-09-06 17:44 ` Trevor Gamblin
2024-09-06 15:43 ` [PATCH v4 7/7] pwm: stm32: " Uwe Kleine-König
2024-09-06 18:08 ` [PATCH v4 0/7] pwm: New abstraction and userspace API Trevor Gamblin
2024-09-06 19:06 ` David Lechner [this message]
2024-09-08 11:32 ` Uwe Kleine-König
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=6e4b7ef4-19c7-477c-b753-d4d59ed38e3a@baylibre.com \
--to=dlechner@baylibre.com \
--cc=alexandre.torgue@foss.st.com \
--cc=fabrice.gasnier@foss.st.com \
--cc=linux-pwm@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=mhiramat@kernel.org \
--cc=michael.hennerich@analog.com \
--cc=nuno.sa@analog.com \
--cc=rostedt@goodmis.org \
--cc=tgamblin@baylibre.com \
--cc=u.kleine-koenig@baylibre.com \
--cc=warthog618@gmail.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