reset-bpmp.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2016 NVIDIA Corporation
  4. */
  5. #include <linux/reset-controller.h>
  6. #include <soc/tegra/bpmp.h>
  7. #include <soc/tegra/bpmp-abi.h>
  8. static struct tegra_bpmp *to_tegra_bpmp(struct reset_controller_dev *rstc)
  9. {
  10. return container_of(rstc, struct tegra_bpmp, rstc);
  11. }
  12. static int tegra_bpmp_reset_common(struct reset_controller_dev *rstc,
  13. enum mrq_reset_commands command,
  14. unsigned int id)
  15. {
  16. struct tegra_bpmp *bpmp = to_tegra_bpmp(rstc);
  17. struct mrq_reset_request request;
  18. struct tegra_bpmp_message msg;
  19. int err;
  20. memset(&request, 0, sizeof(request));
  21. request.cmd = command;
  22. request.reset_id = id;
  23. memset(&msg, 0, sizeof(msg));
  24. msg.mrq = MRQ_RESET;
  25. msg.tx.data = &request;
  26. msg.tx.size = sizeof(request);
  27. err = tegra_bpmp_transfer(bpmp, &msg);
  28. if (err)
  29. return err;
  30. if (msg.rx.ret)
  31. return -EINVAL;
  32. return 0;
  33. }
  34. static int tegra_bpmp_reset_module(struct reset_controller_dev *rstc,
  35. unsigned long id)
  36. {
  37. return tegra_bpmp_reset_common(rstc, CMD_RESET_MODULE, id);
  38. }
  39. static int tegra_bpmp_reset_assert(struct reset_controller_dev *rstc,
  40. unsigned long id)
  41. {
  42. return tegra_bpmp_reset_common(rstc, CMD_RESET_ASSERT, id);
  43. }
  44. static int tegra_bpmp_reset_deassert(struct reset_controller_dev *rstc,
  45. unsigned long id)
  46. {
  47. return tegra_bpmp_reset_common(rstc, CMD_RESET_DEASSERT, id);
  48. }
  49. static const struct reset_control_ops tegra_bpmp_reset_ops = {
  50. .reset = tegra_bpmp_reset_module,
  51. .assert = tegra_bpmp_reset_assert,
  52. .deassert = tegra_bpmp_reset_deassert,
  53. };
  54. int tegra_bpmp_init_resets(struct tegra_bpmp *bpmp)
  55. {
  56. bpmp->rstc.ops = &tegra_bpmp_reset_ops;
  57. bpmp->rstc.owner = THIS_MODULE;
  58. bpmp->rstc.of_node = bpmp->dev->of_node;
  59. bpmp->rstc.nr_resets = bpmp->soc->num_resets;
  60. return devm_reset_controller_register(bpmp->dev, &bpmp->rstc);
  61. }