1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Kunit tests for clk framework 4 */ 5 #include <linux/clk.h> 6 #include <linux/clk-provider.h> 7 #include <linux/clk/clk-conf.h> 8 #include <linux/of.h> 9 #include <linux/platform_device.h> 10 #include <linux/units.h> 11 12 /* Needed for clk_hw_get_clk() */ 13 #include "clk.h" 14 15 #include <kunit/clk.h> 16 #include <kunit/of.h> 17 #include <kunit/platform_device.h> 18 #include <kunit/test.h> 19 20 #include "kunit_clk_assigned_rates.h" 21 #include "clk_parent_data_test.h" 22 23 static const struct clk_ops empty_clk_ops = { }; 24 25 #define DUMMY_CLOCK_INIT_RATE (42 * HZ_PER_MHZ) 26 #define DUMMY_CLOCK_RATE_1 (142 * HZ_PER_MHZ) 27 #define DUMMY_CLOCK_RATE_2 (242 * HZ_PER_MHZ) 28 29 struct clk_dummy_context { 30 struct clk_hw hw; 31 unsigned long rate; 32 struct clk_spread_spectrum sscs; 33 }; 34 35 static unsigned long clk_dummy_recalc_rate(struct clk_hw *hw, 36 unsigned long parent_rate) 37 { 38 struct clk_dummy_context *ctx = 39 container_of(hw, struct clk_dummy_context, hw); 40 41 return ctx->rate; 42 } 43 44 static int clk_dummy_determine_rate(struct clk_hw *hw, 45 struct clk_rate_request *req) 46 { 47 /* Just return the same rate without modifying it */ 48 return 0; 49 } 50 51 static int clk_dummy_maximize_rate(struct clk_hw *hw, 52 struct clk_rate_request *req) 53 { 54 /* 55 * If there's a maximum set, always run the clock at the maximum 56 * allowed. 57 */ 58 if (req->max_rate < ULONG_MAX) 59 req->rate = req->max_rate; 60 61 return 0; 62 } 63 64 static int clk_dummy_minimize_rate(struct clk_hw *hw, 65 struct clk_rate_request *req) 66 { 67 /* 68 * If there's a minimum set, always run the clock at the minimum 69 * allowed. 70 */ 71 if (req->min_rate > 0) 72 req->rate = req->min_rate; 73 74 return 0; 75 } 76 77 static int clk_dummy_set_rate(struct clk_hw *hw, 78 unsigned long rate, 79 unsigned long parent_rate) 80 { 81 struct clk_dummy_context *ctx = 82 container_of(hw, struct clk_dummy_context, hw); 83 84 ctx->rate = rate; 85 return 0; 86 } 87 88 static int clk_dummy_set_spread_spectrum(struct clk_hw *hw, 89 const struct clk_spread_spectrum *ss_conf) 90 { 91 struct clk_dummy_context *ctx = 92 container_of(hw, struct clk_dummy_context, hw); 93 94 ctx->sscs = *ss_conf; 95 96 return 0; 97 } 98 99 static int clk_dummy_single_set_parent(struct clk_hw *hw, u8 index) 100 { 101 if (index >= clk_hw_get_num_parents(hw)) 102 return -EINVAL; 103 104 return 0; 105 } 106 107 static u8 clk_dummy_single_get_parent(struct clk_hw *hw) 108 { 109 return 0; 110 } 111 112 static const struct clk_ops clk_dummy_rate_ops = { 113 .recalc_rate = clk_dummy_recalc_rate, 114 .determine_rate = clk_dummy_determine_rate, 115 .set_rate = clk_dummy_set_rate, 116 .set_spread_spectrum = clk_dummy_set_spread_spectrum, 117 }; 118 119 static const struct clk_ops clk_dummy_maximize_rate_ops = { 120 .recalc_rate = clk_dummy_recalc_rate, 121 .determine_rate = clk_dummy_maximize_rate, 122 .set_rate = clk_dummy_set_rate, 123 .set_spread_spectrum = clk_dummy_set_spread_spectrum, 124 }; 125 126 static const struct clk_ops clk_dummy_minimize_rate_ops = { 127 .recalc_rate = clk_dummy_recalc_rate, 128 .determine_rate = clk_dummy_minimize_rate, 129 .set_rate = clk_dummy_set_rate, 130 .set_spread_spectrum = clk_dummy_set_spread_spectrum, 131 }; 132 133 static const struct clk_ops clk_dummy_single_parent_ops = { 134 /* 135 * FIXME: Even though we should probably be able to use 136 * __clk_mux_determine_rate() here, if we use it and call 137 * clk_round_rate() or clk_set_rate() with a rate lower than 138 * what all the parents can provide, it will return -EINVAL. 139 * 140 * This is due to the fact that it has the undocumented 141 * behaviour to always pick up the closest rate higher than the 142 * requested rate. If we get something lower, it thus considers 143 * that it's not acceptable and will return an error. 144 * 145 * It's somewhat inconsistent and creates a weird threshold 146 * between rates above the parent rate which would be rounded to 147 * what the parent can provide, but rates below will simply 148 * return an error. 149 */ 150 .determine_rate = __clk_mux_determine_rate_closest, 151 .set_parent = clk_dummy_single_set_parent, 152 .get_parent = clk_dummy_single_get_parent, 153 }; 154 155 struct clk_multiple_parent_ctx { 156 struct clk_dummy_context parents_ctx[2]; 157 struct clk_hw hw; 158 u8 current_parent; 159 }; 160 161 static int clk_multiple_parents_mux_set_parent(struct clk_hw *hw, u8 index) 162 { 163 struct clk_multiple_parent_ctx *ctx = 164 container_of(hw, struct clk_multiple_parent_ctx, hw); 165 166 if (index >= clk_hw_get_num_parents(hw)) 167 return -EINVAL; 168 169 ctx->current_parent = index; 170 171 return 0; 172 } 173 174 static u8 clk_multiple_parents_mux_get_parent(struct clk_hw *hw) 175 { 176 struct clk_multiple_parent_ctx *ctx = 177 container_of(hw, struct clk_multiple_parent_ctx, hw); 178 179 return ctx->current_parent; 180 } 181 182 static const struct clk_ops clk_multiple_parents_mux_ops = { 183 .get_parent = clk_multiple_parents_mux_get_parent, 184 .set_parent = clk_multiple_parents_mux_set_parent, 185 .determine_rate = __clk_mux_determine_rate_closest, 186 }; 187 188 static const struct clk_ops clk_multiple_parents_no_reparent_mux_ops = { 189 .determine_rate = clk_hw_determine_rate_no_reparent, 190 .get_parent = clk_multiple_parents_mux_get_parent, 191 .set_parent = clk_multiple_parents_mux_set_parent, 192 }; 193 194 static int clk_test_init_with_ops(struct kunit *test, const struct clk_ops *ops) 195 { 196 struct clk_dummy_context *ctx; 197 struct clk_init_data init = { }; 198 int ret; 199 200 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 201 if (!ctx) 202 return -ENOMEM; 203 ctx->rate = DUMMY_CLOCK_INIT_RATE; 204 test->priv = ctx; 205 206 init.name = "test_dummy_rate"; 207 init.ops = ops; 208 ctx->hw.init = &init; 209 210 ret = clk_hw_register(NULL, &ctx->hw); 211 if (ret) 212 return ret; 213 214 return 0; 215 } 216 217 static int clk_test_init(struct kunit *test) 218 { 219 return clk_test_init_with_ops(test, &clk_dummy_rate_ops); 220 } 221 222 static int clk_maximize_test_init(struct kunit *test) 223 { 224 return clk_test_init_with_ops(test, &clk_dummy_maximize_rate_ops); 225 } 226 227 static int clk_minimize_test_init(struct kunit *test) 228 { 229 return clk_test_init_with_ops(test, &clk_dummy_minimize_rate_ops); 230 } 231 232 static void clk_test_exit(struct kunit *test) 233 { 234 struct clk_dummy_context *ctx = test->priv; 235 236 clk_hw_unregister(&ctx->hw); 237 } 238 239 /* 240 * Test that the actual rate matches what is returned by clk_get_rate() 241 */ 242 static void clk_test_get_rate(struct kunit *test) 243 { 244 struct clk_dummy_context *ctx = test->priv; 245 struct clk_hw *hw = &ctx->hw; 246 struct clk *clk = clk_hw_get_clk(hw, NULL); 247 unsigned long rate; 248 249 rate = clk_get_rate(clk); 250 KUNIT_ASSERT_GT(test, rate, 0); 251 KUNIT_EXPECT_EQ(test, rate, ctx->rate); 252 253 clk_put(clk); 254 } 255 256 /* 257 * Test that, after a call to clk_set_rate(), the rate returned by 258 * clk_get_rate() matches. 259 * 260 * This assumes that clk_ops.determine_rate won't modify the requested rate, 261 * which is our case in clk_dummy_rate_ops. 262 */ 263 static void clk_test_set_get_rate(struct kunit *test) 264 { 265 struct clk_dummy_context *ctx = test->priv; 266 struct clk_hw *hw = &ctx->hw; 267 struct clk *clk = clk_hw_get_clk(hw, NULL); 268 unsigned long rate; 269 270 KUNIT_ASSERT_EQ(test, 271 clk_set_rate(clk, DUMMY_CLOCK_RATE_1), 272 0); 273 274 rate = clk_get_rate(clk); 275 KUNIT_ASSERT_GT(test, rate, 0); 276 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 277 278 clk_put(clk); 279 } 280 281 /* 282 * Test that, after several calls to clk_set_rate(), the rate returned 283 * by clk_get_rate() matches the last one. 284 * 285 * This assumes that clk_ops.determine_rate won't modify the requested rate, 286 * which is our case in clk_dummy_rate_ops. 287 */ 288 static void clk_test_set_set_get_rate(struct kunit *test) 289 { 290 struct clk_dummy_context *ctx = test->priv; 291 struct clk_hw *hw = &ctx->hw; 292 struct clk *clk = clk_hw_get_clk(hw, NULL); 293 unsigned long rate; 294 295 KUNIT_ASSERT_EQ(test, 296 clk_set_rate(clk, DUMMY_CLOCK_RATE_1), 297 0); 298 299 KUNIT_ASSERT_EQ(test, 300 clk_set_rate(clk, DUMMY_CLOCK_RATE_2), 301 0); 302 303 rate = clk_get_rate(clk); 304 KUNIT_ASSERT_GT(test, rate, 0); 305 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 306 307 clk_put(clk); 308 } 309 310 /* 311 * Test that clk_round_rate and clk_set_rate are consistent and will 312 * return the same frequency. 313 */ 314 static void clk_test_round_set_get_rate(struct kunit *test) 315 { 316 struct clk_dummy_context *ctx = test->priv; 317 struct clk_hw *hw = &ctx->hw; 318 struct clk *clk = clk_hw_get_clk(hw, NULL); 319 unsigned long set_rate; 320 long rounded_rate; 321 322 rounded_rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_1); 323 KUNIT_ASSERT_GT(test, rounded_rate, 0); 324 KUNIT_EXPECT_EQ(test, rounded_rate, DUMMY_CLOCK_RATE_1); 325 326 KUNIT_ASSERT_EQ(test, 327 clk_set_rate(clk, DUMMY_CLOCK_RATE_1), 328 0); 329 330 set_rate = clk_get_rate(clk); 331 KUNIT_ASSERT_GT(test, set_rate, 0); 332 KUNIT_EXPECT_EQ(test, rounded_rate, set_rate); 333 334 clk_put(clk); 335 } 336 337 static struct kunit_case clk_test_cases[] = { 338 KUNIT_CASE(clk_test_get_rate), 339 KUNIT_CASE(clk_test_set_get_rate), 340 KUNIT_CASE(clk_test_set_set_get_rate), 341 KUNIT_CASE(clk_test_round_set_get_rate), 342 {} 343 }; 344 345 /* 346 * Test suite for a basic rate clock, without any parent. 347 * 348 * These tests exercise the rate API with simple scenarios 349 */ 350 static struct kunit_suite clk_test_suite = { 351 .name = "clk-test", 352 .init = clk_test_init, 353 .exit = clk_test_exit, 354 .test_cases = clk_test_cases, 355 }; 356 357 static int clk_uncached_test_init(struct kunit *test) 358 { 359 struct clk_dummy_context *ctx; 360 int ret; 361 362 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 363 if (!ctx) 364 return -ENOMEM; 365 test->priv = ctx; 366 367 ctx->rate = DUMMY_CLOCK_INIT_RATE; 368 ctx->hw.init = CLK_HW_INIT_NO_PARENT("test-clk", 369 &clk_dummy_rate_ops, 370 CLK_GET_RATE_NOCACHE); 371 372 ret = clk_hw_register(NULL, &ctx->hw); 373 if (ret) 374 return ret; 375 376 return 0; 377 } 378 379 /* 380 * Test that for an uncached clock, the clock framework doesn't cache 381 * the rate and clk_get_rate() will return the underlying clock rate 382 * even if it changed. 383 */ 384 static void clk_test_uncached_get_rate(struct kunit *test) 385 { 386 struct clk_dummy_context *ctx = test->priv; 387 struct clk_hw *hw = &ctx->hw; 388 struct clk *clk = clk_hw_get_clk(hw, NULL); 389 unsigned long rate; 390 391 rate = clk_get_rate(clk); 392 KUNIT_ASSERT_GT(test, rate, 0); 393 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_INIT_RATE); 394 395 /* We change the rate behind the clock framework's back */ 396 ctx->rate = DUMMY_CLOCK_RATE_1; 397 rate = clk_get_rate(clk); 398 KUNIT_ASSERT_GT(test, rate, 0); 399 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 400 401 clk_put(clk); 402 } 403 404 /* 405 * Test that for an uncached clock, clk_set_rate_range() will work 406 * properly if the rate hasn't changed. 407 */ 408 static void clk_test_uncached_set_range(struct kunit *test) 409 { 410 struct clk_dummy_context *ctx = test->priv; 411 struct clk_hw *hw = &ctx->hw; 412 struct clk *clk = clk_hw_get_clk(hw, NULL); 413 unsigned long rate; 414 415 KUNIT_ASSERT_EQ(test, 416 clk_set_rate_range(clk, 417 DUMMY_CLOCK_RATE_1, 418 DUMMY_CLOCK_RATE_2), 419 0); 420 421 rate = clk_get_rate(clk); 422 KUNIT_ASSERT_GT(test, rate, 0); 423 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 424 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 425 426 clk_put(clk); 427 } 428 429 /* 430 * Test that for an uncached clock, clk_set_rate_range() will work 431 * properly if the rate has changed in hardware. 432 * 433 * In this case, it means that if the rate wasn't initially in the range 434 * we're trying to set, but got changed at some point into the range 435 * without the kernel knowing about it, its rate shouldn't be affected. 436 */ 437 static void clk_test_uncached_updated_rate_set_range(struct kunit *test) 438 { 439 struct clk_dummy_context *ctx = test->priv; 440 struct clk_hw *hw = &ctx->hw; 441 struct clk *clk = clk_hw_get_clk(hw, NULL); 442 unsigned long rate; 443 444 /* We change the rate behind the clock framework's back */ 445 ctx->rate = DUMMY_CLOCK_RATE_1 + 1000; 446 KUNIT_ASSERT_EQ(test, 447 clk_set_rate_range(clk, 448 DUMMY_CLOCK_RATE_1, 449 DUMMY_CLOCK_RATE_2), 450 0); 451 452 rate = clk_get_rate(clk); 453 KUNIT_ASSERT_GT(test, rate, 0); 454 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1 + 1000); 455 456 clk_put(clk); 457 } 458 459 static struct kunit_case clk_uncached_test_cases[] = { 460 KUNIT_CASE(clk_test_uncached_get_rate), 461 KUNIT_CASE(clk_test_uncached_set_range), 462 KUNIT_CASE(clk_test_uncached_updated_rate_set_range), 463 {} 464 }; 465 466 /* 467 * Test suite for a basic, uncached, rate clock, without any parent. 468 * 469 * These tests exercise the rate API with simple scenarios 470 */ 471 static struct kunit_suite clk_uncached_test_suite = { 472 .name = "clk-uncached-test", 473 .init = clk_uncached_test_init, 474 .exit = clk_test_exit, 475 .test_cases = clk_uncached_test_cases, 476 }; 477 478 static int 479 clk_multiple_parents_mux_test_init(struct kunit *test) 480 { 481 struct clk_multiple_parent_ctx *ctx; 482 const char *parents[2] = { "parent-0", "parent-1"}; 483 int ret; 484 485 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 486 if (!ctx) 487 return -ENOMEM; 488 test->priv = ctx; 489 490 ctx->parents_ctx[0].hw.init = CLK_HW_INIT_NO_PARENT("parent-0", 491 &clk_dummy_rate_ops, 492 0); 493 ctx->parents_ctx[0].rate = DUMMY_CLOCK_RATE_1; 494 ret = clk_hw_register_kunit(test, NULL, &ctx->parents_ctx[0].hw); 495 if (ret) 496 return ret; 497 498 ctx->parents_ctx[1].hw.init = CLK_HW_INIT_NO_PARENT("parent-1", 499 &clk_dummy_rate_ops, 500 0); 501 ctx->parents_ctx[1].rate = DUMMY_CLOCK_RATE_2; 502 ret = clk_hw_register_kunit(test, NULL, &ctx->parents_ctx[1].hw); 503 if (ret) 504 return ret; 505 506 ctx->current_parent = 0; 507 ctx->hw.init = CLK_HW_INIT_PARENTS("test-mux", parents, 508 &clk_multiple_parents_mux_ops, 509 CLK_SET_RATE_PARENT); 510 ret = clk_hw_register_kunit(test, NULL, &ctx->hw); 511 if (ret) 512 return ret; 513 514 return 0; 515 } 516 517 /* 518 * Test that for a clock with multiple parents, clk_get_parent() 519 * actually returns the current one. 520 */ 521 static void 522 clk_test_multiple_parents_mux_get_parent(struct kunit *test) 523 { 524 struct clk_multiple_parent_ctx *ctx = test->priv; 525 struct clk_hw *hw = &ctx->hw; 526 struct clk *clk = clk_hw_get_clk(hw, NULL); 527 struct clk *parent = clk_hw_get_clk(&ctx->parents_ctx[0].hw, NULL); 528 529 KUNIT_EXPECT_TRUE(test, clk_is_match(clk_get_parent(clk), parent)); 530 531 clk_put(parent); 532 clk_put(clk); 533 } 534 535 /* 536 * Test that for a clock with a multiple parents, clk_has_parent() 537 * actually reports all of them as parents. 538 */ 539 static void 540 clk_test_multiple_parents_mux_has_parent(struct kunit *test) 541 { 542 struct clk_multiple_parent_ctx *ctx = test->priv; 543 struct clk_hw *hw = &ctx->hw; 544 struct clk *clk = clk_hw_get_clk(hw, NULL); 545 struct clk *parent; 546 547 parent = clk_hw_get_clk(&ctx->parents_ctx[0].hw, NULL); 548 KUNIT_EXPECT_TRUE(test, clk_has_parent(clk, parent)); 549 clk_put(parent); 550 551 parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 552 KUNIT_EXPECT_TRUE(test, clk_has_parent(clk, parent)); 553 clk_put(parent); 554 555 clk_put(clk); 556 } 557 558 /* 559 * Test that for a clock with a multiple parents, if we set a range on 560 * that clock and the parent is changed, its rate after the reparenting 561 * is still within the range we asked for. 562 * 563 * FIXME: clk_set_parent() only does the reparenting but doesn't 564 * reevaluate whether the new clock rate is within its boundaries or 565 * not. 566 */ 567 static void 568 clk_test_multiple_parents_mux_set_range_set_parent_get_rate(struct kunit *test) 569 { 570 struct clk_multiple_parent_ctx *ctx = test->priv; 571 struct clk_hw *hw = &ctx->hw; 572 struct clk *clk = clk_hw_get_clk_kunit(test, hw, NULL); 573 struct clk *parent1, *parent2; 574 unsigned long rate; 575 int ret; 576 577 kunit_skip(test, "This needs to be fixed in the core."); 578 579 parent1 = clk_hw_get_clk_kunit(test, &ctx->parents_ctx[0].hw, NULL); 580 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent1); 581 KUNIT_ASSERT_TRUE(test, clk_is_match(clk_get_parent(clk), parent1)); 582 583 parent2 = clk_hw_get_clk_kunit(test, &ctx->parents_ctx[1].hw, NULL); 584 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent2); 585 586 ret = clk_set_rate(parent1, DUMMY_CLOCK_RATE_1); 587 KUNIT_ASSERT_EQ(test, ret, 0); 588 589 ret = clk_set_rate(parent2, DUMMY_CLOCK_RATE_2); 590 KUNIT_ASSERT_EQ(test, ret, 0); 591 592 ret = clk_set_rate_range(clk, 593 DUMMY_CLOCK_RATE_1 - 1000, 594 DUMMY_CLOCK_RATE_1 + 1000); 595 KUNIT_ASSERT_EQ(test, ret, 0); 596 597 ret = clk_set_parent(clk, parent2); 598 KUNIT_ASSERT_EQ(test, ret, 0); 599 600 rate = clk_get_rate(clk); 601 KUNIT_ASSERT_GT(test, rate, 0); 602 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1 - 1000); 603 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_1 + 1000); 604 } 605 606 static struct kunit_case clk_multiple_parents_mux_test_cases[] = { 607 KUNIT_CASE(clk_test_multiple_parents_mux_get_parent), 608 KUNIT_CASE(clk_test_multiple_parents_mux_has_parent), 609 KUNIT_CASE(clk_test_multiple_parents_mux_set_range_set_parent_get_rate), 610 {} 611 }; 612 613 /* 614 * Test suite for a basic mux clock with two parents, with 615 * CLK_SET_RATE_PARENT on the child. 616 * 617 * These tests exercise the consumer API and check that the state of the 618 * child and parents are sane and consistent. 619 */ 620 static struct kunit_suite 621 clk_multiple_parents_mux_test_suite = { 622 .name = "clk-multiple-parents-mux-test", 623 .init = clk_multiple_parents_mux_test_init, 624 .test_cases = clk_multiple_parents_mux_test_cases, 625 }; 626 627 static int 628 clk_orphan_transparent_multiple_parent_mux_test_init(struct kunit *test) 629 { 630 struct clk_multiple_parent_ctx *ctx; 631 const char *parents[2] = { "missing-parent", "proper-parent"}; 632 int ret; 633 634 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 635 if (!ctx) 636 return -ENOMEM; 637 test->priv = ctx; 638 639 ctx->parents_ctx[1].hw.init = CLK_HW_INIT_NO_PARENT("proper-parent", 640 &clk_dummy_rate_ops, 641 0); 642 ctx->parents_ctx[1].rate = DUMMY_CLOCK_INIT_RATE; 643 ret = clk_hw_register_kunit(test, NULL, &ctx->parents_ctx[1].hw); 644 if (ret) 645 return ret; 646 647 ctx->hw.init = CLK_HW_INIT_PARENTS("test-orphan-mux", parents, 648 &clk_multiple_parents_mux_ops, 649 CLK_SET_RATE_PARENT); 650 ret = clk_hw_register_kunit(test, NULL, &ctx->hw); 651 if (ret) 652 return ret; 653 654 return 0; 655 } 656 657 /* 658 * Test that, for a mux whose current parent hasn't been registered yet and is 659 * thus orphan, clk_get_parent() will return NULL. 660 */ 661 static void 662 clk_test_orphan_transparent_multiple_parent_mux_get_parent(struct kunit *test) 663 { 664 struct clk_multiple_parent_ctx *ctx = test->priv; 665 struct clk_hw *hw = &ctx->hw; 666 struct clk *clk = clk_hw_get_clk(hw, NULL); 667 668 KUNIT_EXPECT_PTR_EQ(test, clk_get_parent(clk), NULL); 669 670 clk_put(clk); 671 } 672 673 /* 674 * Test that, for a mux whose current parent hasn't been registered yet, 675 * calling clk_set_parent() to a valid parent will properly update the 676 * mux parent and its orphan status. 677 */ 678 static void 679 clk_test_orphan_transparent_multiple_parent_mux_set_parent(struct kunit *test) 680 { 681 struct clk_multiple_parent_ctx *ctx = test->priv; 682 struct clk_hw *hw = &ctx->hw; 683 struct clk *clk = clk_hw_get_clk(hw, NULL); 684 struct clk *parent, *new_parent; 685 int ret; 686 687 parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 688 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 689 690 ret = clk_set_parent(clk, parent); 691 KUNIT_ASSERT_EQ(test, ret, 0); 692 693 new_parent = clk_get_parent(clk); 694 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 695 KUNIT_EXPECT_TRUE(test, clk_is_match(parent, new_parent)); 696 697 clk_put(parent); 698 clk_put(clk); 699 } 700 701 /* 702 * Test that, for a mux that started orphan but got switched to a valid 703 * parent, calling clk_drop_range() on the mux won't affect the parent 704 * rate. 705 */ 706 static void 707 clk_test_orphan_transparent_multiple_parent_mux_set_parent_drop_range(struct kunit *test) 708 { 709 struct clk_multiple_parent_ctx *ctx = test->priv; 710 struct clk_hw *hw = &ctx->hw; 711 struct clk *clk = clk_hw_get_clk(hw, NULL); 712 struct clk *parent; 713 unsigned long parent_rate, new_parent_rate; 714 int ret; 715 716 parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 717 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 718 719 parent_rate = clk_get_rate(parent); 720 KUNIT_ASSERT_GT(test, parent_rate, 0); 721 722 ret = clk_set_parent(clk, parent); 723 KUNIT_ASSERT_EQ(test, ret, 0); 724 725 ret = clk_drop_range(clk); 726 KUNIT_ASSERT_EQ(test, ret, 0); 727 728 new_parent_rate = clk_get_rate(clk); 729 KUNIT_ASSERT_GT(test, new_parent_rate, 0); 730 KUNIT_EXPECT_EQ(test, parent_rate, new_parent_rate); 731 732 clk_put(parent); 733 clk_put(clk); 734 } 735 736 /* 737 * Test that, for a mux that started orphan but got switched to a valid 738 * parent, the rate of the mux and its new parent are consistent. 739 */ 740 static void 741 clk_test_orphan_transparent_multiple_parent_mux_set_parent_get_rate(struct kunit *test) 742 { 743 struct clk_multiple_parent_ctx *ctx = test->priv; 744 struct clk_hw *hw = &ctx->hw; 745 struct clk *clk = clk_hw_get_clk(hw, NULL); 746 struct clk *parent; 747 unsigned long parent_rate, rate; 748 int ret; 749 750 parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 751 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 752 753 parent_rate = clk_get_rate(parent); 754 KUNIT_ASSERT_GT(test, parent_rate, 0); 755 756 ret = clk_set_parent(clk, parent); 757 KUNIT_ASSERT_EQ(test, ret, 0); 758 759 rate = clk_get_rate(clk); 760 KUNIT_ASSERT_GT(test, rate, 0); 761 KUNIT_EXPECT_EQ(test, parent_rate, rate); 762 763 clk_put(parent); 764 clk_put(clk); 765 } 766 767 /* 768 * Test that, for a mux that started orphan but got switched to a valid 769 * parent, calling clk_put() on the mux won't affect the parent rate. 770 */ 771 static void 772 clk_test_orphan_transparent_multiple_parent_mux_set_parent_put(struct kunit *test) 773 { 774 struct clk_multiple_parent_ctx *ctx = test->priv; 775 struct clk *clk, *parent; 776 unsigned long parent_rate, new_parent_rate; 777 int ret; 778 779 parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 780 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 781 782 clk = clk_hw_get_clk(&ctx->hw, NULL); 783 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, clk); 784 785 parent_rate = clk_get_rate(parent); 786 KUNIT_ASSERT_GT(test, parent_rate, 0); 787 788 ret = clk_set_parent(clk, parent); 789 KUNIT_ASSERT_EQ(test, ret, 0); 790 791 clk_put(clk); 792 793 new_parent_rate = clk_get_rate(parent); 794 KUNIT_ASSERT_GT(test, new_parent_rate, 0); 795 KUNIT_EXPECT_EQ(test, parent_rate, new_parent_rate); 796 797 clk_put(parent); 798 } 799 800 /* 801 * Test that, for a mux that started orphan but got switched to a valid 802 * parent, calling clk_set_rate_range() will affect the parent state if 803 * its rate is out of range. 804 */ 805 static void 806 clk_test_orphan_transparent_multiple_parent_mux_set_parent_set_range_modified(struct kunit *test) 807 { 808 struct clk_multiple_parent_ctx *ctx = test->priv; 809 struct clk_hw *hw = &ctx->hw; 810 struct clk *clk = clk_hw_get_clk(hw, NULL); 811 struct clk *parent; 812 unsigned long rate; 813 int ret; 814 815 parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 816 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 817 818 ret = clk_set_parent(clk, parent); 819 KUNIT_ASSERT_EQ(test, ret, 0); 820 821 ret = clk_set_rate_range(clk, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2); 822 KUNIT_ASSERT_EQ(test, ret, 0); 823 824 rate = clk_get_rate(clk); 825 KUNIT_ASSERT_GT(test, rate, 0); 826 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 827 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 828 829 clk_put(parent); 830 clk_put(clk); 831 } 832 833 /* 834 * Test that, for a mux that started orphan but got switched to a valid 835 * parent, calling clk_set_rate_range() won't affect the parent state if 836 * its rate is within range. 837 */ 838 static void 839 clk_test_orphan_transparent_multiple_parent_mux_set_parent_set_range_untouched(struct kunit *test) 840 { 841 struct clk_multiple_parent_ctx *ctx = test->priv; 842 struct clk_hw *hw = &ctx->hw; 843 struct clk *clk = clk_hw_get_clk(hw, NULL); 844 struct clk *parent; 845 unsigned long parent_rate, new_parent_rate; 846 int ret; 847 848 parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 849 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 850 851 parent_rate = clk_get_rate(parent); 852 KUNIT_ASSERT_GT(test, parent_rate, 0); 853 854 ret = clk_set_parent(clk, parent); 855 KUNIT_ASSERT_EQ(test, ret, 0); 856 857 ret = clk_set_rate_range(clk, 858 DUMMY_CLOCK_INIT_RATE - 1000, 859 DUMMY_CLOCK_INIT_RATE + 1000); 860 KUNIT_ASSERT_EQ(test, ret, 0); 861 862 new_parent_rate = clk_get_rate(parent); 863 KUNIT_ASSERT_GT(test, new_parent_rate, 0); 864 KUNIT_EXPECT_EQ(test, parent_rate, new_parent_rate); 865 866 clk_put(parent); 867 clk_put(clk); 868 } 869 870 /* 871 * Test that, for a mux whose current parent hasn't been registered yet, 872 * calling clk_set_rate_range() will succeed, and will be taken into 873 * account when rounding a rate. 874 */ 875 static void 876 clk_test_orphan_transparent_multiple_parent_mux_set_range_round_rate(struct kunit *test) 877 { 878 struct clk_multiple_parent_ctx *ctx = test->priv; 879 struct clk_hw *hw = &ctx->hw; 880 struct clk *clk = clk_hw_get_clk(hw, NULL); 881 long rate; 882 int ret; 883 884 ret = clk_set_rate_range(clk, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2); 885 KUNIT_ASSERT_EQ(test, ret, 0); 886 887 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_1 - 1000); 888 KUNIT_ASSERT_GT(test, rate, 0); 889 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 890 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 891 892 clk_put(clk); 893 } 894 895 /* 896 * Test that, for a mux that started orphan, was assigned and rate and 897 * then got switched to a valid parent, its rate is eventually within 898 * range. 899 * 900 * FIXME: Even though we update the rate as part of clk_set_parent(), we 901 * don't evaluate whether that new rate is within range and needs to be 902 * adjusted. 903 */ 904 static void 905 clk_test_orphan_transparent_multiple_parent_mux_set_range_set_parent_get_rate(struct kunit *test) 906 { 907 struct clk_multiple_parent_ctx *ctx = test->priv; 908 struct clk_hw *hw = &ctx->hw; 909 struct clk *clk = clk_hw_get_clk_kunit(test, hw, NULL); 910 struct clk *parent; 911 unsigned long rate; 912 int ret; 913 914 kunit_skip(test, "This needs to be fixed in the core."); 915 916 clk_hw_set_rate_range(hw, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2); 917 918 parent = clk_hw_get_clk_kunit(test, &ctx->parents_ctx[1].hw, NULL); 919 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 920 921 ret = clk_set_parent(clk, parent); 922 KUNIT_ASSERT_EQ(test, ret, 0); 923 924 rate = clk_get_rate(clk); 925 KUNIT_ASSERT_GT(test, rate, 0); 926 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 927 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 928 } 929 930 static struct kunit_case clk_orphan_transparent_multiple_parent_mux_test_cases[] = { 931 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_get_parent), 932 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent), 933 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent_drop_range), 934 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent_get_rate), 935 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent_put), 936 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent_set_range_modified), 937 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent_set_range_untouched), 938 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_range_round_rate), 939 KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_range_set_parent_get_rate), 940 {} 941 }; 942 943 /* 944 * Test suite for a basic mux clock with two parents. The default parent 945 * isn't registered, only the second parent is. By default, the clock 946 * will thus be orphan. 947 * 948 * These tests exercise the behaviour of the consumer API when dealing 949 * with an orphan clock, and how we deal with the transition to a valid 950 * parent. 951 */ 952 static struct kunit_suite clk_orphan_transparent_multiple_parent_mux_test_suite = { 953 .name = "clk-orphan-transparent-multiple-parent-mux-test", 954 .init = clk_orphan_transparent_multiple_parent_mux_test_init, 955 .test_cases = clk_orphan_transparent_multiple_parent_mux_test_cases, 956 }; 957 958 struct clk_single_parent_ctx { 959 struct clk_dummy_context parent_ctx; 960 struct clk_hw hw; 961 }; 962 963 static int clk_single_parent_mux_test_init(struct kunit *test) 964 { 965 struct clk_single_parent_ctx *ctx; 966 int ret; 967 968 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 969 if (!ctx) 970 return -ENOMEM; 971 test->priv = ctx; 972 973 ctx->parent_ctx.rate = DUMMY_CLOCK_INIT_RATE; 974 ctx->parent_ctx.hw.init = 975 CLK_HW_INIT_NO_PARENT("parent-clk", 976 &clk_dummy_rate_ops, 977 0); 978 979 ret = clk_hw_register_kunit(test, NULL, &ctx->parent_ctx.hw); 980 if (ret) 981 return ret; 982 983 ctx->hw.init = CLK_HW_INIT("test-clk", "parent-clk", 984 &clk_dummy_single_parent_ops, 985 CLK_SET_RATE_PARENT); 986 987 ret = clk_hw_register_kunit(test, NULL, &ctx->hw); 988 if (ret) 989 return ret; 990 991 return 0; 992 } 993 994 static void 995 clk_single_parent_mux_test_exit(struct kunit *test) 996 { 997 struct clk_single_parent_ctx *ctx = test->priv; 998 999 clk_hw_unregister(&ctx->hw); 1000 clk_hw_unregister(&ctx->parent_ctx.hw); 1001 } 1002 1003 /* 1004 * Test that for a clock with a single parent, clk_get_parent() actually 1005 * returns the parent. 1006 */ 1007 static void 1008 clk_test_single_parent_mux_get_parent(struct kunit *test) 1009 { 1010 struct clk_single_parent_ctx *ctx = test->priv; 1011 struct clk_hw *hw = &ctx->hw; 1012 struct clk *clk = clk_hw_get_clk(hw, NULL); 1013 struct clk *parent = clk_hw_get_clk(&ctx->parent_ctx.hw, NULL); 1014 1015 KUNIT_EXPECT_TRUE(test, clk_is_match(clk_get_parent(clk), parent)); 1016 1017 clk_put(parent); 1018 clk_put(clk); 1019 } 1020 1021 /* 1022 * Test that for a clock with a single parent, clk_has_parent() actually 1023 * reports it as a parent. 1024 */ 1025 static void 1026 clk_test_single_parent_mux_has_parent(struct kunit *test) 1027 { 1028 struct clk_single_parent_ctx *ctx = test->priv; 1029 struct clk_hw *hw = &ctx->hw; 1030 struct clk *clk = clk_hw_get_clk(hw, NULL); 1031 struct clk *parent = clk_hw_get_clk(&ctx->parent_ctx.hw, NULL); 1032 1033 KUNIT_EXPECT_TRUE(test, clk_has_parent(clk, parent)); 1034 1035 clk_put(parent); 1036 clk_put(clk); 1037 } 1038 1039 /* 1040 * Test that for a clock that can't modify its rate and with a single 1041 * parent, if we set disjoints range on the parent and then the child, 1042 * the second will return an error. 1043 * 1044 * FIXME: clk_set_rate_range() only considers the current clock when 1045 * evaluating whether ranges are disjoints and not the upstream clocks 1046 * ranges. 1047 */ 1048 static void 1049 clk_test_single_parent_mux_set_range_disjoint_child_last(struct kunit *test) 1050 { 1051 struct clk_single_parent_ctx *ctx = test->priv; 1052 struct clk_hw *hw = &ctx->hw; 1053 struct clk *clk = clk_hw_get_clk_kunit(test, hw, NULL); 1054 struct clk *parent; 1055 int ret; 1056 1057 kunit_skip(test, "This needs to be fixed in the core."); 1058 1059 parent = clk_get_parent(clk); 1060 KUNIT_ASSERT_PTR_NE(test, parent, NULL); 1061 1062 ret = clk_set_rate_range(parent, 1000, 2000); 1063 KUNIT_ASSERT_EQ(test, ret, 0); 1064 1065 ret = clk_set_rate_range(clk, 3000, 4000); 1066 KUNIT_EXPECT_LT(test, ret, 0); 1067 } 1068 1069 /* 1070 * Test that for a clock that can't modify its rate and with a single 1071 * parent, if we set disjoints range on the child and then the parent, 1072 * the second will return an error. 1073 * 1074 * FIXME: clk_set_rate_range() only considers the current clock when 1075 * evaluating whether ranges are disjoints and not the downstream clocks 1076 * ranges. 1077 */ 1078 static void 1079 clk_test_single_parent_mux_set_range_disjoint_parent_last(struct kunit *test) 1080 { 1081 struct clk_single_parent_ctx *ctx = test->priv; 1082 struct clk_hw *hw = &ctx->hw; 1083 struct clk *clk = clk_hw_get_clk_kunit(test, hw, NULL); 1084 struct clk *parent; 1085 int ret; 1086 1087 kunit_skip(test, "This needs to be fixed in the core."); 1088 1089 parent = clk_get_parent(clk); 1090 KUNIT_ASSERT_PTR_NE(test, parent, NULL); 1091 1092 ret = clk_set_rate_range(clk, 1000, 2000); 1093 KUNIT_ASSERT_EQ(test, ret, 0); 1094 1095 ret = clk_set_rate_range(parent, 3000, 4000); 1096 KUNIT_EXPECT_LT(test, ret, 0); 1097 } 1098 1099 /* 1100 * Test that for a clock that can't modify its rate and with a single 1101 * parent, if we set a range on the parent and then call 1102 * clk_round_rate(), the boundaries of the parent are taken into 1103 * account. 1104 */ 1105 static void 1106 clk_test_single_parent_mux_set_range_round_rate_parent_only(struct kunit *test) 1107 { 1108 struct clk_single_parent_ctx *ctx = test->priv; 1109 struct clk_hw *hw = &ctx->hw; 1110 struct clk *clk = clk_hw_get_clk(hw, NULL); 1111 struct clk *parent; 1112 long rate; 1113 int ret; 1114 1115 parent = clk_get_parent(clk); 1116 KUNIT_ASSERT_PTR_NE(test, parent, NULL); 1117 1118 ret = clk_set_rate_range(parent, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2); 1119 KUNIT_ASSERT_EQ(test, ret, 0); 1120 1121 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_1 - 1000); 1122 KUNIT_ASSERT_GT(test, rate, 0); 1123 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 1124 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 1125 1126 clk_put(clk); 1127 } 1128 1129 /* 1130 * Test that for a clock that can't modify its rate and with a single 1131 * parent, if we set a range on the parent and a more restrictive one on 1132 * the child, and then call clk_round_rate(), the boundaries of the 1133 * two clocks are taken into account. 1134 */ 1135 static void 1136 clk_test_single_parent_mux_set_range_round_rate_child_smaller(struct kunit *test) 1137 { 1138 struct clk_single_parent_ctx *ctx = test->priv; 1139 struct clk_hw *hw = &ctx->hw; 1140 struct clk *clk = clk_hw_get_clk(hw, NULL); 1141 struct clk *parent; 1142 long rate; 1143 int ret; 1144 1145 parent = clk_get_parent(clk); 1146 KUNIT_ASSERT_PTR_NE(test, parent, NULL); 1147 1148 ret = clk_set_rate_range(parent, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2); 1149 KUNIT_ASSERT_EQ(test, ret, 0); 1150 1151 ret = clk_set_rate_range(clk, DUMMY_CLOCK_RATE_1 + 1000, DUMMY_CLOCK_RATE_2 - 1000); 1152 KUNIT_ASSERT_EQ(test, ret, 0); 1153 1154 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_1 - 1000); 1155 KUNIT_ASSERT_GT(test, rate, 0); 1156 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1 + 1000); 1157 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2 - 1000); 1158 1159 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_2 + 1000); 1160 KUNIT_ASSERT_GT(test, rate, 0); 1161 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1 + 1000); 1162 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2 - 1000); 1163 1164 clk_put(clk); 1165 } 1166 1167 /* 1168 * Test that for a clock that can't modify its rate and with a single 1169 * parent, if we set a range on the child and a more restrictive one on 1170 * the parent, and then call clk_round_rate(), the boundaries of the 1171 * two clocks are taken into account. 1172 */ 1173 static void 1174 clk_test_single_parent_mux_set_range_round_rate_parent_smaller(struct kunit *test) 1175 { 1176 struct clk_single_parent_ctx *ctx = test->priv; 1177 struct clk_hw *hw = &ctx->hw; 1178 struct clk *clk = clk_hw_get_clk(hw, NULL); 1179 struct clk *parent; 1180 long rate; 1181 int ret; 1182 1183 parent = clk_get_parent(clk); 1184 KUNIT_ASSERT_PTR_NE(test, parent, NULL); 1185 1186 ret = clk_set_rate_range(parent, DUMMY_CLOCK_RATE_1 + 1000, DUMMY_CLOCK_RATE_2 - 1000); 1187 KUNIT_ASSERT_EQ(test, ret, 0); 1188 1189 ret = clk_set_rate_range(clk, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2); 1190 KUNIT_ASSERT_EQ(test, ret, 0); 1191 1192 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_1 - 1000); 1193 KUNIT_ASSERT_GT(test, rate, 0); 1194 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1 + 1000); 1195 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2 - 1000); 1196 1197 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_2 + 1000); 1198 KUNIT_ASSERT_GT(test, rate, 0); 1199 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1 + 1000); 1200 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2 - 1000); 1201 1202 clk_put(clk); 1203 } 1204 1205 static struct kunit_case clk_single_parent_mux_test_cases[] = { 1206 KUNIT_CASE(clk_test_single_parent_mux_get_parent), 1207 KUNIT_CASE(clk_test_single_parent_mux_has_parent), 1208 KUNIT_CASE(clk_test_single_parent_mux_set_range_disjoint_child_last), 1209 KUNIT_CASE(clk_test_single_parent_mux_set_range_disjoint_parent_last), 1210 KUNIT_CASE(clk_test_single_parent_mux_set_range_round_rate_child_smaller), 1211 KUNIT_CASE(clk_test_single_parent_mux_set_range_round_rate_parent_only), 1212 KUNIT_CASE(clk_test_single_parent_mux_set_range_round_rate_parent_smaller), 1213 {} 1214 }; 1215 1216 /* 1217 * Test suite for a basic mux clock with one parent, with 1218 * CLK_SET_RATE_PARENT on the child. 1219 * 1220 * These tests exercise the consumer API and check that the state of the 1221 * child and parent are sane and consistent. 1222 */ 1223 static struct kunit_suite 1224 clk_single_parent_mux_test_suite = { 1225 .name = "clk-single-parent-mux-test", 1226 .init = clk_single_parent_mux_test_init, 1227 .test_cases = clk_single_parent_mux_test_cases, 1228 }; 1229 1230 static int clk_orphan_transparent_single_parent_mux_test_init(struct kunit *test) 1231 { 1232 struct clk_single_parent_ctx *ctx; 1233 struct clk_init_data init = { }; 1234 const char * const parents[] = { "orphan_parent" }; 1235 int ret; 1236 1237 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 1238 if (!ctx) 1239 return -ENOMEM; 1240 test->priv = ctx; 1241 1242 init.name = "test_orphan_dummy_parent"; 1243 init.ops = &clk_dummy_single_parent_ops; 1244 init.parent_names = parents; 1245 init.num_parents = ARRAY_SIZE(parents); 1246 init.flags = CLK_SET_RATE_PARENT; 1247 ctx->hw.init = &init; 1248 1249 ret = clk_hw_register(NULL, &ctx->hw); 1250 if (ret) 1251 return ret; 1252 1253 memset(&init, 0, sizeof(init)); 1254 init.name = "orphan_parent"; 1255 init.ops = &clk_dummy_rate_ops; 1256 ctx->parent_ctx.hw.init = &init; 1257 ctx->parent_ctx.rate = DUMMY_CLOCK_INIT_RATE; 1258 1259 ret = clk_hw_register(NULL, &ctx->parent_ctx.hw); 1260 if (ret) 1261 return ret; 1262 1263 return 0; 1264 } 1265 1266 /* 1267 * Test that a mux-only clock, with an initial rate within a range, 1268 * will still have the same rate after the range has been enforced. 1269 * 1270 * See: 1271 * https://lore.kernel.org/linux-clk/7720158d-10a7-a17b-73a4-a8615c9c6d5c@collabora.com/ 1272 */ 1273 static void clk_test_orphan_transparent_parent_mux_set_range(struct kunit *test) 1274 { 1275 struct clk_single_parent_ctx *ctx = test->priv; 1276 struct clk_hw *hw = &ctx->hw; 1277 struct clk *clk = clk_hw_get_clk(hw, NULL); 1278 unsigned long rate, new_rate; 1279 1280 rate = clk_get_rate(clk); 1281 KUNIT_ASSERT_GT(test, rate, 0); 1282 1283 KUNIT_ASSERT_EQ(test, 1284 clk_set_rate_range(clk, 1285 ctx->parent_ctx.rate - 1000, 1286 ctx->parent_ctx.rate + 1000), 1287 0); 1288 1289 new_rate = clk_get_rate(clk); 1290 KUNIT_ASSERT_GT(test, new_rate, 0); 1291 KUNIT_EXPECT_EQ(test, rate, new_rate); 1292 1293 clk_put(clk); 1294 } 1295 1296 static struct kunit_case clk_orphan_transparent_single_parent_mux_test_cases[] = { 1297 KUNIT_CASE(clk_test_orphan_transparent_parent_mux_set_range), 1298 {} 1299 }; 1300 1301 /* 1302 * Test suite for a basic mux clock with one parent. The parent is 1303 * registered after its child. The clock will thus be an orphan when 1304 * registered, but will no longer be when the tests run. 1305 * 1306 * These tests make sure a clock that used to be orphan has a sane, 1307 * consistent, behaviour. 1308 */ 1309 static struct kunit_suite clk_orphan_transparent_single_parent_test_suite = { 1310 .name = "clk-orphan-transparent-single-parent-test", 1311 .init = clk_orphan_transparent_single_parent_mux_test_init, 1312 .exit = clk_single_parent_mux_test_exit, 1313 .test_cases = clk_orphan_transparent_single_parent_mux_test_cases, 1314 }; 1315 1316 struct clk_single_parent_two_lvl_ctx { 1317 struct clk_dummy_context parent_parent_ctx; 1318 struct clk_dummy_context parent_ctx; 1319 struct clk_hw hw; 1320 }; 1321 1322 static int 1323 clk_orphan_two_level_root_last_test_init(struct kunit *test) 1324 { 1325 struct clk_single_parent_two_lvl_ctx *ctx; 1326 int ret; 1327 1328 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 1329 if (!ctx) 1330 return -ENOMEM; 1331 test->priv = ctx; 1332 1333 ctx->parent_ctx.hw.init = 1334 CLK_HW_INIT("intermediate-parent", 1335 "root-parent", 1336 &clk_dummy_single_parent_ops, 1337 CLK_SET_RATE_PARENT); 1338 ret = clk_hw_register(NULL, &ctx->parent_ctx.hw); 1339 if (ret) 1340 return ret; 1341 1342 ctx->hw.init = 1343 CLK_HW_INIT("test-clk", "intermediate-parent", 1344 &clk_dummy_single_parent_ops, 1345 CLK_SET_RATE_PARENT); 1346 ret = clk_hw_register(NULL, &ctx->hw); 1347 if (ret) 1348 return ret; 1349 1350 ctx->parent_parent_ctx.rate = DUMMY_CLOCK_INIT_RATE; 1351 ctx->parent_parent_ctx.hw.init = 1352 CLK_HW_INIT_NO_PARENT("root-parent", 1353 &clk_dummy_rate_ops, 1354 0); 1355 ret = clk_hw_register(NULL, &ctx->parent_parent_ctx.hw); 1356 if (ret) 1357 return ret; 1358 1359 return 0; 1360 } 1361 1362 static void 1363 clk_orphan_two_level_root_last_test_exit(struct kunit *test) 1364 { 1365 struct clk_single_parent_two_lvl_ctx *ctx = test->priv; 1366 1367 clk_hw_unregister(&ctx->hw); 1368 clk_hw_unregister(&ctx->parent_ctx.hw); 1369 clk_hw_unregister(&ctx->parent_parent_ctx.hw); 1370 } 1371 1372 /* 1373 * Test that, for a clock whose parent used to be orphan, clk_get_rate() 1374 * will return the proper rate. 1375 */ 1376 static void 1377 clk_orphan_two_level_root_last_test_get_rate(struct kunit *test) 1378 { 1379 struct clk_single_parent_two_lvl_ctx *ctx = test->priv; 1380 struct clk_hw *hw = &ctx->hw; 1381 struct clk *clk = clk_hw_get_clk(hw, NULL); 1382 unsigned long rate; 1383 1384 rate = clk_get_rate(clk); 1385 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_INIT_RATE); 1386 1387 clk_put(clk); 1388 } 1389 1390 /* 1391 * Test that, for a clock whose parent used to be orphan, 1392 * clk_set_rate_range() won't affect its rate if it is already within 1393 * range. 1394 * 1395 * See (for Exynos 4210): 1396 * https://lore.kernel.org/linux-clk/366a0232-bb4a-c357-6aa8-636e398e05eb@samsung.com/ 1397 */ 1398 static void 1399 clk_orphan_two_level_root_last_test_set_range(struct kunit *test) 1400 { 1401 struct clk_single_parent_two_lvl_ctx *ctx = test->priv; 1402 struct clk_hw *hw = &ctx->hw; 1403 struct clk *clk = clk_hw_get_clk(hw, NULL); 1404 unsigned long rate; 1405 int ret; 1406 1407 ret = clk_set_rate_range(clk, 1408 DUMMY_CLOCK_INIT_RATE - 1000, 1409 DUMMY_CLOCK_INIT_RATE + 1000); 1410 KUNIT_ASSERT_EQ(test, ret, 0); 1411 1412 rate = clk_get_rate(clk); 1413 KUNIT_ASSERT_GT(test, rate, 0); 1414 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_INIT_RATE); 1415 1416 clk_put(clk); 1417 } 1418 1419 static struct kunit_case 1420 clk_orphan_two_level_root_last_test_cases[] = { 1421 KUNIT_CASE(clk_orphan_two_level_root_last_test_get_rate), 1422 KUNIT_CASE(clk_orphan_two_level_root_last_test_set_range), 1423 {} 1424 }; 1425 1426 /* 1427 * Test suite for a basic, transparent, clock with a parent that is also 1428 * such a clock. The parent's parent is registered last, while the 1429 * parent and its child are registered in that order. The intermediate 1430 * and leaf clocks will thus be orphan when registered, but the leaf 1431 * clock itself will always have its parent and will never be 1432 * reparented. Indeed, it's only orphan because its parent is. 1433 * 1434 * These tests exercise the behaviour of the consumer API when dealing 1435 * with an orphan clock, and how we deal with the transition to a valid 1436 * parent. 1437 */ 1438 static struct kunit_suite 1439 clk_orphan_two_level_root_last_test_suite = { 1440 .name = "clk-orphan-two-level-root-last-test", 1441 .init = clk_orphan_two_level_root_last_test_init, 1442 .exit = clk_orphan_two_level_root_last_test_exit, 1443 .test_cases = clk_orphan_two_level_root_last_test_cases, 1444 }; 1445 1446 /* 1447 * Test that clk_set_rate_range won't return an error for a valid range 1448 * and that it will make sure the rate of the clock is within the 1449 * boundaries. 1450 */ 1451 static void clk_range_test_set_range(struct kunit *test) 1452 { 1453 struct clk_dummy_context *ctx = test->priv; 1454 struct clk_hw *hw = &ctx->hw; 1455 struct clk *clk = clk_hw_get_clk(hw, NULL); 1456 unsigned long rate; 1457 1458 KUNIT_ASSERT_EQ(test, 1459 clk_set_rate_range(clk, 1460 DUMMY_CLOCK_RATE_1, 1461 DUMMY_CLOCK_RATE_2), 1462 0); 1463 1464 rate = clk_get_rate(clk); 1465 KUNIT_ASSERT_GT(test, rate, 0); 1466 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 1467 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 1468 1469 clk_put(clk); 1470 } 1471 1472 /* 1473 * Test that calling clk_set_rate_range with a minimum rate higher than 1474 * the maximum rate returns an error. 1475 */ 1476 static void clk_range_test_set_range_invalid(struct kunit *test) 1477 { 1478 struct clk_dummy_context *ctx = test->priv; 1479 struct clk_hw *hw = &ctx->hw; 1480 struct clk *clk = clk_hw_get_clk(hw, NULL); 1481 1482 KUNIT_EXPECT_LT(test, 1483 clk_set_rate_range(clk, 1484 DUMMY_CLOCK_RATE_1 + 1000, 1485 DUMMY_CLOCK_RATE_1), 1486 0); 1487 1488 clk_put(clk); 1489 } 1490 1491 /* 1492 * Test that users can't set multiple, disjoints, range that would be 1493 * impossible to meet. 1494 */ 1495 static void clk_range_test_multiple_disjoints_range(struct kunit *test) 1496 { 1497 struct clk_dummy_context *ctx = test->priv; 1498 struct clk_hw *hw = &ctx->hw; 1499 struct clk *user1, *user2; 1500 1501 user1 = clk_hw_get_clk(hw, NULL); 1502 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1); 1503 1504 user2 = clk_hw_get_clk(hw, NULL); 1505 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2); 1506 1507 KUNIT_ASSERT_EQ(test, 1508 clk_set_rate_range(user1, 1000, 2000), 1509 0); 1510 1511 KUNIT_EXPECT_LT(test, 1512 clk_set_rate_range(user2, 3000, 4000), 1513 0); 1514 1515 clk_put(user2); 1516 clk_put(user1); 1517 } 1518 1519 /* 1520 * Test that if our clock has some boundaries and we try to round a rate 1521 * lower than the minimum, the returned rate will be within range. 1522 */ 1523 static void clk_range_test_set_range_round_rate_lower(struct kunit *test) 1524 { 1525 struct clk_dummy_context *ctx = test->priv; 1526 struct clk_hw *hw = &ctx->hw; 1527 struct clk *clk = clk_hw_get_clk(hw, NULL); 1528 long rate; 1529 1530 KUNIT_ASSERT_EQ(test, 1531 clk_set_rate_range(clk, 1532 DUMMY_CLOCK_RATE_1, 1533 DUMMY_CLOCK_RATE_2), 1534 0); 1535 1536 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_1 - 1000); 1537 KUNIT_ASSERT_GT(test, rate, 0); 1538 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 1539 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 1540 1541 clk_put(clk); 1542 } 1543 1544 /* 1545 * Test that if our clock has some boundaries and we try to set a rate 1546 * higher than the maximum, the new rate will be within range. 1547 */ 1548 static void clk_range_test_set_range_set_rate_lower(struct kunit *test) 1549 { 1550 struct clk_dummy_context *ctx = test->priv; 1551 struct clk_hw *hw = &ctx->hw; 1552 struct clk *clk = clk_hw_get_clk(hw, NULL); 1553 unsigned long rate; 1554 1555 KUNIT_ASSERT_EQ(test, 1556 clk_set_rate_range(clk, 1557 DUMMY_CLOCK_RATE_1, 1558 DUMMY_CLOCK_RATE_2), 1559 0); 1560 1561 KUNIT_ASSERT_EQ(test, 1562 clk_set_rate(clk, DUMMY_CLOCK_RATE_1 - 1000), 1563 0); 1564 1565 rate = clk_get_rate(clk); 1566 KUNIT_ASSERT_GT(test, rate, 0); 1567 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 1568 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 1569 1570 clk_put(clk); 1571 } 1572 1573 /* 1574 * Test that if our clock has some boundaries and we try to round and 1575 * set a rate lower than the minimum, the rate returned by 1576 * clk_round_rate() will be consistent with the new rate set by 1577 * clk_set_rate(). 1578 */ 1579 static void clk_range_test_set_range_set_round_rate_consistent_lower(struct kunit *test) 1580 { 1581 struct clk_dummy_context *ctx = test->priv; 1582 struct clk_hw *hw = &ctx->hw; 1583 struct clk *clk = clk_hw_get_clk(hw, NULL); 1584 long rounded; 1585 1586 KUNIT_ASSERT_EQ(test, 1587 clk_set_rate_range(clk, 1588 DUMMY_CLOCK_RATE_1, 1589 DUMMY_CLOCK_RATE_2), 1590 0); 1591 1592 rounded = clk_round_rate(clk, DUMMY_CLOCK_RATE_1 - 1000); 1593 KUNIT_ASSERT_GT(test, rounded, 0); 1594 1595 KUNIT_ASSERT_EQ(test, 1596 clk_set_rate(clk, DUMMY_CLOCK_RATE_1 - 1000), 1597 0); 1598 1599 KUNIT_EXPECT_EQ(test, rounded, clk_get_rate(clk)); 1600 1601 clk_put(clk); 1602 } 1603 1604 /* 1605 * Test that if our clock has some boundaries and we try to round a rate 1606 * higher than the maximum, the returned rate will be within range. 1607 */ 1608 static void clk_range_test_set_range_round_rate_higher(struct kunit *test) 1609 { 1610 struct clk_dummy_context *ctx = test->priv; 1611 struct clk_hw *hw = &ctx->hw; 1612 struct clk *clk = clk_hw_get_clk(hw, NULL); 1613 long rate; 1614 1615 KUNIT_ASSERT_EQ(test, 1616 clk_set_rate_range(clk, 1617 DUMMY_CLOCK_RATE_1, 1618 DUMMY_CLOCK_RATE_2), 1619 0); 1620 1621 rate = clk_round_rate(clk, DUMMY_CLOCK_RATE_2 + 1000); 1622 KUNIT_ASSERT_GT(test, rate, 0); 1623 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 1624 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 1625 1626 clk_put(clk); 1627 } 1628 1629 /* 1630 * Test that if our clock has some boundaries and we try to set a rate 1631 * higher than the maximum, the new rate will be within range. 1632 */ 1633 static void clk_range_test_set_range_set_rate_higher(struct kunit *test) 1634 { 1635 struct clk_dummy_context *ctx = test->priv; 1636 struct clk_hw *hw = &ctx->hw; 1637 struct clk *clk = clk_hw_get_clk(hw, NULL); 1638 unsigned long rate; 1639 1640 KUNIT_ASSERT_EQ(test, 1641 clk_set_rate_range(clk, 1642 DUMMY_CLOCK_RATE_1, 1643 DUMMY_CLOCK_RATE_2), 1644 0); 1645 1646 KUNIT_ASSERT_EQ(test, 1647 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 1648 0); 1649 1650 rate = clk_get_rate(clk); 1651 KUNIT_ASSERT_GT(test, rate, 0); 1652 KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1); 1653 KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2); 1654 1655 clk_put(clk); 1656 } 1657 1658 /* 1659 * Test that if our clock has some boundaries and we try to round and 1660 * set a rate higher than the maximum, the rate returned by 1661 * clk_round_rate() will be consistent with the new rate set by 1662 * clk_set_rate(). 1663 */ 1664 static void clk_range_test_set_range_set_round_rate_consistent_higher(struct kunit *test) 1665 { 1666 struct clk_dummy_context *ctx = test->priv; 1667 struct clk_hw *hw = &ctx->hw; 1668 struct clk *clk = clk_hw_get_clk(hw, NULL); 1669 long rounded; 1670 1671 KUNIT_ASSERT_EQ(test, 1672 clk_set_rate_range(clk, 1673 DUMMY_CLOCK_RATE_1, 1674 DUMMY_CLOCK_RATE_2), 1675 0); 1676 1677 rounded = clk_round_rate(clk, DUMMY_CLOCK_RATE_2 + 1000); 1678 KUNIT_ASSERT_GT(test, rounded, 0); 1679 1680 KUNIT_ASSERT_EQ(test, 1681 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 1682 0); 1683 1684 KUNIT_EXPECT_EQ(test, rounded, clk_get_rate(clk)); 1685 1686 clk_put(clk); 1687 } 1688 1689 /* 1690 * Test that if our clock has a rate lower than the minimum set by a 1691 * call to clk_set_rate_range(), the rate will be raised to match the 1692 * new minimum. 1693 * 1694 * This assumes that clk_ops.determine_rate won't modify the requested rate, 1695 * which is our case in clk_dummy_rate_ops. 1696 */ 1697 static void clk_range_test_set_range_get_rate_raised(struct kunit *test) 1698 { 1699 struct clk_dummy_context *ctx = test->priv; 1700 struct clk_hw *hw = &ctx->hw; 1701 struct clk *clk = clk_hw_get_clk(hw, NULL); 1702 unsigned long rate; 1703 1704 KUNIT_ASSERT_EQ(test, 1705 clk_set_rate(clk, DUMMY_CLOCK_RATE_1 - 1000), 1706 0); 1707 1708 KUNIT_ASSERT_EQ(test, 1709 clk_set_rate_range(clk, 1710 DUMMY_CLOCK_RATE_1, 1711 DUMMY_CLOCK_RATE_2), 1712 0); 1713 1714 rate = clk_get_rate(clk); 1715 KUNIT_ASSERT_GT(test, rate, 0); 1716 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 1717 1718 clk_put(clk); 1719 } 1720 1721 /* 1722 * Test that if our clock has a rate higher than the maximum set by a 1723 * call to clk_set_rate_range(), the rate will be lowered to match the 1724 * new maximum. 1725 * 1726 * This assumes that clk_ops.determine_rate won't modify the requested rate, 1727 * which is our case in clk_dummy_rate_ops. 1728 */ 1729 static void clk_range_test_set_range_get_rate_lowered(struct kunit *test) 1730 { 1731 struct clk_dummy_context *ctx = test->priv; 1732 struct clk_hw *hw = &ctx->hw; 1733 struct clk *clk = clk_hw_get_clk(hw, NULL); 1734 unsigned long rate; 1735 1736 KUNIT_ASSERT_EQ(test, 1737 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 1738 0); 1739 1740 KUNIT_ASSERT_EQ(test, 1741 clk_set_rate_range(clk, 1742 DUMMY_CLOCK_RATE_1, 1743 DUMMY_CLOCK_RATE_2), 1744 0); 1745 1746 rate = clk_get_rate(clk); 1747 KUNIT_ASSERT_GT(test, rate, 0); 1748 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 1749 1750 clk_put(clk); 1751 } 1752 1753 static struct kunit_case clk_range_test_cases[] = { 1754 KUNIT_CASE(clk_range_test_set_range), 1755 KUNIT_CASE(clk_range_test_set_range_invalid), 1756 KUNIT_CASE(clk_range_test_multiple_disjoints_range), 1757 KUNIT_CASE(clk_range_test_set_range_round_rate_lower), 1758 KUNIT_CASE(clk_range_test_set_range_set_rate_lower), 1759 KUNIT_CASE(clk_range_test_set_range_set_round_rate_consistent_lower), 1760 KUNIT_CASE(clk_range_test_set_range_round_rate_higher), 1761 KUNIT_CASE(clk_range_test_set_range_set_rate_higher), 1762 KUNIT_CASE(clk_range_test_set_range_set_round_rate_consistent_higher), 1763 KUNIT_CASE(clk_range_test_set_range_get_rate_raised), 1764 KUNIT_CASE(clk_range_test_set_range_get_rate_lowered), 1765 {} 1766 }; 1767 1768 /* 1769 * Test suite for a basic rate clock, without any parent. 1770 * 1771 * These tests exercise the rate range API: clk_set_rate_range(), 1772 * clk_set_min_rate(), clk_set_max_rate(), clk_drop_range(). 1773 */ 1774 static struct kunit_suite clk_range_test_suite = { 1775 .name = "clk-range-test", 1776 .init = clk_test_init, 1777 .exit = clk_test_exit, 1778 .test_cases = clk_range_test_cases, 1779 }; 1780 1781 /* 1782 * Test that if we have several subsequent calls to 1783 * clk_set_rate_range(), the core will reevaluate whether a new rate is 1784 * needed each and every time. 1785 * 1786 * With clk_dummy_maximize_rate_ops, this means that the rate will 1787 * trail along the maximum as it evolves. 1788 */ 1789 static void clk_range_test_set_range_rate_maximized(struct kunit *test) 1790 { 1791 struct clk_dummy_context *ctx = test->priv; 1792 struct clk_hw *hw = &ctx->hw; 1793 struct clk *clk = clk_hw_get_clk(hw, NULL); 1794 unsigned long rate; 1795 1796 KUNIT_ASSERT_EQ(test, 1797 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 1798 0); 1799 1800 KUNIT_ASSERT_EQ(test, 1801 clk_set_rate_range(clk, 1802 DUMMY_CLOCK_RATE_1, 1803 DUMMY_CLOCK_RATE_2), 1804 0); 1805 1806 rate = clk_get_rate(clk); 1807 KUNIT_ASSERT_GT(test, rate, 0); 1808 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 1809 1810 KUNIT_ASSERT_EQ(test, 1811 clk_set_rate_range(clk, 1812 DUMMY_CLOCK_RATE_1, 1813 DUMMY_CLOCK_RATE_2 - 1000), 1814 0); 1815 1816 rate = clk_get_rate(clk); 1817 KUNIT_ASSERT_GT(test, rate, 0); 1818 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2 - 1000); 1819 1820 KUNIT_ASSERT_EQ(test, 1821 clk_set_rate_range(clk, 1822 DUMMY_CLOCK_RATE_1, 1823 DUMMY_CLOCK_RATE_2), 1824 0); 1825 1826 rate = clk_get_rate(clk); 1827 KUNIT_ASSERT_GT(test, rate, 0); 1828 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 1829 1830 clk_put(clk); 1831 } 1832 1833 /* 1834 * Test that if we have several subsequent calls to 1835 * clk_set_rate_range(), across multiple users, the core will reevaluate 1836 * whether a new rate is needed each and every time. 1837 * 1838 * With clk_dummy_maximize_rate_ops, this means that the rate will 1839 * trail along the maximum as it evolves. 1840 */ 1841 static void clk_range_test_multiple_set_range_rate_maximized(struct kunit *test) 1842 { 1843 struct clk_dummy_context *ctx = test->priv; 1844 struct clk_hw *hw = &ctx->hw; 1845 struct clk *clk = clk_hw_get_clk(hw, NULL); 1846 struct clk *user1, *user2; 1847 unsigned long rate; 1848 1849 user1 = clk_hw_get_clk(hw, NULL); 1850 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1); 1851 1852 user2 = clk_hw_get_clk(hw, NULL); 1853 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2); 1854 1855 KUNIT_ASSERT_EQ(test, 1856 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 1857 0); 1858 1859 KUNIT_ASSERT_EQ(test, 1860 clk_set_rate_range(user1, 1861 0, 1862 DUMMY_CLOCK_RATE_2), 1863 0); 1864 1865 rate = clk_get_rate(clk); 1866 KUNIT_ASSERT_GT(test, rate, 0); 1867 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 1868 1869 KUNIT_ASSERT_EQ(test, 1870 clk_set_rate_range(user2, 1871 0, 1872 DUMMY_CLOCK_RATE_1), 1873 0); 1874 1875 rate = clk_get_rate(clk); 1876 KUNIT_ASSERT_GT(test, rate, 0); 1877 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 1878 1879 KUNIT_ASSERT_EQ(test, 1880 clk_drop_range(user2), 1881 0); 1882 1883 rate = clk_get_rate(clk); 1884 KUNIT_ASSERT_GT(test, rate, 0); 1885 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 1886 1887 clk_put(user2); 1888 clk_put(user1); 1889 clk_put(clk); 1890 } 1891 1892 /* 1893 * Test that if we have several subsequent calls to 1894 * clk_set_rate_range(), across multiple users, the core will reevaluate 1895 * whether a new rate is needed, including when a user drop its clock. 1896 * 1897 * With clk_dummy_maximize_rate_ops, this means that the rate will 1898 * trail along the maximum as it evolves. 1899 */ 1900 static void clk_range_test_multiple_set_range_rate_put_maximized(struct kunit *test) 1901 { 1902 struct clk_dummy_context *ctx = test->priv; 1903 struct clk_hw *hw = &ctx->hw; 1904 struct clk *clk = clk_hw_get_clk(hw, NULL); 1905 struct clk *user1, *user2; 1906 unsigned long rate; 1907 1908 user1 = clk_hw_get_clk(hw, NULL); 1909 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1); 1910 1911 user2 = clk_hw_get_clk(hw, NULL); 1912 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2); 1913 1914 KUNIT_ASSERT_EQ(test, 1915 clk_set_rate(clk, DUMMY_CLOCK_RATE_2 + 1000), 1916 0); 1917 1918 KUNIT_ASSERT_EQ(test, 1919 clk_set_rate_range(user1, 1920 0, 1921 DUMMY_CLOCK_RATE_2), 1922 0); 1923 1924 rate = clk_get_rate(clk); 1925 KUNIT_ASSERT_GT(test, rate, 0); 1926 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 1927 1928 KUNIT_ASSERT_EQ(test, 1929 clk_set_rate_range(user2, 1930 0, 1931 DUMMY_CLOCK_RATE_1), 1932 0); 1933 1934 rate = clk_get_rate(clk); 1935 KUNIT_ASSERT_GT(test, rate, 0); 1936 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 1937 1938 clk_put(user2); 1939 1940 rate = clk_get_rate(clk); 1941 KUNIT_ASSERT_GT(test, rate, 0); 1942 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 1943 1944 clk_put(user1); 1945 clk_put(clk); 1946 } 1947 1948 static struct kunit_case clk_range_maximize_test_cases[] = { 1949 KUNIT_CASE(clk_range_test_set_range_rate_maximized), 1950 KUNIT_CASE(clk_range_test_multiple_set_range_rate_maximized), 1951 KUNIT_CASE(clk_range_test_multiple_set_range_rate_put_maximized), 1952 {} 1953 }; 1954 1955 /* 1956 * Test suite for a basic rate clock, without any parent. 1957 * 1958 * These tests exercise the rate range API: clk_set_rate_range(), 1959 * clk_set_min_rate(), clk_set_max_rate(), clk_drop_range(), with a 1960 * driver that will always try to run at the highest possible rate. 1961 */ 1962 static struct kunit_suite clk_range_maximize_test_suite = { 1963 .name = "clk-range-maximize-test", 1964 .init = clk_maximize_test_init, 1965 .exit = clk_test_exit, 1966 .test_cases = clk_range_maximize_test_cases, 1967 }; 1968 1969 /* 1970 * Test that if we have several subsequent calls to 1971 * clk_set_rate_range(), the core will reevaluate whether a new rate is 1972 * needed each and every time. 1973 * 1974 * With clk_dummy_minimize_rate_ops, this means that the rate will 1975 * trail along the minimum as it evolves. 1976 */ 1977 static void clk_range_test_set_range_rate_minimized(struct kunit *test) 1978 { 1979 struct clk_dummy_context *ctx = test->priv; 1980 struct clk_hw *hw = &ctx->hw; 1981 struct clk *clk = clk_hw_get_clk(hw, NULL); 1982 unsigned long rate; 1983 1984 KUNIT_ASSERT_EQ(test, 1985 clk_set_rate(clk, DUMMY_CLOCK_RATE_1 - 1000), 1986 0); 1987 1988 KUNIT_ASSERT_EQ(test, 1989 clk_set_rate_range(clk, 1990 DUMMY_CLOCK_RATE_1, 1991 DUMMY_CLOCK_RATE_2), 1992 0); 1993 1994 rate = clk_get_rate(clk); 1995 KUNIT_ASSERT_GT(test, rate, 0); 1996 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 1997 1998 KUNIT_ASSERT_EQ(test, 1999 clk_set_rate_range(clk, 2000 DUMMY_CLOCK_RATE_1 + 1000, 2001 DUMMY_CLOCK_RATE_2), 2002 0); 2003 2004 rate = clk_get_rate(clk); 2005 KUNIT_ASSERT_GT(test, rate, 0); 2006 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1 + 1000); 2007 2008 KUNIT_ASSERT_EQ(test, 2009 clk_set_rate_range(clk, 2010 DUMMY_CLOCK_RATE_1, 2011 DUMMY_CLOCK_RATE_2), 2012 0); 2013 2014 rate = clk_get_rate(clk); 2015 KUNIT_ASSERT_GT(test, rate, 0); 2016 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 2017 2018 clk_put(clk); 2019 } 2020 2021 /* 2022 * Test that if we have several subsequent calls to 2023 * clk_set_rate_range(), across multiple users, the core will reevaluate 2024 * whether a new rate is needed each and every time. 2025 * 2026 * With clk_dummy_minimize_rate_ops, this means that the rate will 2027 * trail along the minimum as it evolves. 2028 */ 2029 static void clk_range_test_multiple_set_range_rate_minimized(struct kunit *test) 2030 { 2031 struct clk_dummy_context *ctx = test->priv; 2032 struct clk_hw *hw = &ctx->hw; 2033 struct clk *clk = clk_hw_get_clk(hw, NULL); 2034 struct clk *user1, *user2; 2035 unsigned long rate; 2036 2037 user1 = clk_hw_get_clk(hw, NULL); 2038 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1); 2039 2040 user2 = clk_hw_get_clk(hw, NULL); 2041 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2); 2042 2043 KUNIT_ASSERT_EQ(test, 2044 clk_set_rate_range(user1, 2045 DUMMY_CLOCK_RATE_1, 2046 ULONG_MAX), 2047 0); 2048 2049 rate = clk_get_rate(clk); 2050 KUNIT_ASSERT_GT(test, rate, 0); 2051 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 2052 2053 KUNIT_ASSERT_EQ(test, 2054 clk_set_rate_range(user2, 2055 DUMMY_CLOCK_RATE_2, 2056 ULONG_MAX), 2057 0); 2058 2059 rate = clk_get_rate(clk); 2060 KUNIT_ASSERT_GT(test, rate, 0); 2061 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 2062 2063 KUNIT_ASSERT_EQ(test, 2064 clk_drop_range(user2), 2065 0); 2066 2067 rate = clk_get_rate(clk); 2068 KUNIT_ASSERT_GT(test, rate, 0); 2069 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 2070 2071 clk_put(user2); 2072 clk_put(user1); 2073 clk_put(clk); 2074 } 2075 2076 /* 2077 * Test that if we have several subsequent calls to 2078 * clk_set_rate_range(), across multiple users, the core will reevaluate 2079 * whether a new rate is needed, including when a user drop its clock. 2080 * 2081 * With clk_dummy_minimize_rate_ops, this means that the rate will 2082 * trail along the minimum as it evolves. 2083 */ 2084 static void clk_range_test_multiple_set_range_rate_put_minimized(struct kunit *test) 2085 { 2086 struct clk_dummy_context *ctx = test->priv; 2087 struct clk_hw *hw = &ctx->hw; 2088 struct clk *clk = clk_hw_get_clk(hw, NULL); 2089 struct clk *user1, *user2; 2090 unsigned long rate; 2091 2092 user1 = clk_hw_get_clk(hw, NULL); 2093 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user1); 2094 2095 user2 = clk_hw_get_clk(hw, NULL); 2096 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, user2); 2097 2098 KUNIT_ASSERT_EQ(test, 2099 clk_set_rate_range(user1, 2100 DUMMY_CLOCK_RATE_1, 2101 ULONG_MAX), 2102 0); 2103 2104 rate = clk_get_rate(clk); 2105 KUNIT_ASSERT_GT(test, rate, 0); 2106 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 2107 2108 KUNIT_ASSERT_EQ(test, 2109 clk_set_rate_range(user2, 2110 DUMMY_CLOCK_RATE_2, 2111 ULONG_MAX), 2112 0); 2113 2114 rate = clk_get_rate(clk); 2115 KUNIT_ASSERT_GT(test, rate, 0); 2116 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_2); 2117 2118 clk_put(user2); 2119 2120 rate = clk_get_rate(clk); 2121 KUNIT_ASSERT_GT(test, rate, 0); 2122 KUNIT_EXPECT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 2123 2124 clk_put(user1); 2125 clk_put(clk); 2126 } 2127 2128 static struct kunit_case clk_range_minimize_test_cases[] = { 2129 KUNIT_CASE(clk_range_test_set_range_rate_minimized), 2130 KUNIT_CASE(clk_range_test_multiple_set_range_rate_minimized), 2131 KUNIT_CASE(clk_range_test_multiple_set_range_rate_put_minimized), 2132 {} 2133 }; 2134 2135 /* 2136 * Test suite for a basic rate clock, without any parent. 2137 * 2138 * These tests exercise the rate range API: clk_set_rate_range(), 2139 * clk_set_min_rate(), clk_set_max_rate(), clk_drop_range(), with a 2140 * driver that will always try to run at the lowest possible rate. 2141 */ 2142 static struct kunit_suite clk_range_minimize_test_suite = { 2143 .name = "clk-range-minimize-test", 2144 .init = clk_minimize_test_init, 2145 .exit = clk_test_exit, 2146 .test_cases = clk_range_minimize_test_cases, 2147 }; 2148 2149 struct clk_leaf_mux_ctx { 2150 struct clk_multiple_parent_ctx mux_ctx; 2151 struct clk_hw hw; 2152 struct clk_hw parent; 2153 struct clk_rate_request *req; 2154 int (*determine_rate_func)(struct clk_hw *hw, struct clk_rate_request *req); 2155 }; 2156 2157 static int clk_leaf_mux_determine_rate(struct clk_hw *hw, struct clk_rate_request *req) 2158 { 2159 struct clk_leaf_mux_ctx *ctx = container_of(hw, struct clk_leaf_mux_ctx, hw); 2160 int ret; 2161 struct clk_rate_request *parent_req = ctx->req; 2162 2163 clk_hw_forward_rate_request(hw, req, req->best_parent_hw, parent_req, req->rate); 2164 ret = ctx->determine_rate_func(req->best_parent_hw, parent_req); 2165 if (ret) 2166 return ret; 2167 2168 req->rate = parent_req->rate; 2169 2170 return 0; 2171 } 2172 2173 static const struct clk_ops clk_leaf_mux_set_rate_parent_ops = { 2174 .determine_rate = clk_leaf_mux_determine_rate, 2175 .set_parent = clk_dummy_single_set_parent, 2176 .get_parent = clk_dummy_single_get_parent, 2177 }; 2178 2179 static int 2180 clk_leaf_mux_set_rate_parent_test_init(struct kunit *test) 2181 { 2182 struct clk_leaf_mux_ctx *ctx; 2183 const char *top_parents[2] = { "parent-0", "parent-1" }; 2184 int ret; 2185 2186 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 2187 if (!ctx) 2188 return -ENOMEM; 2189 test->priv = ctx; 2190 2191 ctx->mux_ctx.parents_ctx[0].hw.init = CLK_HW_INIT_NO_PARENT("parent-0", 2192 &clk_dummy_rate_ops, 2193 0); 2194 ctx->mux_ctx.parents_ctx[0].rate = DUMMY_CLOCK_RATE_1; 2195 ret = clk_hw_register(NULL, &ctx->mux_ctx.parents_ctx[0].hw); 2196 if (ret) 2197 return ret; 2198 2199 ctx->mux_ctx.parents_ctx[1].hw.init = CLK_HW_INIT_NO_PARENT("parent-1", 2200 &clk_dummy_rate_ops, 2201 0); 2202 ctx->mux_ctx.parents_ctx[1].rate = DUMMY_CLOCK_RATE_2; 2203 ret = clk_hw_register(NULL, &ctx->mux_ctx.parents_ctx[1].hw); 2204 if (ret) 2205 return ret; 2206 2207 ctx->mux_ctx.current_parent = 0; 2208 ctx->mux_ctx.hw.init = CLK_HW_INIT_PARENTS("test-mux", top_parents, 2209 &clk_multiple_parents_mux_ops, 2210 0); 2211 ret = clk_hw_register(NULL, &ctx->mux_ctx.hw); 2212 if (ret) 2213 return ret; 2214 2215 ctx->parent.init = CLK_HW_INIT_HW("test-parent", &ctx->mux_ctx.hw, 2216 &empty_clk_ops, CLK_SET_RATE_PARENT); 2217 ret = clk_hw_register(NULL, &ctx->parent); 2218 if (ret) 2219 return ret; 2220 2221 ctx->hw.init = CLK_HW_INIT_HW("test-clock", &ctx->parent, 2222 &clk_leaf_mux_set_rate_parent_ops, 2223 CLK_SET_RATE_PARENT); 2224 ret = clk_hw_register(NULL, &ctx->hw); 2225 if (ret) 2226 return ret; 2227 2228 return 0; 2229 } 2230 2231 static void clk_leaf_mux_set_rate_parent_test_exit(struct kunit *test) 2232 { 2233 struct clk_leaf_mux_ctx *ctx = test->priv; 2234 2235 clk_hw_unregister(&ctx->hw); 2236 clk_hw_unregister(&ctx->parent); 2237 clk_hw_unregister(&ctx->mux_ctx.hw); 2238 clk_hw_unregister(&ctx->mux_ctx.parents_ctx[0].hw); 2239 clk_hw_unregister(&ctx->mux_ctx.parents_ctx[1].hw); 2240 } 2241 2242 struct clk_leaf_mux_set_rate_parent_determine_rate_test_case { 2243 const char *desc; 2244 int (*determine_rate_func)(struct clk_hw *hw, struct clk_rate_request *req); 2245 }; 2246 2247 static void 2248 clk_leaf_mux_set_rate_parent_determine_rate_test_case_to_desc( 2249 const struct clk_leaf_mux_set_rate_parent_determine_rate_test_case *t, char *desc) 2250 { 2251 strscpy(desc, t->desc, KUNIT_PARAM_DESC_SIZE); 2252 } 2253 2254 static const struct clk_leaf_mux_set_rate_parent_determine_rate_test_case 2255 clk_leaf_mux_set_rate_parent_determine_rate_test_cases[] = { 2256 { 2257 /* 2258 * Test that __clk_determine_rate() on the parent that can't 2259 * change rate doesn't return a clk_rate_request structure with 2260 * the best_parent_hw pointer pointing to the parent. 2261 */ 2262 .desc = "clk_leaf_mux_set_rate_parent__clk_determine_rate_proper_parent", 2263 .determine_rate_func = __clk_determine_rate, 2264 }, 2265 { 2266 /* 2267 * Test that __clk_mux_determine_rate() on the parent that 2268 * can't change rate doesn't return a clk_rate_request 2269 * structure with the best_parent_hw pointer pointing to 2270 * the parent. 2271 */ 2272 .desc = "clk_leaf_mux_set_rate_parent__clk_mux_determine_rate_proper_parent", 2273 .determine_rate_func = __clk_mux_determine_rate, 2274 }, 2275 { 2276 /* 2277 * Test that __clk_mux_determine_rate_closest() on the parent 2278 * that can't change rate doesn't return a clk_rate_request 2279 * structure with the best_parent_hw pointer pointing to 2280 * the parent. 2281 */ 2282 .desc = "clk_leaf_mux_set_rate_parent__clk_mux_determine_rate_closest_proper_parent", 2283 .determine_rate_func = __clk_mux_determine_rate_closest, 2284 }, 2285 { 2286 /* 2287 * Test that clk_hw_determine_rate_no_reparent() on the parent 2288 * that can't change rate doesn't return a clk_rate_request 2289 * structure with the best_parent_hw pointer pointing to 2290 * the parent. 2291 */ 2292 .desc = "clk_leaf_mux_set_rate_parent_clk_hw_determine_rate_no_reparent_proper_parent", 2293 .determine_rate_func = clk_hw_determine_rate_no_reparent, 2294 }, 2295 }; 2296 2297 KUNIT_ARRAY_PARAM(clk_leaf_mux_set_rate_parent_determine_rate_test, 2298 clk_leaf_mux_set_rate_parent_determine_rate_test_cases, 2299 clk_leaf_mux_set_rate_parent_determine_rate_test_case_to_desc) 2300 2301 /* 2302 * Test that when a clk that can't change rate itself calls a function like 2303 * __clk_determine_rate() on its parent it doesn't get back a clk_rate_request 2304 * structure that has the best_parent_hw pointer point to the clk_hw passed 2305 * into the determine rate function. See commit 262ca38f4b6e ("clk: Stop 2306 * forwarding clk_rate_requests to the parent") for more background. 2307 */ 2308 static void clk_leaf_mux_set_rate_parent_determine_rate_test(struct kunit *test) 2309 { 2310 struct clk_leaf_mux_ctx *ctx = test->priv; 2311 struct clk_hw *hw = &ctx->hw; 2312 struct clk *clk = clk_hw_get_clk(hw, NULL); 2313 struct clk_rate_request req; 2314 unsigned long rate; 2315 const struct clk_leaf_mux_set_rate_parent_determine_rate_test_case *test_param; 2316 2317 test_param = test->param_value; 2318 ctx->determine_rate_func = test_param->determine_rate_func; 2319 2320 ctx->req = &req; 2321 rate = clk_get_rate(clk); 2322 KUNIT_ASSERT_EQ(test, rate, DUMMY_CLOCK_RATE_1); 2323 KUNIT_ASSERT_EQ(test, DUMMY_CLOCK_RATE_2, clk_round_rate(clk, DUMMY_CLOCK_RATE_2)); 2324 2325 KUNIT_EXPECT_EQ(test, req.rate, DUMMY_CLOCK_RATE_2); 2326 KUNIT_EXPECT_EQ(test, req.best_parent_rate, DUMMY_CLOCK_RATE_2); 2327 KUNIT_EXPECT_PTR_EQ(test, req.best_parent_hw, &ctx->mux_ctx.hw); 2328 2329 clk_put(clk); 2330 } 2331 2332 static struct kunit_case clk_leaf_mux_set_rate_parent_test_cases[] = { 2333 KUNIT_CASE_PARAM(clk_leaf_mux_set_rate_parent_determine_rate_test, 2334 clk_leaf_mux_set_rate_parent_determine_rate_test_gen_params), 2335 {} 2336 }; 2337 2338 /* 2339 * Test suite for a clock whose parent is a pass-through clk whose parent is a 2340 * mux with multiple parents. The leaf and pass-through clocks have the 2341 * CLK_SET_RATE_PARENT flag, and will forward rate requests to the mux, which 2342 * will then select which parent is the best fit for a given rate. 2343 * 2344 * These tests exercise the behaviour of muxes, and the proper selection 2345 * of parents. 2346 */ 2347 static struct kunit_suite clk_leaf_mux_set_rate_parent_test_suite = { 2348 .name = "clk-leaf-mux-set-rate-parent", 2349 .init = clk_leaf_mux_set_rate_parent_test_init, 2350 .exit = clk_leaf_mux_set_rate_parent_test_exit, 2351 .test_cases = clk_leaf_mux_set_rate_parent_test_cases, 2352 }; 2353 2354 struct clk_mux_notifier_rate_change { 2355 bool done; 2356 unsigned long old_rate; 2357 unsigned long new_rate; 2358 wait_queue_head_t wq; 2359 }; 2360 2361 struct clk_mux_notifier_ctx { 2362 struct clk_multiple_parent_ctx mux_ctx; 2363 struct clk *clk; 2364 struct notifier_block clk_nb; 2365 struct clk_mux_notifier_rate_change pre_rate_change; 2366 struct clk_mux_notifier_rate_change post_rate_change; 2367 }; 2368 2369 #define NOTIFIER_TIMEOUT_MS 100 2370 2371 static int clk_mux_notifier_callback(struct notifier_block *nb, 2372 unsigned long action, void *data) 2373 { 2374 struct clk_notifier_data *clk_data = data; 2375 struct clk_mux_notifier_ctx *ctx = container_of(nb, 2376 struct clk_mux_notifier_ctx, 2377 clk_nb); 2378 2379 if (action & PRE_RATE_CHANGE) { 2380 ctx->pre_rate_change.old_rate = clk_data->old_rate; 2381 ctx->pre_rate_change.new_rate = clk_data->new_rate; 2382 ctx->pre_rate_change.done = true; 2383 wake_up_interruptible(&ctx->pre_rate_change.wq); 2384 } 2385 2386 if (action & POST_RATE_CHANGE) { 2387 ctx->post_rate_change.old_rate = clk_data->old_rate; 2388 ctx->post_rate_change.new_rate = clk_data->new_rate; 2389 ctx->post_rate_change.done = true; 2390 wake_up_interruptible(&ctx->post_rate_change.wq); 2391 } 2392 2393 return 0; 2394 } 2395 2396 static int clk_mux_notifier_test_init(struct kunit *test) 2397 { 2398 struct clk_mux_notifier_ctx *ctx; 2399 const char *top_parents[2] = { "parent-0", "parent-1" }; 2400 int ret; 2401 2402 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 2403 if (!ctx) 2404 return -ENOMEM; 2405 test->priv = ctx; 2406 ctx->clk_nb.notifier_call = clk_mux_notifier_callback; 2407 init_waitqueue_head(&ctx->pre_rate_change.wq); 2408 init_waitqueue_head(&ctx->post_rate_change.wq); 2409 2410 ctx->mux_ctx.parents_ctx[0].hw.init = CLK_HW_INIT_NO_PARENT("parent-0", 2411 &clk_dummy_rate_ops, 2412 0); 2413 ctx->mux_ctx.parents_ctx[0].rate = DUMMY_CLOCK_RATE_1; 2414 ret = clk_hw_register(NULL, &ctx->mux_ctx.parents_ctx[0].hw); 2415 if (ret) 2416 return ret; 2417 2418 ctx->mux_ctx.parents_ctx[1].hw.init = CLK_HW_INIT_NO_PARENT("parent-1", 2419 &clk_dummy_rate_ops, 2420 0); 2421 ctx->mux_ctx.parents_ctx[1].rate = DUMMY_CLOCK_RATE_2; 2422 ret = clk_hw_register(NULL, &ctx->mux_ctx.parents_ctx[1].hw); 2423 if (ret) 2424 return ret; 2425 2426 ctx->mux_ctx.current_parent = 0; 2427 ctx->mux_ctx.hw.init = CLK_HW_INIT_PARENTS("test-mux", top_parents, 2428 &clk_multiple_parents_mux_ops, 2429 0); 2430 ret = clk_hw_register(NULL, &ctx->mux_ctx.hw); 2431 if (ret) 2432 return ret; 2433 2434 ctx->clk = clk_hw_get_clk(&ctx->mux_ctx.hw, NULL); 2435 ret = clk_notifier_register(ctx->clk, &ctx->clk_nb); 2436 if (ret) 2437 return ret; 2438 2439 return 0; 2440 } 2441 2442 static void clk_mux_notifier_test_exit(struct kunit *test) 2443 { 2444 struct clk_mux_notifier_ctx *ctx = test->priv; 2445 struct clk *clk = ctx->clk; 2446 2447 clk_notifier_unregister(clk, &ctx->clk_nb); 2448 clk_put(clk); 2449 2450 clk_hw_unregister(&ctx->mux_ctx.hw); 2451 clk_hw_unregister(&ctx->mux_ctx.parents_ctx[0].hw); 2452 clk_hw_unregister(&ctx->mux_ctx.parents_ctx[1].hw); 2453 } 2454 2455 /* 2456 * Test that if the we have a notifier registered on a mux, the core 2457 * will notify us when we switch to another parent, and with the proper 2458 * old and new rates. 2459 */ 2460 static void clk_mux_notifier_set_parent_test(struct kunit *test) 2461 { 2462 struct clk_mux_notifier_ctx *ctx = test->priv; 2463 struct clk_hw *hw = &ctx->mux_ctx.hw; 2464 struct clk *clk = clk_hw_get_clk(hw, NULL); 2465 struct clk *new_parent = clk_hw_get_clk(&ctx->mux_ctx.parents_ctx[1].hw, NULL); 2466 int ret; 2467 2468 ret = clk_set_parent(clk, new_parent); 2469 KUNIT_ASSERT_EQ(test, ret, 0); 2470 2471 ret = wait_event_interruptible_timeout(ctx->pre_rate_change.wq, 2472 ctx->pre_rate_change.done, 2473 msecs_to_jiffies(NOTIFIER_TIMEOUT_MS)); 2474 KUNIT_ASSERT_GT(test, ret, 0); 2475 2476 KUNIT_EXPECT_EQ(test, ctx->pre_rate_change.old_rate, DUMMY_CLOCK_RATE_1); 2477 KUNIT_EXPECT_EQ(test, ctx->pre_rate_change.new_rate, DUMMY_CLOCK_RATE_2); 2478 2479 ret = wait_event_interruptible_timeout(ctx->post_rate_change.wq, 2480 ctx->post_rate_change.done, 2481 msecs_to_jiffies(NOTIFIER_TIMEOUT_MS)); 2482 KUNIT_ASSERT_GT(test, ret, 0); 2483 2484 KUNIT_EXPECT_EQ(test, ctx->post_rate_change.old_rate, DUMMY_CLOCK_RATE_1); 2485 KUNIT_EXPECT_EQ(test, ctx->post_rate_change.new_rate, DUMMY_CLOCK_RATE_2); 2486 2487 clk_put(new_parent); 2488 clk_put(clk); 2489 } 2490 2491 static struct kunit_case clk_mux_notifier_test_cases[] = { 2492 KUNIT_CASE(clk_mux_notifier_set_parent_test), 2493 {} 2494 }; 2495 2496 /* 2497 * Test suite for a mux with multiple parents, and a notifier registered 2498 * on the mux. 2499 * 2500 * These tests exercise the behaviour of notifiers. 2501 */ 2502 static struct kunit_suite clk_mux_notifier_test_suite = { 2503 .name = "clk-mux-notifier", 2504 .init = clk_mux_notifier_test_init, 2505 .exit = clk_mux_notifier_test_exit, 2506 .test_cases = clk_mux_notifier_test_cases, 2507 }; 2508 2509 static int 2510 clk_mux_no_reparent_test_init(struct kunit *test) 2511 { 2512 struct clk_multiple_parent_ctx *ctx; 2513 const char *parents[2] = { "parent-0", "parent-1"}; 2514 int ret; 2515 2516 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 2517 if (!ctx) 2518 return -ENOMEM; 2519 test->priv = ctx; 2520 2521 ctx->parents_ctx[0].hw.init = CLK_HW_INIT_NO_PARENT("parent-0", 2522 &clk_dummy_rate_ops, 2523 0); 2524 ctx->parents_ctx[0].rate = DUMMY_CLOCK_RATE_1; 2525 ret = clk_hw_register(NULL, &ctx->parents_ctx[0].hw); 2526 if (ret) 2527 return ret; 2528 2529 ctx->parents_ctx[1].hw.init = CLK_HW_INIT_NO_PARENT("parent-1", 2530 &clk_dummy_rate_ops, 2531 0); 2532 ctx->parents_ctx[1].rate = DUMMY_CLOCK_RATE_2; 2533 ret = clk_hw_register(NULL, &ctx->parents_ctx[1].hw); 2534 if (ret) 2535 return ret; 2536 2537 ctx->current_parent = 0; 2538 ctx->hw.init = CLK_HW_INIT_PARENTS("test-mux", parents, 2539 &clk_multiple_parents_no_reparent_mux_ops, 2540 0); 2541 ret = clk_hw_register(NULL, &ctx->hw); 2542 if (ret) 2543 return ret; 2544 2545 return 0; 2546 } 2547 2548 static void 2549 clk_mux_no_reparent_test_exit(struct kunit *test) 2550 { 2551 struct clk_multiple_parent_ctx *ctx = test->priv; 2552 2553 clk_hw_unregister(&ctx->hw); 2554 clk_hw_unregister(&ctx->parents_ctx[0].hw); 2555 clk_hw_unregister(&ctx->parents_ctx[1].hw); 2556 } 2557 2558 /* 2559 * Test that if the we have a mux that cannot change parent and we call 2560 * clk_round_rate() on it with a rate that should cause it to change 2561 * parent, it won't. 2562 */ 2563 static void clk_mux_no_reparent_round_rate(struct kunit *test) 2564 { 2565 struct clk_multiple_parent_ctx *ctx = test->priv; 2566 struct clk_hw *hw = &ctx->hw; 2567 struct clk *clk = clk_hw_get_clk(hw, NULL); 2568 struct clk *other_parent, *parent; 2569 unsigned long other_parent_rate; 2570 unsigned long parent_rate; 2571 long rounded_rate; 2572 2573 parent = clk_get_parent(clk); 2574 KUNIT_ASSERT_PTR_NE(test, parent, NULL); 2575 2576 parent_rate = clk_get_rate(parent); 2577 KUNIT_ASSERT_GT(test, parent_rate, 0); 2578 2579 other_parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 2580 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, other_parent); 2581 KUNIT_ASSERT_FALSE(test, clk_is_match(parent, other_parent)); 2582 2583 other_parent_rate = clk_get_rate(other_parent); 2584 KUNIT_ASSERT_GT(test, other_parent_rate, 0); 2585 clk_put(other_parent); 2586 2587 rounded_rate = clk_round_rate(clk, other_parent_rate); 2588 KUNIT_ASSERT_GT(test, rounded_rate, 0); 2589 KUNIT_EXPECT_EQ(test, rounded_rate, parent_rate); 2590 2591 clk_put(clk); 2592 } 2593 2594 /* 2595 * Test that if the we have a mux that cannot change parent and we call 2596 * clk_set_rate() on it with a rate that should cause it to change 2597 * parent, it won't. 2598 */ 2599 static void clk_mux_no_reparent_set_rate(struct kunit *test) 2600 { 2601 struct clk_multiple_parent_ctx *ctx = test->priv; 2602 struct clk_hw *hw = &ctx->hw; 2603 struct clk *clk = clk_hw_get_clk(hw, NULL); 2604 struct clk *other_parent, *parent; 2605 unsigned long other_parent_rate; 2606 unsigned long parent_rate; 2607 unsigned long rate; 2608 int ret; 2609 2610 parent = clk_get_parent(clk); 2611 KUNIT_ASSERT_PTR_NE(test, parent, NULL); 2612 2613 parent_rate = clk_get_rate(parent); 2614 KUNIT_ASSERT_GT(test, parent_rate, 0); 2615 2616 other_parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL); 2617 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, other_parent); 2618 KUNIT_ASSERT_FALSE(test, clk_is_match(parent, other_parent)); 2619 2620 other_parent_rate = clk_get_rate(other_parent); 2621 KUNIT_ASSERT_GT(test, other_parent_rate, 0); 2622 clk_put(other_parent); 2623 2624 ret = clk_set_rate(clk, other_parent_rate); 2625 KUNIT_ASSERT_EQ(test, ret, 0); 2626 2627 rate = clk_get_rate(clk); 2628 KUNIT_ASSERT_GT(test, rate, 0); 2629 KUNIT_EXPECT_EQ(test, rate, parent_rate); 2630 2631 clk_put(clk); 2632 } 2633 2634 static struct kunit_case clk_mux_no_reparent_test_cases[] = { 2635 KUNIT_CASE(clk_mux_no_reparent_round_rate), 2636 KUNIT_CASE(clk_mux_no_reparent_set_rate), 2637 {} 2638 }; 2639 2640 /* 2641 * Test suite for a clock mux that isn't allowed to change parent, using 2642 * the clk_hw_determine_rate_no_reparent() helper. 2643 * 2644 * These tests exercise that helper, and the proper selection of 2645 * rates and parents. 2646 */ 2647 static struct kunit_suite clk_mux_no_reparent_test_suite = { 2648 .name = "clk-mux-no-reparent", 2649 .init = clk_mux_no_reparent_test_init, 2650 .exit = clk_mux_no_reparent_test_exit, 2651 .test_cases = clk_mux_no_reparent_test_cases, 2652 }; 2653 2654 struct clk_register_clk_parent_data_test_case { 2655 const char *desc; 2656 struct clk_parent_data pdata; 2657 }; 2658 2659 static void 2660 clk_register_clk_parent_data_test_case_to_desc( 2661 const struct clk_register_clk_parent_data_test_case *t, char *desc) 2662 { 2663 strscpy(desc, t->desc, KUNIT_PARAM_DESC_SIZE); 2664 } 2665 2666 static const struct clk_register_clk_parent_data_test_case 2667 clk_register_clk_parent_data_of_cases[] = { 2668 { 2669 /* 2670 * Test that a clk registered with a struct device_node can 2671 * find a parent based on struct clk_parent_data::index. 2672 */ 2673 .desc = "clk_parent_data_of_index_test", 2674 .pdata.index = 0, 2675 }, 2676 { 2677 /* 2678 * Test that a clk registered with a struct device_node can 2679 * find a parent based on struct clk_parent_data::fwname. 2680 */ 2681 .desc = "clk_parent_data_of_fwname_test", 2682 .pdata.fw_name = CLK_PARENT_DATA_PARENT1, 2683 }, 2684 { 2685 /* 2686 * Test that a clk registered with a struct device_node can 2687 * find a parent based on struct clk_parent_data::name. 2688 */ 2689 .desc = "clk_parent_data_of_name_test", 2690 /* The index must be negative to indicate firmware not used */ 2691 .pdata.index = -1, 2692 .pdata.name = CLK_PARENT_DATA_1MHZ_NAME, 2693 }, 2694 { 2695 /* 2696 * Test that a clk registered with a struct device_node can 2697 * find a parent based on struct 2698 * clk_parent_data::{fw_name,name}. 2699 */ 2700 .desc = "clk_parent_data_of_fwname_name_test", 2701 .pdata.fw_name = CLK_PARENT_DATA_PARENT1, 2702 .pdata.name = "not_matching", 2703 }, 2704 { 2705 /* 2706 * Test that a clk registered with a struct device_node can 2707 * find a parent based on struct clk_parent_data::{index,name}. 2708 * Index takes priority. 2709 */ 2710 .desc = "clk_parent_data_of_index_name_priority_test", 2711 .pdata.index = 0, 2712 .pdata.name = "not_matching", 2713 }, 2714 { 2715 /* 2716 * Test that a clk registered with a struct device_node can 2717 * find a parent based on struct 2718 * clk_parent_data::{index,fwname,name}. The fw_name takes 2719 * priority over index and name. 2720 */ 2721 .desc = "clk_parent_data_of_index_fwname_name_priority_test", 2722 .pdata.index = 1, 2723 .pdata.fw_name = CLK_PARENT_DATA_PARENT1, 2724 .pdata.name = "not_matching", 2725 }, 2726 }; 2727 2728 KUNIT_ARRAY_PARAM(clk_register_clk_parent_data_of_test, clk_register_clk_parent_data_of_cases, 2729 clk_register_clk_parent_data_test_case_to_desc) 2730 2731 /** 2732 * struct clk_register_clk_parent_data_of_ctx - Context for clk_parent_data OF tests 2733 * @np: device node of clk under test 2734 * @hw: clk_hw for clk under test 2735 */ 2736 struct clk_register_clk_parent_data_of_ctx { 2737 struct device_node *np; 2738 struct clk_hw hw; 2739 }; 2740 2741 static int clk_register_clk_parent_data_of_test_init(struct kunit *test) 2742 { 2743 struct clk_register_clk_parent_data_of_ctx *ctx; 2744 2745 KUNIT_ASSERT_EQ(test, 0, 2746 of_overlay_apply_kunit(test, kunit_clk_parent_data_test)); 2747 2748 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 2749 if (!ctx) 2750 return -ENOMEM; 2751 test->priv = ctx; 2752 2753 ctx->np = of_find_compatible_node(NULL, NULL, "test,clk-parent-data"); 2754 if (!ctx->np) 2755 return -ENODEV; 2756 2757 of_node_put_kunit(test, ctx->np); 2758 2759 return 0; 2760 } 2761 2762 /* 2763 * Test that a clk registered with a struct device_node can find a parent based on 2764 * struct clk_parent_data when the hw member isn't set. 2765 */ 2766 static void clk_register_clk_parent_data_of_test(struct kunit *test) 2767 { 2768 struct clk_register_clk_parent_data_of_ctx *ctx = test->priv; 2769 struct clk_hw *parent_hw; 2770 const struct clk_register_clk_parent_data_test_case *test_param; 2771 struct clk_init_data init = { }; 2772 struct clk *expected_parent, *actual_parent; 2773 2774 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx->np); 2775 2776 expected_parent = of_clk_get_kunit(test, ctx->np, 0); 2777 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_parent); 2778 2779 test_param = test->param_value; 2780 init.parent_data = &test_param->pdata; 2781 init.num_parents = 1; 2782 init.name = "parent_data_of_test_clk"; 2783 init.ops = &clk_dummy_single_parent_ops; 2784 ctx->hw.init = &init; 2785 KUNIT_ASSERT_EQ(test, 0, of_clk_hw_register_kunit(test, ctx->np, &ctx->hw)); 2786 2787 parent_hw = clk_hw_get_parent(&ctx->hw); 2788 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent_hw); 2789 2790 actual_parent = clk_hw_get_clk_kunit(test, parent_hw, __func__); 2791 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, actual_parent); 2792 2793 KUNIT_EXPECT_TRUE(test, clk_is_match(expected_parent, actual_parent)); 2794 } 2795 2796 static struct kunit_case clk_register_clk_parent_data_of_test_cases[] = { 2797 KUNIT_CASE_PARAM(clk_register_clk_parent_data_of_test, 2798 clk_register_clk_parent_data_of_test_gen_params), 2799 {} 2800 }; 2801 2802 /* 2803 * Test suite for registering clks with struct clk_parent_data and a struct 2804 * device_node. 2805 */ 2806 static struct kunit_suite clk_register_clk_parent_data_of_suite = { 2807 .name = "clk_register_clk_parent_data_of", 2808 .init = clk_register_clk_parent_data_of_test_init, 2809 .test_cases = clk_register_clk_parent_data_of_test_cases, 2810 }; 2811 2812 /** 2813 * struct platform_driver_dev_ctx - Context to stash platform device 2814 * @dev: device under test 2815 * @pdrv: driver to attach to find @dev 2816 */ 2817 struct platform_driver_dev_ctx { 2818 struct device *dev; 2819 struct platform_driver pdrv; 2820 }; 2821 2822 static inline struct platform_driver_dev_ctx * 2823 pdev_to_platform_driver_dev_ctx(struct platform_device *pdev) 2824 { 2825 return container_of(to_platform_driver(pdev->dev.driver), 2826 struct platform_driver_dev_ctx, pdrv); 2827 } 2828 2829 static int kunit_platform_driver_dev_probe(struct platform_device *pdev) 2830 { 2831 struct platform_driver_dev_ctx *ctx; 2832 2833 ctx = pdev_to_platform_driver_dev_ctx(pdev); 2834 ctx->dev = &pdev->dev; 2835 2836 return 0; 2837 } 2838 2839 static struct device * 2840 kunit_of_platform_driver_dev(struct kunit *test, const struct of_device_id *match_table) 2841 { 2842 struct platform_driver_dev_ctx *ctx; 2843 2844 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL); 2845 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx); 2846 2847 ctx->pdrv.probe = kunit_platform_driver_dev_probe; 2848 ctx->pdrv.driver.of_match_table = match_table; 2849 ctx->pdrv.driver.name = __func__; 2850 ctx->pdrv.driver.owner = THIS_MODULE; 2851 2852 KUNIT_ASSERT_EQ(test, 0, kunit_platform_driver_register(test, &ctx->pdrv)); 2853 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, ctx->dev); 2854 2855 return ctx->dev; 2856 } 2857 2858 static const struct clk_register_clk_parent_data_test_case 2859 clk_register_clk_parent_data_device_cases[] = { 2860 { 2861 /* 2862 * Test that a clk registered with a struct device can find a 2863 * parent based on struct clk_parent_data::index. 2864 */ 2865 .desc = "clk_parent_data_device_index_test", 2866 .pdata.index = 1, 2867 }, 2868 { 2869 /* 2870 * Test that a clk registered with a struct device can find a 2871 * parent based on struct clk_parent_data::fwname. 2872 */ 2873 .desc = "clk_parent_data_device_fwname_test", 2874 .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 2875 }, 2876 { 2877 /* 2878 * Test that a clk registered with a struct device can find a 2879 * parent based on struct clk_parent_data::name. 2880 */ 2881 .desc = "clk_parent_data_device_name_test", 2882 /* The index must be negative to indicate firmware not used */ 2883 .pdata.index = -1, 2884 .pdata.name = CLK_PARENT_DATA_50MHZ_NAME, 2885 }, 2886 { 2887 /* 2888 * Test that a clk registered with a struct device can find a 2889 * parent based on struct clk_parent_data::{fw_name,name}. 2890 */ 2891 .desc = "clk_parent_data_device_fwname_name_test", 2892 .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 2893 .pdata.name = "not_matching", 2894 }, 2895 { 2896 /* 2897 * Test that a clk registered with a struct device can find a 2898 * parent based on struct clk_parent_data::{index,name}. Index 2899 * takes priority. 2900 */ 2901 .desc = "clk_parent_data_device_index_name_priority_test", 2902 .pdata.index = 1, 2903 .pdata.name = "not_matching", 2904 }, 2905 { 2906 /* 2907 * Test that a clk registered with a struct device can find a 2908 * parent based on struct clk_parent_data::{index,fwname,name}. 2909 * The fw_name takes priority over index and name. 2910 */ 2911 .desc = "clk_parent_data_device_index_fwname_name_priority_test", 2912 .pdata.index = 0, 2913 .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 2914 .pdata.name = "not_matching", 2915 }, 2916 }; 2917 2918 KUNIT_ARRAY_PARAM(clk_register_clk_parent_data_device_test, 2919 clk_register_clk_parent_data_device_cases, 2920 clk_register_clk_parent_data_test_case_to_desc) 2921 2922 /* 2923 * Test that a clk registered with a struct device can find a parent based on 2924 * struct clk_parent_data when the hw member isn't set. 2925 */ 2926 static void clk_register_clk_parent_data_device_test(struct kunit *test) 2927 { 2928 struct device *dev; 2929 struct clk_hw *hw; 2930 const struct clk_register_clk_parent_data_test_case *test_param; 2931 struct clk_hw *parent_hw; 2932 struct clk_init_data init = { }; 2933 struct clk *expected_parent, *actual_parent; 2934 static const struct of_device_id match_table[] = { 2935 { .compatible = "test,clk-parent-data" }, 2936 { } 2937 }; 2938 2939 dev = kunit_of_platform_driver_dev(test, match_table); 2940 2941 expected_parent = clk_get_kunit(test, dev, "50"); 2942 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_parent); 2943 2944 hw = kunit_kzalloc(test, sizeof(*hw), GFP_KERNEL); 2945 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 2946 2947 test_param = test->param_value; 2948 init.parent_data = &test_param->pdata; 2949 init.num_parents = 1; 2950 init.name = "parent_data_device_test_clk"; 2951 init.ops = &clk_dummy_single_parent_ops; 2952 hw->init = &init; 2953 KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, dev, hw)); 2954 2955 parent_hw = clk_hw_get_parent(hw); 2956 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent_hw); 2957 2958 actual_parent = clk_hw_get_clk_kunit(test, parent_hw, __func__); 2959 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, actual_parent); 2960 2961 KUNIT_EXPECT_TRUE(test, clk_is_match(expected_parent, actual_parent)); 2962 } 2963 2964 static const struct clk_register_clk_parent_data_test_case 2965 clk_register_clk_parent_data_device_hw_cases[] = { 2966 { 2967 /* 2968 * Test that a clk registered with a struct device can find a 2969 * parent based on struct clk_parent_data::hw. 2970 */ 2971 .desc = "clk_parent_data_device_hw_index_test", 2972 /* The index must be negative to indicate firmware not used */ 2973 .pdata.index = -1, 2974 }, 2975 { 2976 /* 2977 * Test that a clk registered with a struct device can find a 2978 * parent based on struct clk_parent_data::hw when 2979 * struct clk_parent_data::fw_name is set. 2980 */ 2981 .desc = "clk_parent_data_device_hw_fwname_test", 2982 .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 2983 }, 2984 { 2985 /* 2986 * Test that a clk registered with a struct device can find a 2987 * parent based on struct clk_parent_data::hw when struct 2988 * clk_parent_data::name is set. 2989 */ 2990 .desc = "clk_parent_data_device_hw_name_test", 2991 /* The index must be negative to indicate firmware not used */ 2992 .pdata.index = -1, 2993 .pdata.name = CLK_PARENT_DATA_50MHZ_NAME, 2994 }, 2995 { 2996 /* 2997 * Test that a clk registered with a struct device can find a 2998 * parent based on struct clk_parent_data::hw when struct 2999 * clk_parent_data::{fw_name,name} are set. 3000 */ 3001 .desc = "clk_parent_data_device_hw_fwname_name_test", 3002 .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 3003 .pdata.name = "not_matching", 3004 }, 3005 { 3006 /* 3007 * Test that a clk registered with a struct device can find a 3008 * parent based on struct clk_parent_data::hw when struct 3009 * clk_parent_data::index is set. The hw pointer takes 3010 * priority. 3011 */ 3012 .desc = "clk_parent_data_device_hw_index_priority_test", 3013 .pdata.index = 0, 3014 }, 3015 { 3016 /* 3017 * Test that a clk registered with a struct device can find a 3018 * parent based on struct clk_parent_data::hw when 3019 * struct clk_parent_data::{index,fwname,name} are set. 3020 * The hw pointer takes priority over everything else. 3021 */ 3022 .desc = "clk_parent_data_device_hw_index_fwname_name_priority_test", 3023 .pdata.index = 0, 3024 .pdata.fw_name = CLK_PARENT_DATA_PARENT2, 3025 .pdata.name = "not_matching", 3026 }, 3027 }; 3028 3029 KUNIT_ARRAY_PARAM(clk_register_clk_parent_data_device_hw_test, 3030 clk_register_clk_parent_data_device_hw_cases, 3031 clk_register_clk_parent_data_test_case_to_desc) 3032 3033 /* 3034 * Test that a clk registered with a struct device can find a 3035 * parent based on struct clk_parent_data::hw. 3036 */ 3037 static void clk_register_clk_parent_data_device_hw_test(struct kunit *test) 3038 { 3039 struct device *dev; 3040 struct clk_hw *hw; 3041 const struct clk_register_clk_parent_data_test_case *test_param; 3042 struct clk_dummy_context *parent; 3043 struct clk_hw *parent_hw; 3044 struct clk_parent_data pdata = { }; 3045 struct clk_init_data init = { }; 3046 static const struct of_device_id match_table[] = { 3047 { .compatible = "test,clk-parent-data" }, 3048 { } 3049 }; 3050 3051 dev = kunit_of_platform_driver_dev(test, match_table); 3052 3053 parent = kunit_kzalloc(test, sizeof(*parent), GFP_KERNEL); 3054 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent); 3055 3056 parent_hw = &parent->hw; 3057 parent_hw->init = CLK_HW_INIT_NO_PARENT("parent-clk", 3058 &clk_dummy_rate_ops, 0); 3059 3060 KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, dev, parent_hw)); 3061 3062 hw = kunit_kzalloc(test, sizeof(*hw), GFP_KERNEL); 3063 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 3064 3065 test_param = test->param_value; 3066 memcpy(&pdata, &test_param->pdata, sizeof(pdata)); 3067 pdata.hw = parent_hw; 3068 init.parent_data = &pdata; 3069 init.num_parents = 1; 3070 init.ops = &clk_dummy_single_parent_ops; 3071 init.name = "parent_data_device_hw_test_clk"; 3072 hw->init = &init; 3073 KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, dev, hw)); 3074 3075 KUNIT_EXPECT_PTR_EQ(test, parent_hw, clk_hw_get_parent(hw)); 3076 } 3077 3078 static struct kunit_case clk_register_clk_parent_data_device_test_cases[] = { 3079 KUNIT_CASE_PARAM(clk_register_clk_parent_data_device_test, 3080 clk_register_clk_parent_data_device_test_gen_params), 3081 KUNIT_CASE_PARAM(clk_register_clk_parent_data_device_hw_test, 3082 clk_register_clk_parent_data_device_hw_test_gen_params), 3083 {} 3084 }; 3085 3086 static int clk_register_clk_parent_data_device_init(struct kunit *test) 3087 { 3088 KUNIT_ASSERT_EQ(test, 0, 3089 of_overlay_apply_kunit(test, kunit_clk_parent_data_test)); 3090 3091 return 0; 3092 } 3093 3094 /* 3095 * Test suite for registering clks with struct clk_parent_data and a struct 3096 * device. 3097 */ 3098 static struct kunit_suite clk_register_clk_parent_data_device_suite = { 3099 .name = "clk_register_clk_parent_data_device", 3100 .init = clk_register_clk_parent_data_device_init, 3101 .test_cases = clk_register_clk_parent_data_device_test_cases, 3102 }; 3103 3104 struct clk_assigned_rates_context { 3105 struct clk_dummy_context clk0; 3106 struct clk_dummy_context clk1; 3107 }; 3108 3109 /* 3110 * struct clk_assigned_rates_test_param - Test parameters for clk_assigned_rates test 3111 * @desc: Test description 3112 * @overlay_begin: Pointer to start of DT overlay to apply for test 3113 * @overlay_end: Pointer to end of DT overlay to apply for test 3114 * @rate0: Initial rate of first clk 3115 * @rate1: Initial rate of second clk 3116 * @sscs: Initial spread spectrum settings 3117 * @consumer_test: true if a consumer is being tested 3118 */ 3119 struct clk_assigned_rates_test_param { 3120 const char *desc; 3121 u8 *overlay_begin; 3122 u8 *overlay_end; 3123 unsigned long rate0; 3124 unsigned long rate1; 3125 struct clk_spread_spectrum sscs; 3126 bool consumer_test; 3127 }; 3128 3129 #define TEST_PARAM_OVERLAY(overlay_name) \ 3130 .overlay_begin = of_overlay_begin(overlay_name), \ 3131 .overlay_end = of_overlay_end(overlay_name) 3132 3133 static void 3134 clk_assigned_rates_register_clk(struct kunit *test, 3135 struct clk_dummy_context *ctx, 3136 struct device_node *np, const char *name, 3137 unsigned long rate, const struct clk_spread_spectrum *sscs) 3138 { 3139 struct clk_init_data init = { }; 3140 3141 init.name = name; 3142 init.ops = &clk_dummy_rate_ops; 3143 ctx->hw.init = &init; 3144 ctx->rate = rate; 3145 ctx->sscs = *sscs; 3146 3147 KUNIT_ASSERT_EQ(test, 0, of_clk_hw_register_kunit(test, np, &ctx->hw)); 3148 KUNIT_ASSERT_EQ(test, ctx->rate, rate); 3149 } 3150 3151 /* 3152 * Does most of the work of the test: 3153 * 3154 * 1. Apply the overlay to test 3155 * 2. Register the clk or clks to test 3156 * 3. Register the clk provider 3157 * 4. Apply clk defaults to the consumer device if this is a consumer test 3158 * 3159 * The tests will set different test_param values to test different scenarios 3160 * and validate that in their test functions. 3161 */ 3162 static int clk_assigned_rates_test_init(struct kunit *test) 3163 { 3164 struct device_node *np, *consumer; 3165 struct clk_hw_onecell_data *data; 3166 struct clk_assigned_rates_context *ctx; 3167 u32 clk_cells; 3168 const struct clk_assigned_rates_test_param *test_param; 3169 3170 test_param = test->param_value; 3171 3172 KUNIT_ASSERT_EQ(test, 0, __of_overlay_apply_kunit(test, 3173 test_param->overlay_begin, 3174 test_param->overlay_end)); 3175 3176 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, 3177 ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL)); 3178 test->priv = ctx; 3179 3180 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, 3181 np = of_find_compatible_node(NULL, NULL, "test,clk-assigned-rates")); 3182 of_node_put_kunit(test, np); 3183 3184 KUNIT_ASSERT_EQ(test, 0, of_property_read_u32(np, "#clock-cells", &clk_cells)); 3185 /* Only support #clock-cells = <0> or <1> */ 3186 KUNIT_ASSERT_LT(test, clk_cells, 2); 3187 3188 clk_assigned_rates_register_clk(test, &ctx->clk0, np, 3189 "test_assigned_rate0", test_param->rate0, 3190 &test_param->sscs); 3191 if (clk_cells == 0) { 3192 KUNIT_ASSERT_EQ(test, 0, 3193 of_clk_add_hw_provider_kunit(test, np, of_clk_hw_simple_get, 3194 &ctx->clk0.hw)); 3195 } else if (clk_cells == 1) { 3196 clk_assigned_rates_register_clk(test, &ctx->clk1, np, 3197 "test_assigned_rate1", test_param->rate1, 3198 &test_param->sscs); 3199 3200 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, 3201 data = kunit_kzalloc(test, struct_size(data, hws, 2), GFP_KERNEL)); 3202 data->num = 2; 3203 data->hws[0] = &ctx->clk0.hw; 3204 data->hws[1] = &ctx->clk1.hw; 3205 3206 KUNIT_ASSERT_EQ(test, 0, 3207 of_clk_add_hw_provider_kunit(test, np, of_clk_hw_onecell_get, data)); 3208 } 3209 3210 /* Consumers are optional */ 3211 if (test_param->consumer_test) { 3212 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, 3213 consumer = of_find_compatible_node(NULL, NULL, "test,clk-consumer")); 3214 of_node_put_kunit(test, consumer); 3215 3216 KUNIT_ASSERT_EQ(test, 0, of_clk_set_defaults(consumer, false)); 3217 } 3218 3219 return 0; 3220 } 3221 3222 static void clk_assigned_rates_assigns_one(struct kunit *test) 3223 { 3224 struct clk_assigned_rates_context *ctx = test->priv; 3225 3226 KUNIT_EXPECT_EQ(test, ctx->clk0.rate, ASSIGNED_RATES_0_RATE); 3227 } 3228 3229 static void clk_assigned_rates_assigns_multiple(struct kunit *test) 3230 { 3231 struct clk_assigned_rates_context *ctx = test->priv; 3232 3233 KUNIT_EXPECT_EQ(test, ctx->clk0.rate, ASSIGNED_RATES_0_RATE); 3234 KUNIT_EXPECT_EQ(test, ctx->clk1.rate, ASSIGNED_RATES_1_RATE); 3235 } 3236 3237 static void clk_assigned_rates_skips(struct kunit *test) 3238 { 3239 struct clk_assigned_rates_context *ctx = test->priv; 3240 const struct clk_assigned_rates_test_param *test_param = test->param_value; 3241 3242 KUNIT_EXPECT_NE(test, ctx->clk0.rate, ASSIGNED_RATES_0_RATE); 3243 KUNIT_EXPECT_EQ(test, ctx->clk0.rate, test_param->rate0); 3244 } 3245 3246 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_one); 3247 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_one_consumer); 3248 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_u64_one); 3249 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_u64_one_consumer); 3250 3251 /* Test cases that assign one rate */ 3252 static const struct clk_assigned_rates_test_param clk_assigned_rates_assigns_one_test_params[] = { 3253 { 3254 /* 3255 * Test that a single cell assigned-clock-rates property 3256 * assigns the rate when the property is in the provider. 3257 */ 3258 .desc = "provider assigns", 3259 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_one), 3260 }, 3261 { 3262 /* 3263 * Test that a single cell assigned-clock-rates property 3264 * assigns the rate when the property is in the consumer. 3265 */ 3266 .desc = "consumer assigns", 3267 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_one_consumer), 3268 .consumer_test = true, 3269 }, 3270 { 3271 /* 3272 * Test that a single cell assigned-clock-rates-u64 property 3273 * assigns the rate when the property is in the provider. 3274 */ 3275 .desc = "provider assigns u64", 3276 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_u64_one), 3277 }, 3278 { 3279 /* 3280 * Test that a single cell assigned-clock-rates-u64 property 3281 * assigns the rate when the property is in the consumer. 3282 */ 3283 .desc = "consumer assigns u64", 3284 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_u64_one_consumer), 3285 .consumer_test = true, 3286 }, 3287 }; 3288 KUNIT_ARRAY_PARAM_DESC(clk_assigned_rates_assigns_one, 3289 clk_assigned_rates_assigns_one_test_params, desc) 3290 3291 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_multiple); 3292 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_multiple_consumer); 3293 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_u64_multiple); 3294 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_u64_multiple_consumer); 3295 3296 /* Test cases that assign multiple rates */ 3297 static const struct clk_assigned_rates_test_param clk_assigned_rates_assigns_multiple_test_params[] = { 3298 { 3299 /* 3300 * Test that a multiple cell assigned-clock-rates property 3301 * assigns the rates when the property is in the provider. 3302 */ 3303 .desc = "provider assigns", 3304 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_multiple), 3305 }, 3306 { 3307 /* 3308 * Test that a multiple cell assigned-clock-rates property 3309 * assigns the rates when the property is in the consumer. 3310 */ 3311 .desc = "consumer assigns", 3312 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_multiple_consumer), 3313 .consumer_test = true, 3314 }, 3315 { 3316 /* 3317 * Test that a single cell assigned-clock-rates-u64 property 3318 * assigns the rate when the property is in the provider. 3319 */ 3320 .desc = "provider assigns u64", 3321 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_u64_multiple), 3322 }, 3323 { 3324 /* 3325 * Test that a multiple cell assigned-clock-rates-u64 property 3326 * assigns the rates when the property is in the consumer. 3327 */ 3328 .desc = "consumer assigns u64", 3329 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_u64_multiple_consumer), 3330 .consumer_test = true, 3331 }, 3332 }; 3333 KUNIT_ARRAY_PARAM_DESC(clk_assigned_rates_assigns_multiple, 3334 clk_assigned_rates_assigns_multiple_test_params, 3335 desc) 3336 3337 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_without); 3338 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_without_consumer); 3339 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_zero); 3340 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_zero_consumer); 3341 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_null); 3342 OF_OVERLAY_DECLARE(kunit_clk_assigned_rates_null_consumer); 3343 3344 /* Test cases that skip changing the rate due to malformed DT */ 3345 static const struct clk_assigned_rates_test_param clk_assigned_rates_skips_test_params[] = { 3346 { 3347 /* 3348 * Test that an assigned-clock-rates property without an assigned-clocks 3349 * property fails when the property is in the provider. 3350 */ 3351 .desc = "provider missing assigned-clocks", 3352 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_without), 3353 .rate0 = 3000, 3354 }, 3355 { 3356 /* 3357 * Test that an assigned-clock-rates property without an assigned-clocks 3358 * property fails when the property is in the consumer. 3359 */ 3360 .desc = "consumer missing assigned-clocks", 3361 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_without_consumer), 3362 .rate0 = 3000, 3363 .consumer_test = true, 3364 }, 3365 { 3366 /* 3367 * Test that an assigned-clock-rates property of zero doesn't 3368 * set a rate when the property is in the provider. 3369 */ 3370 .desc = "provider assigned-clock-rates of zero", 3371 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_zero), 3372 .rate0 = 3000, 3373 }, 3374 { 3375 /* 3376 * Test that an assigned-clock-rates property of zero doesn't 3377 * set a rate when the property is in the consumer. 3378 */ 3379 .desc = "consumer assigned-clock-rates of zero", 3380 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_zero_consumer), 3381 .rate0 = 3000, 3382 .consumer_test = true, 3383 }, 3384 { 3385 /* 3386 * Test that an assigned-clocks property with a null phandle 3387 * doesn't set a rate when the property is in the provider. 3388 */ 3389 .desc = "provider assigned-clocks null phandle", 3390 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_null), 3391 .rate0 = 3000, 3392 }, 3393 { 3394 /* 3395 * Test that an assigned-clocks property with a null phandle 3396 * doesn't set a rate when the property is in the consumer. 3397 */ 3398 .desc = "provider assigned-clocks null phandle", 3399 TEST_PARAM_OVERLAY(kunit_clk_assigned_rates_null_consumer), 3400 .rate0 = 3000, 3401 .consumer_test = true, 3402 }, 3403 }; 3404 KUNIT_ARRAY_PARAM_DESC(clk_assigned_rates_skips, 3405 clk_assigned_rates_skips_test_params, 3406 desc) 3407 3408 static struct kunit_case clk_assigned_rates_test_cases[] = { 3409 KUNIT_CASE_PARAM(clk_assigned_rates_assigns_one, 3410 clk_assigned_rates_assigns_one_gen_params), 3411 KUNIT_CASE_PARAM(clk_assigned_rates_assigns_multiple, 3412 clk_assigned_rates_assigns_multiple_gen_params), 3413 KUNIT_CASE_PARAM(clk_assigned_rates_skips, 3414 clk_assigned_rates_skips_gen_params), 3415 {} 3416 }; 3417 3418 /* 3419 * Test suite for assigned-clock-rates{-u64} DT property. 3420 */ 3421 static struct kunit_suite clk_assigned_rates_suite = { 3422 .name = "clk_assigned_rates", 3423 .test_cases = clk_assigned_rates_test_cases, 3424 .init = clk_assigned_rates_test_init, 3425 }; 3426 3427 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_one); 3428 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_one_consumer); 3429 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_multiple); 3430 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_multiple_consumer); 3431 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_without); 3432 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_without_consumer); 3433 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_zero); 3434 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_zero_consumer); 3435 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_null); 3436 OF_OVERLAY_DECLARE(kunit_clk_assigned_sscs_null_consumer); 3437 3438 static void clk_assigned_sscs_assigns_one(struct kunit *test) 3439 { 3440 struct clk_assigned_rates_context *ctx = test->priv; 3441 3442 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.modfreq_hz, ASSIGNED_SSCS_0_MODFREQ); 3443 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.spread_bp, ASSIGNED_SSCS_0_SPREAD); 3444 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.method, ASSIGNED_SSCS_0_METHOD); 3445 } 3446 3447 /* Test cases that assign sscs for one clk */ 3448 static const struct clk_assigned_rates_test_param clk_assigned_sscs_assigns_one_test_params[] = { 3449 { 3450 /* 3451 * Test that a single cell assigned-clock-sscs property 3452 * assigns the sscs when the property is in the provider. 3453 */ 3454 .desc = "provider assigns", 3455 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_one), 3456 }, 3457 { 3458 /* 3459 * Test that a single cell assigned-clock-sscs property 3460 * assigns the sscs when the property is in the consumer. 3461 */ 3462 .desc = "consumer assigns", 3463 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_one_consumer), 3464 .consumer_test = true, 3465 }, 3466 }; 3467 KUNIT_ARRAY_PARAM_DESC(clk_assigned_sscs_assigns_one, 3468 clk_assigned_sscs_assigns_one_test_params, desc) 3469 3470 static void clk_assigned_sscs_assigns_multiple(struct kunit *test) 3471 { 3472 struct clk_assigned_rates_context *ctx = test->priv; 3473 3474 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.modfreq_hz, ASSIGNED_SSCS_0_MODFREQ); 3475 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.spread_bp, ASSIGNED_SSCS_0_SPREAD); 3476 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.method, ASSIGNED_SSCS_0_METHOD); 3477 KUNIT_EXPECT_EQ(test, ctx->clk1.sscs.modfreq_hz, ASSIGNED_SSCS_1_MODFREQ); 3478 KUNIT_EXPECT_EQ(test, ctx->clk1.sscs.spread_bp, ASSIGNED_SSCS_1_SPREAD); 3479 KUNIT_EXPECT_EQ(test, ctx->clk1.sscs.method, ASSIGNED_SSCS_1_METHOD); 3480 } 3481 3482 /* Test cases that assign sscs for multiple clks */ 3483 static const 3484 struct clk_assigned_rates_test_param clk_assigned_sscs_assigns_multiple_test_params[] = { 3485 { 3486 /* 3487 * Test that a multiple cell assigned-clock-sscs property 3488 * assigns the sscs when the property is in the provider. 3489 */ 3490 .desc = "provider assigns", 3491 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_multiple), 3492 }, 3493 { 3494 /* 3495 * Test that a multiple cell assigned-clock-sscs property 3496 * assigns the sscs when the property is in the consumer. 3497 */ 3498 .desc = "consumer assigns", 3499 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_multiple_consumer), 3500 .consumer_test = true, 3501 }, 3502 }; 3503 KUNIT_ARRAY_PARAM_DESC(clk_assigned_sscs_assigns_multiple, 3504 clk_assigned_sscs_assigns_multiple_test_params, 3505 desc) 3506 3507 static void clk_assigned_sscs_skips(struct kunit *test) 3508 { 3509 struct clk_assigned_rates_context *ctx = test->priv; 3510 const struct clk_assigned_rates_test_param *test_param = test->param_value; 3511 3512 KUNIT_EXPECT_NE(test, ctx->clk0.sscs.modfreq_hz, ASSIGNED_SSCS_0_MODFREQ); 3513 KUNIT_EXPECT_NE(test, ctx->clk0.sscs.spread_bp, ASSIGNED_SSCS_0_SPREAD); 3514 KUNIT_EXPECT_NE(test, ctx->clk0.sscs.method, ASSIGNED_SSCS_0_METHOD); 3515 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.modfreq_hz, test_param->sscs.modfreq_hz); 3516 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.spread_bp, test_param->sscs.spread_bp); 3517 KUNIT_EXPECT_EQ(test, ctx->clk0.sscs.method, test_param->sscs.method); 3518 } 3519 3520 /* Test cases that skip changing the sscs due to malformed DT */ 3521 static const struct clk_assigned_rates_test_param clk_assigned_sscs_skips_test_params[] = { 3522 { 3523 /* 3524 * Test that an assigned-clock-sscs property without an assigned-clocks 3525 * property fails when the property is in the provider. 3526 */ 3527 .desc = "provider missing assigned-clocks", 3528 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_without), 3529 .sscs = {50000, 60000, 3}, 3530 }, 3531 { 3532 /* 3533 * Test that an assigned-clock-sscs property without an assigned-clocks 3534 * property fails when the property is in the consumer. 3535 */ 3536 .desc = "consumer missing assigned-clocks", 3537 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_without_consumer), 3538 .sscs = {50000, 60000, 3}, 3539 .consumer_test = true, 3540 }, 3541 { 3542 /* 3543 * Test that an assigned-clock-sscs property of zero doesn't 3544 * set sscs when the property is in the provider. 3545 */ 3546 .desc = "provider assigned-clock-sscs of zero", 3547 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_zero), 3548 .sscs = {50000, 60000, 3}, 3549 }, 3550 { 3551 /* 3552 * Test that an assigned-clock-sscs property of zero doesn't 3553 * set sscs when the property is in the consumer. 3554 */ 3555 .desc = "consumer assigned-clock-sscs of zero", 3556 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_zero_consumer), 3557 .sscs = {50000, 60000, 3}, 3558 .consumer_test = true, 3559 }, 3560 { 3561 /* 3562 * Test that an assigned-clocks property with a null phandle 3563 * doesn't set sscs when the property is in the provider. 3564 */ 3565 .desc = "provider assigned-clocks null phandle", 3566 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_null), 3567 .sscs = {50000, 60000, 3}, 3568 }, 3569 { 3570 /* 3571 * Test that an assigned-clocks property with a null phandle 3572 * doesn't set sscs when the property is in the consumer. 3573 */ 3574 .desc = "consumer assigned-clocks null phandle", 3575 TEST_PARAM_OVERLAY(kunit_clk_assigned_sscs_null_consumer), 3576 .sscs = {50000, 60000, 3}, 3577 .consumer_test = true, 3578 }, 3579 }; 3580 KUNIT_ARRAY_PARAM_DESC(clk_assigned_sscs_skips, 3581 clk_assigned_sscs_skips_test_params, 3582 desc) 3583 3584 static struct kunit_case clk_assigned_sscs_test_cases[] = { 3585 KUNIT_CASE_PARAM(clk_assigned_sscs_assigns_one, 3586 clk_assigned_sscs_assigns_one_gen_params), 3587 KUNIT_CASE_PARAM(clk_assigned_sscs_assigns_multiple, 3588 clk_assigned_sscs_assigns_multiple_gen_params), 3589 KUNIT_CASE_PARAM(clk_assigned_sscs_skips, 3590 clk_assigned_sscs_skips_gen_params), 3591 {} 3592 }; 3593 3594 /* 3595 * Test suite for assigned-clock-sscs DT property. 3596 */ 3597 static struct kunit_suite clk_assigned_sscs_suite = { 3598 .name = "clk_assigned_sscs", 3599 .test_cases = clk_assigned_sscs_test_cases, 3600 .init = clk_assigned_rates_test_init, 3601 }; 3602 3603 static const struct clk_init_data clk_hw_get_dev_of_node_init_data = { 3604 .name = "clk_hw_get_dev_of_node", 3605 .ops = &empty_clk_ops, 3606 }; 3607 3608 /* 3609 * Test that a clk registered with a struct device returns the device from 3610 * clk_hw_get_dev() and the node from clk_hw_get_of_node() 3611 */ 3612 static void clk_hw_register_dev_get_dev_returns_dev(struct kunit *test) 3613 { 3614 struct device *dev; 3615 struct clk_hw *hw; 3616 static const struct of_device_id match_table[] = { 3617 { .compatible = "test,clk-hw-get-dev-of-node" }, 3618 { } 3619 }; 3620 3621 KUNIT_ASSERT_EQ(test, 0, of_overlay_apply_kunit(test, kunit_clk_hw_get_dev_of_node)); 3622 3623 dev = kunit_of_platform_driver_dev(test, match_table); 3624 3625 hw = kunit_kzalloc(test, sizeof(*hw), GFP_KERNEL); 3626 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 3627 3628 hw->init = &clk_hw_get_dev_of_node_init_data; 3629 KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, dev, hw)); 3630 3631 KUNIT_EXPECT_PTR_EQ(test, dev, clk_hw_get_dev(hw)); 3632 KUNIT_EXPECT_PTR_EQ(test, dev_of_node(dev), clk_hw_get_of_node(hw)); 3633 } 3634 3635 /* 3636 * Test that a clk registered with a struct device that's not associated with 3637 * an OF node returns the device from clk_hw_get_dev() and NULL from 3638 * clk_hw_get_of_node() 3639 */ 3640 static void clk_hw_register_dev_no_node_get_dev_returns_dev(struct kunit *test) 3641 { 3642 struct platform_device *pdev; 3643 struct device *dev; 3644 struct clk_hw *hw; 3645 3646 pdev = kunit_platform_device_alloc(test, "clk_hw_register_dev_no_node", -1); 3647 KUNIT_ASSERT_NOT_NULL(test, pdev); 3648 KUNIT_ASSERT_EQ(test, 0, kunit_platform_device_add(test, pdev)); 3649 dev = &pdev->dev; 3650 3651 hw = kunit_kzalloc(test, sizeof(*hw), GFP_KERNEL); 3652 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 3653 3654 hw->init = &clk_hw_get_dev_of_node_init_data; 3655 KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, dev, hw)); 3656 3657 KUNIT_EXPECT_PTR_EQ(test, dev, clk_hw_get_dev(hw)); 3658 KUNIT_EXPECT_PTR_EQ(test, NULL, clk_hw_get_of_node(hw)); 3659 } 3660 3661 /* 3662 * Test that a clk registered without a struct device returns NULL from 3663 * clk_hw_get_dev() 3664 */ 3665 static void clk_hw_register_NULL_get_dev_of_node_returns_NULL(struct kunit *test) 3666 { 3667 struct clk_hw *hw; 3668 3669 hw = kunit_kzalloc(test, sizeof(*hw), GFP_KERNEL); 3670 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 3671 3672 hw->init = &clk_hw_get_dev_of_node_init_data; 3673 3674 KUNIT_ASSERT_EQ(test, 0, clk_hw_register_kunit(test, NULL, hw)); 3675 3676 KUNIT_EXPECT_PTR_EQ(test, NULL, clk_hw_get_dev(hw)); 3677 KUNIT_EXPECT_PTR_EQ(test, NULL, clk_hw_get_of_node(hw)); 3678 } 3679 3680 /* 3681 * Test that a clk registered with an of_node returns the node from 3682 * clk_hw_get_of_node() and NULL from clk_hw_get_dev() 3683 */ 3684 static void of_clk_hw_register_node_get_of_node_returns_node(struct kunit *test) 3685 { 3686 struct device_node *np; 3687 struct clk_hw *hw; 3688 3689 hw = kunit_kzalloc(test, sizeof(*hw), GFP_KERNEL); 3690 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 3691 3692 KUNIT_ASSERT_EQ(test, 0, of_overlay_apply_kunit(test, kunit_clk_hw_get_dev_of_node)); 3693 3694 np = of_find_compatible_node(NULL, NULL, "test,clk-hw-get-dev-of-node"); 3695 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); 3696 of_node_put_kunit(test, np); 3697 3698 hw->init = &clk_hw_get_dev_of_node_init_data; 3699 KUNIT_ASSERT_EQ(test, 0, of_clk_hw_register_kunit(test, np, hw)); 3700 3701 KUNIT_EXPECT_PTR_EQ(test, NULL, clk_hw_get_dev(hw)); 3702 KUNIT_EXPECT_PTR_EQ(test, np, clk_hw_get_of_node(hw)); 3703 } 3704 3705 /* 3706 * Test that a clk registered without an of_node returns the node from 3707 * clk_hw_get_of_node() and clk_hw_get_dev() 3708 */ 3709 static void of_clk_hw_register_NULL_get_of_node_returns_NULL(struct kunit *test) 3710 { 3711 struct clk_hw *hw; 3712 3713 hw = kunit_kzalloc(test, sizeof(*hw), GFP_KERNEL); 3714 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hw); 3715 3716 hw->init = &clk_hw_get_dev_of_node_init_data; 3717 KUNIT_ASSERT_EQ(test, 0, of_clk_hw_register_kunit(test, NULL, hw)); 3718 3719 KUNIT_EXPECT_PTR_EQ(test, NULL, clk_hw_get_dev(hw)); 3720 KUNIT_EXPECT_PTR_EQ(test, NULL, clk_hw_get_of_node(hw)); 3721 } 3722 3723 static struct kunit_case clk_hw_get_dev_of_node_test_cases[] = { 3724 KUNIT_CASE(clk_hw_register_dev_get_dev_returns_dev), 3725 KUNIT_CASE(clk_hw_register_dev_no_node_get_dev_returns_dev), 3726 KUNIT_CASE(clk_hw_register_NULL_get_dev_of_node_returns_NULL), 3727 KUNIT_CASE(of_clk_hw_register_node_get_of_node_returns_node), 3728 KUNIT_CASE(of_clk_hw_register_NULL_get_of_node_returns_NULL), 3729 {} 3730 }; 3731 3732 /* 3733 * Test suite to verify clk_hw_get_dev() and clk_hw_get_of_node() when clk 3734 * registered with clk_hw_register() and of_clk_hw_register() 3735 */ 3736 static struct kunit_suite clk_hw_get_dev_of_node_test_suite = { 3737 .name = "clk_hw_get_dev_of_node_test_suite", 3738 .test_cases = clk_hw_get_dev_of_node_test_cases, 3739 }; 3740 3741 3742 kunit_test_suites( 3743 &clk_assigned_rates_suite, 3744 &clk_assigned_sscs_suite, 3745 &clk_hw_get_dev_of_node_test_suite, 3746 &clk_leaf_mux_set_rate_parent_test_suite, 3747 &clk_test_suite, 3748 &clk_multiple_parents_mux_test_suite, 3749 &clk_mux_no_reparent_test_suite, 3750 &clk_mux_notifier_test_suite, 3751 &clk_orphan_transparent_multiple_parent_mux_test_suite, 3752 &clk_orphan_transparent_single_parent_test_suite, 3753 &clk_orphan_two_level_root_last_test_suite, 3754 &clk_range_test_suite, 3755 &clk_range_maximize_test_suite, 3756 &clk_range_minimize_test_suite, 3757 &clk_register_clk_parent_data_of_suite, 3758 &clk_register_clk_parent_data_device_suite, 3759 &clk_single_parent_mux_test_suite, 3760 &clk_uncached_test_suite, 3761 ); 3762 MODULE_DESCRIPTION("Kunit tests for clk framework"); 3763 MODULE_LICENSE("GPL v2"); 3764