
Add a stub_clk driver which does absolutely nothing and is configured as the fallback stub for UCLASS_CLK. If there is a dependency on a clock device which is not supported by any existing driver, and CONFIG_CLK_STUB is enabled, then the stub driver will kick in.
This is intended to be useful during early bringup (e.g. if the serial port is already configured for a default rate) or for clock controllers that simply aren't vital for a platform to work.
Signed-off-by: Caleb Connolly caleb.connolly@linaro.org --- drivers/clk/Makefile | 1 + drivers/clk/clk-fallback.c | 39 +++++++++++++++++++++++++++++++++++++++ drivers/clk/clk-uclass.c | 4 ++++ drivers/core/Kconfig | 10 ++++++++++ 4 files changed, 54 insertions(+)
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index 638ad04baeb0..dd57f2fd0397 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile @@ -4,8 +4,9 @@ # Wolfgang Denk, DENX Software Engineering, wd@denx.de. #
obj-$(CONFIG_$(SPL_TPL_)CLK) += clk-uclass.o +obj-$(CONFIG_CLK_FALLBACK) += clk-fallback.o obj-$(CONFIG_$(SPL_TPL_)CLK) += clk_fixed_rate.o obj-$(CONFIG_$(SPL_TPL_)CLK) += clk_fixed_factor.o obj-$(CONFIG_$(SPL_TPL_)CLK_CCF) += clk.o clk-divider.o clk-mux.o clk-gate.o obj-$(CONFIG_$(SPL_TPL_)CLK_CCF) += clk-fixed-factor.o diff --git a/drivers/clk/clk-fallback.c b/drivers/clk/clk-fallback.c new file mode 100644 index 000000000000..f5733821e998 --- /dev/null +++ b/drivers/clk/clk-fallback.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2024 Linaro Ltd. + * + * Stub clock driver for non-vital clocks. + */ + +#include <clk.h> +#include <clk-uclass.h> +#include <dm.h> + +static ulong fallback_clk_set_rate(struct clk *clk, ulong rate) +{ + return (clk->rate = rate); +} + +static ulong fallback_clk_get_rate(struct clk *clk) +{ + return clk->rate; +} + +static int fallback_clk_nop(struct clk *clk) +{ + return 0; +}; + +static struct clk_ops fallback_clk_ops = { + .set_rate = fallback_clk_set_rate, + .get_rate = fallback_clk_get_rate, + .enable = fallback_clk_nop, + .disable = fallback_clk_nop, +}; + +U_BOOT_DRIVER(clk_fallback) = { + .name = "clk_fallback", + .id = UCLASS_CLK, + .ops = &fallback_clk_ops, + .flags = DM_FLAG_DEFAULT_PD_CTRL_OFF, +}; diff --git a/drivers/clk/clk-uclass.c b/drivers/clk/clk-uclass.c index ed6e60bc4841..c0cdb3cf529c 100644 --- a/drivers/clk/clk-uclass.c +++ b/drivers/clk/clk-uclass.c @@ -11,8 +11,9 @@ #include <common.h> #include <clk.h> #include <clk-uclass.h> #include <dm.h> +#include <dm/lists.h> #include <dt-structs.h> #include <errno.h> #include <log.h> #include <malloc.h> @@ -801,6 +802,9 @@ int clk_uclass_post_probe(struct udevice *dev)
UCLASS_DRIVER(clk) = { .id = UCLASS_CLK, .name = "clk", +#if CONFIG_IS_ENABLED(CLK_FALLBACK) + .fallback_drv_name = "clk_fallback", +#endif .post_probe = clk_uclass_post_probe, }; diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig index 09075b9b7a15..1cf78b4303ca 100644 --- a/drivers/core/Kconfig +++ b/drivers/core/Kconfig @@ -476,5 +476,15 @@ menuconfig FALLBACK_DRIVERS driver to "stub" the resource. These stubs usually do nothing and are therefore only suitable in instances where the resource is not required.
+config CLK_FALLBACK + bool "Enable the clock fallback driver" + depends on FALLBACK_DRIVERS && CLK + help + This provides a no-op clock driver that can be used as a fallback + when no other driver is available. This is useful for systems with + clock controllers that are not actually required for peripherals to + work correctly (for example the RPMh clock controller on Qualcomm + platforms). + endmenu