adc.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Tests for the driver model ADC API
  4. *
  5. * Copyright (c) 2015 Samsung Electronics
  6. * Przemyslaw Marczak <p.marczak@samsung.com>
  7. */
  8. #include <common.h>
  9. #include <adc.h>
  10. #include <dm.h>
  11. #include <dm/root.h>
  12. #include <dm/util.h>
  13. #include <dm/test.h>
  14. #include <errno.h>
  15. #include <fdtdec.h>
  16. #include <power/regulator.h>
  17. #include <power/sandbox_pmic.h>
  18. #include <sandbox-adc.h>
  19. #include <test/ut.h>
  20. static int dm_test_adc_bind(struct unit_test_state *uts)
  21. {
  22. struct udevice *dev;
  23. ut_assertok(uclass_get_device_by_name(UCLASS_ADC, "adc", &dev));
  24. ut_asserteq_str(SANDBOX_ADC_DEVNAME, dev->name);
  25. return 0;
  26. }
  27. DM_TEST(dm_test_adc_bind, DM_TESTF_SCAN_FDT);
  28. static int dm_test_adc_wrong_channel_selection(struct unit_test_state *uts)
  29. {
  30. struct udevice *dev;
  31. ut_assertok(uclass_get_device_by_name(UCLASS_ADC, "adc", &dev));
  32. ut_asserteq(-EINVAL, adc_start_channel(dev, SANDBOX_ADC_CHANNELS));
  33. return 0;
  34. }
  35. DM_TEST(dm_test_adc_wrong_channel_selection, DM_TESTF_SCAN_FDT);
  36. static int dm_test_adc_supply(struct unit_test_state *uts)
  37. {
  38. struct udevice *supply;
  39. struct udevice *dev;
  40. int uV;
  41. ut_assertok(uclass_get_device_by_name(UCLASS_ADC, "adc", &dev));
  42. /* Test Vss value - predefined 0 uV */
  43. ut_assertok(adc_vss_value(dev, &uV));
  44. ut_asserteq(SANDBOX_ADC_VSS_VALUE, uV);
  45. /* Test Vdd initial value - buck2 */
  46. ut_assertok(adc_vdd_value(dev, &uV));
  47. ut_asserteq(SANDBOX_BUCK2_INITIAL_EXPECTED_UV, uV);
  48. /* Change Vdd value - buck2 manual preset */
  49. ut_assertok(regulator_get_by_devname(SANDBOX_BUCK2_DEVNAME, &supply));
  50. ut_assertok(regulator_set_value(supply, SANDBOX_BUCK2_SET_UV));
  51. ut_asserteq(SANDBOX_BUCK2_SET_UV, regulator_get_value(supply));
  52. /* Update ADC platdata and get new Vdd value */
  53. ut_assertok(adc_vdd_value(dev, &uV));
  54. ut_asserteq(SANDBOX_BUCK2_SET_UV, uV);
  55. /* Disable buck2 and test ADC supply enable function */
  56. ut_assertok(regulator_set_enable(supply, false));
  57. ut_asserteq(false, regulator_get_enable(supply));
  58. /* adc_start_channel() should enable the supply regulator */
  59. ut_assertok(adc_start_channel(dev, 0));
  60. ut_asserteq(true, regulator_get_enable(supply));
  61. return 0;
  62. }
  63. DM_TEST(dm_test_adc_supply, DM_TESTF_SCAN_FDT);
  64. struct adc_channel adc_channel_test_data[] = {
  65. { 0, SANDBOX_ADC_CHANNEL0_DATA },
  66. { 1, SANDBOX_ADC_CHANNEL1_DATA },
  67. { 2, SANDBOX_ADC_CHANNEL2_DATA },
  68. { 3, SANDBOX_ADC_CHANNEL3_DATA },
  69. };
  70. static int dm_test_adc_single_channel_conversion(struct unit_test_state *uts)
  71. {
  72. struct adc_channel *tdata = adc_channel_test_data;
  73. unsigned int i, data;
  74. struct udevice *dev;
  75. ut_assertok(uclass_get_device_by_name(UCLASS_ADC, "adc", &dev));
  76. /* Test each ADC channel's value */
  77. for (i = 0; i < SANDBOX_ADC_CHANNELS; i++, tdata++) {
  78. ut_assertok(adc_start_channel(dev, tdata->id));
  79. ut_assertok(adc_channel_data(dev, tdata->id, &data));
  80. ut_asserteq(tdata->data, data);
  81. }
  82. return 0;
  83. }
  84. DM_TEST(dm_test_adc_single_channel_conversion, DM_TESTF_SCAN_FDT);
  85. static int dm_test_adc_multi_channel_conversion(struct unit_test_state *uts)
  86. {
  87. struct adc_channel channels[SANDBOX_ADC_CHANNELS];
  88. struct udevice *dev;
  89. struct adc_channel *tdata = adc_channel_test_data;
  90. unsigned int i, channel_mask;
  91. channel_mask = ADC_CHANNEL(0) | ADC_CHANNEL(1) |
  92. ADC_CHANNEL(2) | ADC_CHANNEL(3);
  93. /* Start multi channel conversion */
  94. ut_assertok(uclass_get_device_by_name(UCLASS_ADC, "adc", &dev));
  95. ut_assertok(adc_start_channels(dev, channel_mask));
  96. ut_assertok(adc_channels_data(dev, channel_mask, channels));
  97. /* Compare the expected and returned conversion data. */
  98. for (i = 0; i < SANDBOX_ADC_CHANNELS; i++, tdata++)
  99. ut_asserteq(tdata->data, channels[i].data);
  100. return 0;
  101. }
  102. DM_TEST(dm_test_adc_multi_channel_conversion, DM_TESTF_SCAN_FDT);
  103. static int dm_test_adc_single_channel_shot(struct unit_test_state *uts)
  104. {
  105. struct adc_channel *tdata = adc_channel_test_data;
  106. unsigned int i, data;
  107. for (i = 0; i < SANDBOX_ADC_CHANNELS; i++, tdata++) {
  108. /* Start single channel conversion */
  109. ut_assertok(adc_channel_single_shot("adc", tdata->id, &data));
  110. /* Compare the expected and returned conversion data. */
  111. ut_asserteq(tdata->data, data);
  112. }
  113. return 0;
  114. }
  115. DM_TEST(dm_test_adc_single_channel_shot, DM_TESTF_SCAN_FDT);
  116. static int dm_test_adc_multi_channel_shot(struct unit_test_state *uts)
  117. {
  118. struct adc_channel channels[SANDBOX_ADC_CHANNELS];
  119. struct adc_channel *tdata = adc_channel_test_data;
  120. unsigned int i, channel_mask;
  121. channel_mask = ADC_CHANNEL(0) | ADC_CHANNEL(1) |
  122. ADC_CHANNEL(2) | ADC_CHANNEL(3);
  123. /* Start single call and multi channel conversion */
  124. ut_assertok(adc_channels_single_shot("adc", channel_mask, channels));
  125. /* Compare the expected and returned conversion data. */
  126. for (i = 0; i < SANDBOX_ADC_CHANNELS; i++, tdata++)
  127. ut_asserteq(tdata->data, channels[i].data);
  128. return 0;
  129. }
  130. DM_TEST(dm_test_adc_multi_channel_shot, DM_TESTF_SCAN_FDT);