Add a nexus node with a child requesting a mapped clock in the fake DT overlay to verify that the parsing is also correctly working.
Suggested-by: Stephen Boyd <[email protected]> Signed-off-by: Miquel Raynal (Schneider Electric) <[email protected]> --- drivers/clk/clk_kunit_helpers.c | 31 +++++++++++++++++++++++++++++++ drivers/clk/clk_test.c | 15 +++++++++++++++ drivers/clk/kunit_clk_parse_clkspec.dtso | 10 ++++++++++ include/kunit/clk.h | 2 ++ 4 files changed, 58 insertions(+) diff --git a/drivers/clk/clk_kunit_helpers.c b/drivers/clk/clk_kunit_helpers.c index 68a28e70bb61..151f62ab57c1 100644 --- a/drivers/clk/clk_kunit_helpers.c +++ b/drivers/clk/clk_kunit_helpers.c @@ -233,5 +233,36 @@ int of_clk_add_hw_provider_kunit(struct kunit *test, struct device_node *np, } EXPORT_SYMBOL_GPL(of_clk_add_hw_provider_kunit); +KUNIT_DEFINE_ACTION_WRAPPER(of_node_put_wrapper, of_node_put, struct device_node *); + +/** + * of_find_node_by_name_kunit() - Test managed of_find_node_by_name() + * @test: The test context + * @from: Parent device node to start searching from, or NULL to search from root + * @name: The name string to match against + * + * Just like of_find_node_by_name(), except the device_noded is managed by + * the test case and is automatically put after the test case concludes. + * + * Return: the device_node on success or a negative errno value on failure. + */ +struct device_node *of_find_node_by_name_kunit(struct kunit *test, struct device_node *from, + const char *name) +{ + struct device_node *np; + int ret; + + np = of_find_node_by_name(from, name); + if (!np) + return NULL; + + ret = kunit_add_action_or_reset(test, of_node_put_wrapper, np); + if (ret) + return ERR_PTR(ret); + + return np; +} +EXPORT_SYMBOL_GPL(of_find_node_by_name_kunit); + MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("KUnit helpers for clk providers and consumers"); diff --git a/drivers/clk/clk_test.c b/drivers/clk/clk_test.c index 5f3ffda033c3..bebfd928ab36 100644 --- a/drivers/clk/clk_test.c +++ b/drivers/clk/clk_test.c @@ -3656,10 +3656,25 @@ static void of_clk_get_parent_name_gets_parent_name(struct kunit *test) of_clk_get_parent_name(ctx->cons_np, 0)); } +static void of_clk_get_hw_maps_thru_nexus(struct kunit *test) +{ + struct clk_parse_clkspec_ctx *ctx = test->priv; + struct clk_hw *expected; + struct device_node *np; + + np = of_find_node_by_name_kunit(test, NULL, "kunit-clock-nexus-child"); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); + expected = of_clk_get_hw(ctx->cons_np, 1, NULL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected); + + KUNIT_EXPECT_PTR_EQ(test, expected, of_clk_get_hw(np, 0, NULL)); +} + static struct kunit_case clk_parse_clkspec_test_cases[] = { KUNIT_CASE(clk_parse_clkspec_with_correct_index_and_name), KUNIT_CASE(clk_parse_clkspec_with_incorrect_index_and_name), KUNIT_CASE(of_clk_get_parent_name_gets_parent_name), + KUNIT_CASE(of_clk_get_hw_maps_thru_nexus), {} }; diff --git a/drivers/clk/kunit_clk_parse_clkspec.dtso b/drivers/clk/kunit_clk_parse_clkspec.dtso index c93feb93e101..a4115216d2aa 100644 --- a/drivers/clk/kunit_clk_parse_clkspec.dtso +++ b/drivers/clk/kunit_clk_parse_clkspec.dtso @@ -18,4 +18,14 @@ kunit-clock-consumer { clocks = <&kunit_clock_provider1 0>, <&kunit_clock_provider2 0>; clock-names = "first_clock", "second_clock"; }; + + kunit_clock_nexus: kunit-clock-nexus { + clocks = <&kunit_clock_provider2 0>; + clock-map = <&kunit_clock_provider2 0>; + #clock-cells = <0>; + + kunit-clock-nexus-child { + clocks = <&kunit_clock_nexus>; + }; + }; }; diff --git a/include/kunit/clk.h b/include/kunit/clk.h index f226044cc78d..ab24f7747516 100644 --- a/include/kunit/clk.h +++ b/include/kunit/clk.h @@ -29,5 +29,7 @@ int of_clk_hw_register_kunit(struct kunit *test, struct device_node *node, int of_clk_add_hw_provider_kunit(struct kunit *test, struct device_node *np, struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data), void *data); +struct device_node *of_find_node_by_name_kunit(struct kunit *test, struct device_node *from, + const char *name); #endif -- 2.54.0

