mmrm_clk_rsrc_mgr.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  4. */
  5. #ifndef _MMRM_CLK_RESOURCE_MGR_H_
  6. #define _MMRM_CLK_RESOURCE_MGR_H_
  7. #include <dt-bindings/regulator/qcom,rpmh-regulator-levels.h>
  8. #include <linux/soc/qcom/msm_mmrm.h>
  9. #include "mmrm_internal.h"
  10. enum mmrm_clk_mgr_scheme {
  11. CLK_MGR_SCHEME_SW,
  12. CLK_MGR_SCHEME_CXIPEAK
  13. };
  14. enum mmrm_sw_vdd_levels {
  15. MMRM_VDD_LEVEL_SVS_L1,
  16. MMRM_VDD_LEVEL_NOM,
  17. MMRM_VDD_LEVEL_TURBO,
  18. MMRM_VDD_LEVEL_MAX
  19. };
  20. static int mmrm_sw_vdd_corner[] = {
  21. [MMRM_VDD_LEVEL_SVS_L1] = RPMH_REGULATOR_LEVEL_SVS_L1,
  22. [MMRM_VDD_LEVEL_NOM] = RPMH_REGULATOR_LEVEL_NOM,
  23. [MMRM_VDD_LEVEL_TURBO] = RPMH_REGULATOR_LEVEL_TURBO
  24. };
  25. #define MMRM_SW_CLIENTS_NUM_MAX 35
  26. typedef int (*notifier_callback_fn_t)(
  27. struct mmrm_client_notifier_data *notifier_data);
  28. struct mmrm_sw_clk_client_tbl_entry {
  29. char name[MMRM_CLK_CLIENT_NAME_SIZE];
  30. struct clk *clk;
  31. enum mmrm_client_priority pri;
  32. void *pvt_data; /* client user data */
  33. notifier_callback_fn_t notifier_cb_fn;
  34. /* prepared internally */
  35. u32 clk_src_id;
  36. bool pass_through;
  37. u32 min_level;
  38. u32 max_level;
  39. u64 freq[MMRM_VDD_LEVEL_MAX];
  40. u32 dyn_pwr[MMRM_VDD_LEVEL_MAX];
  41. u32 leak_pwr[MMRM_VDD_LEVEL_MAX];
  42. u32 current_ma[MMRM_VDD_LEVEL_MAX];
  43. /* reference to this entry */
  44. struct mmrm_client *client;
  45. /* configured clk rate */
  46. u64 clk_rate;
  47. };
  48. struct mmrm_sw_peak_current_data {
  49. u32 threshold;
  50. u32 aggreg_val;
  51. };
  52. struct mmrm_sw_clk_mgr_info {
  53. /* client data */
  54. struct mmrm_sw_clk_client_tbl_entry *clk_client_tbl;
  55. u32 tot_clk_clients;
  56. u32 enabled_clk_clients;
  57. /* peak current data */
  58. struct mmrm_sw_peak_current_data peak_cur_data;
  59. };
  60. struct mmrm_clk_mgr {
  61. struct mutex lock;
  62. enum mmrm_clk_mgr_scheme scheme;
  63. union {
  64. struct mmrm_sw_clk_mgr_info sw_info;
  65. } data;
  66. struct mmrm_clk_mgr_client_ops *clk_client_ops;
  67. };
  68. struct mmrm_clk_mgr_client_ops {
  69. /* client ops */
  70. struct mmrm_client*(*clk_client_reg)(
  71. struct mmrm_clk_mgr *clk_mgr,
  72. struct mmrm_clk_client_desc clk_desc,
  73. enum mmrm_client_priority priority, void *pvt_data,
  74. notifier_callback_fn_t nt_fn_cb);
  75. int (*clk_client_dereg)(
  76. struct mmrm_clk_mgr *clk_mgr,
  77. struct mmrm_client *client);
  78. int (*clk_client_setval)(struct mmrm_clk_mgr *clk_mgr,
  79. struct mmrm_client *client,
  80. struct mmrm_client_data *client_data, unsigned long val);
  81. int (*clk_client_setval_inrange)(struct mmrm_clk_mgr *clk_mgr,
  82. struct mmrm_client *client,
  83. struct mmrm_client_data *client_data,
  84. struct mmrm_client_res_value *val);
  85. int (*clk_client_getval)(struct mmrm_clk_mgr *clk_mgr,
  86. struct mmrm_client *client, struct mmrm_client_res_value *val);
  87. };
  88. /* clk mgr operations */
  89. struct mmrm_clk_mgr_ops {
  90. int (*init_clk_mgr)(void *drv_data);
  91. int (*destroy_clk_mgr)(struct mmrm_clk_mgr *sw_clk_mgr);
  92. };
  93. int mmrm_get_clk_mgr_ops(void *drv_data);
  94. /* clk mgr client operations */
  95. struct mmrm_client *mmrm_clk_client_register(struct mmrm_clk_mgr *clk_mgr,
  96. struct mmrm_client_desc *client_desc);
  97. int mmrm_clk_client_deregister(struct mmrm_clk_mgr *clk_mgr,
  98. struct mmrm_client *client);
  99. int mmrm_clk_client_setval(struct mmrm_clk_mgr *clk_mgr,
  100. struct mmrm_client *client,
  101. struct mmrm_client_data *client_data,
  102. unsigned long val);
  103. int mmrm_clk_client_setval_inrange(struct mmrm_clk_mgr *clk_mgr,
  104. struct mmrm_client *client,
  105. struct mmrm_client_data *client_data,
  106. struct mmrm_client_res_value *val);
  107. int mmrm_clk_client_getval(struct mmrm_clk_mgr *clk_mgr,
  108. struct mmrm_client *client,
  109. struct mmrm_client_res_value *val);
  110. /* sw clk mgr specific */
  111. int mmrm_init_sw_clk_mgr(void *driver_data);
  112. int mmrm_destroy_sw_clk_mgr(struct mmrm_clk_mgr *sw_clk_mgr);
  113. #endif //_MMRM_CLK_RESOURCE_MGR_H_