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