wcd9xxx-resmgr-v2.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved.
  4. */
  5. #ifndef __WCD9XXX_COMMON_V2_H__
  6. #define __WCD9XXX_COMMON_V2_H__
  7. #include "wcd9xxx_registers.h"
  8. #include "core.h"
  9. enum wcd_clock_type {
  10. WCD_CLK_OFF,
  11. WCD_CLK_RCO,
  12. WCD_CLK_MCLK,
  13. };
  14. enum {
  15. SIDO_SOURCE_INTERNAL,
  16. SIDO_SOURCE_RCO_BG,
  17. };
  18. struct wcd_resmgr_cb {
  19. int (*cdc_rco_ctrl)(struct snd_soc_component *component, bool enable);
  20. };
  21. struct wcd9xxx_resmgr_v2 {
  22. struct snd_soc_component *component;
  23. struct wcd9xxx_core_resource *core_res;
  24. int master_bias_users;
  25. int clk_mclk_users;
  26. int clk_rco_users;
  27. struct mutex codec_bg_clk_lock;
  28. struct mutex master_bias_lock;
  29. enum codec_variant codec_type;
  30. enum wcd_clock_type clk_type;
  31. const struct wcd_resmgr_cb *resmgr_cb;
  32. int sido_input_src;
  33. };
  34. #define WCD9XXX_V2_BG_CLK_LOCK(resmgr) \
  35. { \
  36. struct wcd9xxx_resmgr_v2 *__resmgr = resmgr; \
  37. pr_debug("%s: Acquiring BG_CLK\n", __func__); \
  38. mutex_lock(&__resmgr->codec_bg_clk_lock); \
  39. pr_debug("%s: Acquiring BG_CLK done\n", __func__); \
  40. }
  41. #define WCD9XXX_V2_BG_CLK_UNLOCK(resmgr) \
  42. { \
  43. struct wcd9xxx_resmgr_v2 *__resmgr = resmgr; \
  44. pr_debug("%s: Releasing BG_CLK\n", __func__); \
  45. mutex_unlock(&__resmgr->codec_bg_clk_lock); \
  46. }
  47. #define WCD9XXX_V2_BG_CLK_ASSERT_LOCKED(resmgr) \
  48. { \
  49. WARN_ONCE(!mutex_is_locked(&resmgr->codec_bg_clk_lock), \
  50. "%s: BG_CLK lock should have acquired\n", __func__); \
  51. }
  52. int wcd_resmgr_enable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr);
  53. int wcd_resmgr_disable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr);
  54. struct wcd9xxx_resmgr_v2 *wcd_resmgr_init(
  55. struct wcd9xxx_core_resource *core_res,
  56. struct snd_soc_component *component);
  57. void wcd_resmgr_remove(struct wcd9xxx_resmgr_v2 *resmgr);
  58. int wcd_resmgr_post_init(struct wcd9xxx_resmgr_v2 *resmgr,
  59. const struct wcd_resmgr_cb *resmgr_cb,
  60. struct snd_soc_component *component);
  61. int wcd_resmgr_enable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr,
  62. enum wcd_clock_type type);
  63. int wcd_resmgr_disable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr,
  64. enum wcd_clock_type type);
  65. int wcd_resmgr_get_clk_type(struct wcd9xxx_resmgr_v2 *resmgr);
  66. void wcd_resmgr_post_ssr_v2(struct wcd9xxx_resmgr_v2 *resmgr);
  67. void wcd_resmgr_set_sido_input_src_locked(struct wcd9xxx_resmgr_v2 *resmgr,
  68. int sido_src);
  69. void wcd_resmgr_set_sido_input_src(struct wcd9xxx_resmgr_v2 *resmgr,
  70. int sido_src);
  71. #endif