1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * (C) Copyright 2017
4 * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
5 */
6
7 #include <common.h>
8 #include <dm.h>
9 #include <sysinfo.h>
10
11 struct sysinfo_priv {
12 bool detected;
13 };
14
sysinfo_get(struct udevice ** devp)15 int sysinfo_get(struct udevice **devp)
16 {
17 return uclass_first_device_err(UCLASS_SYSINFO, devp);
18 }
19
sysinfo_detect(struct udevice * dev)20 int sysinfo_detect(struct udevice *dev)
21 {
22 int ret;
23 struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
24 struct sysinfo_ops *ops = sysinfo_get_ops(dev);
25
26 if (!ops->detect)
27 return -ENOSYS;
28
29 ret = ops->detect(dev);
30 if (!ret)
31 priv->detected = true;
32
33 return ret;
34 }
35
sysinfo_get_fit_loadable(struct udevice * dev,int index,const char * type,const char ** strp)36 int sysinfo_get_fit_loadable(struct udevice *dev, int index, const char *type,
37 const char **strp)
38 {
39 struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
40 struct sysinfo_ops *ops = sysinfo_get_ops(dev);
41
42 if (!priv->detected)
43 return -EPERM;
44
45 if (!ops->get_fit_loadable)
46 return -ENOSYS;
47
48 return ops->get_fit_loadable(dev, index, type, strp);
49 }
50
sysinfo_get_bool(struct udevice * dev,int id,bool * val)51 int sysinfo_get_bool(struct udevice *dev, int id, bool *val)
52 {
53 struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
54 struct sysinfo_ops *ops = sysinfo_get_ops(dev);
55
56 if (!priv->detected)
57 return -EPERM;
58
59 if (!ops->get_bool)
60 return -ENOSYS;
61
62 return ops->get_bool(dev, id, val);
63 }
64
sysinfo_get_int(struct udevice * dev,int id,int * val)65 int sysinfo_get_int(struct udevice *dev, int id, int *val)
66 {
67 struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
68 struct sysinfo_ops *ops = sysinfo_get_ops(dev);
69
70 if (!priv->detected)
71 return -EPERM;
72
73 if (!ops->get_int)
74 return -ENOSYS;
75
76 return ops->get_int(dev, id, val);
77 }
78
sysinfo_get_str(struct udevice * dev,int id,size_t size,char * val)79 int sysinfo_get_str(struct udevice *dev, int id, size_t size, char *val)
80 {
81 struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
82 struct sysinfo_ops *ops = sysinfo_get_ops(dev);
83
84 if (!priv->detected)
85 return -EPERM;
86
87 if (!ops->get_str)
88 return -ENOSYS;
89
90 return ops->get_str(dev, id, size, val);
91 }
92
93 UCLASS_DRIVER(sysinfo) = {
94 .id = UCLASS_SYSINFO,
95 .name = "sysinfo",
96 .post_bind = dm_scan_fdt_dev,
97 .per_device_auto = sizeof(bool),
98 };
99