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