+14
-28
drivers/clk/clk.c
+14
-28
drivers/clk/clk.c
···
2332
2332
}
2333
2333
EXPORT_SYMBOL_GPL(clk_set_rate_exclusive);
2334
2334
2335
-
static int clk_set_rate_range_nolock(struct clk *clk,
2336
-
unsigned long min,
2337
-
unsigned long max)
2335
+
/**
2336
+
* clk_set_rate_range - set a rate range for a clock source
2337
+
* @clk: clock source
2338
+
* @min: desired minimum clock rate in Hz, inclusive
2339
+
* @max: desired maximum clock rate in Hz, inclusive
2340
+
*
2341
+
* Returns success (0) or negative errno.
2342
+
*/
2343
+
int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)
2338
2344
{
2339
2345
int ret = 0;
2340
2346
unsigned long old_min, old_max, rate;
2341
-
2342
-
lockdep_assert_held(&prepare_lock);
2343
2347
2344
2348
if (!clk)
2345
2349
return 0;
···
2356
2352
min, max);
2357
2353
return -EINVAL;
2358
2354
}
2355
+
2356
+
clk_prepare_lock();
2359
2357
2360
2358
if (clk->exclusive_count)
2361
2359
clk_core_rate_unprotect(clk->core);
···
2401
2395
out:
2402
2396
if (clk->exclusive_count)
2403
2397
clk_core_rate_protect(clk->core);
2404
-
2405
-
return ret;
2406
-
}
2407
-
2408
-
/**
2409
-
* clk_set_rate_range - set a rate range for a clock source
2410
-
* @clk: clock source
2411
-
* @min: desired minimum clock rate in Hz, inclusive
2412
-
* @max: desired maximum clock rate in Hz, inclusive
2413
-
*
2414
-
* Return: 0 for success or negative errno on failure.
2415
-
*/
2416
-
int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)
2417
-
{
2418
-
int ret;
2419
-
2420
-
if (!clk)
2421
-
return 0;
2422
-
2423
-
clk_prepare_lock();
2424
-
2425
-
ret = clk_set_rate_range_nolock(clk, min, max);
2426
2398
2427
2399
clk_prepare_unlock();
2428
2400
···
4403
4419
}
4404
4420
4405
4421
hlist_del(&clk->clks_node);
4406
-
clk_set_rate_range_nolock(clk, 0, ULONG_MAX);
4422
+
if (clk->min_rate > clk->core->req_rate ||
4423
+
clk->max_rate < clk->core->req_rate)
4424
+
clk_core_set_rate_nolock(clk->core, clk->core->req_rate);
4407
4425
4408
4426
owner = clk->core->owner;
4409
4427
kref_put(&clk->core->ref, __clk_release);
-108
drivers/clk/clk_test.c
-108
drivers/clk/clk_test.c
···
760
760
clk_put(user1);
761
761
}
762
762
763
-
/*
764
-
* Test that if we have several subsequent calls to
765
-
* clk_set_rate_range(), across multiple users, the core will reevaluate
766
-
* whether a new rate is needed, including when a user drop its clock.
767
-
*
768
-
* With clk_dummy_maximize_rate_ops, this means that the rate will
769
-
* trail along the maximum as it evolves.
770
-
*/
771
-
static void clk_range_test_multiple_set_range_rate_put_maximized(struct kunit *test)
772
-
{
773
-
struct clk_dummy_context *ctx = test->priv;
774
-
struct clk_hw *hw = &ctx->hw;
775
-
struct clk *clk = hw->clk;
776
-
struct clk *user1, *user2;
777
-
unsigned long rate;
778
-
779
-
user1 = clk_hw_get_clk(hw, NULL);
780
-
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1);
781
-
782
-
user2 = clk_hw_get_clk(hw, NULL);
783
-
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2);
784
-
785
-
KUNIT_ASSERT_EQ(test,
786
-
clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000),
787
-
0);
788
-
789
-
KUNIT_ASSERT_EQ(test,
790
-
clk_set_rate_range(user1,
791
-
0,
792
-
DUMMY_CLOCK_RATE_2),
793
-
0);
794
-
795
-
rate = clk_get_rate(clk);
796
-
KUNIT_ASSERT_GT(test, rate, 0);
797
-
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2);
798
-
799
-
KUNIT_ASSERT_EQ(test,
800
-
clk_set_rate_range(user2,
801
-
0,
802
-
DUMMY_CLOCK_RATE_1),
803
-
0);
804
-
805
-
rate = clk_get_rate(clk);
806
-
KUNIT_ASSERT_GT(test, rate, 0);
807
-
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1);
808
-
809
-
clk_put(user2);
810
-
811
-
rate = clk_get_rate(clk);
812
-
KUNIT_ASSERT_GT(test, rate, 0);
813
-
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2);
814
-
815
-
clk_put(user1);
816
-
}
817
-
818
763
static struct kunit_case clk_range_maximize_test_cases[] = {
819
764
KUNIT_CASE(clk_range_test_set_range_rate_maximized),
820
765
KUNIT_CASE(clk_range_test_multiple_set_range_rate_maximized),
821
-
KUNIT_CASE(clk_range_test_multiple_set_range_rate_put_maximized),
822
766
{}
823
767
};
824
768
···
877
933
clk_put(user1);
878
934
}
879
935
880
-
/*
881
-
* Test that if we have several subsequent calls to
882
-
* clk_set_rate_range(), across multiple users, the core will reevaluate
883
-
* whether a new rate is needed, including when a user drop its clock.
884
-
*
885
-
* With clk_dummy_minimize_rate_ops, this means that the rate will
886
-
* trail along the minimum as it evolves.
887
-
*/
888
-
static void clk_range_test_multiple_set_range_rate_put_minimized(struct kunit *test)
889
-
{
890
-
struct clk_dummy_context *ctx = test->priv;
891
-
struct clk_hw *hw = &ctx->hw;
892
-
struct clk *clk = hw->clk;
893
-
struct clk *user1, *user2;
894
-
unsigned long rate;
895
-
896
-
user1 = clk_hw_get_clk(hw, NULL);
897
-
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1);
898
-
899
-
user2 = clk_hw_get_clk(hw, NULL);
900
-
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2);
901
-
902
-
KUNIT_ASSERT_EQ(test,
903
-
clk_set_rate_range(user1,
904
-
DUMMY_CLOCK_RATE_1,
905
-
ULONG_MAX),
906
-
0);
907
-
908
-
rate = clk_get_rate(clk);
909
-
KUNIT_ASSERT_GT(test, rate, 0);
910
-
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1);
911
-
912
-
KUNIT_ASSERT_EQ(test,
913
-
clk_set_rate_range(user2,
914
-
DUMMY_CLOCK_RATE_2,
915
-
ULONG_MAX),
916
-
0);
917
-
918
-
rate = clk_get_rate(clk);
919
-
KUNIT_ASSERT_GT(test, rate, 0);
920
-
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2);
921
-
922
-
clk_put(user2);
923
-
924
-
rate = clk_get_rate(clk);
925
-
KUNIT_ASSERT_GT(test, rate, 0);
926
-
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1);
927
-
928
-
clk_put(user1);
929
-
}
930
-
931
936
static struct kunit_case clk_range_minimize_test_cases[] = {
932
937
KUNIT_CASE(clk_range_test_set_range_rate_minimized),
933
938
KUNIT_CASE(clk_range_test_multiple_set_range_rate_minimized),
934
-
KUNIT_CASE(clk_range_test_multiple_set_range_rate_put_minimized),
935
939
{}
936
940
};
937
941