From: Heiner Kallweit <hkallweit1@gmail.com>
To: George Stark <gnstark@sberdevices.ru>
Cc: "thierry.reding@gmail.com" <thierry.reding@gmail.com>,
"linux-iio@vger.kernel.org" <linux-iio@vger.kernel.org>,
"u.kleine-koenig@pengutronix.de" <u.kleine-koenig@pengutronix.de>,
"neil.armstrong@linaro.org" <neil.armstrong@linaro.org>,
"martin.blumenstingl@googlemail.com"
<martin.blumenstingl@googlemail.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-amlogic@lists.infradead.org"
<linux-amlogic@lists.infradead.org>,
kernel <kernel@sberdevices.ru>,
Dmitry Rokosov <DDRokosov@sberdevices.ru>,
"jbrunet@baylibre.com" <jbrunet@baylibre.com>,
"khilman@baylibre.com" <khilman@baylibre.com>
Subject: Re: [PATCH] pwm: meson: compute cnt register value in proper way
Date: Mon, 5 Jun 2023 23:01:40 +0200 [thread overview]
Message-ID: <bf7c71bf-4f04-0dd3-91e1-eb639b36e7d1@gmail.com> (raw)
In-Reply-To: <ed8f95d2-ef62-d91a-618c-402ba1c9d09f@sberdevices.ru>
On 05.06.2023 09:11, George Stark wrote:
> On 6/2/23 23:52, Heiner Kallweit wrote:
>> On 02.06.2023 12:32, George Stark wrote:
>>> According to the datasheet, the PWM high and low clock count values
>>> should be set to at least one. Therefore, setting the clock count
>>> register to 0 actually means 1 clock count.
>>>
>>> Signed-off-by: George Stark <GNStark@sberdevices.ru>
>>> Signed-off-by: Dmitry Rokosov <ddrokosov@sberdevices.ru>
>>> ---
>>> This patch is based on currently unmerged patch by Heiner Kallweit
>>> https://lore.kernel.org/linux-amlogic/23fe625e-dc23-4db8-3dce-83167cd3b206@gmail.com
>>> ---
>>> diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c
>>> index 834acd7..57e7d9c 100644
>>> --- a/drivers/pwm/pwm-meson.c
>>> +++ b/drivers/pwm/pwm-meson.c
>>> @@ -206,6 +206,11 @@
>>> channel->pre_div = pre_div;
>>> channel->hi = duty_cnt;
>>> channel->lo = cnt - duty_cnt;
>>> +
>>> + if (channel->hi)
>>> + channel->hi--;
>>> + if (channel->lo)
>>> + channel->lo--;
> Hello Heiner
>
> Thanks for review
>> I'm not sure whether we should do this. duty_cnt and cnt are results
>> of an integer division and therefore potentially rounded down.
>> The chip-internal increment may help to compensate such rounding
>> errors, so to say. With the proposed change we may end up with the
>> effective period being shorter than the requested one.
> Although chip-internal increment sometimes may help accidentally
> there are cases when the increment ruins precise calculation in unexpected way.
>
> Here's our experience on meson a113l (meson-a1) with pwm driver based on ccf:
> we need to get pwm period as close as possible to 32768hz.
> config pwm to period 1/32768 = 30517ns, duty 15258n
> How driver calculates hi\lo regs:
> rate = NSEC_PER_SEC * 0xffff / 30517 = ~2147Mhz
> rate = clk_round_rate(rate) clk_round_rate selects fastest parent clock which is 64Mhz in our case then calculating hi\lo at last: period= mul_u64_u64_div_u64(rate, state->period, NSEC_PER_SEC); // 1953
> duty= mul_u64_u64_div_u64(rate, state->duty_cycle, NSEC_PER_SEC); // 976
> channel->hi= duty;
> channel->lo= period- duty;
> with the internal increment we'll have real output (1953-976 + 1 + 976 + 1) * 1 / 64Mhz = 32736.57Hz but we should have (1953-976 + 976) * 1 / 64Mhz = 32770.09Hz
Supposedly, depending on the prior rounding errors, something incrementing,
and sometimes not incrementing may provide the more precise result.
Another source of error is shown your example, the duty cycle isn't 50%
due to the rounding.
Not sure however where there's any use case where such small deviations
would cause problems. Therefore I don't have a strong opinion.
> | And IIRC this should not happen.
> Could you please explain why or point out doc/description where it's stated?
> If so we can add explicit check to prevent such a case
I think I got this wrong. When checking where I got this information from
I found the following in pwm_apply_state_debug():
if (state->enabled && state->period < s2.period)
dev_warn(chip->dev,
".apply is supposed to round down period (requested: %llu, applied: %llu)\n",
state->period, s2.period);
>>> }
>>> return 0;
>>> @@ -340,7 +345,8 @@
>>> channel->lo = FIELD_GET(PWM_LOW_MASK, value);
>>> channel->hi = FIELD_GET(PWM_HIGH_MASK, value);
>>> - state->period = meson_pwm_cnt_to_ns(chip, pwm, channel->lo + channel->hi);
>>> + state->period = meson_pwm_cnt_to_ns(chip, pwm,
>>> + channel->lo + 1 + channel->hi + 1);
>>> state->duty_cycle = meson_pwm_cnt_to_ns(chip, pwm, channel->hi);
>>>
>> Doesn't channel->hi have to be incremented here too?
> Yes, lost the line. I'll fix it
>
> Best regards
> George
>>> return 0;
>>
>
_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic
next prev parent reply other threads:[~2023-06-05 21:02 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-02 10:32 [PATCH] pwm: meson: compute cnt register value in proper way George Stark
2023-06-02 20:52 ` Heiner Kallweit
2023-06-05 7:11 ` George Stark
2023-06-05 21:01 ` Heiner Kallweit [this message]
2023-06-06 8:14 ` Uwe Kleine-König
2023-06-06 7:38 ` 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=bf7c71bf-4f04-0dd3-91e1-eb639b36e7d1@gmail.com \
--to=hkallweit1@gmail.com \
--cc=DDRokosov@sberdevices.ru \
--cc=gnstark@sberdevices.ru \
--cc=jbrunet@baylibre.com \
--cc=kernel@sberdevices.ru \
--cc=khilman@baylibre.com \
--cc=linux-amlogic@lists.infradead.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.blumenstingl@googlemail.com \
--cc=neil.armstrong@linaro.org \
--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