reset.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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_index_nodev(dev_ofnode(dev), 0,
  33. &reset_method1_1));
  34. ut_assertok(reset_get_by_index(dev, 1, &reset_method2));
  35. ut_assertok(reset_get_by_index_nodev(dev_ofnode(dev), 1,
  36. &reset_method2_1));
  37. ut_assertok(reset_get_by_index(dev, 2, &reset_method3));
  38. ut_assertok(reset_get_by_index_nodev(dev_ofnode(dev), 2,
  39. &reset_method3_1));
  40. ut_assertok(reset_get_by_index(dev, 3, &reset_method4));
  41. ut_assertok(reset_get_by_index_nodev(dev_ofnode(dev), 3,
  42. &reset_method4_1));
  43. ut_asserteq(reset_method1.id, reset_method1_1.id);
  44. ut_asserteq(reset_method2.id, reset_method2_1.id);
  45. ut_asserteq(reset_method3.id, reset_method3_1.id);
  46. ut_asserteq(reset_method4.id, reset_method4_1.id);
  47. ut_asserteq(true, reset_method1.id != reset_method2.id);
  48. ut_asserteq(true, reset_method1.id != reset_method3.id);
  49. ut_asserteq(true, reset_method1.id != reset_method4.id);
  50. ut_asserteq(true, reset_method2.id != reset_method3.id);
  51. ut_asserteq(true, reset_method2.id != reset_method4.id);
  52. ut_asserteq(true, reset_method3.id != reset_method4.id);
  53. ut_asserteq(true, reset_method1_1.id != reset_method2_1.id);
  54. ut_asserteq(true, reset_method1_1.id != reset_method3_1.id);
  55. ut_asserteq(true, reset_method1_1.id != reset_method4_1.id);
  56. ut_asserteq(true, reset_method2_1.id != reset_method3_1.id);
  57. ut_asserteq(true, reset_method2_1.id != reset_method4_1.id);
  58. ut_asserteq(true, reset_method3_1.id != reset_method4_1.id);
  59. return 0;
  60. }
  61. DM_TEST(dm_test_reset_base, UT_TESTF_SCAN_FDT);
  62. static int dm_test_reset(struct unit_test_state *uts)
  63. {
  64. struct udevice *dev_reset;
  65. struct udevice *dev_test;
  66. ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl",
  67. &dev_reset));
  68. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  69. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  70. &dev_test));
  71. ut_assertok(sandbox_reset_test_get(dev_test));
  72. ut_assertok(sandbox_reset_test_assert(dev_test));
  73. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  74. ut_assertok(sandbox_reset_test_deassert(dev_test));
  75. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  76. ut_asserteq(1, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  77. ut_assertok(sandbox_reset_test_free(dev_test));
  78. ut_asserteq(0, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  79. return 0;
  80. }
  81. DM_TEST(dm_test_reset, UT_TESTF_SCAN_FDT);
  82. static int dm_test_reset_devm(struct unit_test_state *uts)
  83. {
  84. struct udevice *dev_reset;
  85. struct udevice *dev_test;
  86. ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl",
  87. &dev_reset));
  88. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  89. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  90. &dev_test));
  91. ut_assertok(sandbox_reset_test_get_devm(dev_test));
  92. ut_assertok(sandbox_reset_test_assert(dev_test));
  93. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  94. ut_assertok(sandbox_reset_test_deassert(dev_test));
  95. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  96. ut_asserteq(1, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  97. ut_assertok(device_remove(dev_test, DM_REMOVE_NORMAL));
  98. ut_asserteq(0, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  99. return 0;
  100. }
  101. DM_TEST(dm_test_reset_devm, UT_TESTF_SCAN_FDT);
  102. static int dm_test_reset_bulk(struct unit_test_state *uts)
  103. {
  104. struct udevice *dev_reset;
  105. struct udevice *dev_test;
  106. ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl",
  107. &dev_reset));
  108. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  109. ut_asserteq(0, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  110. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  111. &dev_test));
  112. ut_assertok(sandbox_reset_test_get_bulk(dev_test));
  113. ut_assertok(sandbox_reset_test_assert_bulk(dev_test));
  114. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  115. ut_asserteq(1, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  116. ut_assertok(sandbox_reset_test_deassert_bulk(dev_test));
  117. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  118. ut_asserteq(0, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  119. ut_assertok(sandbox_reset_test_release_bulk(dev_test));
  120. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  121. ut_asserteq(1, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  122. return 0;
  123. }
  124. DM_TEST(dm_test_reset_bulk, UT_TESTF_SCAN_FDT);
  125. static int dm_test_reset_bulk_devm(struct unit_test_state *uts)
  126. {
  127. struct udevice *dev_reset;
  128. struct udevice *dev_test;
  129. ut_assertok(uclass_get_device_by_name(UCLASS_RESET, "reset-ctl",
  130. &dev_reset));
  131. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  132. ut_asserteq(0, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  133. ut_assertok(uclass_get_device_by_name(UCLASS_MISC, "reset-ctl-test",
  134. &dev_test));
  135. ut_assertok(sandbox_reset_test_get_bulk_devm(dev_test));
  136. ut_assertok(sandbox_reset_test_assert_bulk(dev_test));
  137. ut_asserteq(1, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  138. ut_asserteq(1, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  139. ut_assertok(sandbox_reset_test_deassert_bulk(dev_test));
  140. ut_asserteq(0, sandbox_reset_query(dev_reset, TEST_RESET_ID));
  141. ut_asserteq(0, sandbox_reset_query(dev_reset, OTHER_RESET_ID));
  142. ut_asserteq(1, sandbox_reset_is_requested(dev_reset, OTHER_RESET_ID));
  143. ut_asserteq(1, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  144. ut_assertok(device_remove(dev_test, DM_REMOVE_NORMAL));
  145. ut_asserteq(0, sandbox_reset_is_requested(dev_reset, TEST_RESET_ID));
  146. ut_asserteq(0, sandbox_reset_is_requested(dev_reset, OTHER_RESET_ID));
  147. return 0;
  148. }
  149. DM_TEST(dm_test_reset_bulk_devm, UT_TESTF_SCAN_FDT);