clk_test.c (23004B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Kunit test for clk rate management 4 */ 5#include <linux/clk.h> 6#include <linux/clk-provider.h> 7 8/* Needed for clk_hw_get_clk() */ 9#include "clk.h" 10 11#include <kunit/test.h> 12 13#define DUMMY_CLOCK_INIT_RATE (42 * 1000 * 1000) 14#define DUMMY_CLOCK_RATE_1 (142 * 1000 * 1000) 15#define DUMMY_CLOCK_RATE_2 (242 * 1000 * 1000) 16 17struct clk_dummy_context { 18 struct clk_hw hw; 19 unsigned long rate; 20}; 21 22static unsigned long clk_dummy_recalc_rate(struct clk_hw *hw, 23 unsigned long parent_rate) 24{ 25 struct clk_dummy_context *ctx = 26 container_of(hw, struct clk_dummy_context, hw); 27 28 return ctx->rate; 29} 30 31static int clk_dummy_determine_rate(struct clk_hw *hw, 32 struct clk_rate_request *req) 33{ 34 /* Just return the same rate without modifying it */ 35 return 0; 36} 37 38static int clk_dummy_maximize_rate(struct clk_hw *hw, 39 struct clk_rate_request *req) 40{ 41 /* 42 * If there's a maximum set, always run the clock at the maximum 43 * allowed. 44 */ 45 if (req->max_rate < ULONG_MAX) 46 req->rate = req->max_rate; 47 48 return 0; 49} 50 51static int clk_dummy_minimize_rate(struct clk_hw *hw, 52 struct clk_rate_request *req) 53{ 54 /* 55 * If there's a minimum set, always run the clock at the minimum 56 * allowed. 57 */ 58 if (req->min_rate > 0) 59 req->rate = req->min_rate; 60 61 return 0; 62} 63 64static int clk_dummy_set_rate(struct clk_hw *hw, 65 unsigned long rate, 66 unsigned long parent_rate) 67{ 68 struct clk_dummy_context *ctx = 69 container_of(hw, struct clk_dummy_context, hw); 70 71 ctx->rate = rate; 72 return 0; 73} 74 75static int clk_dummy_single_set_parent(struct clk_hw *hw, u8 index) 76{ 77 if (index >= clk_hw_get_num_parents(hw)) 78 return -EINVAL; 79 80 return 0; 81} 82 83static u8 clk_dummy_single_get_parent(struct clk_hw *hw) 84{ 85 return 0; 86} 87 88static const struct clk_ops clk_dummy_rate_ops = { 89 .recalc_rate = clk_dummy_recalc_rate, 90 .determine_rate = clk_dummy_determine_rate, 91 .set_rate = clk_dummy_set_rate, 92}; 93 94static const struct clk_ops clk_dummy_maximize_rate_ops = { 95 .recalc_rate = clk_dummy_recalc_rate, 96 .determine_rate = clk_dummy_maximize_rate, 97 .set_rate = clk_dummy_set_rate, 98}; 99 100static const struct clk_ops clk_dummy_minimize_rate_ops = { 101 .recalc_rate = clk_dummy_recalc_rate, 102 .determine_rate = clk_dummy_minimize_rate, 103 .set_rate = clk_dummy_set_rate, 104}; 105 106static const struct clk_ops clk_dummy_single_parent_ops = { 107 .set_parent = clk_dummy_single_set_parent, 108 .get_parent = clk_dummy_single_get_parent, 109}; 110 111static int clk_test_init_with_ops(struct kunit *test, const struct clk_ops *ops) 112{ 113 struct clk_dummy_context *ctx; 114 struct clk_init_data init = { }; 115 int ret; 116 117 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 118 if (!ctx) 119 return -ENOMEM; 120 ctx->rate = DUMMY_CLOCK_INIT_RATE; 121 test->priv = ctx; 122 123 init.name = "test_dummy_rate"; 124 init.ops = ops; 125 ctx->hw.init = &init; 126 127 ret = clk_hw_register(NULL, &ctx->hw); 128 if (ret) 129 return ret; 130 131 return 0; 132} 133 134static int clk_test_init(struct kunit *test) 135{ 136 return clk_test_init_with_ops(test, &clk_dummy_rate_ops); 137} 138 139static int clk_maximize_test_init(struct kunit *test) 140{ 141 return clk_test_init_with_ops(test, &clk_dummy_maximize_rate_ops); 142} 143 144static int clk_minimize_test_init(struct kunit *test) 145{ 146 return clk_test_init_with_ops(test, &clk_dummy_minimize_rate_ops); 147} 148 149static void clk_test_exit(struct kunit *test) 150{ 151 struct clk_dummy_context *ctx = test->priv; 152 153 clk_hw_unregister(&ctx->hw); 154} 155 156/* 157 * Test that the actual rate matches what is returned by clk_get_rate() 158 */ 159static void clk_test_get_rate(struct kunit *test) 160{ 161 struct clk_dummy_context *ctx = test->priv; 162 struct clk_hw *hw = &ctx->hw; 163 struct clk *clk = hw->clk; 164 unsigned long rate; 165 166 rate = clk_get_rate(clk); 167 KUNIT_ASSERT_GT(test, rate, 0); 168 KUNIT_EXPECT_EQ(test, rate, ctx->rate); 169} 170 171/* 172 * Test that, after a call to clk_set_rate(), the rate returned by 173 * clk_get_rate() matches. 174 * 175 * This assumes that clk_ops.determine_rate or clk_ops.round_rate won't 176 * modify the requested rate, which is our case in clk_dummy_rate_ops. 177 */ 178static void clk_test_set_get_rate(struct kunit *test) 179{ 180 struct clk_dummy_context *ctx = test->priv; 181 struct clk_hw *hw = &ctx->hw; 182 struct clk *clk = hw->clk; 183 unsigned long rate; 184 185 KUNIT_ASSERT_EQ(test, 186 clk_set_rate(clk, DUMMY_CLOCK_RATE_1), 187 0); 188 189 rate = clk_get_rate(clk); 190 KUNIT_ASSERT_GT(test, rate, 0); 191 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 192} 193 194/* 195 * Test that, after several calls to clk_set_rate(), the rate returned 196 * by clk_get_rate() matches the last one. 197 * 198 * This assumes that clk_ops.determine_rate or clk_ops.round_rate won't 199 * modify the requested rate, which is our case in clk_dummy_rate_ops. 200 */ 201static void clk_test_set_set_get_rate(struct kunit *test) 202{ 203 struct clk_dummy_context *ctx = test->priv; 204 struct clk_hw *hw = &ctx->hw; 205 struct clk *clk = hw->clk; 206 unsigned long rate; 207 208 KUNIT_ASSERT_EQ(test, 209 clk_set_rate(clk, DUMMY_CLOCK_RATE_1), 210 0); 211 212 KUNIT_ASSERT_EQ(test, 213 clk_set_rate(clk, DUMMY_CLOCK_RATE_2), 214 0); 215 216 rate = clk_get_rate(clk); 217 KUNIT_ASSERT_GT(test, rate, 0); 218 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 219} 220 221/* 222 * Test that clk_round_rate and clk_set_rate are consitent and will 223 * return the same frequency. 224 */ 225static void clk_test_round_set_get_rate(struct kunit *test) 226{ 227 struct clk_dummy_context *ctx = test->priv; 228 struct clk_hw *hw = &ctx->hw; 229 struct clk *clk = hw->clk; 230 unsigned long rounded_rate, set_rate; 231 232 rounded_rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_1); 233 KUNIT_ASSERT_GT(test, rounded_rate, 0); 234 KUNIT_EXPECT_EQ(test, rounded_rate, DUMMY_CLOCK_RATE_1); 235 236 KUNIT_ASSERT_EQ(test, 237 clk_set_rate(clk, DUMMY_CLOCK_RATE_1), 238 0); 239 240 set_rate = clk_get_rate(clk); 241 KUNIT_ASSERT_GT(test, set_rate, 0); 242 KUNIT_EXPECT_EQ(test, rounded_rate, set_rate); 243} 244 245static struct kunit_case clk_test_cases[] = { 246 KUNIT_CASE(clk_test_get_rate), 247 KUNIT_CASE(clk_test_set_get_rate), 248 KUNIT_CASE(clk_test_set_set_get_rate), 249 KUNIT_CASE(clk_test_round_set_get_rate), 250 {} 251}; 252 253static struct kunit_suite clk_test_suite = { 254 .name = "clk-test", 255 .init = clk_test_init, 256 .exit = clk_test_exit, 257 .test_cases = clk_test_cases, 258}; 259 260struct clk_single_parent_ctx { 261 struct clk_dummy_context parent_ctx; 262 struct clk_hw hw; 263}; 264 265static int clk_orphan_transparent_single_parent_mux_test_init(struct kunit *test) 266{ 267 struct clk_single_parent_ctx *ctx; 268 struct clk_init_data init = { }; 269 const char * const parents[] = { "orphan_parent" }; 270 int ret; 271 272 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 273 if (!ctx) 274 return -ENOMEM; 275 test->priv = ctx; 276 277 init.name = "test_orphan_dummy_parent"; 278 init.ops = &clk_dummy_single_parent_ops; 279 init.parent_names = parents; 280 init.num_parents = ARRAY_SIZE(parents); 281 init.flags = CLK_SET_RATE_PARENT; 282 ctx->hw.init = &init; 283 284 ret = clk_hw_register(NULL, &ctx->hw); 285 if (ret) 286 return ret; 287 288 memset(&init, 0, sizeof(init)); 289 init.name = "orphan_parent"; 290 init.ops = &clk_dummy_rate_ops; 291 ctx->parent_ctx.hw.init = &init; 292 ctx->parent_ctx.rate = DUMMY_CLOCK_INIT_RATE; 293 294 ret = clk_hw_register(NULL, &ctx->parent_ctx.hw); 295 if (ret) 296 return ret; 297 298 return 0; 299} 300 301static void clk_orphan_transparent_single_parent_mux_test_exit(struct kunit *test) 302{ 303 struct clk_single_parent_ctx *ctx = test->priv; 304 305 clk_hw_unregister(&ctx->hw); 306 clk_hw_unregister(&ctx->parent_ctx.hw); 307} 308 309/* 310 * Test that a mux-only clock, with an initial rate within a range, 311 * will still have the same rate after the range has been enforced. 312 */ 313static void clk_test_orphan_transparent_parent_mux_set_range(struct kunit *test) 314{ 315 struct clk_single_parent_ctx *ctx = test->priv; 316 struct clk_hw *hw = &ctx->hw; 317 struct clk *clk = hw->clk; 318 unsigned long rate, new_rate; 319 320 rate = clk_get_rate(clk); 321 KUNIT_ASSERT_GT(test, rate, 0); 322 323 KUNIT_ASSERT_EQ(test, 324 clk_set_rate_range(clk, 325 ctx->parent_ctx.rate - 1000, 326 ctx->parent_ctx.rate + 1000), 327 0); 328 329 new_rate = clk_get_rate(clk); 330 KUNIT_ASSERT_GT(test, new_rate, 0); 331 KUNIT_EXPECT_EQ(test, rate, new_rate); 332} 333 334static struct kunit_case clk_orphan_transparent_single_parent_mux_test_cases[] = { 335 KUNIT_CASE(clk_test_orphan_transparent_parent_mux_set_range), 336 {} 337}; 338 339static struct kunit_suite clk_orphan_transparent_single_parent_test_suite = { 340 .name = "clk-orphan-transparent-single-parent-test", 341 .init = clk_orphan_transparent_single_parent_mux_test_init, 342 .exit = clk_orphan_transparent_single_parent_mux_test_exit, 343 .test_cases = clk_orphan_transparent_single_parent_mux_test_cases, 344}; 345 346/* 347 * Test that clk_set_rate_range won't return an error for a valid range 348 * and that it will make sure the rate of the clock is within the 349 * boundaries. 350 */ 351static void clk_range_test_set_range(struct kunit *test) 352{ 353 struct clk_dummy_context *ctx = test->priv; 354 struct clk_hw *hw = &ctx->hw; 355 struct clk *clk = hw->clk; 356 unsigned long rate; 357 358 KUNIT_ASSERT_EQ(test, 359 clk_set_rate_range(clk, 360 DUMMY_CLOCK_RATE_1, 361 DUMMY_CLOCK_RATE_2), 362 0); 363 364 rate = clk_get_rate(clk); 365 KUNIT_ASSERT_GT(test, rate, 0); 366 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 367 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 368} 369 370/* 371 * Test that calling clk_set_rate_range with a minimum rate higher than 372 * the maximum rate returns an error. 373 */ 374static void clk_range_test_set_range_invalid(struct kunit *test) 375{ 376 struct clk_dummy_context *ctx = test->priv; 377 struct clk_hw *hw = &ctx->hw; 378 struct clk *clk = hw->clk; 379 380 KUNIT_EXPECT_LT(test, 381 clk_set_rate_range(clk, 382 DUMMY_CLOCK_RATE_1 + 1000, 383 DUMMY_CLOCK_RATE_1), 384 0); 385} 386 387/* 388 * Test that users can't set multiple, disjoints, range that would be 389 * impossible to meet. 390 */ 391static void clk_range_test_multiple_disjoints_range(struct kunit *test) 392{ 393 struct clk_dummy_context *ctx = test->priv; 394 struct clk_hw *hw = &ctx->hw; 395 struct clk *user1, *user2; 396 397 user1 = clk_hw_get_clk(hw, NULL); 398 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1); 399 400 user2 = clk_hw_get_clk(hw, NULL); 401 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2); 402 403 KUNIT_ASSERT_EQ(test, 404 clk_set_rate_range(user1, 1000, 2000), 405 0); 406 407 KUNIT_EXPECT_LT(test, 408 clk_set_rate_range(user2, 3000, 4000), 409 0); 410 411 clk_put(user2); 412 clk_put(user1); 413} 414 415/* 416 * Test that if our clock has some boundaries and we try to round a rate 417 * lower than the minimum, the returned rate will be within range. 418 */ 419static void clk_range_test_set_range_round_rate_lower(struct kunit *test) 420{ 421 struct clk_dummy_context *ctx = test->priv; 422 struct clk_hw *hw = &ctx->hw; 423 struct clk *clk = hw->clk; 424 long rate; 425 426 KUNIT_ASSERT_EQ(test, 427 clk_set_rate_range(clk, 428 DUMMY_CLOCK_RATE_1, 429 DUMMY_CLOCK_RATE_2), 430 0); 431 432 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_1 - 1000); 433 KUNIT_ASSERT_GT(test, rate, 0); 434 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 435 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 436} 437 438/* 439 * Test that if our clock has some boundaries and we try to set a rate 440 * higher than the maximum, the new rate will be within range. 441 */ 442static void clk_range_test_set_range_set_rate_lower(struct kunit *test) 443{ 444 struct clk_dummy_context *ctx = test->priv; 445 struct clk_hw *hw = &ctx->hw; 446 struct clk *clk = hw->clk; 447 unsigned long rate; 448 449 KUNIT_ASSERT_EQ(test, 450 clk_set_rate_range(clk, 451 DUMMY_CLOCK_RATE_1, 452 DUMMY_CLOCK_RATE_2), 453 0); 454 455 KUNIT_ASSERT_EQ(test, 456 clk_set_rate(clk, DUMMY_CLOCK_RATE_1 - 1000), 457 0); 458 459 rate = clk_get_rate(clk); 460 KUNIT_ASSERT_GT(test, rate, 0); 461 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 462 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 463} 464 465/* 466 * Test that if our clock has some boundaries and we try to round and 467 * set a rate lower than the minimum, the rate returned by 468 * clk_round_rate() will be consistent with the new rate set by 469 * clk_set_rate(). 470 */ 471static void clk_range_test_set_range_set_round_rate_consistent_lower(struct kunit *test) 472{ 473 struct clk_dummy_context *ctx = test->priv; 474 struct clk_hw *hw = &ctx->hw; 475 struct clk *clk = hw->clk; 476 long rounded; 477 478 KUNIT_ASSERT_EQ(test, 479 clk_set_rate_range(clk, 480 DUMMY_CLOCK_RATE_1, 481 DUMMY_CLOCK_RATE_2), 482 0); 483 484 rounded = clk_round_rate(clk, DUMMY_CLOCK_RATE_1 - 1000); 485 KUNIT_ASSERT_GT(test, rounded, 0); 486 487 KUNIT_ASSERT_EQ(test, 488 clk_set_rate(clk, DUMMY_CLOCK_RATE_1 - 1000), 489 0); 490 491 KUNIT_EXPECT_EQ(test, rounded, clk_get_rate(clk)); 492} 493 494/* 495 * Test that if our clock has some boundaries and we try to round a rate 496 * higher than the maximum, the returned rate will be within range. 497 */ 498static void clk_range_test_set_range_round_rate_higher(struct kunit *test) 499{ 500 struct clk_dummy_context *ctx = test->priv; 501 struct clk_hw *hw = &ctx->hw; 502 struct clk *clk = hw->clk; 503 long rate; 504 505 KUNIT_ASSERT_EQ(test, 506 clk_set_rate_range(clk, 507 DUMMY_CLOCK_RATE_1, 508 DUMMY_CLOCK_RATE_2), 509 0); 510 511 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_2 + 1000); 512 KUNIT_ASSERT_GT(test, rate, 0); 513 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 514 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 515} 516 517/* 518 * Test that if our clock has some boundaries and we try to set a rate 519 * higher than the maximum, the new rate will be within range. 520 */ 521static void clk_range_test_set_range_set_rate_higher(struct kunit *test) 522{ 523 struct clk_dummy_context *ctx = test->priv; 524 struct clk_hw *hw = &ctx->hw; 525 struct clk *clk = hw->clk; 526 unsigned long rate; 527 528 KUNIT_ASSERT_EQ(test, 529 clk_set_rate_range(clk, 530 DUMMY_CLOCK_RATE_1, 531 DUMMY_CLOCK_RATE_2), 532 0); 533 534 KUNIT_ASSERT_EQ(test, 535 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 536 0); 537 538 rate = clk_get_rate(clk); 539 KUNIT_ASSERT_GT(test, rate, 0); 540 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 541 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 542} 543 544/* 545 * Test that if our clock has some boundaries and we try to round and 546 * set a rate higher than the maximum, the rate returned by 547 * clk_round_rate() will be consistent with the new rate set by 548 * clk_set_rate(). 549 */ 550static void clk_range_test_set_range_set_round_rate_consistent_higher(struct kunit *test) 551{ 552 struct clk_dummy_context *ctx = test->priv; 553 struct clk_hw *hw = &ctx->hw; 554 struct clk *clk = hw->clk; 555 long rounded; 556 557 KUNIT_ASSERT_EQ(test, 558 clk_set_rate_range(clk, 559 DUMMY_CLOCK_RATE_1, 560 DUMMY_CLOCK_RATE_2), 561 0); 562 563 rounded = clk_round_rate(clk, DUMMY_CLOCK_RATE_2 + 1000); 564 KUNIT_ASSERT_GT(test, rounded, 0); 565 566 KUNIT_ASSERT_EQ(test, 567 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 568 0); 569 570 KUNIT_EXPECT_EQ(test, rounded, clk_get_rate(clk)); 571} 572 573/* 574 * Test that if our clock has a rate lower than the minimum set by a 575 * call to clk_set_rate_range(), the rate will be raised to match the 576 * new minimum. 577 * 578 * This assumes that clk_ops.determine_rate or clk_ops.round_rate won't 579 * modify the requested rate, which is our case in clk_dummy_rate_ops. 580 */ 581static void clk_range_test_set_range_get_rate_raised(struct kunit *test) 582{ 583 struct clk_dummy_context *ctx = test->priv; 584 struct clk_hw *hw = &ctx->hw; 585 struct clk *clk = hw->clk; 586 unsigned long rate; 587 588 KUNIT_ASSERT_EQ(test, 589 clk_set_rate(clk, DUMMY_CLOCK_RATE_1 - 1000), 590 0); 591 592 KUNIT_ASSERT_EQ(test, 593 clk_set_rate_range(clk, 594 DUMMY_CLOCK_RATE_1, 595 DUMMY_CLOCK_RATE_2), 596 0); 597 598 rate = clk_get_rate(clk); 599 KUNIT_ASSERT_GT(test, rate, 0); 600 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 601} 602 603/* 604 * Test that if our clock has a rate higher than the maximum set by a 605 * call to clk_set_rate_range(), the rate will be lowered to match the 606 * new maximum. 607 * 608 * This assumes that clk_ops.determine_rate or clk_ops.round_rate won't 609 * modify the requested rate, which is our case in clk_dummy_rate_ops. 610 */ 611static void clk_range_test_set_range_get_rate_lowered(struct kunit *test) 612{ 613 struct clk_dummy_context *ctx = test->priv; 614 struct clk_hw *hw = &ctx->hw; 615 struct clk *clk = hw->clk; 616 unsigned long rate; 617 618 KUNIT_ASSERT_EQ(test, 619 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 620 0); 621 622 KUNIT_ASSERT_EQ(test, 623 clk_set_rate_range(clk, 624 DUMMY_CLOCK_RATE_1, 625 DUMMY_CLOCK_RATE_2), 626 0); 627 628 rate = clk_get_rate(clk); 629 KUNIT_ASSERT_GT(test, rate, 0); 630 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 631} 632 633static struct kunit_case clk_range_test_cases[] = { 634 KUNIT_CASE(clk_range_test_set_range), 635 KUNIT_CASE(clk_range_test_set_range_invalid), 636 KUNIT_CASE(clk_range_test_multiple_disjoints_range), 637 KUNIT_CASE(clk_range_test_set_range_round_rate_lower), 638 KUNIT_CASE(clk_range_test_set_range_set_rate_lower), 639 KUNIT_CASE(clk_range_test_set_range_set_round_rate_consistent_lower), 640 KUNIT_CASE(clk_range_test_set_range_round_rate_higher), 641 KUNIT_CASE(clk_range_test_set_range_set_rate_higher), 642 KUNIT_CASE(clk_range_test_set_range_set_round_rate_consistent_higher), 643 KUNIT_CASE(clk_range_test_set_range_get_rate_raised), 644 KUNIT_CASE(clk_range_test_set_range_get_rate_lowered), 645 {} 646}; 647 648static struct kunit_suite clk_range_test_suite = { 649 .name = "clk-range-test", 650 .init = clk_test_init, 651 .exit = clk_test_exit, 652 .test_cases = clk_range_test_cases, 653}; 654 655/* 656 * Test that if we have several subsequent calls to 657 * clk_set_rate_range(), the core will reevaluate whether a new rate is 658 * needed each and every time. 659 * 660 * With clk_dummy_maximize_rate_ops, this means that the rate will 661 * trail along the maximum as it evolves. 662 */ 663static void clk_range_test_set_range_rate_maximized(struct kunit *test) 664{ 665 struct clk_dummy_context *ctx = test->priv; 666 struct clk_hw *hw = &ctx->hw; 667 struct clk *clk = hw->clk; 668 unsigned long rate; 669 670 KUNIT_ASSERT_EQ(test, 671 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 672 0); 673 674 KUNIT_ASSERT_EQ(test, 675 clk_set_rate_range(clk, 676 DUMMY_CLOCK_RATE_1, 677 DUMMY_CLOCK_RATE_2), 678 0); 679 680 rate = clk_get_rate(clk); 681 KUNIT_ASSERT_GT(test, rate, 0); 682 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 683 684 KUNIT_ASSERT_EQ(test, 685 clk_set_rate_range(clk, 686 DUMMY_CLOCK_RATE_1, 687 DUMMY_CLOCK_RATE_2 - 1000), 688 0); 689 690 rate = clk_get_rate(clk); 691 KUNIT_ASSERT_GT(test, rate, 0); 692 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2 - 1000); 693 694 KUNIT_ASSERT_EQ(test, 695 clk_set_rate_range(clk, 696 DUMMY_CLOCK_RATE_1, 697 DUMMY_CLOCK_RATE_2), 698 0); 699 700 rate = clk_get_rate(clk); 701 KUNIT_ASSERT_GT(test, rate, 0); 702 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 703} 704 705/* 706 * Test that if we have several subsequent calls to 707 * clk_set_rate_range(), across multiple users, the core will reevaluate 708 * whether a new rate is needed each and every time. 709 * 710 * With clk_dummy_maximize_rate_ops, this means that the rate will 711 * trail along the maximum as it evolves. 712 */ 713static void clk_range_test_multiple_set_range_rate_maximized(struct kunit *test) 714{ 715 struct clk_dummy_context *ctx = test->priv; 716 struct clk_hw *hw = &ctx->hw; 717 struct clk *clk = hw->clk; 718 struct clk *user1, *user2; 719 unsigned long rate; 720 721 user1 = clk_hw_get_clk(hw, NULL); 722 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1); 723 724 user2 = clk_hw_get_clk(hw, NULL); 725 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2); 726 727 KUNIT_ASSERT_EQ(test, 728 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 729 0); 730 731 KUNIT_ASSERT_EQ(test, 732 clk_set_rate_range(user1, 733 0, 734 DUMMY_CLOCK_RATE_2), 735 0); 736 737 rate = clk_get_rate(clk); 738 KUNIT_ASSERT_GT(test, rate, 0); 739 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 740 741 KUNIT_ASSERT_EQ(test, 742 clk_set_rate_range(user2, 743 0, 744 DUMMY_CLOCK_RATE_1), 745 0); 746 747 rate = clk_get_rate(clk); 748 KUNIT_ASSERT_GT(test, rate, 0); 749 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 750 751 KUNIT_ASSERT_EQ(test, 752 clk_drop_range(user2), 753 0); 754 755 rate = clk_get_rate(clk); 756 KUNIT_ASSERT_GT(test, rate, 0); 757 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 758 759 clk_put(user2); 760 clk_put(user1); 761} 762 763static struct kunit_case clk_range_maximize_test_cases[] = { 764 KUNIT_CASE(clk_range_test_set_range_rate_maximized), 765 KUNIT_CASE(clk_range_test_multiple_set_range_rate_maximized), 766 {} 767}; 768 769static struct kunit_suite clk_range_maximize_test_suite = { 770 .name = "clk-range-maximize-test", 771 .init = clk_maximize_test_init, 772 .exit = clk_test_exit, 773 .test_cases = clk_range_maximize_test_cases, 774}; 775 776/* 777 * Test that if we have several subsequent calls to 778 * clk_set_rate_range(), the core will reevaluate whether a new rate is 779 * needed each and every time. 780 * 781 * With clk_dummy_minimize_rate_ops, this means that the rate will 782 * trail along the minimum as it evolves. 783 */ 784static void clk_range_test_set_range_rate_minimized(struct kunit *test) 785{ 786 struct clk_dummy_context *ctx = test->priv; 787 struct clk_hw *hw = &ctx->hw; 788 struct clk *clk = hw->clk; 789 unsigned long rate; 790 791 KUNIT_ASSERT_EQ(test, 792 clk_set_rate(clk, DUMMY_CLOCK_RATE_1 - 1000), 793 0); 794 795 KUNIT_ASSERT_EQ(test, 796 clk_set_rate_range(clk, 797 DUMMY_CLOCK_RATE_1, 798 DUMMY_CLOCK_RATE_2), 799 0); 800 801 rate = clk_get_rate(clk); 802 KUNIT_ASSERT_GT(test, rate, 0); 803 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 804 805 KUNIT_ASSERT_EQ(test, 806 clk_set_rate_range(clk, 807 DUMMY_CLOCK_RATE_1 + 1000, 808 DUMMY_CLOCK_RATE_2), 809 0); 810 811 rate = clk_get_rate(clk); 812 KUNIT_ASSERT_GT(test, rate, 0); 813 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1 + 1000); 814 815 KUNIT_ASSERT_EQ(test, 816 clk_set_rate_range(clk, 817 DUMMY_CLOCK_RATE_1, 818 DUMMY_CLOCK_RATE_2), 819 0); 820 821 rate = clk_get_rate(clk); 822 KUNIT_ASSERT_GT(test, rate, 0); 823 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 824} 825 826/* 827 * Test that if we have several subsequent calls to 828 * clk_set_rate_range(), across multiple users, the core will reevaluate 829 * whether a new rate is needed each and every time. 830 * 831 * With clk_dummy_minimize_rate_ops, this means that the rate will 832 * trail along the minimum as it evolves. 833 */ 834static void clk_range_test_multiple_set_range_rate_minimized(struct kunit *test) 835{ 836 struct clk_dummy_context *ctx = test->priv; 837 struct clk_hw *hw = &ctx->hw; 838 struct clk *clk = hw->clk; 839 struct clk *user1, *user2; 840 unsigned long rate; 841 842 user1 = clk_hw_get_clk(hw, NULL); 843 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1); 844 845 user2 = clk_hw_get_clk(hw, NULL); 846 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2); 847 848 KUNIT_ASSERT_EQ(test, 849 clk_set_rate_range(user1, 850 DUMMY_CLOCK_RATE_1, 851 ULONG_MAX), 852 0); 853 854 rate = clk_get_rate(clk); 855 KUNIT_ASSERT_GT(test, rate, 0); 856 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 857 858 KUNIT_ASSERT_EQ(test, 859 clk_set_rate_range(user2, 860 DUMMY_CLOCK_RATE_2, 861 ULONG_MAX), 862 0); 863 864 rate = clk_get_rate(clk); 865 KUNIT_ASSERT_GT(test, rate, 0); 866 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 867 868 KUNIT_ASSERT_EQ(test, 869 clk_drop_range(user2), 870 0); 871 872 rate = clk_get_rate(clk); 873 KUNIT_ASSERT_GT(test, rate, 0); 874 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 875 876 clk_put(user2); 877 clk_put(user1); 878} 879 880static struct kunit_case clk_range_minimize_test_cases[] = { 881 KUNIT_CASE(clk_range_test_set_range_rate_minimized), 882 KUNIT_CASE(clk_range_test_multiple_set_range_rate_minimized), 883 {} 884}; 885 886static struct kunit_suite clk_range_minimize_test_suite = { 887 .name = "clk-range-minimize-test", 888 .init = clk_minimize_test_init, 889 .exit = clk_test_exit, 890 .test_cases = clk_range_minimize_test_cases, 891}; 892 893kunit_test_suites( 894 &clk_test_suite, 895 &clk_orphan_transparent_single_parent_test_suite, 896 &clk_range_test_suite, 897 &clk_range_maximize_test_suite, 898 &clk_range_minimize_test_suite 899); 900MODULE_LICENSE("GPL v2");