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