sysinfo-uclass.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. int ret = uclass_first_device_err(UCLASS_SYSINFO, devp);
  16. /*
  17. * There is some very dodgy error handling in gazerbeam,
  18. * do not return a device on error.
  19. */
  20. if (ret)
  21. *devp = NULL;
  22. return ret;
  23. }
  24. int sysinfo_detect(struct udevice *dev)
  25. {
  26. int ret;
  27. struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
  28. struct sysinfo_ops *ops = sysinfo_get_ops(dev);
  29. if (!ops->detect)
  30. return -ENOSYS;
  31. ret = ops->detect(dev);
  32. if (!ret)
  33. priv->detected = true;
  34. return ret;
  35. }
  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. if (!priv->detected)
  42. return -EPERM;
  43. if (!ops->get_fit_loadable)
  44. return -ENOSYS;
  45. return ops->get_fit_loadable(dev, index, type, strp);
  46. }
  47. int sysinfo_get_bool(struct udevice *dev, int id, bool *val)
  48. {
  49. struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
  50. struct sysinfo_ops *ops = sysinfo_get_ops(dev);
  51. if (!priv->detected)
  52. return -EPERM;
  53. if (!ops->get_bool)
  54. return -ENOSYS;
  55. return ops->get_bool(dev, id, val);
  56. }
  57. int sysinfo_get_int(struct udevice *dev, int id, int *val)
  58. {
  59. struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
  60. struct sysinfo_ops *ops = sysinfo_get_ops(dev);
  61. if (!priv->detected)
  62. return -EPERM;
  63. if (!ops->get_int)
  64. return -ENOSYS;
  65. return ops->get_int(dev, id, val);
  66. }
  67. int sysinfo_get_str(struct udevice *dev, int id, size_t size, char *val)
  68. {
  69. struct sysinfo_priv *priv = dev_get_uclass_priv(dev);
  70. struct sysinfo_ops *ops = sysinfo_get_ops(dev);
  71. if (!priv->detected)
  72. return -EPERM;
  73. if (!ops->get_str)
  74. return -ENOSYS;
  75. return ops->get_str(dev, id, size, val);
  76. }
  77. UCLASS_DRIVER(sysinfo) = {
  78. .id = UCLASS_SYSINFO,
  79. .name = "sysinfo",
  80. .post_bind = dm_scan_fdt_dev,
  81. .per_device_auto = sizeof(bool),
  82. };