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 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 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 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 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 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 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 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