lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 2/7] clk: bcm: rpi: Add a function to retrieve the maximum
    Date
    The RaspberryPi firmware can be configured by the end user using the
    config.txt file.

    Some of these options will affect the kernel capabilities, and we thus
    need to be able to detect it to operate reliably.

    One of such parameters is the hdmi_enable_4kp60 parameter that will
    setup the clocks in a way that is suitable to reach the pixel
    frequencies required by the 4k at 60Hz and higher modes.

    If the user forgot to enable it, then those modes will simply not work
    but are still likely to be picked up by the userspace, which is a poor
    user-experience.

    The kernel can't access the config.txt file directly, but one of the
    effect that parameter has is that the core clock frequency maximum will
    be much higher. Thus we can infer whether it was enabled or not by
    querying the firmware for that maximum, and if it isn't prevent any of
    the modes that wouldn't work.

    The HDMI driver is already doing this, but was relying on a behaviour of
    clk_round_rate() that got changed recently, and doesn't return the
    result we would like anymore.

    We also considered introducing a CCF function to access the maximum of a
    given struct clk, but that wouldn't work if the clock is further
    constrained by another user.

    It was thus suggested to create a small, ad-hoc function to query the
    RaspberryPi firmware for the maximum rate a given clock has.

    Suggested-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Maxime Ripard <maxime@cerno.tech>

    diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c
    index 6c0a0fd6cd79..182e8817eac2 100644
    --- a/drivers/clk/bcm/clk-raspberrypi.c
    +++ b/drivers/clk/bcm/clk-raspberrypi.c
    @@ -16,6 +16,7 @@
    #include <linux/module.h>
    #include <linux/platform_device.h>

    +#include <soc/bcm2835/raspberrypi-clocks.h>
    #include <soc/bcm2835/raspberrypi-firmware.h>

    enum rpi_firmware_clk_id {
    @@ -254,6 +255,33 @@ static int raspberrypi_fw_dumb_determine_rate(struct clk_hw *hw,
    return 0;
    }

    +unsigned long rpi_firmware_clk_get_max_rate(struct clk *clk)
    +{
    + const struct raspberrypi_clk_data *data;
    + struct raspberrypi_clk *rpi;
    + struct clk_hw *hw;
    + u32 max_rate;
    + int ret;
    +
    + if (!clk)
    + return 0;
    +
    + hw = __clk_get_hw(clk);
    + if (!hw)
    + return 0;
    +
    + data = clk_hw_to_data(hw);
    + rpi = data->rpi;
    + ret = raspberrypi_clock_property(rpi->firmware, data,
    + RPI_FIRMWARE_GET_MAX_CLOCK_RATE,
    + &max_rate);
    + if (ret)
    + return 0;
    +
    + return max_rate;
    +}
    +EXPORT_SYMBOL_GPL(rpi_firmware_clk_get_max_rate);
    +
    static const struct clk_ops raspberrypi_firmware_clk_ops = {
    .is_prepared = raspberrypi_fw_is_prepared,
    .recalc_rate = raspberrypi_fw_get_rate,
    diff --git a/include/soc/bcm2835/raspberrypi-clocks.h b/include/soc/bcm2835/raspberrypi-clocks.h
    new file mode 100644
    index 000000000000..ff0b608b51a8
    --- /dev/null
    +++ b/include/soc/bcm2835/raspberrypi-clocks.h
    @@ -0,0 +1,15 @@
    +/* SPDX-License-Identifier: GPL-2.0 */
    +
    +#ifndef __SOC_RASPBERRY_CLOCKS_H__
    +#define __SOC_RASPBERRY_CLOCKS_H__
    +
    +#if IS_ENABLED(CONFIG_CLK_RASPBERRYPI)
    +unsigned long rpi_firmware_clk_get_max_rate(struct clk *clk);
    +#else
    +static inline unsigned long rpi_firmware_clk_get_max_rate(struct clk *clk)
    +{
    + return ULONG_MAX;
    +}
    +#endif
    +
    +#endif /* __SOC_RASPBERRY_CLOCKS_H__ */
    --
    b4 0.10.0-dev-a76f5

    \
     
     \ /
      Last update: 2022-08-15 17:34    [W:5.160 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site