blob: af54fe8759634c990d1459195702d833299127be [file] [log] [blame]
Simon Glass458b66a2020-11-05 06:32:05 -07001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * (C) Copyright 2018
4 * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
5 */
6
Simon Glass458b66a2020-11-05 06:32:05 -07007#include <dm.h>
8#include <sysinfo.h>
9
10#include "sandbox.h"
11
12struct sysinfo_sandbox_priv {
13 bool called_detect;
14 int test_i1;
15 int test_i2;
Raymond Mao592e3332024-12-06 14:54:20 -080016 u32 test_data[2];
Simon Glass458b66a2020-11-05 06:32:05 -070017};
18
19char vacation_spots[][64] = {"R'lyeh", "Dreamlands", "Plateau of Leng",
20 "Carcosa", "Yuggoth", "The Nameless City"};
21
22int 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;
Raymond Mao592e3332024-12-06 14:54:20 -080028 priv->test_data[0] = 0xabcdabcd;
29 priv->test_data[1] = 0xdeadbeef;
Simon Glass458b66a2020-11-05 06:32:05 -070030
31 return 0;
32}
33
34int 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
48int 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
68int 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
Raymond Mao592e3332024-12-06 14:54:20 -080085int 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
Simon Glass458b66a2020-11-05 06:32:05 -0700100static const struct udevice_id sysinfo_sandbox_ids[] = {
101 { .compatible = "sandbox,sysinfo-sandbox" },
102 { /* sentinel */ }
103};
104
105static 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,
Raymond Mao592e3332024-12-06 14:54:20 -0800110 .get_data = sysinfo_sandbox_get_data,
Simon Glass458b66a2020-11-05 06:32:05 -0700111};
112
113int sysinfo_sandbox_probe(struct udevice *dev)
114{
115 return 0;
116}
117
118U_BOOT_DRIVER(sysinfo_sandbox) = {
119 .name = "sysinfo_sandbox",
120 .id = UCLASS_SYSINFO,
121 .of_match = sysinfo_sandbox_ids,
122 .ops = &sysinfo_sandbox_ops,
Simon Glass8a2b47f2020-12-03 16:55:17 -0700123 .priv_auto = sizeof(struct sysinfo_sandbox_priv),
Simon Glass458b66a2020-11-05 06:32:05 -0700124 .probe = sysinfo_sandbox_probe,
125};