common.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /* Copyright (c) 2014, 2018, 2020, The Linux Foundation. All rights reserved. */
  3. /* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. */
  4. #ifndef __QCOM_CLK_COMMON_H__
  5. #define __QCOM_CLK_COMMON_H__
  6. #include <linux/reset-controller.h>
  7. struct platform_device;
  8. struct regmap_config;
  9. struct clk_regmap;
  10. struct qcom_reset_map;
  11. struct regmap;
  12. struct freq_tbl;
  13. struct clk_hw;
  14. #define PLL_LOCK_COUNT_SHIFT 8
  15. #define PLL_LOCK_COUNT_MASK 0x3f
  16. #define PLL_BIAS_COUNT_SHIFT 14
  17. #define PLL_BIAS_COUNT_MASK 0x3f
  18. #define PLL_VOTE_FSM_ENA BIT(20)
  19. #define PLL_VOTE_FSM_RESET BIT(21)
  20. /**
  21. * struct critical_clk_offset - list the critical clks for each clk controller
  22. * @offset: offset address for critical clk
  23. * @mask: enable mask for critical clk
  24. */
  25. struct critical_clk_offset {
  26. unsigned int offset;
  27. unsigned int mask;
  28. };
  29. struct qcom_cc_desc {
  30. const struct regmap_config *config;
  31. struct clk_regmap **clks;
  32. struct critical_clk_offset *critical_clk_en;
  33. size_t num_critical_clk;
  34. size_t num_clks;
  35. const struct qcom_reset_map *resets;
  36. size_t num_resets;
  37. struct gdsc **gdscs;
  38. size_t num_gdscs;
  39. struct clk_hw **clk_hws;
  40. size_t num_clk_hws;
  41. struct clk_vdd_class **clk_regulators;
  42. size_t num_clk_regulators;
  43. struct icc_path *path;
  44. };
  45. /**
  46. * struct parent_map - map table for source select configuration values
  47. * @src: source
  48. * @cfg: configuration value
  49. */
  50. struct parent_map {
  51. u8 src;
  52. u8 cfg;
  53. };
  54. struct clk_dummy {
  55. struct clk_hw hw;
  56. struct reset_controller_dev reset;
  57. unsigned long rrate;
  58. };
  59. /**
  60. * struct clk_crm - clk crm
  61. *
  62. * @crm_name: crm instance name
  63. * @regmap_crmc: corresponds to crmc instance
  64. * @crm_dev: crm dev
  65. * @crm_initialized: crm init flag
  66. */
  67. struct clk_crm {
  68. const char *name;
  69. struct regmap *regmap_crmc;
  70. const struct device *dev;
  71. bool initialized;
  72. };
  73. extern const struct freq_tbl *qcom_find_freq(const struct freq_tbl *f,
  74. unsigned long rate);
  75. extern const struct freq_tbl *qcom_find_freq_floor(const struct freq_tbl *f,
  76. unsigned long rate);
  77. int qcom_find_crm_freq_index(const struct freq_tbl *f, unsigned long rate);
  78. extern void
  79. qcom_pll_set_fsm_mode(struct regmap *m, u32 reg, u8 bias_count, u8 lock_count);
  80. extern int qcom_find_src_index(struct clk_hw *hw, const struct parent_map *map,
  81. u8 src);
  82. extern int qcom_find_cfg_index(struct clk_hw *hw, const struct parent_map *map,
  83. u8 cfg);
  84. extern int qcom_cc_register_board_clk(struct device *dev, const char *path,
  85. const char *name, unsigned long rate);
  86. extern int qcom_cc_register_sleep_clk(struct device *dev);
  87. extern struct regmap *qcom_cc_map(struct platform_device *pdev,
  88. const struct qcom_cc_desc *desc);
  89. extern int qcom_cc_really_probe(struct platform_device *pdev,
  90. const struct qcom_cc_desc *desc,
  91. struct regmap *regmap);
  92. extern int qcom_cc_probe(struct platform_device *pdev,
  93. const struct qcom_cc_desc *desc);
  94. extern int qcom_cc_probe_by_index(struct platform_device *pdev, int index,
  95. const struct qcom_cc_desc *desc);
  96. extern const struct clk_ops clk_dummy_ops;
  97. void qcom_cc_sync_state(struct device *dev, const struct qcom_cc_desc *desc);
  98. int qcom_cc_runtime_init(struct platform_device *pdev,
  99. struct qcom_cc_desc *desc);
  100. int qcom_cc_runtime_suspend(struct device *dev);
  101. int qcom_cc_runtime_resume(struct device *dev);
  102. int qcom_clk_crm_init(struct device *dev, struct clk_crm *crm);
  103. static inline const char *qcom_clk_hw_get_name(const struct clk_hw *hw)
  104. {
  105. return hw->init ? hw->init->name : clk_hw_get_name(hw);
  106. }
  107. #endif