• Sebastian Reichel's avatar
    clk: composite: Fix handling of high clock rates · d54fb4b2
    Sebastian Reichel authored
    ULONG_MAX is used by a few drivers to figure out the highest available
    clock rate via clk_round_rate(clk, ULONG_MAX). Since abs() takes a
    signed value as input, the current logic effectively calculates with
    ULONG_MAX = -1, which results in the worst parent clock being chosen
    instead of the best one.
    
    For example on Rockchip RK3588 the eMMC driver tries to figure out
    the highest available clock rate. There are three parent clocks
    available resulting in the following rate diffs with the existing
    logic:
    
    GPLL:   abs(18446744073709551615 - 1188000000) = 1188000001
    CPLL:   abs(18446744073709551615 - 1500000000) = 1500000001
    XIN24M: abs(18446744073709551615 -   24000000) =   24000001
    
    As a result the clock framework will promote a maximum supported
    clock rate of 24 MHz, even though 1.5GHz are possible. With the
    updated logic any casting between signed and unsigned is avoided
    and the numbers look like this instead:
    
    GPLL:   18446744073709551615 - 1188000000 = 18446744072521551615
    CPLL:   18446744073709551615 - 1500000000 = 18446744072209551615
    XIN24M: 18446744073709551615 -   24000000 = 18446744073685551615
    
    As a result the parent with the highest acceptable rate is chosen
    instead of the parent clock with the lowest one.
    
    Cc: stable@vger.kernel.org
    Fixes: 49502408 ("mmc: sdhci-of-dwcmshc: properly determine max clock on Rockchip")
    Tested-by: default avatarChristopher Obbard <chris.obbard@collabora.com>
    Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
    Link: https://lore.kernel.org/r/20230526171057.66876-2-sebastian.reichel@collabora.comReviewed-by: default avatarAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
    Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
    d54fb4b2
clk-composite.c 13.2 KB