fdt_reset.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*
  2. * SPDX-License-Identifier: BSD-2-Clause
  3. *
  4. * Copyright (c) 2020 Western Digital Corporation or its affiliates.
  5. *
  6. * Authors:
  7. * Anup Patel <anup.patel@wdc.com>
  8. */
  9. #include <sbi/sbi_error.h>
  10. #include <sbi/sbi_scratch.h>
  11. #include <sbi_utils/fdt/fdt_helper.h>
  12. #include <sbi_utils/reset/fdt_reset.h>
  13. extern struct fdt_reset fdt_reset_sifive;
  14. extern struct fdt_reset fdt_reset_htif;
  15. extern struct fdt_reset fdt_reset_thead;
  16. static struct fdt_reset *reset_drivers[] = {
  17. &fdt_reset_sifive,
  18. &fdt_reset_htif,
  19. &fdt_reset_thead,
  20. };
  21. static struct fdt_reset *current_driver = NULL;
  22. int fdt_reset_init(void)
  23. {
  24. int pos, noff, rc;
  25. struct fdt_reset *drv;
  26. const struct fdt_match *match;
  27. void *fdt = sbi_scratch_thishart_arg1_ptr();
  28. for (pos = 0; pos < array_size(reset_drivers); pos++) {
  29. drv = reset_drivers[pos];
  30. noff = fdt_find_match(fdt, -1, drv->match_table, &match);
  31. if (noff < 0)
  32. continue;
  33. if (drv->init) {
  34. rc = drv->init(fdt, noff, match);
  35. if (rc == SBI_ENODEV)
  36. continue;
  37. if (rc)
  38. return rc;
  39. }
  40. current_driver = drv;
  41. break;
  42. }
  43. return 0;
  44. }