From: Heiner Kallweit <hkallweit1@gmail.com>
To: Dmitry Rokosov <DDRokosov@sberdevices.ru>
Cc: "Jerome Brunet" <jbrunet@baylibre.com>,
"Martin Blumenstingl" <martin.blumenstingl@googlemail.com>,
"Neil Armstrong" <narmstrong@baylibre.com>,
"Kevin Hilman" <khilman@baylibre.com>,
"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
"thierry.reding@gmail.com" <thierry.reding@gmail.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"open list:ARM/Amlogic Meson..."
<linux-amlogic@lists.infradead.org>,
"linux-pwm@vger.kernel.org" <linux-pwm@vger.kernel.org>,
"rockosov@gmail.com" <rockosov@gmail.com>,
kernel <kernel@sberdevices.ru>
Subject: Re: [PATCH v4 4/4] pwm: meson: make full use of common clock framework
Date: Fri, 19 May 2023 18:53:30 +0200 [thread overview]
Message-ID: <29961a2e-5367-0685-0f3a-1910328ad3ab@gmail.com> (raw)
In-Reply-To: <tyuyderm7i6otsgrntw2wj4k4ii5xwp2vngfa76eaguki7yuqa@322cjuotnr6q>
On 19.05.2023 17:30, Dmitry Rokosov wrote:
> Hello Heiner,
>
> Thank you for the patch series!
>
> I am currently working on the Amlogic A1 clock driver and other
> peripheral devices, including PWM. During a discussion about the clock
> driver with Martin Blumenstingl, we found an intersection between the
> clock driver and your PWM CCF support patch series. Please see my
> comments below.
>
> On Thu, Apr 13, 2023 at 07:54:46AM +0200, Heiner Kallweit wrote:
>> Newer versions of the PWM block use a core clock with external mux,
>> divider, and gate. These components either don't exist any longer in
>> the PWM block, or they are bypassed.
>> To minimize needed changes for supporting the new version, the internal
>> divider and gate should be handled by CCF too.
>>
>> I didn't see a good way to split the patch, therefore it's somewhat
>> bigger. What it does:
>>
>> - The internal mux is handled by CCF already. Register also internal
>> divider and gate with CCF, so that we have one representation of the
>> input clock: [mux] parent of [divider] parent of [gate]
>>
>> - Now that CCF selects an appropriate mux parent, we don't need the
>> DT-provided default parent any longer. Accordingly we can also omit
>> setting the mux parent directly in the driver.
>>
>> - Instead of manually handling the pre-div divider value, let CCF
>> set the input clock. Targeted input clock frequency is
>> 0xffff * 1/period for best precision.
>>
>> - For the "inverted pwm disabled" scenario target an input clock
>> frequency of 1GHz. This ensures that the remaining low pulses
>> have minimum length.
>>
>> I don't have hw with the old PWM block, therefore I couldn't test this
>> patch. With the not yet included extension for the new PWM block
>> (channel->clk coming directly from get_clk(external_clk)) I didn't
>> notice any problem. My system uses PWM for the CPU voltage regulator
>> and for the SDIO 32kHz clock.
>>
>> Note: The clock gate in the old PWM block is permanently disabled.
>> This seems to indicate that it's not used by the new PWM block.
>>
>> Tested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
>> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
>> ---
>> Changes to RFT/RFC version:
>> - use parent_hws instead of parent_names for div/gate clock
>> - use devm_clk_hw_register where the struct clk * returned by
>> devm_clk_register isn't needed
>>
>> v2:
>> - add patch 1
>> - add patch 3
>> - switch to using clk_parent_data in all relevant places
>> v3:
>> - add flag CLK_IGNORE_UNUSED
>> v4:
>> - remove variable tmp in meson_pwm_get_state
>> - don't use deprecated function devm_clk_register
>
> [...]
>
>> @@ -166,7 +158,11 @@ static int meson_pwm_calc(struct meson_pwm *meson, struct pwm_device *pwm,
>> if (state->polarity == PWM_POLARITY_INVERSED)
>> duty = period - duty;
>>
>> - fin_freq = clk_get_rate(channel->clk);
>> + freq = div64_u64(NSEC_PER_SEC * (u64)0xffff, period);
>> + if (freq > ULONG_MAX)
>> + freq = ULONG_MAX;
>> +
>> + fin_freq = clk_round_rate(channel->clk, freq);
>> if (fin_freq == 0) {
>> dev_err(meson->chip.dev, "invalid source clock frequency\n");
>> return -EINVAL;
>
> As mentioned previously, we have discussed one optimization for PWM
> parent clock calculation. Many modern Amlogic SoCs include an RTC clock
> within the clock tree. This clock provides a stable and efficient 32kHz
> input for several clock objects that can be inherited through the muxes
> from the RTC clock.
>
> In short, we aim to use the RTC clock parent directly for PWM to
> generate a 32kHz clock on the PWM lines. Martin has suggested one way to
> do so, which is described in [0]. You can also refer to our IRC
> discussion in [1].
>
> I would appreciate your thoughts on this. Please let me know what you
> think.
>
Requesting a frequency of (NSEC_PER_SEC * 0xffffULL / period) is based
on the assumption that the highest possible input frequency always
allows to generate a period that is close enough to the requested period.
To find the best parent you'd need a somewhat more complex logic outside CCF.
What you want is the parent where (f_parent * period / NSEC_PER_SEC) is
closest to an integer in the range 1 .. 0xffff.
IOW: max(abs((f_parent * period) % 10^9 - 5 * 10^8))
This can be done, question is whether it's needed and worth the effort.
This would be the generic solution. If you just want to handle the case
that period 1/32.768Hz is requested, an adjusted version of Martins's
pseudo-code formula should do.
Best I think as follow-up to my series.
> [...]
>
> Links:
> [0] https://lore.kernel.org/all/CAFBinCCPf+asVakAxeBqV-jhsZp=i2zbShByTCXfYYAQ6cCnHg@mail.gmail.com/
> [1] https://libera.irclog.whitequark.org/linux-amlogic/2023-05-18
>
next prev parent reply other threads:[~2023-05-19 16:53 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-13 5:48 [PATCH v4 0/4] pwm: meson: make full use of common clock framework Heiner Kallweit
2023-04-13 5:49 ` [PATCH v4 1/4] pwm: meson: switch to using struct clk_parent_data for mux parents Heiner Kallweit
2023-04-13 5:50 ` [PATCH v4 2/4] pwm: meson: don't use hdmi/video clock as mux parent Heiner Kallweit
2023-04-13 5:51 ` [PATCH v4 3/4] pwm: meson: change clk/pwm gate from mask to bit Heiner Kallweit
2023-04-13 5:54 ` [PATCH v4 4/4] pwm: meson: make full use of common clock framework Heiner Kallweit
2023-04-14 19:39 ` Martin Blumenstingl
2023-04-15 6:39 ` Heiner Kallweit
2023-04-16 19:26 ` Martin Blumenstingl
2023-04-16 21:34 ` Heiner Kallweit
2023-04-23 20:55 ` Martin Blumenstingl
2023-04-17 7:23 ` Neil Armstrong
2023-04-17 9:17 ` Thierry Reding
2023-04-17 9:53 ` Heiner Kallweit
2023-04-17 9:59 ` neil.armstrong
2023-04-17 10:36 ` Heiner Kallweit
2023-04-17 12:21 ` neil.armstrong
2023-04-19 19:58 ` Heiner Kallweit
2023-04-21 7:39 ` neil.armstrong
2023-04-23 20:58 ` Martin Blumenstingl
2023-05-01 13:39 ` Heiner Kallweit
2023-05-19 15:30 ` Dmitry Rokosov
2023-05-19 16:53 ` Heiner Kallweit [this message]
2023-05-22 13:37 ` Dmitry Rokosov
2023-05-22 20:10 ` Heiner Kallweit
2023-05-23 10:28 ` Dmitry Rokosov
2023-05-23 19:22 ` Heiner Kallweit
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=29961a2e-5367-0685-0f3a-1910328ad3ab@gmail.com \
--to=hkallweit1@gmail.com \
--cc=DDRokosov@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-pwm@vger.kernel.org \
--cc=martin.blumenstingl@googlemail.com \
--cc=narmstrong@baylibre.com \
--cc=rockosov@gmail.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