clk-rk.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-3-08 GuEe-GUI the first version
  9. */
  10. #ifndef __CLK_RK_H__
  11. #define __CLK_RK_H__
  12. #include <rockchip.h>
  13. struct rockchip_clk_provider
  14. {
  15. void *reg_base;
  16. struct rt_syscon *grf;
  17. struct rt_syscon *pmugrf;
  18. };
  19. struct clk_div_table
  20. {
  21. rt_uint32_t val;
  22. rt_uint32_t div;
  23. };
  24. struct rockchip_clk_cell
  25. {
  26. struct rt_clk_cell cell;
  27. int id;
  28. int muxdiv_offset;
  29. rt_uint8_t mux_shift;
  30. rt_uint8_t mux_width;
  31. #define CLK_MUX_INDEX_ONE RT_BIT(0)
  32. #define CLK_MUX_INDEX_BIT RT_BIT(1)
  33. #define CLK_MUX_HIWORD_MASK RT_BIT(2)
  34. #define CLK_MUX_READ_ONLY RT_BIT(3)
  35. #define CLK_MUX_ROUND_CLOSEST RT_BIT(4)
  36. #define CLK_MUX_BIG_ENDIAN RT_BIT(5)
  37. rt_uint8_t mux_flags;
  38. rt_uint32_t mux_mask;
  39. rt_uint32_t *mux_table;
  40. int div_offset;
  41. rt_uint8_t div_shift;
  42. rt_uint8_t div_width;
  43. #define CLK_DIVIDER_ONE_BASED RT_BIT(0)
  44. #define CLK_DIVIDER_POWER_OF_TWO RT_BIT(1)
  45. #define CLK_DIVIDER_ALLOW_ZERO RT_BIT(2)
  46. #define CLK_DIVIDER_HIWORD_MASK RT_BIT(3)
  47. #define CLK_DIVIDER_ROUND_CLOSEST RT_BIT(4)
  48. #define CLK_DIVIDER_READ_ONLY RT_BIT(5)
  49. #define CLK_DIVIDER_MAX_AT_ZERO RT_BIT(6)
  50. #define CLK_DIVIDER_BIG_ENDIAN RT_BIT(7)
  51. #define CLK_FRAC_DIVIDER_ZERO_BASED RT_BIT(0)
  52. #define CLK_FRAC_DIVIDER_BIG_ENDIAN RT_BIT(1)
  53. #define CLK_FRAC_DIVIDER_POWER_OF_TWO_PS RT_BIT(2)
  54. #define CLK_FRAC_DIVIDER_NO_LIMIT RT_BIT(3)
  55. rt_uint8_t div_flags;
  56. struct clk_div_table *div_table;
  57. int gate_offset;
  58. rt_uint8_t gate_shift;
  59. #define CLK_GATE_SET_TO_DISABLE RT_BIT(0)
  60. #define CLK_GATE_HIWORD_MASK RT_BIT(1)
  61. #define CLK_GATE_BIG_ENDIAN RT_BIT(2)
  62. rt_uint8_t gate_flags;
  63. struct rockchip_clk_provider *provider;
  64. void (*init)(struct rockchip_clk_cell *cell);
  65. void (*setup)(struct rockchip_clk_cell *cell);
  66. };
  67. #define cell_to_rockchip_clk_cell(cell) rt_container_of(cell, struct rockchip_clk_cell, cell)
  68. #define PNAME(x) static const char *const x
  69. #define PNAMES(x) PNAME(x)[]
  70. void rational_best_approximation(rt_ubase_t given_numerator,
  71. rt_ubase_t given_denominator,
  72. rt_ubase_t max_numerator,
  73. rt_ubase_t max_denominator,
  74. rt_ubase_t *best_numerator,
  75. rt_ubase_t *best_denominator);
  76. #define ROCKCHIP_SOFTRST_HIWORD_MASK RT_BIT(0)
  77. int rockchip_gcd(int m, int n);
  78. void rockchip_clk_init(struct rockchip_clk_provider *provider,
  79. struct rt_clk_cell **cells, rt_size_t cells_nr);
  80. void rockchip_clk_setup(struct rockchip_clk_provider *provider,
  81. struct rt_clk_cell **cells, rt_size_t cells_nr);
  82. rt_err_t rockchip_register_softrst(struct rt_reset_controller *rstcer,
  83. struct rt_ofw_node *np, const int *lookup_table, void *regs, rt_uint8_t flags);
  84. void rockchip_register_restart_notifier(struct rockchip_clk_provider *provider,
  85. rt_uint32_t reg, void (*callback)(struct rockchip_clk_provider *provider));
  86. #endif /* __CLK_RK_H__ */