 20ea6adbf1
			
		
	
	20ea6adbf1
	
	
	
		
			
			Build system: x86_64 Build-tested: bcm2708, bcm2709, bcm2710, bcm2711 Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B Signed-off-by: Marty Jones <mj8263788@gmail.com> Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From b28798f3ae1a63169dd57e5b5cb55848172aa4c6 Mon Sep 17 00:00:00 2001
 | |
| From: Maxime Ripard <maxime@cerno.tech>
 | |
| Date: Fri, 8 Apr 2022 09:54:39 +0200
 | |
| Subject: [PATCH] clk: tests: Add tests for uncached clock
 | |
| 
 | |
| The clock framework supports clocks that can have their rate changed
 | |
| without the kernel knowing about it using the CLK_GET_RATE_NOCACHE flag.
 | |
| 
 | |
| As its name suggests, this flag turns off the rate caching in the clock
 | |
| framework, reading out the rate from the hardware any time we need to
 | |
| read it.
 | |
| 
 | |
| Let's add a couple of tests to make sure it works as intended.
 | |
| 
 | |
| Tested-by: Alexander Stein <alexander.stein@ew.tq-group.com> # imx8mp
 | |
| Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> # exynos4210, meson g12b
 | |
| Signed-off-by: Maxime Ripard <maxime@cerno.tech>
 | |
| ---
 | |
|  drivers/clk/clk_test.c | 88 +++++++++++++++++++++++++++++++++++++++++-
 | |
|  1 file changed, 87 insertions(+), 1 deletion(-)
 | |
| 
 | |
| --- a/drivers/clk/clk_test.c
 | |
| +++ b/drivers/clk/clk_test.c
 | |
| @@ -262,6 +262,91 @@ static struct kunit_suite clk_test_suite
 | |
|  	.test_cases = clk_test_cases,
 | |
|  };
 | |
|  
 | |
| +static int clk_uncached_test_init(struct kunit *test)
 | |
| +{
 | |
| +	struct clk_dummy_context *ctx;
 | |
| +	int ret;
 | |
| +
 | |
| +	ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
 | |
| +	if (!ctx)
 | |
| +		return -ENOMEM;
 | |
| +	test->priv = ctx;
 | |
| +
 | |
| +	ctx->rate = DUMMY_CLOCK_INIT_RATE;
 | |
| +	ctx->hw.init = CLK_HW_INIT_NO_PARENT("test-clk",
 | |
| +					     &clk_dummy_rate_ops,
 | |
| +					     CLK_GET_RATE_NOCACHE);
 | |
| +
 | |
| +	ret = clk_hw_register(NULL, &ctx->hw);
 | |
| +	if (ret)
 | |
| +		return ret;
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +/*
 | |
| + * Test that for an uncached clock, the clock framework doesn't cache
 | |
| + * the rate and clk_get_rate() will return the underlying clock rate
 | |
| + * even if it changed.
 | |
| + */
 | |
| +static void clk_test_uncached_get_rate(struct kunit *test)
 | |
| +{
 | |
| +	struct clk_dummy_context *ctx = test->priv;
 | |
| +	struct clk_hw *hw = &ctx->hw;
 | |
| +	struct clk *clk = hw->clk;
 | |
| +	unsigned long rate;
 | |
| +
 | |
| +	rate = clk_get_rate(clk);
 | |
| +	KUNIT_ASSERT_GT(test, rate, 0);
 | |
| +	KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_INIT_RATE);
 | |
| +
 | |
| +	ctx->rate = DUMMY_CLOCK_RATE_1;
 | |
| +	rate = clk_get_rate(clk);
 | |
| +	KUNIT_ASSERT_GT(test, rate, 0);
 | |
| +	KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1);
 | |
| +}
 | |
| +
 | |
| +/*
 | |
| + * Test that for an uncached clock, clk_set_rate_range() will work
 | |
| + * properly if the rate hasn't changed.
 | |
| + */
 | |
| +static void clk_test_uncached_set_range(struct kunit *test)
 | |
| +{
 | |
| +	struct clk_dummy_context *ctx = test->priv;
 | |
| +	struct clk_hw *hw = &ctx->hw;
 | |
| +	struct clk *clk = hw->clk;
 | |
| +	unsigned long rate;
 | |
| +
 | |
| +	KUNIT_ASSERT_EQ(test,
 | |
| +			clk_set_rate_range(clk,
 | |
| +					   DUMMY_CLOCK_RATE_1,
 | |
| +					   DUMMY_CLOCK_RATE_2),
 | |
| +			0);
 | |
| +
 | |
| +	rate = clk_get_rate(clk);
 | |
| +	KUNIT_ASSERT_GT(test, rate, 0);
 | |
| +	KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1);
 | |
| +	KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2);
 | |
| +}
 | |
| +
 | |
| +static struct kunit_case clk_uncached_test_cases[] = {
 | |
| +	KUNIT_CASE(clk_test_uncached_get_rate),
 | |
| +	KUNIT_CASE(clk_test_uncached_set_range),
 | |
| +	{}
 | |
| +};
 | |
| +
 | |
| +/*
 | |
| + * Test suite for a basic, uncached, rate clock, without any parent.
 | |
| + *
 | |
| + * These tests are supposed to exercise the rate API with simple scenarios
 | |
| + */
 | |
| +static struct kunit_suite clk_uncached_test_suite = {
 | |
| +	.name = "clk-uncached-test",
 | |
| +	.init = clk_uncached_test_init,
 | |
| +	.exit = clk_test_exit,
 | |
| +	.test_cases = clk_uncached_test_cases,
 | |
| +};
 | |
| +
 | |
|  struct clk_single_parent_ctx {
 | |
|  	struct clk_dummy_context parent_ctx;
 | |
|  	struct clk_hw hw;
 | |
| @@ -1042,6 +1127,7 @@ kunit_test_suites(
 | |
|  	&clk_orphan_transparent_single_parent_test_suite,
 | |
|  	&clk_range_test_suite,
 | |
|  	&clk_range_maximize_test_suite,
 | |
| -	&clk_range_minimize_test_suite
 | |
| +	&clk_range_minimize_test_suite,
 | |
| +	&clk_uncached_test_suite
 | |
|  );
 | |
|  MODULE_LICENSE("GPL v2");
 |