psc.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Clock driver for TI Davinci PSC controllers
  4. *
  5. * Copyright (C) 2018 David Lechner <[email protected]>
  6. */
  7. #ifndef __CLK_DAVINCI_PSC_H__
  8. #define __CLK_DAVINCI_PSC_H__
  9. #include <linux/clk-provider.h>
  10. #include <linux/types.h>
  11. /* PSC quirk flags */
  12. #define LPSC_ALWAYS_ENABLED BIT(0) /* never disable this clock */
  13. #define LPSC_SET_RATE_PARENT BIT(1) /* propagate set_rate to parent clock */
  14. #define LPSC_FORCE BIT(2) /* requires MDCTL FORCE bit */
  15. #define LPSC_LOCAL_RESET BIT(3) /* acts as reset provider */
  16. struct davinci_lpsc_clkdev_info {
  17. const char *con_id;
  18. const char *dev_id;
  19. };
  20. #define LPSC_CLKDEV(c, d) { \
  21. .con_id = (c), \
  22. .dev_id = (d) \
  23. }
  24. #define LPSC_CLKDEV1(n, c, d) \
  25. static const struct davinci_lpsc_clkdev_info n[] __initconst = { \
  26. LPSC_CLKDEV((c), (d)), \
  27. { } \
  28. }
  29. #define LPSC_CLKDEV2(n, c1, d1, c2, d2) \
  30. static const struct davinci_lpsc_clkdev_info n[] __initconst = { \
  31. LPSC_CLKDEV((c1), (d1)), \
  32. LPSC_CLKDEV((c2), (d2)), \
  33. { } \
  34. }
  35. #define LPSC_CLKDEV3(n, c1, d1, c2, d2, c3, d3) \
  36. static const struct davinci_lpsc_clkdev_info n[] __initconst = { \
  37. LPSC_CLKDEV((c1), (d1)), \
  38. LPSC_CLKDEV((c2), (d2)), \
  39. LPSC_CLKDEV((c3), (d3)), \
  40. { } \
  41. }
  42. /**
  43. * davinci_lpsc_clk_info - LPSC module-specific clock information
  44. * @name: the clock name
  45. * @parent: the parent clock name
  46. * @cdevs: optional array of clkdev lookup table info
  47. * @md: the local module domain (LPSC id)
  48. * @pd: the power domain id
  49. * @flags: bitmask of LPSC_* flags
  50. */
  51. struct davinci_lpsc_clk_info {
  52. const char *name;
  53. const char *parent;
  54. const struct davinci_lpsc_clkdev_info *cdevs;
  55. u32 md;
  56. u32 pd;
  57. unsigned long flags;
  58. };
  59. #define LPSC(m, d, n, p, c, f) \
  60. { \
  61. .name = #n, \
  62. .parent = #p, \
  63. .cdevs = (c), \
  64. .md = (m), \
  65. .pd = (d), \
  66. .flags = (f), \
  67. }
  68. int davinci_psc_register_clocks(struct device *dev,
  69. const struct davinci_lpsc_clk_info *info,
  70. u8 num_clks,
  71. void __iomem *base);
  72. int of_davinci_psc_clk_init(struct device *dev,
  73. const struct davinci_lpsc_clk_info *info,
  74. u8 num_clks,
  75. void __iomem *base);
  76. /* Device-specific data */
  77. struct davinci_psc_init_data {
  78. struct clk_bulk_data *parent_clks;
  79. int num_parent_clks;
  80. int (*psc_init)(struct device *dev, void __iomem *base);
  81. };
  82. #ifdef CONFIG_ARCH_DAVINCI_DA830
  83. extern const struct davinci_psc_init_data da830_psc0_init_data;
  84. extern const struct davinci_psc_init_data da830_psc1_init_data;
  85. #endif
  86. #ifdef CONFIG_ARCH_DAVINCI_DA850
  87. extern const struct davinci_psc_init_data da850_psc0_init_data;
  88. extern const struct davinci_psc_init_data da850_psc1_init_data;
  89. extern const struct davinci_psc_init_data of_da850_psc0_init_data;
  90. extern const struct davinci_psc_init_data of_da850_psc1_init_data;
  91. #endif
  92. #ifdef CONFIG_ARCH_DAVINCI_DM355
  93. extern const struct davinci_psc_init_data dm355_psc_init_data;
  94. #endif
  95. #ifdef CONFIG_ARCH_DAVINCI_DM365
  96. extern const struct davinci_psc_init_data dm365_psc_init_data;
  97. #endif
  98. #endif /* __CLK_DAVINCI_PSC_H__ */