xref: /openbmc/qemu/tests/qtest/isl_pmbus_vr-test.c (revision 1c0c52f76208c648a70b115fc99ab558008466da)
1 /*
2  * QTests for the ISL_PMBUS digital voltage regulators
3  *
4  * Copyright 2021 Google LLC
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the
8  * Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14  * for more details.
15  */
16 
17 #include "qemu/osdep.h"
18 #include <math.h>
19 #include "hw/i2c/pmbus_device.h"
20 #include "hw/sensor/isl_pmbus_vr.h"
21 #include "libqtest-single.h"
22 #include "libqos/qgraph.h"
23 #include "libqos/i2c.h"
24 #include "qapi/qmp/qdict.h"
25 #include "qapi/qmp/qnum.h"
26 #include "qemu/bitops.h"
27 
28 #define TEST_ID "isl_pmbus_vr-test"
29 #define TEST_ADDR (0x43)
30 
31 static uint16_t qmp_isl_pmbus_vr_get(const char *id, const char *property)
32 {
33     QDict *response;
34     uint64_t ret;
35 
36     response = qmp("{ 'execute': 'qom-get', 'arguments': { 'path': %s, "
37                    "'property': %s } }", id, property);
38     g_assert(qdict_haskey(response, "return"));
39     ret = qnum_get_uint(qobject_to(QNum, qdict_get(response, "return")));
40     qobject_unref(response);
41     return ret;
42 }
43 
44 static void qmp_isl_pmbus_vr_set(const char *id,
45                             const char *property,
46                             uint16_t value)
47 {
48     QDict *response;
49 
50     response = qmp("{ 'execute': 'qom-set', 'arguments': { 'path': %s, "
51                    "'property': %s, 'value': %u } }", id, property, value);
52     g_assert(qdict_haskey(response, "return"));
53     qobject_unref(response);
54 }
55 
56 /* PMBus commands are little endian vs i2c_set16 in i2c.h which is big endian */
57 static uint16_t isl_pmbus_vr_i2c_get16(QI2CDevice *i2cdev, uint8_t reg)
58 {
59     uint8_t resp[2];
60     i2c_read_block(i2cdev, reg, resp, sizeof(resp));
61     return (resp[1] << 8) | resp[0];
62 }
63 
64 /* PMBus commands are little endian vs i2c_set16 in i2c.h which is big endian */
65 static void isl_pmbus_vr_i2c_set16(QI2CDevice *i2cdev, uint8_t reg,
66                                    uint16_t value)
67 {
68     uint8_t data[2];
69 
70     data[0] = value & 255;
71     data[1] = value >> 8;
72     i2c_write_block(i2cdev, reg, data, sizeof(data));
73 }
74 
75 static void test_defaults(void *obj, void *data, QGuestAllocator *alloc)
76 {
77     uint16_t value, i2c_value;
78     QI2CDevice *i2cdev = (QI2CDevice *)obj;
79 
80     value = qmp_isl_pmbus_vr_get(TEST_ID, "vout[0]");
81     g_assert_cmpuint(value, ==, ISL_READ_VOUT_DEFAULT);
82 
83     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT);
84     g_assert_cmpuint(i2c_value, ==, ISL_READ_IOUT_DEFAULT);
85 
86     value = qmp_isl_pmbus_vr_get(TEST_ID, "pout[0]");
87     g_assert_cmpuint(value, ==, ISL_READ_POUT_DEFAULT);
88 
89     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN);
90     g_assert_cmpuint(i2c_value, ==, ISL_READ_VIN_DEFAULT);
91 
92     value = qmp_isl_pmbus_vr_get(TEST_ID, "iin[0]");
93     g_assert_cmpuint(value, ==, ISL_READ_IIN_DEFAULT);
94 
95     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN);
96     g_assert_cmpuint(i2c_value, ==, ISL_READ_PIN_DEFAULT);
97 
98     value = qmp_isl_pmbus_vr_get(TEST_ID, "temp1[0]");
99     g_assert_cmpuint(value, ==, ISL_READ_TEMP_DEFAULT);
100 
101     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2);
102     g_assert_cmpuint(i2c_value, ==, ISL_READ_TEMP_DEFAULT);
103 
104     i2c_value = i2c_get8(i2cdev, PMBUS_CAPABILITY);
105     g_assert_cmphex(i2c_value, ==, ISL_CAPABILITY_DEFAULT);
106 
107     i2c_value = i2c_get8(i2cdev, PMBUS_OPERATION);
108     g_assert_cmphex(i2c_value, ==, ISL_OPERATION_DEFAULT);
109 
110     i2c_value = i2c_get8(i2cdev, PMBUS_ON_OFF_CONFIG);
111     g_assert_cmphex(i2c_value, ==, ISL_ON_OFF_CONFIG_DEFAULT);
112 
113     i2c_value = i2c_get8(i2cdev, PMBUS_VOUT_MODE);
114     g_assert_cmphex(i2c_value, ==, ISL_VOUT_MODE_DEFAULT);
115 
116     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_COMMAND);
117     g_assert_cmphex(i2c_value, ==, ISL_VOUT_COMMAND_DEFAULT);
118 
119     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MAX);
120     g_assert_cmphex(i2c_value, ==, ISL_VOUT_MAX_DEFAULT);
121 
122     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_HIGH);
123     g_assert_cmphex(i2c_value, ==, ISL_VOUT_MARGIN_HIGH_DEFAULT);
124 
125     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_LOW);
126     g_assert_cmphex(i2c_value, ==, ISL_VOUT_MARGIN_LOW_DEFAULT);
127 
128     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRANSITION_RATE);
129     g_assert_cmphex(i2c_value, ==, ISL_VOUT_TRANSITION_RATE_DEFAULT);
130 
131     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT);
132     g_assert_cmphex(i2c_value, ==, ISL_VOUT_OV_FAULT_LIMIT_DEFAULT);
133 
134     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_FAULT_LIMIT);
135     g_assert_cmphex(i2c_value, ==, ISL_OT_FAULT_LIMIT_DEFAULT);
136 
137     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_WARN_LIMIT);
138     g_assert_cmphex(i2c_value, ==, ISL_OT_WARN_LIMIT_DEFAULT);
139 
140     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_OV_WARN_LIMIT);
141     g_assert_cmphex(i2c_value, ==, ISL_VIN_OV_WARN_LIMIT_DEFAULT);
142 
143     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_UV_WARN_LIMIT);
144     g_assert_cmphex(i2c_value, ==, ISL_VIN_UV_WARN_LIMIT_DEFAULT);
145 
146     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT);
147     g_assert_cmphex(i2c_value, ==, ISL_IIN_OC_FAULT_LIMIT_DEFAULT);
148 
149     i2c_value = i2c_get8(i2cdev, PMBUS_REVISION);
150     g_assert_cmphex(i2c_value, ==, ISL_REVISION_DEFAULT);
151 }
152 
153 /* test qmp access */
154 static void test_tx_rx(void *obj, void *data, QGuestAllocator *alloc)
155 {
156     uint16_t i2c_value, value;
157     QI2CDevice *i2cdev = (QI2CDevice *)obj;
158 
159     qmp_isl_pmbus_vr_set(TEST_ID, "vin[0]", 200);
160     value = qmp_isl_pmbus_vr_get(TEST_ID, "vin[0]");
161     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN);
162     g_assert_cmpuint(value, ==, i2c_value);
163 
164     qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 2500);
165     value = qmp_isl_pmbus_vr_get(TEST_ID, "vout[0]");
166     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT);
167     g_assert_cmpuint(value, ==, i2c_value);
168 
169     qmp_isl_pmbus_vr_set(TEST_ID, "iin[0]", 300);
170     value = qmp_isl_pmbus_vr_get(TEST_ID, "iin[0]");
171     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN);
172     g_assert_cmpuint(value, ==, i2c_value);
173 
174     qmp_isl_pmbus_vr_set(TEST_ID, "iout[0]", 310);
175     value = qmp_isl_pmbus_vr_get(TEST_ID, "iout[0]");
176     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT);
177     g_assert_cmpuint(value, ==, i2c_value);
178 
179     qmp_isl_pmbus_vr_set(TEST_ID, "pin[0]", 100);
180     value = qmp_isl_pmbus_vr_get(TEST_ID, "pin[0]");
181     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN);
182     g_assert_cmpuint(value, ==, i2c_value);
183 
184     qmp_isl_pmbus_vr_set(TEST_ID, "pout[0]", 95);
185     value = qmp_isl_pmbus_vr_get(TEST_ID, "pout[0]");
186     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT);
187     g_assert_cmpuint(value, ==, i2c_value);
188 
189     qmp_isl_pmbus_vr_set(TEST_ID, "temp1[0]", 26);
190     value = qmp_isl_pmbus_vr_get(TEST_ID, "temp1[0]");
191     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1);
192     g_assert_cmpuint(value, ==, i2c_value);
193 
194     qmp_isl_pmbus_vr_set(TEST_ID, "temp2[0]", 27);
195     value = qmp_isl_pmbus_vr_get(TEST_ID, "temp2[0]");
196     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2);
197     g_assert_cmpuint(value, ==, i2c_value);
198 
199     qmp_isl_pmbus_vr_set(TEST_ID, "temp3[0]", 28);
200     value = qmp_isl_pmbus_vr_get(TEST_ID, "temp3[0]");
201     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3);
202     g_assert_cmpuint(value, ==, i2c_value);
203 
204 }
205 
206 /* test r/w registers */
207 static void test_rw_regs(void *obj, void *data, QGuestAllocator *alloc)
208 {
209     uint16_t i2c_value;
210     QI2CDevice *i2cdev = (QI2CDevice *)obj;
211 
212     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_COMMAND, 0x1234);
213     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_COMMAND);
214     g_assert_cmphex(i2c_value, ==, 0x1234);
215 
216     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_TRIM, 0x4567);
217     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRIM);
218     g_assert_cmphex(i2c_value, ==, 0x4567);
219 
220     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MAX, 0x9876);
221     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MAX);
222     g_assert_cmphex(i2c_value, ==, 0x9876);
223 
224     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MARGIN_HIGH, 0xABCD);
225     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_HIGH);
226     g_assert_cmphex(i2c_value, ==, 0xABCD);
227 
228     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MARGIN_LOW, 0xA1B2);
229     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MARGIN_LOW);
230     g_assert_cmphex(i2c_value, ==, 0xA1B2);
231 
232     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_TRANSITION_RATE, 0xDEF1);
233     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_TRANSITION_RATE);
234     g_assert_cmphex(i2c_value, ==, 0xDEF1);
235 
236     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_DROOP, 0x5678);
237     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_DROOP);
238     g_assert_cmphex(i2c_value, ==, 0x5678);
239 
240     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_MIN, 0x1234);
241     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_MIN);
242     g_assert_cmphex(i2c_value, ==, 0x1234);
243 
244     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT, 0x2345);
245     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_OV_FAULT_LIMIT);
246     g_assert_cmphex(i2c_value, ==, 0x2345);
247 
248     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_UV_FAULT_LIMIT, 0xFA12);
249     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VOUT_UV_FAULT_LIMIT);
250     g_assert_cmphex(i2c_value, ==, 0xFA12);
251 
252     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_OT_FAULT_LIMIT, 0xF077);
253     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_FAULT_LIMIT);
254     g_assert_cmphex(i2c_value, ==, 0xF077);
255 
256     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_OT_WARN_LIMIT, 0x7137);
257     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_OT_WARN_LIMIT);
258     g_assert_cmphex(i2c_value, ==, 0x7137);
259 
260     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VIN_OV_FAULT_LIMIT, 0x3456);
261     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_OV_FAULT_LIMIT);
262     g_assert_cmphex(i2c_value, ==, 0x3456);
263 
264     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VIN_UV_FAULT_LIMIT, 0xBADA);
265     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_VIN_UV_FAULT_LIMIT);
266     g_assert_cmphex(i2c_value, ==, 0xBADA);
267 
268     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT, 0xB1B0);
269     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_IIN_OC_FAULT_LIMIT);
270     g_assert_cmphex(i2c_value, ==, 0xB1B0);
271 
272     i2c_set8(i2cdev, PMBUS_OPERATION, 0xA);
273     i2c_value = i2c_get8(i2cdev, PMBUS_OPERATION);
274     g_assert_cmphex(i2c_value, ==, 0xA);
275 
276     i2c_set8(i2cdev, PMBUS_ON_OFF_CONFIG, 0x42);
277     i2c_value = i2c_get8(i2cdev, PMBUS_ON_OFF_CONFIG);
278     g_assert_cmphex(i2c_value, ==, 0x42);
279 }
280 
281 /* test that devices with multiple pages can switch between them */
282 static void test_pages_rw(void *obj, void *data, QGuestAllocator *alloc)
283 {
284     uint16_t i2c_value;
285     QI2CDevice *i2cdev = (QI2CDevice *)obj;
286 
287     i2c_set8(i2cdev, PMBUS_PAGE, 1);
288     i2c_value = i2c_get8(i2cdev, PMBUS_PAGE);
289     g_assert_cmphex(i2c_value, ==, 1);
290 
291     i2c_set8(i2cdev, PMBUS_PAGE, 0);
292     i2c_value = i2c_get8(i2cdev, PMBUS_PAGE);
293     g_assert_cmphex(i2c_value, ==, 0);
294 }
295 
296 /* test read-only registers */
297 static void test_ro_regs(void *obj, void *data, QGuestAllocator *alloc)
298 {
299     uint16_t i2c_init_value, i2c_value;
300     QI2CDevice *i2cdev = (QI2CDevice *)obj;
301 
302     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN);
303     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_VIN, 0xBEEF);
304     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VIN);
305     g_assert_cmphex(i2c_init_value, ==, i2c_value);
306 
307     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN);
308     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_IIN, 0xB00F);
309     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IIN);
310     g_assert_cmphex(i2c_init_value, ==, i2c_value);
311 
312     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT);
313     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_VOUT, 0x1234);
314     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_VOUT);
315     g_assert_cmphex(i2c_init_value, ==, i2c_value);
316 
317     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT);
318     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_IOUT, 0x6547);
319     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_IOUT);
320     g_assert_cmphex(i2c_init_value, ==, i2c_value);
321 
322     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1);
323     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_1, 0x1597);
324     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_1);
325     g_assert_cmphex(i2c_init_value, ==, i2c_value);
326 
327     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2);
328     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_2, 0x1897);
329     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_2);
330     g_assert_cmphex(i2c_init_value, ==, i2c_value);
331 
332     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3);
333     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_TEMPERATURE_3, 0x1007);
334     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_TEMPERATURE_3);
335     g_assert_cmphex(i2c_init_value, ==, i2c_value);
336 
337     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN);
338     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_PIN, 0xDEAD);
339     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_PIN);
340     g_assert_cmphex(i2c_init_value, ==, i2c_value);
341 
342     i2c_init_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT);
343     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_READ_POUT, 0xD00D);
344     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_READ_POUT);
345     g_assert_cmphex(i2c_init_value, ==, i2c_value);
346 }
347 
348 /* test voltage fault handling */
349 static void test_voltage_faults(void *obj, void *data, QGuestAllocator *alloc)
350 {
351     uint16_t i2c_value;
352     uint8_t i2c_byte;
353     QI2CDevice *i2cdev = (QI2CDevice *)obj;
354 
355     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_OV_WARN_LIMIT, 5000);
356     qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 5100);
357 
358     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_STATUS_WORD);
359     i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT);
360     g_assert_true((i2c_value & PB_STATUS_VOUT) != 0);
361     g_assert_true((i2c_byte & PB_STATUS_VOUT_OV_WARN) != 0);
362 
363     qmp_isl_pmbus_vr_set(TEST_ID, "vout[0]", 4500);
364     i2c_set8(i2cdev, PMBUS_CLEAR_FAULTS, 0);
365     i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT);
366     g_assert_true((i2c_byte & PB_STATUS_VOUT_OV_WARN) == 0);
367 
368     isl_pmbus_vr_i2c_set16(i2cdev, PMBUS_VOUT_UV_WARN_LIMIT, 4600);
369 
370     i2c_value = isl_pmbus_vr_i2c_get16(i2cdev, PMBUS_STATUS_WORD);
371     i2c_byte = i2c_get8(i2cdev, PMBUS_STATUS_VOUT);
372     g_assert_true((i2c_value & PB_STATUS_VOUT) != 0);
373     g_assert_true((i2c_byte & PB_STATUS_VOUT_UV_WARN) != 0);
374 
375 }
376 
377 static void isl_pmbus_vr_register_nodes(void)
378 {
379     QOSGraphEdgeOptions opts = {
380         .extra_device_opts = "id=" TEST_ID ",address=0x43"
381     };
382     add_qi2c_address(&opts, &(QI2CAddress) { TEST_ADDR });
383 
384     qos_node_create_driver("isl69260", i2c_device_create);
385     qos_node_consumes("isl69260", "i2c-bus", &opts);
386 
387     qos_add_test("test_defaults", "isl69260", test_defaults, NULL);
388     qos_add_test("test_tx_rx", "isl69260", test_tx_rx, NULL);
389     qos_add_test("test_rw_regs", "isl69260", test_rw_regs, NULL);
390     qos_add_test("test_pages_rw", "isl69260", test_pages_rw, NULL);
391     qos_add_test("test_ro_regs", "isl69260", test_ro_regs, NULL);
392     qos_add_test("test_ov_faults", "isl69260", test_voltage_faults, NULL);
393 
394     qos_node_create_driver("raa229004", i2c_device_create);
395     qos_node_consumes("raa229004", "i2c-bus", &opts);
396 
397     qos_add_test("test_tx_rx", "raa229004", test_tx_rx, NULL);
398     qos_add_test("test_rw_regs", "raa229004", test_rw_regs, NULL);
399     qos_add_test("test_pages_rw", "raa229004", test_pages_rw, NULL);
400     qos_add_test("test_ov_faults", "raa229004", test_voltage_faults, NULL);
401 }
402 libqos_init(isl_pmbus_vr_register_nodes);
403