mmrm_clk_rsrc_mgr.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  4. */
  5. #include "mmrm_clk_rsrc_mgr.h"
  6. #include "mmrm_debug.h"
  7. /* sw clk mgr ops */
  8. static struct mmrm_clk_mgr_ops sw_clk_mgr_ops = {
  9. .init_clk_mgr = mmrm_init_sw_clk_mgr,
  10. .destroy_clk_mgr = mmrm_destroy_sw_clk_mgr,
  11. };
  12. int mmrm_get_clk_mgr_ops(void *driver_data)
  13. {
  14. int rc = 0;
  15. struct mmrm_driver_data *drv_data =
  16. (struct mmrm_driver_data *)driver_data;
  17. if (drv_data->clk_res.scheme == CLK_MGR_SCHEME_SW) {
  18. drv_data->clk_mgr_ops = &sw_clk_mgr_ops;
  19. } else if (drv_data->clk_res.scheme == CLK_MGR_SCHEME_CXIPEAK) {
  20. d_mpr_e("%s: cxipeak is not supported with mmrm\n", __func__);
  21. rc = -EINVAL;
  22. goto err_exit;
  23. } else {
  24. d_mpr_e("%s: unsupported clk mgr scheme\n", __func__);
  25. goto err_exit;
  26. }
  27. return rc;
  28. err_exit:
  29. return rc;
  30. }
  31. struct mmrm_client *mmrm_clk_client_register(struct mmrm_clk_mgr *clk_mgr,
  32. struct mmrm_client_desc *client_desc)
  33. {
  34. if (!clk_mgr || !clk_mgr->clk_client_ops ||
  35. !clk_mgr->clk_client_ops->clk_client_reg) {
  36. d_mpr_e("%s: invalid clk mgr\n", __func__);
  37. return NULL;
  38. }
  39. return clk_mgr->clk_client_ops->clk_client_reg(clk_mgr,
  40. client_desc->client_info.desc,
  41. client_desc->priority,
  42. client_desc->pvt_data,
  43. client_desc->notifier_callback_fn);
  44. }
  45. int mmrm_clk_client_deregister(struct mmrm_clk_mgr *clk_mgr,
  46. struct mmrm_client *client)
  47. {
  48. if (!clk_mgr || !clk_mgr->clk_client_ops ||
  49. !clk_mgr->clk_client_ops->clk_client_dereg) {
  50. d_mpr_e("%s: invalid clk mgr\n", __func__);
  51. return -EINVAL;
  52. }
  53. return clk_mgr->clk_client_ops->clk_client_dereg(clk_mgr, client);
  54. }
  55. int mmrm_clk_client_setval(struct mmrm_clk_mgr *clk_mgr,
  56. struct mmrm_client *client,
  57. struct mmrm_client_data *client_data,
  58. unsigned long val)
  59. {
  60. if (!clk_mgr || !clk_mgr->clk_client_ops ||
  61. !clk_mgr->clk_client_ops->clk_client_setval) {
  62. d_mpr_e("%s: invalid clk mgr\n", __func__);
  63. return -EINVAL;
  64. }
  65. return clk_mgr->clk_client_ops->clk_client_setval(
  66. clk_mgr, client, client_data, val);
  67. }
  68. int mmrm_clk_client_setval_inrange(struct mmrm_clk_mgr *clk_mgr,
  69. struct mmrm_client *client,
  70. struct mmrm_client_data *client_data,
  71. struct mmrm_client_res_value *val)
  72. {
  73. if (!clk_mgr || !clk_mgr->clk_client_ops ||
  74. !clk_mgr->clk_client_ops->clk_client_setval_inrange) {
  75. d_mpr_e("%s: invalid clk mgr\n", __func__);
  76. return -EINVAL;
  77. }
  78. return clk_mgr->clk_client_ops->clk_client_setval_inrange(
  79. clk_mgr, client, client_data, val);
  80. }
  81. int mmrm_clk_client_getval(struct mmrm_clk_mgr *clk_mgr,
  82. struct mmrm_client *client,
  83. struct mmrm_client_res_value *val)
  84. {
  85. if (!clk_mgr || !clk_mgr->clk_client_ops ||
  86. !clk_mgr->clk_client_ops->clk_client_getval) {
  87. d_mpr_e("%s: invalid clk mgr\n", __func__);
  88. return -EINVAL;
  89. }
  90. return clk_mgr->clk_client_ops->clk_client_getval(
  91. clk_mgr, client, val);
  92. }
  93. int mmrm_clk_print_enabled_client_info(struct mmrm_clk_mgr *clk_mgr,
  94. char *buf, int sz)
  95. {
  96. if (!clk_mgr || !clk_mgr->clk_client_ops ||
  97. !clk_mgr->clk_client_ops->clk_print_enabled_client_info) {
  98. d_mpr_e("%s: invalid clk mgr\n", __func__);
  99. return -EINVAL;
  100. }
  101. return clk_mgr->clk_client_ops->clk_print_enabled_client_info(
  102. clk_mgr, buf, sz);
  103. }