clkbuf.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2018. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #include <debug.h>
  32. #include <string.h>
  33. #include <platform/clkbuf.h>
  34. #include <platform/mt_pmic.h>
  35. #include <platform/mt_pmic_wrap_init.h>
  36. #include <platform/mt_reg_base.h>
  37. #include <platform/mt_typedefs.h>
  38. #include <platform/upmu_hw.h>
  39. #ifdef DEVICE_TREE_SUPPORT
  40. #include <libfdt.h>
  41. #include <lk_builtin_dtb.h>
  42. #endif
  43. #define CLKBUF_NODE "mediatek,pmic_clock_buffer"
  44. #define XO_MASK 0x7
  45. #define XO_WCN_SHIFT 3
  46. #define XO_EXT_SHIFT 12
  47. #define VOTE_MASK 0x7ff
  48. #define VOTE_SHIFT 0
  49. #define CONN_VOTE_MASK 0xf
  50. #define CONN_VOTE_SHIFT 4
  51. #define PMIC_MASK 0xffff
  52. #define PMIC_SHIFT 0
  53. #define PMIFSPI_OTHER_INF_EN (PMIF_SPI_BASE + 0x0028)
  54. #define OTHER_INF_DCXO0_EN_MSK 0x1
  55. #define OTHER_INF_DCXO0_EN_SHFT 0
  56. #define CLKBUF_DEBUG 1
  57. enum clk_buf_id {
  58. XO_SOC = 0,
  59. XO_WCN,
  60. XO_NFC,
  61. XO_CEL,
  62. XO_EXT = 6,
  63. };
  64. static void clk_buf_mask_voter(unsigned int addr, unsigned int vote_mask,
  65. unsigned int vote_shift)
  66. {
  67. unsigned int val = 0;
  68. pmic_read_interface(addr,
  69. &val,
  70. VOTE_MASK,
  71. VOTE_SHIFT);
  72. pmic_config_interface(addr,
  73. (val & (~(vote_mask << vote_shift))),
  74. VOTE_MASK,
  75. VOTE_SHIFT);
  76. #if CLKBUF_DEBUG
  77. pmic_read_interface(addr,
  78. &val,
  79. VOTE_MASK,
  80. VOTE_SHIFT);
  81. dprintf(CRITICAL, "[CLKBUF] vote addr: 0x%x config to 0x%x\n",
  82. addr, val);
  83. #endif
  84. }
  85. static void clk_buf_tcxo_config(void)
  86. {
  87. unsigned int val = 0;
  88. pmic_config_interface(PMIC_XO_EXTBUF2_MODE_ADDR,
  89. 0,
  90. PMIC_XO_EXTBUF2_MODE_MASK,
  91. PMIC_XO_EXTBUF2_MODE_SHIFT);
  92. pmic_config_interface(PMIC_XO_EXTBUF2_EN_M_ADDR,
  93. 0,
  94. PMIC_XO_EXTBUF2_EN_M_MASK,
  95. PMIC_XO_EXTBUF2_EN_M_SHIFT);
  96. pmic_config_interface(PMIC_XO_EXTBUF7_MODE_ADDR,
  97. 0,
  98. PMIC_XO_EXTBUF7_MODE_MASK,
  99. PMIC_XO_EXTBUF7_MODE_SHIFT);
  100. pmic_config_interface(PMIC_XO_EXTBUF7_EN_M_ADDR,
  101. 0,
  102. PMIC_XO_EXTBUF7_EN_M_MASK,
  103. PMIC_XO_EXTBUF7_EN_M_SHIFT);
  104. clk_buf_mask_voter(PMIC_XO_WCN_VOTE_ADDR,
  105. CONN_VOTE_MASK,
  106. CONN_VOTE_SHIFT);
  107. clk_buf_mask_voter(PMIC_XO_CEL_VOTE_ADDR,
  108. CONN_VOTE_MASK,
  109. CONN_VOTE_SHIFT);
  110. clk_buf_mask_voter(PMIC_XO_EXT_VOTE_ADDR,
  111. CONN_VOTE_MASK,
  112. CONN_VOTE_SHIFT);
  113. DRV_WriteReg32(PMIFSPI_OTHER_INF_EN, (DRV_Reg32(PMIFSPI_OTHER_INF_EN)
  114. & ~(OTHER_INF_DCXO0_EN_MSK << OTHER_INF_DCXO0_EN_SHFT)));
  115. #if CLKBUF_DEBUG
  116. pmic_read_interface(MT6359_DCXO_CW00,
  117. &val,
  118. PMIC_MASK,
  119. PMIC_SHIFT);
  120. dprintf(CRITICAL, "[CLKBUF] CW00: 0x%x\n", val);
  121. pmic_read_interface(MT6359_DCXO_CW09,
  122. &val,
  123. PMIC_MASK,
  124. PMIC_SHIFT);
  125. dprintf(CRITICAL, "[CLKBUF] CW09: 0x%x\n", val);
  126. val = DRV_Reg32(PMIFSPI_OTHER_INF_EN);
  127. dprintf(CRITICAL, "[CLKBUF] OTHER_INF_EN: 0x%x\n", val);
  128. #endif
  129. }
  130. int clk_buf_init(void)
  131. {
  132. char *tcxo_support = NULL;
  133. #ifdef DEVICE_TREE_SUPPORT
  134. int nodeoffset;
  135. int len;
  136. void *fdt = get_lk_overlayed_dtb();
  137. if (fdt == NULL)
  138. panic("lk driver fdt is NULL! something wrong.\n");
  139. nodeoffset = fdt_node_offset_by_compatible(fdt, -1, CLKBUF_NODE);
  140. if (nodeoffset < 0) {
  141. dprintf(CRITICAL, "[CLKBUF] dts node not found\n");
  142. return 0;
  143. }
  144. tcxo_support = (char *)fdt_getprop(fdt,
  145. nodeoffset,
  146. "tcxo_support",
  147. &len);
  148. if (!tcxo_support) {
  149. dprintf(CRITICAL, "[CLKBUF] not support\n");
  150. }
  151. #endif
  152. if (tcxo_support && !strcmp(tcxo_support, "true")) {
  153. clk_buf_tcxo_config();
  154. dprintf(CRITICAL, "[CLKBUF] TCXO Supported\n");
  155. }
  156. dprintf(CRITICAL, "[CLKBUF] Init\n");
  157. return 0;
  158. }