[PATCH RFC RFT v2 2/3] clk: divider: add CLK_DIVIDER_INVALID_ZERO flag
Jian Hu
jian.hu at amlogic.com
Wed Nov 4 01:07:10 PST 2026
On 10/29/2026 5:47 PM, sashiko-bot at kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [High] clk: divider: unhandled zero divisor in divider_ro_determine_rate()
> --
>
> commit 5ec3118aee2f03855552c58a4a8533e035b565bc
> Author: Jian Hu <jian.hu at amlogic.com>
>
> clk: divider: add CLK_DIVIDER_INVALID_ZERO flag
>
> This commit introduces the CLK_DIVIDER_INVALID_ZERO flag for dividers where
> a zero divisor value represents an invalid hardware state rather than a
> pass-through. When this flag is set and the divisor evaluates to zero,
> divider_recalc_rate() returns 0 without emitting a warning.
>
>> diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
>> index f68216c65d3df..6c1523d22477c 100644
>> --- a/drivers/clk/clk-divider.c
>> +++ b/drivers/clk/clk-divider.c
>> @@ -143,6 +143,9 @@ unsigned long divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate,
>>
>> div = _get_div(table, val, flags, width);
>> if (!div) {
>> + if (flags & CLK_DIVIDER_INVALID_ZERO)
>> + return 0;
> [Severity: High]
> Should divider_ro_determine_rate() in drivers/clk/clk-divider.c also handle
> a zero divisor when CLK_DIVIDER_INVALID_ZERO or CLK_DIVIDER_ALLOW_ZERO is
> set?
>
> When a read-only divider has a register value val that maps to div == 0 via
> _get_div() (for example, when CLK_DIVIDER_INVALID_ZERO is combined with
> CLK_DIVIDER_ONE_BASED or an unmapped table entry alongside
> CLK_DIVIDER_READ_ONLY), calling clk_round_rate() or clk_set_rate() invokes
> clk_divider_determine_rate()->divider_ro_determine_rate():
>
> drivers/clk/clk-divider.c:divider_ro_determine_rate() {
> int div;
>
> div = _get_div(table, val, flags, width);
>
> /* Even a read-only clock can propagate a rate change */
> if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) {
> if (!req->best_parent_hw)
> return -EINVAL;
>
> req->best_parent_rate = clk_hw_round_rate(req->best_parent_hw,
> req->rate * div);
> }
>
> req->rate = DIV_ROUND_UP_ULL((u64)req->best_parent_rate, div);
>
> return 0;
> }
>
> Unlike divider_recalc_rate(), divider_ro_determine_rate() does not check for
> !div before calling DIV_ROUND_UP_ULL(), which will trigger a division by zero
> in the kernel when div is 0.
In this patch, the dividers which set CLK_DIVIDER_INVALID_ZERO use
divider_determine_rate(),
not divider_ro_determine_rate().
divider_ro_determine_rate() is used for read-only dividers, which do not
have CLK_DIVIDER_INVALID_ZERO
set in the current implementation.
Therefore, a zero divisor caused by CLK_DIVIDER_INVALID_ZERO cannot occur in
divider_ro_determine_rate(), and no additional check is needed here.
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/20261029-meson_refactor_n-v2-0-ff4ac74e527b@amlogic.com?part=2
More information about the linux-amlogic
mailing list