gdsc.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2015, 2017-2018, 2022, The Linux Foundation. All rights reserved.
  4. */
  5. #ifndef __QCOM_GDSC_H__
  6. #define __QCOM_GDSC_H__
  7. #include <linux/err.h>
  8. #include <linux/pm_domain.h>
  9. struct regmap;
  10. struct regulator;
  11. struct reset_controller_dev;
  12. /**
  13. * struct gdsc - Globally Distributed Switch Controller
  14. * @pd: generic power domain
  15. * @regmap: regmap for MMIO accesses
  16. * @gdscr: gsdc control register
  17. * @collapse_ctrl: APCS collapse-vote register
  18. * @collapse_mask: APCS collapse-vote mask
  19. * @gds_hw_ctrl: gds_hw_ctrl register
  20. * @cxcs: offsets of branch registers to toggle mem/periph bits in
  21. * @cxc_count: number of @cxcs
  22. * @pwrsts: Possible powerdomain power states
  23. * @en_rest_wait_val: transition delay value for receiving enr ack signal
  24. * @en_few_wait_val: transition delay value for receiving enf ack signal
  25. * @clk_dis_wait_val: transition delay value for halting clock
  26. * @resets: ids of resets associated with this gdsc
  27. * @reset_count: number of @resets
  28. * @rcdev: reset controller
  29. */
  30. struct gdsc {
  31. struct generic_pm_domain pd;
  32. struct generic_pm_domain *parent;
  33. struct regmap *regmap;
  34. unsigned int gdscr;
  35. unsigned int collapse_ctrl;
  36. unsigned int collapse_mask;
  37. unsigned int gds_hw_ctrl;
  38. unsigned int clamp_io_ctrl;
  39. unsigned int *cxcs;
  40. unsigned int cxc_count;
  41. unsigned int en_rest_wait_val;
  42. unsigned int en_few_wait_val;
  43. unsigned int clk_dis_wait_val;
  44. const u8 pwrsts;
  45. /* Powerdomain allowable state bitfields */
  46. #define PWRSTS_OFF BIT(0)
  47. /*
  48. * There is no SW control to transition a GDSC into
  49. * PWRSTS_RET. This happens in HW when the parent
  50. * domain goes down to a low power state
  51. */
  52. #define PWRSTS_RET BIT(1)
  53. #define PWRSTS_ON BIT(2)
  54. #define PWRSTS_OFF_ON (PWRSTS_OFF | PWRSTS_ON)
  55. #define PWRSTS_RET_ON (PWRSTS_RET | PWRSTS_ON)
  56. const u16 flags;
  57. #define VOTABLE BIT(0)
  58. #define CLAMP_IO BIT(1)
  59. #define HW_CTRL BIT(2)
  60. #define SW_RESET BIT(3)
  61. #define AON_RESET BIT(4)
  62. #define POLL_CFG_GDSCR BIT(5)
  63. #define ALWAYS_ON BIT(6)
  64. #define RETAIN_FF_ENABLE BIT(7)
  65. #define NO_RET_PERIPH BIT(8)
  66. struct reset_controller_dev *rcdev;
  67. unsigned int *resets;
  68. unsigned int reset_count;
  69. const char *supply;
  70. struct regulator *rsupply;
  71. };
  72. struct gdsc_desc {
  73. struct device *dev;
  74. struct gdsc **scs;
  75. size_t num;
  76. };
  77. #ifdef CONFIG_QCOM_GDSC
  78. int gdsc_register(struct gdsc_desc *desc, struct reset_controller_dev *,
  79. struct regmap *);
  80. void gdsc_unregister(struct gdsc_desc *desc);
  81. int gdsc_gx_do_nothing_enable(struct generic_pm_domain *domain);
  82. #else
  83. static inline int gdsc_register(struct gdsc_desc *desc,
  84. struct reset_controller_dev *rcdev,
  85. struct regmap *r)
  86. {
  87. return -ENOSYS;
  88. }
  89. static inline void gdsc_unregister(struct gdsc_desc *desc) {};
  90. #endif /* CONFIG_QCOM_GDSC */
  91. #endif /* __QCOM_GDSC_H__ */