sysinfo-uclass.c 2.0 KB

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