reset.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2016, NVIDIA CORPORATION.
  4. */
  5. #include <common.h>
  6. #include <dm.h>
  7. #include <dm/device-internal.h>
  8. #include <log.h>
  9. #include <malloc.h>
  10. #include <reset.h>
  11. #include <dm/test.h>
  12. #include <asm/reset.h>
  13. #include <test/test.h>
  14. #include <test/ut.h>
  15. /* This must match the specifier for mbox-names="test" in the DT node */
  16. #define TEST_RESET_ID 2
  17. /* This is the other reset phandle specifier handled by bulk */
  18. #define OTHER_RESET_ID 2
  19. /* Base test of the reset uclass */
  20. static int dm_test_reset_base(struct unit_test_state *uts)
  21. {
  22. struct udevice *dev;
  23. struct reset_ctl reset_method1, reset_method1_1;
  24. struct reset_ctl reset_method2, reset_method2_1;
  25. struct reset_ctl reset_method3, reset_method3_1;
  26. struct reset_ctl reset_method4, reset_method4_1;
  27. /* Get the device using the reset device */
  28. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  29. &dev));
  30. /* Get the same reset port in 2 different ways and compare */
  31. ut_assertok(reset_get_by_index(dev, 0, &reset_method1));
  32. ut_assertok(reset_get_by_name(dev, NULL, &reset_method1_1));
  33. ut_assertok(reset_get_by_index(dev, 1, &reset_method2));
  34. ut_assertok(reset_get_by_index_nodev(dev_ofnode(dev), 1,
  35. &reset_method2_1));
  36. ut_assertok(reset_get_by_index(dev, 2, &reset_method3));
  37. ut_assertok(reset_get_by_index_nodev(dev_ofnode(dev), 2,
  38. &reset_method3_1));
  39. ut_assertok(reset_get_by_index(dev, 3, &reset_method4));
  40. ut_assertok(reset_get_by_index_nodev(dev_ofnode(dev), 3,
  41. &reset_method4_1));
  42. ut_asserteq(reset_method1.id, reset_method1_1.id);
  43. ut_asserteq(reset_method2.id, reset_method2_1.id);
  44. ut_asserteq(reset_method3.id, reset_method3_1.id);
  45. ut_asserteq(reset_method4.id, reset_method4_1.id);
  46. ut_asserteq(true, reset_method1.id != reset_method2.id);
  47. ut_asserteq(true, reset_method1.id != reset_method3.id);
  48. ut_asserteq(true, reset_method1.id != reset_method4.id);
  49. ut_asserteq(true, reset_method2.id != reset_method3.id);
  50. ut_asserteq(true, reset_method2.id != reset_method4.id);
  51. ut_asserteq(true, reset_method3.id != reset_method4.id);
  52. ut_asserteq(true, reset_method1_1.id != reset_method2_1.id);
  53. ut_asserteq(true, reset_method1_1.id != reset_method3_1.id);
  54. ut_asserteq(true, reset_method1_1.id != reset_method4_1.id);
  55. ut_asserteq(true, reset_method2_1.id != reset_method3_1.id);
  56. ut_asserteq(true, reset_method2_1.id != reset_method4_1.id);
  57. ut_asserteq(true, reset_method3_1.id != reset_method4_1.id);
  58. return 0;
  59. }
  60. DM_TEST(dm_test_reset_base, UT_TESTF_SCAN_FDT);
  61. static int dm_test_reset(struct unit_test_state *uts)
  62. {
  63. struct udevice *dev_reset;
  64. struct udevice *dev_test;
  65. ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl",
  66. &dev_reset));
  67. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  68. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  69. &dev_test));
  70. ut_assertok(sandbox_reset_test_get(dev_test));
  71. ut_assertok(sandbox_reset_test_assert(dev_test));
  72. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  73. ut_assertok(sandbox_reset_test_deassert(dev_test));
  74. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  75. ut_asserteq(1, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  76. ut_assertok(sandbox_reset_test_free(dev_test));
  77. ut_asserteq(0, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  78. return 0;
  79. }
  80. DM_TEST(dm_test_reset, UT_TESTF_SCAN_FDT);
  81. static int dm_test_reset_devm(struct unit_test_state *uts)
  82. {
  83. struct udevice *dev_reset;
  84. struct udevice *dev_test;
  85. ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl",
  86. &dev_reset));
  87. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  88. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  89. &dev_test));
  90. ut_assertok(sandbox_reset_test_get_devm(dev_test));
  91. ut_assertok(sandbox_reset_test_assert(dev_test));
  92. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  93. ut_assertok(sandbox_reset_test_deassert(dev_test));
  94. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  95. ut_asserteq(1, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  96. ut_assertok(device_remove(dev_test, DM_REMOVE_NORMAL));
  97. ut_asserteq(0, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  98. return 0;
  99. }
  100. DM_TEST(dm_test_reset_devm, UT_TESTF_SCAN_FDT);
  101. static int dm_test_reset_bulk(struct unit_test_state *uts)
  102. {
  103. struct udevice *dev_reset;
  104. struct udevice *dev_test;
  105. ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl",
  106. &dev_reset));
  107. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  108. ut_asserteq(0, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  109. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  110. &dev_test));
  111. ut_assertok(sandbox_reset_test_get_bulk(dev_test));
  112. ut_assertok(sandbox_reset_test_assert_bulk(dev_test));
  113. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  114. ut_asserteq(1, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  115. ut_assertok(sandbox_reset_test_deassert_bulk(dev_test));
  116. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  117. ut_asserteq(0, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  118. ut_assertok(sandbox_reset_test_release_bulk(dev_test));
  119. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  120. ut_asserteq(1, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  121. return 0;
  122. }
  123. DM_TEST(dm_test_reset_bulk, UT_TESTF_SCAN_FDT);
  124. static int dm_test_reset_bulk_devm(struct unit_test_state *uts)
  125. {
  126. struct udevice *dev_reset;
  127. struct udevice *dev_test;
  128. ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl",
  129. &dev_reset));
  130. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  131. ut_asserteq(0, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  132. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  133. &dev_test));
  134. ut_assertok(sandbox_reset_test_get_bulk_devm(dev_test));
  135. ut_assertok(sandbox_reset_test_assert_bulk(dev_test));
  136. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  137. ut_asserteq(1, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  138. ut_assertok(sandbox_reset_test_deassert_bulk(dev_test));
  139. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  140. ut_asserteq(0, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  141. ut_asserteq(1, sandbox_reset_is_requested(dev_reset, OTHER_RESET_ID));
  142. ut_asserteq(1, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  143. ut_assertok(device_remove(dev_test, DM_REMOVE_NORMAL));
  144. ut_asserteq(0, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  145. ut_asserteq(0, sandbox_reset_is_requested(dev_reset, OTHER_RESET_ID));
  146. return 0;
  147. }
  148. DM_TEST(dm_test_reset_bulk_devm, UT_TESTF_SCAN_FDT);