Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux

Pull clk fix from Stephen Boyd:
"A single revert to fix a boot regression seen when clk_put() started
dropping rate range requests. It's best to keep various systems
booting so we'll kick this out and try again next time"

* tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux:
Revert "clk: Drop the rate range on clk_put()"

Changed files
+14 -136
drivers
+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
··· 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