183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2e8f339e0SPrzemyslaw Marczak /*
3e8f339e0SPrzemyslaw Marczak * Tests for the driver model pmic API
4e8f339e0SPrzemyslaw Marczak *
5e8f339e0SPrzemyslaw Marczak * Copyright (c) 2015 Samsung Electronics
6e8f339e0SPrzemyslaw Marczak * Przemyslaw Marczak <p.marczak@samsung.com>
7e8f339e0SPrzemyslaw Marczak */
8e8f339e0SPrzemyslaw Marczak
9e8f339e0SPrzemyslaw Marczak #include <common.h>
10e8f339e0SPrzemyslaw Marczak #include <errno.h>
11e8f339e0SPrzemyslaw Marczak #include <dm.h>
12e8f339e0SPrzemyslaw Marczak #include <fdtdec.h>
13e8f339e0SPrzemyslaw Marczak #include <malloc.h>
14e8f339e0SPrzemyslaw Marczak #include <dm/device-internal.h>
15e8f339e0SPrzemyslaw Marczak #include <dm/root.h>
16e8f339e0SPrzemyslaw Marczak #include <dm/util.h>
17e8f339e0SPrzemyslaw Marczak #include <dm/test.h>
18e8f339e0SPrzemyslaw Marczak #include <dm/uclass-internal.h>
19e8f339e0SPrzemyslaw Marczak #include <power/pmic.h>
20e8f339e0SPrzemyslaw Marczak #include <power/sandbox_pmic.h>
21e721b882SJoe Hershberger #include <test/ut.h>
22*3edf9ebeSLukasz Majewski #include <fsl_pmic.h>
23e8f339e0SPrzemyslaw Marczak
24e8f339e0SPrzemyslaw Marczak /* Test PMIC get method */
25e4aab0e1SLukasz Majewski
power_pmic_get(struct unit_test_state * uts,char * name)26e4aab0e1SLukasz Majewski static inline int power_pmic_get(struct unit_test_state *uts, char *name)
27e8f339e0SPrzemyslaw Marczak {
28e8f339e0SPrzemyslaw Marczak struct udevice *dev;
29e8f339e0SPrzemyslaw Marczak
30e8f339e0SPrzemyslaw Marczak ut_assertok(pmic_get(name, &dev));
31e8f339e0SPrzemyslaw Marczak ut_assertnonnull(dev);
32e8f339e0SPrzemyslaw Marczak
33e8f339e0SPrzemyslaw Marczak /* Check PMIC's name */
34e8f339e0SPrzemyslaw Marczak ut_asserteq_str(name, dev->name);
35e8f339e0SPrzemyslaw Marczak
36e8f339e0SPrzemyslaw Marczak return 0;
37e8f339e0SPrzemyslaw Marczak }
38e4aab0e1SLukasz Majewski
39e4aab0e1SLukasz Majewski /* Test PMIC get method */
dm_test_power_pmic_get(struct unit_test_state * uts)40e4aab0e1SLukasz Majewski static int dm_test_power_pmic_get(struct unit_test_state *uts)
41e4aab0e1SLukasz Majewski {
42e4aab0e1SLukasz Majewski power_pmic_get(uts, "sandbox_pmic");
43e4aab0e1SLukasz Majewski
44e4aab0e1SLukasz Majewski return 0;
45e4aab0e1SLukasz Majewski }
46e8f339e0SPrzemyslaw Marczak DM_TEST(dm_test_power_pmic_get, DM_TESTF_SCAN_FDT);
47e8f339e0SPrzemyslaw Marczak
48*3edf9ebeSLukasz Majewski /* PMIC get method - MC34708 - for 3 bytes transmission */
dm_test_power_pmic_mc34708_get(struct unit_test_state * uts)49*3edf9ebeSLukasz Majewski static int dm_test_power_pmic_mc34708_get(struct unit_test_state *uts)
50*3edf9ebeSLukasz Majewski {
51*3edf9ebeSLukasz Majewski power_pmic_get(uts, "pmic@41");
52*3edf9ebeSLukasz Majewski
53*3edf9ebeSLukasz Majewski return 0;
54*3edf9ebeSLukasz Majewski }
55*3edf9ebeSLukasz Majewski
56*3edf9ebeSLukasz Majewski DM_TEST(dm_test_power_pmic_mc34708_get, DM_TESTF_SCAN_FDT);
57*3edf9ebeSLukasz Majewski
58e8f339e0SPrzemyslaw Marczak /* Test PMIC I/O */
dm_test_power_pmic_io(struct unit_test_state * uts)59e721b882SJoe Hershberger static int dm_test_power_pmic_io(struct unit_test_state *uts)
60e8f339e0SPrzemyslaw Marczak {
61e8f339e0SPrzemyslaw Marczak const char *name = "sandbox_pmic";
62e8f339e0SPrzemyslaw Marczak uint8_t out_buffer, in_buffer;
63e8f339e0SPrzemyslaw Marczak struct udevice *dev;
64e8f339e0SPrzemyslaw Marczak int reg_count, i;
65e8f339e0SPrzemyslaw Marczak
66e8f339e0SPrzemyslaw Marczak ut_assertok(pmic_get(name, &dev));
67e8f339e0SPrzemyslaw Marczak
68e8f339e0SPrzemyslaw Marczak reg_count = pmic_reg_count(dev);
69e8f339e0SPrzemyslaw Marczak ut_asserteq(reg_count, SANDBOX_PMIC_REG_COUNT);
70e8f339e0SPrzemyslaw Marczak
71e8f339e0SPrzemyslaw Marczak /*
72e8f339e0SPrzemyslaw Marczak * Test PMIC I/O - write and read a loop counter.
73e8f339e0SPrzemyslaw Marczak * usually we can't write to all PMIC's registers in the real hardware,
74e8f339e0SPrzemyslaw Marczak * but we can to the sandbox pmic.
75e8f339e0SPrzemyslaw Marczak */
76e8f339e0SPrzemyslaw Marczak for (i = 0; i < reg_count; i++) {
77e8f339e0SPrzemyslaw Marczak out_buffer = i;
78e8f339e0SPrzemyslaw Marczak ut_assertok(pmic_write(dev, i, &out_buffer, 1));
79e8f339e0SPrzemyslaw Marczak ut_assertok(pmic_read(dev, i, &in_buffer, 1));
80e8f339e0SPrzemyslaw Marczak ut_asserteq(out_buffer, in_buffer);
81e8f339e0SPrzemyslaw Marczak }
82e8f339e0SPrzemyslaw Marczak
83e8f339e0SPrzemyslaw Marczak return 0;
84e8f339e0SPrzemyslaw Marczak }
85e8f339e0SPrzemyslaw Marczak DM_TEST(dm_test_power_pmic_io, DM_TESTF_SCAN_FDT);
86*3edf9ebeSLukasz Majewski
87*3edf9ebeSLukasz Majewski #define MC34708_PMIC_REG_COUNT 64
88*3edf9ebeSLukasz Majewski #define MC34708_PMIC_TEST_VAL 0x125534
dm_test_power_pmic_mc34708_regs_check(struct unit_test_state * uts)89*3edf9ebeSLukasz Majewski static int dm_test_power_pmic_mc34708_regs_check(struct unit_test_state *uts)
90*3edf9ebeSLukasz Majewski {
91*3edf9ebeSLukasz Majewski struct udevice *dev;
92*3edf9ebeSLukasz Majewski int reg_count;
93*3edf9ebeSLukasz Majewski
94*3edf9ebeSLukasz Majewski ut_assertok(pmic_get("pmic@41", &dev));
95*3edf9ebeSLukasz Majewski
96*3edf9ebeSLukasz Majewski /* Check number of PMIC registers */
97*3edf9ebeSLukasz Majewski reg_count = pmic_reg_count(dev);
98*3edf9ebeSLukasz Majewski ut_asserteq(reg_count, MC34708_PMIC_REG_COUNT);
99*3edf9ebeSLukasz Majewski
100*3edf9ebeSLukasz Majewski return 0;
101*3edf9ebeSLukasz Majewski }
102*3edf9ebeSLukasz Majewski
103*3edf9ebeSLukasz Majewski DM_TEST(dm_test_power_pmic_mc34708_regs_check, DM_TESTF_SCAN_FDT);
104*3edf9ebeSLukasz Majewski
dm_test_power_pmic_mc34708_rw_val(struct unit_test_state * uts)105*3edf9ebeSLukasz Majewski static int dm_test_power_pmic_mc34708_rw_val(struct unit_test_state *uts)
106*3edf9ebeSLukasz Majewski {
107*3edf9ebeSLukasz Majewski struct udevice *dev;
108*3edf9ebeSLukasz Majewski int val;
109*3edf9ebeSLukasz Majewski
110*3edf9ebeSLukasz Majewski ut_assertok(pmic_get("pmic@41", &dev));
111*3edf9ebeSLukasz Majewski
112*3edf9ebeSLukasz Majewski /* Check if single 3 byte read is successful */
113*3edf9ebeSLukasz Majewski val = pmic_reg_read(dev, REG_POWER_CTL2);
114*3edf9ebeSLukasz Majewski ut_asserteq(val, 0x422100);
115*3edf9ebeSLukasz Majewski
116*3edf9ebeSLukasz Majewski /* Check if RW works */
117*3edf9ebeSLukasz Majewski val = 0;
118*3edf9ebeSLukasz Majewski ut_assertok(pmic_reg_write(dev, REG_RTC_TIME, val));
119*3edf9ebeSLukasz Majewski ut_assertok(pmic_reg_write(dev, REG_RTC_TIME, MC34708_PMIC_TEST_VAL));
120*3edf9ebeSLukasz Majewski val = pmic_reg_read(dev, REG_RTC_TIME);
121*3edf9ebeSLukasz Majewski ut_asserteq(val, MC34708_PMIC_TEST_VAL);
122*3edf9ebeSLukasz Majewski
123*3edf9ebeSLukasz Majewski pmic_clrsetbits(dev, REG_POWER_CTL2, 0x3 << 8, 1 << 9);
124*3edf9ebeSLukasz Majewski val = pmic_reg_read(dev, REG_POWER_CTL2);
125*3edf9ebeSLukasz Majewski ut_asserteq(val, (0x422100 & ~(0x3 << 8)) | (1 << 9));
126*3edf9ebeSLukasz Majewski
127*3edf9ebeSLukasz Majewski return 0;
128*3edf9ebeSLukasz Majewski }
129*3edf9ebeSLukasz Majewski
130*3edf9ebeSLukasz Majewski DM_TEST(dm_test_power_pmic_mc34708_rw_val, DM_TESTF_SCAN_FDT);
131