sysinfo-uclass.c 1.9 KB

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