reset-uclass.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * Copyright (C) 2015 Google, Inc
  3. * Written by Simon Glass <sjg@chromium.org>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <reset.h>
  9. #include <dm.h>
  10. #include <errno.h>
  11. #include <regmap.h>
  12. #include <dm/device-internal.h>
  13. #include <dm/lists.h>
  14. #include <dm/root.h>
  15. #include <linux/err.h>
  16. int reset_request(struct udevice *dev, enum reset_t type)
  17. {
  18. struct reset_ops *ops = reset_get_ops(dev);
  19. if (!ops->request)
  20. return -ENOSYS;
  21. return ops->request(dev, type);
  22. }
  23. void reset_walk(enum reset_t type)
  24. {
  25. struct udevice *dev;
  26. int ret = 0;
  27. while (ret != -EINPROGRESS && type < RESET_COUNT) {
  28. for (uclass_first_device(UCLASS_RESET, &dev);
  29. dev;
  30. uclass_next_device(&dev)) {
  31. ret = reset_request(dev, type);
  32. if (ret == -EINPROGRESS)
  33. break;
  34. }
  35. }
  36. /* Wait for the reset to take effect */
  37. mdelay(100);
  38. /* Still no reset? Give up */
  39. printf("Reset not supported on this platform\n");
  40. hang();
  41. }
  42. /**
  43. * reset_cpu() - calls reset_walk(RESET_WARM)
  44. */
  45. void reset_cpu(ulong addr)
  46. {
  47. reset_walk(RESET_WARM);
  48. }
  49. UCLASS_DRIVER(reset) = {
  50. .id = UCLASS_RESET,
  51. .name = "reset",
  52. };