From 4d1e75ce3b09d95ae0c7ffe3d489a19d2fe55bba Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Thu, 15 Jun 2023 08:52:17 +0200 Subject: [PATCH] dde_linux: enhance clock infrastructure Issue #5036 --- repos/dde_linux/src/lib/lx_emul/clock.cc | 19 +++++++++++--- .../lx_emul/shadow/drivers/clk/clk-devres.c | 26 +++++++++++++++++++ .../src/lib/lx_emul/shadow/drivers/clk/clk.c | 5 ++++ 3 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 repos/dde_linux/src/lib/lx_emul/shadow/drivers/clk/clk-devres.c diff --git a/repos/dde_linux/src/lib/lx_emul/clock.cc b/repos/dde_linux/src/lib/lx_emul/clock.cc index 78c409e24b..a4cf83cbe5 100644 --- a/repos/dde_linux/src/lib/lx_emul/clock.cc +++ b/repos/dde_linux/src/lib/lx_emul/clock.cc @@ -15,8 +15,21 @@ #include #include -extern "C" int of_device_is_compatible(const struct device_node * node, - const char * compat); +/* + * CONFIG_OF is normally disabled on PC thus of_device_is_compatible() should + * be "static inline" not "extern" (see include/linux/of.h), thus enable this + * function only if not building for x86. + */ +extern "C" int of_device_is_compatible(const struct device_node * node, const char * compat); +static int _of_device_is_compatible(const struct device_node * node, const char * compat) +{ +#if defined(__x86_64__) || defined(__i386__) + (void)node; (void)compat; + return 0; +#else + return of_device_is_compatible(node, compat); +#endif +} struct clk * lx_emul_clock_get(const struct device_node * node, const char * name) @@ -26,7 +39,7 @@ struct clk * lx_emul_clock_get(const struct device_node * node, struct clk * ret = nullptr; env().devices.for_each([&] (Device & d) { - if (!of_device_is_compatible(node, d.compatible())) + if (!_of_device_is_compatible(node, d.compatible())) return; ret = name ? d.clock(name) : d.clock(0U); if (!ret) warning("No clock ", name, " found for device ", d.name()); diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/drivers/clk/clk-devres.c b/repos/dde_linux/src/lib/lx_emul/shadow/drivers/clk/clk-devres.c new file mode 100644 index 0000000000..4c5b03bf53 --- /dev/null +++ b/repos/dde_linux/src/lib/lx_emul/shadow/drivers/clk/clk-devres.c @@ -0,0 +1,26 @@ +/* + * \brief Replaces drivers/clk/clk-devres.c + * \author Christian Helmuth + * \date 2023-06-13 + */ + +/* + * Copyright (C) 2023 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include + + +struct clk *devm_clk_get(struct device *dev, const char *id) +{ + return clk_get(dev, id); +} + + +struct clk *devm_clk_get_optional(struct device *dev,const char *id) +{ + return devm_clk_get(dev, id); +} diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/drivers/clk/clk.c b/repos/dde_linux/src/lib/lx_emul/shadow/drivers/clk/clk.c index 1d4195c516..0e5c1d6ced 100644 --- a/repos/dde_linux/src/lib/lx_emul/shadow/drivers/clk/clk.c +++ b/repos/dde_linux/src/lib/lx_emul/shadow/drivers/clk/clk.c @@ -52,3 +52,8 @@ struct of_device_id; void of_clk_init(const struct of_device_id *matches) { } + +const char *__clk_get_name(const struct clk *clk) +{ + return "unknown-clk"; +}