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. -----BEGIN PGP SIGNATURE----- iQJFBAABCAAvFiEE9L57QeeUxqYDyoaDrQKIl8bklSUFAmJJqlERHHNib3lkQGtl cm5lbC5vcmcACgkQrQKIl8bklSX4BhAAo/LNZijJYJQCkXQDM9bV6blXlFMWy48d i1Dd7EBFLNhOBIfiZhxYu9TyoSHolaxcR50Asv2PpsGkp1HkUl0tAmYZ7vOzfIWn XE8xOVkE7tPgtgBfWbJ5Z8s20rSNZia+J5OGdlG7UDyiaWQfMufliHMOaaVWwDK5 hk7kqGERpfr7gxezxOhwU8xyXTUvuNVesT+1zQi7EZp6eODlpQUVZhHzT2XJiU4m wjgwtz48WhE0X3Ppw3KJyW1MIOX5kQ8kRW1L0sIYAXxSOpRUcT5XZbE9pshd+Zio 8uX0ZhRrpDBRdZvWeG/OnXfoIZR616wUk+Pn0jjosBHtieOc82mQmJa8RtxGrTKC J7Ju76AV6ZjSrq3mtZR57pcd+u+M2WFAna6sKSFFqZJNQQatAbIiL3uGwqS3xHR2 ojngT3ViQf2TSU/0UghfhpUAX03bYxcxE18VeYwRilQVNHxprERqpaoFJhvH39LR O58cA118N5DrLEG7T1kR75Z+90F316QKRYG+bsx0A0/FGnGgnQ6SieOzGWu6+30t Jo1NfiblJmAzDYRBndeJUBTM6EjpLix+qnDDy2RVyWm1O4c9m6UVUgJlhZYNm9p2 jiZw0ZHac9+0s6bdXEwrlc0diTWfkfyQD4t5v76qkUQIXMAQS3BT4GdSOeo4x6wa cgoHzBdd/Ok= =OJT3 -----END PGP SIGNATURE----- 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()"
This commit is contained in:
commit
34a53ff911
|
@ -2332,15 +2332,19 @@ int clk_set_rate_exclusive(struct clk *clk, unsigned long rate)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(clk_set_rate_exclusive);
|
EXPORT_SYMBOL_GPL(clk_set_rate_exclusive);
|
||||||
|
|
||||||
static int clk_set_rate_range_nolock(struct clk *clk,
|
/**
|
||||||
unsigned long min,
|
* clk_set_rate_range - set a rate range for a clock source
|
||||||
unsigned long max)
|
* @clk: clock source
|
||||||
|
* @min: desired minimum clock rate in Hz, inclusive
|
||||||
|
* @max: desired maximum clock rate in Hz, inclusive
|
||||||
|
*
|
||||||
|
* Returns success (0) or negative errno.
|
||||||
|
*/
|
||||||
|
int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned long old_min, old_max, rate;
|
unsigned long old_min, old_max, rate;
|
||||||
|
|
||||||
lockdep_assert_held(&prepare_lock);
|
|
||||||
|
|
||||||
if (!clk)
|
if (!clk)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -2353,6 +2357,8 @@ static int clk_set_rate_range_nolock(struct clk *clk,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clk_prepare_lock();
|
||||||
|
|
||||||
if (clk->exclusive_count)
|
if (clk->exclusive_count)
|
||||||
clk_core_rate_unprotect(clk->core);
|
clk_core_rate_unprotect(clk->core);
|
||||||
|
|
||||||
|
@ -2396,28 +2402,6 @@ static int clk_set_rate_range_nolock(struct clk *clk,
|
||||||
if (clk->exclusive_count)
|
if (clk->exclusive_count)
|
||||||
clk_core_rate_protect(clk->core);
|
clk_core_rate_protect(clk->core);
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* clk_set_rate_range - set a rate range for a clock source
|
|
||||||
* @clk: clock source
|
|
||||||
* @min: desired minimum clock rate in Hz, inclusive
|
|
||||||
* @max: desired maximum clock rate in Hz, inclusive
|
|
||||||
*
|
|
||||||
* Return: 0 for success or negative errno on failure.
|
|
||||||
*/
|
|
||||||
int clk_set_rate_range(struct clk *clk, unsigned long min, unsigned long max)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!clk)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
clk_prepare_lock();
|
|
||||||
|
|
||||||
ret = clk_set_rate_range_nolock(clk, min, max);
|
|
||||||
|
|
||||||
clk_prepare_unlock();
|
clk_prepare_unlock();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -4419,7 +4403,9 @@ void __clk_put(struct clk *clk)
|
||||||
}
|
}
|
||||||
|
|
||||||
hlist_del(&clk->clks_node);
|
hlist_del(&clk->clks_node);
|
||||||
clk_set_rate_range_nolock(clk, 0, ULONG_MAX);
|
if (clk->min_rate > clk->core->req_rate ||
|
||||||
|
clk->max_rate < clk->core->req_rate)
|
||||||
|
clk_core_set_rate_nolock(clk->core, clk->core->req_rate);
|
||||||
|
|
||||||
owner = clk->core->owner;
|
owner = clk->core->owner;
|
||||||
kref_put(&clk->core->ref, __clk_release);
|
kref_put(&clk->core->ref, __clk_release);
|
||||||
|
|
|
@ -760,65 +760,9 @@ static void clk_range_test_multiple_set_range_rate_maximized(struct kunit *test)
|
||||||
clk_put(user1);
|
clk_put(user1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Test that if we have several subsequent calls to
|
|
||||||
* clk_set_rate_range(), across multiple users, the core will reevaluate
|
|
||||||
* whether a new rate is needed, including when a user drop its clock.
|
|
||||||
*
|
|
||||||
* With clk_dummy_maximize_rate_ops, this means that the rate will
|
|
||||||
* trail along the maximum as it evolves.
|
|
||||||
*/
|
|
||||||
static void clk_range_test_multiple_set_range_rate_put_maximized(struct kunit *test)
|
|
||||||
{
|
|
||||||
struct clk_dummy_context *ctx = test->priv;
|
|
||||||
struct clk_hw *hw = &ctx->hw;
|
|
||||||
struct clk *clk = hw->clk;
|
|
||||||
struct clk *user1, *user2;
|
|
||||||
unsigned long rate;
|
|
||||||
|
|
||||||
user1 = clk_hw_get_clk(hw, NULL);
|
|
||||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1);
|
|
||||||
|
|
||||||
user2 = clk_hw_get_clk(hw, NULL);
|
|
||||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2);
|
|
||||||
|
|
||||||
KUNIT_ASSERT_EQ(test,
|
|
||||||
clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000),
|
|
||||||
0);
|
|
||||||
|
|
||||||
KUNIT_ASSERT_EQ(test,
|
|
||||||
clk_set_rate_range(user1,
|
|
||||||
0,
|
|
||||||
DUMMY_CLOCK_RATE_2),
|
|
||||||
0);
|
|
||||||
|
|
||||||
rate = clk_get_rate(clk);
|
|
||||||
KUNIT_ASSERT_GT(test, rate, 0);
|
|
||||||
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2);
|
|
||||||
|
|
||||||
KUNIT_ASSERT_EQ(test,
|
|
||||||
clk_set_rate_range(user2,
|
|
||||||
0,
|
|
||||||
DUMMY_CLOCK_RATE_1),
|
|
||||||
0);
|
|
||||||
|
|
||||||
rate = clk_get_rate(clk);
|
|
||||||
KUNIT_ASSERT_GT(test, rate, 0);
|
|
||||||
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1);
|
|
||||||
|
|
||||||
clk_put(user2);
|
|
||||||
|
|
||||||
rate = clk_get_rate(clk);
|
|
||||||
KUNIT_ASSERT_GT(test, rate, 0);
|
|
||||||
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2);
|
|
||||||
|
|
||||||
clk_put(user1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct kunit_case clk_range_maximize_test_cases[] = {
|
static struct kunit_case clk_range_maximize_test_cases[] = {
|
||||||
KUNIT_CASE(clk_range_test_set_range_rate_maximized),
|
KUNIT_CASE(clk_range_test_set_range_rate_maximized),
|
||||||
KUNIT_CASE(clk_range_test_multiple_set_range_rate_maximized),
|
KUNIT_CASE(clk_range_test_multiple_set_range_rate_maximized),
|
||||||
KUNIT_CASE(clk_range_test_multiple_set_range_rate_put_maximized),
|
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -933,61 +877,9 @@ static void clk_range_test_multiple_set_range_rate_minimized(struct kunit *test)
|
||||||
clk_put(user1);
|
clk_put(user1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Test that if we have several subsequent calls to
|
|
||||||
* clk_set_rate_range(), across multiple users, the core will reevaluate
|
|
||||||
* whether a new rate is needed, including when a user drop its clock.
|
|
||||||
*
|
|
||||||
* With clk_dummy_minimize_rate_ops, this means that the rate will
|
|
||||||
* trail along the minimum as it evolves.
|
|
||||||
*/
|
|
||||||
static void clk_range_test_multiple_set_range_rate_put_minimized(struct kunit *test)
|
|
||||||
{
|
|
||||||
struct clk_dummy_context *ctx = test->priv;
|
|
||||||
struct clk_hw *hw = &ctx->hw;
|
|
||||||
struct clk *clk = hw->clk;
|
|
||||||
struct clk *user1, *user2;
|
|
||||||
unsigned long rate;
|
|
||||||
|
|
||||||
user1 = clk_hw_get_clk(hw, NULL);
|
|
||||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1);
|
|
||||||
|
|
||||||
user2 = clk_hw_get_clk(hw, NULL);
|
|
||||||
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2);
|
|
||||||
|
|
||||||
KUNIT_ASSERT_EQ(test,
|
|
||||||
clk_set_rate_range(user1,
|
|
||||||
DUMMY_CLOCK_RATE_1,
|
|
||||||
ULONG_MAX),
|
|
||||||
0);
|
|
||||||
|
|
||||||
rate = clk_get_rate(clk);
|
|
||||||
KUNIT_ASSERT_GT(test, rate, 0);
|
|
||||||
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1);
|
|
||||||
|
|
||||||
KUNIT_ASSERT_EQ(test,
|
|
||||||
clk_set_rate_range(user2,
|
|
||||||
DUMMY_CLOCK_RATE_2,
|
|
||||||
ULONG_MAX),
|
|
||||||
0);
|
|
||||||
|
|
||||||
rate = clk_get_rate(clk);
|
|
||||||
KUNIT_ASSERT_GT(test, rate, 0);
|
|
||||||
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2);
|
|
||||||
|
|
||||||
clk_put(user2);
|
|
||||||
|
|
||||||
rate = clk_get_rate(clk);
|
|
||||||
KUNIT_ASSERT_GT(test, rate, 0);
|
|
||||||
KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1);
|
|
||||||
|
|
||||||
clk_put(user1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct kunit_case clk_range_minimize_test_cases[] = {
|
static struct kunit_case clk_range_minimize_test_cases[] = {
|
||||||
KUNIT_CASE(clk_range_test_set_range_rate_minimized),
|
KUNIT_CASE(clk_range_test_set_range_rate_minimized),
|
||||||
KUNIT_CASE(clk_range_test_multiple_set_range_rate_minimized),
|
KUNIT_CASE(clk_range_test_multiple_set_range_rate_minimized),
|
||||||
KUNIT_CASE(clk_range_test_multiple_set_range_rate_put_minimized),
|
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue