1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * (C) Copyright 2018
4 * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
5 */
6
7 #include <dm.h>
8 #include <sysinfo.h>
9
10 #include "sandbox.h"
11
12 struct sysinfo_sandbox_priv {
13 bool called_detect;
14 int test_i1;
15 int test_i2;
16 u32 test_data[2];
17 };
18
19 char vacation_spots[][64] = {"R'lyeh", "Dreamlands", "Plateau of Leng",
20 "Carcosa", "Yuggoth", "The Nameless City"};
21
sysinfo_sandbox_detect(struct udevice * dev)22 int sysinfo_sandbox_detect(struct udevice *dev)
23 {
24 struct sysinfo_sandbox_priv *priv = dev_get_priv(dev);
25
26 priv->called_detect = true;
27 priv->test_i2 = 100;
28 priv->test_data[0] = 0xabcdabcd;
29 priv->test_data[1] = 0xdeadbeef;
30
31 return 0;
32 }
33
sysinfo_sandbox_get_bool(struct udevice * dev,int id,bool * val)34 int sysinfo_sandbox_get_bool(struct udevice *dev, int id, bool *val)
35 {
36 struct sysinfo_sandbox_priv *priv = dev_get_priv(dev);
37
38 switch (id) {
39 case BOOL_CALLED_DETECT:
40 /* Checks if the dectect method has been called */
41 *val = priv->called_detect;
42 return 0;
43 }
44
45 return -ENOENT;
46 }
47
sysinfo_sandbox_get_int(struct udevice * dev,int id,int * val)48 int sysinfo_sandbox_get_int(struct udevice *dev, int id, int *val)
49 {
50 struct sysinfo_sandbox_priv *priv = dev_get_priv(dev);
51
52 switch (id) {
53 case INT_TEST1:
54 *val = priv->test_i1;
55 /* Increments with every call */
56 priv->test_i1++;
57 return 0;
58 case INT_TEST2:
59 *val = priv->test_i2;
60 /* Decrements with every call */
61 priv->test_i2--;
62 return 0;
63 }
64
65 return -ENOENT;
66 }
67
sysinfo_sandbox_get_str(struct udevice * dev,int id,size_t size,char * val)68 int sysinfo_sandbox_get_str(struct udevice *dev, int id, size_t size, char *val)
69 {
70 struct sysinfo_sandbox_priv *priv = dev_get_priv(dev);
71 int i1 = priv->test_i1;
72 int i2 = priv->test_i2;
73 int index = (i1 * i2) % ARRAY_SIZE(vacation_spots);
74
75 switch (id) {
76 case STR_VACATIONSPOT:
77 /* Picks a vacation spot depending on i1 and i2 */
78 snprintf(val, size, vacation_spots[index]);
79 return 0;
80 }
81
82 return -ENOENT;
83 }
84
sysinfo_sandbox_get_data(struct udevice * dev,int id,void ** buf,size_t * size)85 int sysinfo_sandbox_get_data(struct udevice *dev, int id, void **buf,
86 size_t *size)
87 {
88 struct sysinfo_sandbox_priv *priv = dev_get_priv(dev);
89
90 switch (id) {
91 case DATA_TEST:
92 *buf = priv->test_data;
93 *size = sizeof(priv->test_data);
94 return 0;
95 }
96
97 return -ENOENT;
98 }
99
100 static const struct udevice_id sysinfo_sandbox_ids[] = {
101 { .compatible = "sandbox,sysinfo-sandbox" },
102 { /* sentinel */ }
103 };
104
105 static const struct sysinfo_ops sysinfo_sandbox_ops = {
106 .detect = sysinfo_sandbox_detect,
107 .get_bool = sysinfo_sandbox_get_bool,
108 .get_int = sysinfo_sandbox_get_int,
109 .get_str = sysinfo_sandbox_get_str,
110 .get_data = sysinfo_sandbox_get_data,
111 };
112
sysinfo_sandbox_probe(struct udevice * dev)113 int sysinfo_sandbox_probe(struct udevice *dev)
114 {
115 return 0;
116 }
117
118 U_BOOT_DRIVER(sysinfo_sandbox) = {
119 .name = "sysinfo_sandbox",
120 .id = UCLASS_SYSINFO,
121 .of_match = sysinfo_sandbox_ids,
122 .ops = &sysinfo_sandbox_ops,
123 .priv_auto = sizeof(struct sysinfo_sandbox_priv),
124 .probe = sysinfo_sandbox_probe,
125 };
126