soc.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312
  1. // SPDX-License-Identifier: BSD-3-Clause-Clear
  2. /* Copyright (C) 2022 MediaTek Inc. */
  3. #include <linux/kernel.h>
  4. #include <linux/module.h>
  5. #include <linux/platform_device.h>
  6. #include <linux/pinctrl/consumer.h>
  7. #include <linux/of.h>
  8. #include <linux/of_reserved_mem.h>
  9. #include <linux/iopoll.h>
  10. #include <linux/reset.h>
  11. #include <linux/of_net.h>
  12. #include <linux/clk.h>
  13. #include "mt7915.h"
  14. #define MT7981_CON_INFRA_VERSION 0x02090000
  15. #define MT7986_CON_INFRA_VERSION 0x02070000
  16. /* INFRACFG */
  17. #define MT_INFRACFG_CONN2AP_SLPPROT 0x0d0
  18. #define MT_INFRACFG_AP2CONN_SLPPROT 0x0d4
  19. #define MT_INFRACFG_RX_EN_MASK BIT(16)
  20. #define MT_INFRACFG_TX_RDY_MASK BIT(4)
  21. #define MT_INFRACFG_TX_EN_MASK BIT(0)
  22. /* TOP POS */
  23. #define MT_TOP_POS_FAST_CTRL 0x114
  24. #define MT_TOP_POS_FAST_EN_MASK BIT(3)
  25. #define MT_TOP_POS_SKU 0x21c
  26. #define MT_TOP_POS_SKU_MASK GENMASK(31, 28)
  27. #define MT_TOP_POS_SKU_ADIE_DBDC_MASK BIT(2)
  28. enum {
  29. ADIE_SB,
  30. ADIE_DBDC
  31. };
  32. static int
  33. mt76_wmac_spi_read(struct mt7915_dev *dev, u8 adie, u32 addr, u32 *val)
  34. {
  35. int ret;
  36. u32 cur;
  37. ret = read_poll_timeout(mt76_rr, cur, !(cur & MT_TOP_SPI_POLLING_BIT),
  38. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  39. dev, MT_TOP_SPI_BUSY_CR(adie));
  40. if (ret)
  41. return ret;
  42. mt76_wr(dev, MT_TOP_SPI_ADDR_CR(adie),
  43. MT_TOP_SPI_READ_ADDR_FORMAT | addr);
  44. mt76_wr(dev, MT_TOP_SPI_WRITE_DATA_CR(adie), 0);
  45. ret = read_poll_timeout(mt76_rr, cur, !(cur & MT_TOP_SPI_POLLING_BIT),
  46. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  47. dev, MT_TOP_SPI_BUSY_CR(adie));
  48. if (ret)
  49. return ret;
  50. *val = mt76_rr(dev, MT_TOP_SPI_READ_DATA_CR(adie));
  51. return 0;
  52. }
  53. static int
  54. mt76_wmac_spi_write(struct mt7915_dev *dev, u8 adie, u32 addr, u32 val)
  55. {
  56. int ret;
  57. u32 cur;
  58. ret = read_poll_timeout(mt76_rr, cur, !(cur & MT_TOP_SPI_POLLING_BIT),
  59. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  60. dev, MT_TOP_SPI_BUSY_CR(adie));
  61. if (ret)
  62. return ret;
  63. mt76_wr(dev, MT_TOP_SPI_ADDR_CR(adie),
  64. MT_TOP_SPI_WRITE_ADDR_FORMAT | addr);
  65. mt76_wr(dev, MT_TOP_SPI_WRITE_DATA_CR(adie), val);
  66. return read_poll_timeout(mt76_rr, cur, !(cur & MT_TOP_SPI_POLLING_BIT),
  67. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  68. dev, MT_TOP_SPI_BUSY_CR(adie));
  69. }
  70. static int
  71. mt76_wmac_spi_rmw(struct mt7915_dev *dev, u8 adie,
  72. u32 addr, u32 mask, u32 val)
  73. {
  74. u32 cur, ret;
  75. ret = mt76_wmac_spi_read(dev, adie, addr, &cur);
  76. if (ret)
  77. return ret;
  78. cur &= ~mask;
  79. cur |= val;
  80. return mt76_wmac_spi_write(dev, adie, addr, cur);
  81. }
  82. static int
  83. mt7986_wmac_adie_efuse_read(struct mt7915_dev *dev, u8 adie,
  84. u32 addr, u32 *data)
  85. {
  86. int ret, temp;
  87. u32 val, mask;
  88. ret = mt76_wmac_spi_write(dev, adie, MT_ADIE_EFUSE_CFG,
  89. MT_ADIE_EFUSE_CTRL_MASK);
  90. if (ret)
  91. return ret;
  92. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_EFUSE2_CTRL, BIT(30), 0x0);
  93. if (ret)
  94. return ret;
  95. mask = (MT_ADIE_EFUSE_MODE_MASK | MT_ADIE_EFUSE_ADDR_MASK |
  96. MT_ADIE_EFUSE_KICK_MASK);
  97. val = FIELD_PREP(MT_ADIE_EFUSE_MODE_MASK, 0) |
  98. FIELD_PREP(MT_ADIE_EFUSE_ADDR_MASK, addr) |
  99. FIELD_PREP(MT_ADIE_EFUSE_KICK_MASK, 1);
  100. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_EFUSE2_CTRL, mask, val);
  101. if (ret)
  102. return ret;
  103. ret = read_poll_timeout(mt76_wmac_spi_read, temp,
  104. !temp && !FIELD_GET(MT_ADIE_EFUSE_KICK_MASK, val),
  105. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  106. dev, adie, MT_ADIE_EFUSE2_CTRL, &val);
  107. if (ret)
  108. return ret;
  109. ret = mt76_wmac_spi_read(dev, adie, MT_ADIE_EFUSE2_CTRL, &val);
  110. if (ret)
  111. return ret;
  112. if (FIELD_GET(MT_ADIE_EFUSE_VALID_MASK, val) == 1)
  113. ret = mt76_wmac_spi_read(dev, adie, MT_ADIE_EFUSE_RDATA0,
  114. data);
  115. return ret;
  116. }
  117. static inline void mt76_wmac_spi_lock(struct mt7915_dev *dev)
  118. {
  119. u32 cur;
  120. read_poll_timeout(mt76_rr, cur,
  121. FIELD_GET(MT_SEMA_RFSPI_STATUS_MASK, cur),
  122. 1000, 1000 * MSEC_PER_SEC, false, dev,
  123. MT_SEMA_RFSPI_STATUS);
  124. }
  125. static inline void mt76_wmac_spi_unlock(struct mt7915_dev *dev)
  126. {
  127. mt76_wr(dev, MT_SEMA_RFSPI_RELEASE, 1);
  128. }
  129. static u32 mt76_wmac_rmw(void __iomem *base, u32 offset, u32 mask, u32 val)
  130. {
  131. val |= readl(base + offset) & ~mask;
  132. writel(val, base + offset);
  133. return val;
  134. }
  135. static u8 mt798x_wmac_check_adie_type(struct mt7915_dev *dev)
  136. {
  137. u32 val;
  138. /* Only DBDC A-die is used with MT7981 */
  139. if (is_mt7981(&dev->mt76))
  140. return ADIE_DBDC;
  141. val = readl(dev->sku + MT_TOP_POS_SKU);
  142. return FIELD_GET(MT_TOP_POS_SKU_ADIE_DBDC_MASK, val);
  143. }
  144. static int mt7986_wmac_consys_reset(struct mt7915_dev *dev, bool enable)
  145. {
  146. if (!enable)
  147. return reset_control_assert(dev->rstc);
  148. mt76_wmac_rmw(dev->sku, MT_TOP_POS_FAST_CTRL,
  149. MT_TOP_POS_FAST_EN_MASK,
  150. FIELD_PREP(MT_TOP_POS_FAST_EN_MASK, 0x1));
  151. return reset_control_deassert(dev->rstc);
  152. }
  153. static int mt7986_wmac_gpio_setup(struct mt7915_dev *dev)
  154. {
  155. struct pinctrl_state *state;
  156. struct pinctrl *pinctrl;
  157. int ret;
  158. u8 type;
  159. type = mt798x_wmac_check_adie_type(dev);
  160. pinctrl = devm_pinctrl_get(dev->mt76.dev);
  161. if (IS_ERR(pinctrl))
  162. return PTR_ERR(pinctrl);
  163. switch (type) {
  164. case ADIE_SB:
  165. state = pinctrl_lookup_state(pinctrl, "default");
  166. if (IS_ERR_OR_NULL(state))
  167. return -EINVAL;
  168. break;
  169. case ADIE_DBDC:
  170. state = pinctrl_lookup_state(pinctrl, "dbdc");
  171. if (IS_ERR_OR_NULL(state))
  172. return -EINVAL;
  173. break;
  174. default:
  175. return -EINVAL;
  176. }
  177. ret = pinctrl_select_state(pinctrl, state);
  178. if (ret)
  179. return ret;
  180. usleep_range(500, 1000);
  181. return 0;
  182. }
  183. static int mt7986_wmac_consys_lockup(struct mt7915_dev *dev, bool enable)
  184. {
  185. int ret;
  186. u32 cur;
  187. mt76_wmac_rmw(dev->dcm, MT_INFRACFG_AP2CONN_SLPPROT,
  188. MT_INFRACFG_RX_EN_MASK,
  189. FIELD_PREP(MT_INFRACFG_RX_EN_MASK, enable));
  190. ret = read_poll_timeout(readl, cur, !(cur & MT_INFRACFG_RX_EN_MASK),
  191. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  192. dev->dcm + MT_INFRACFG_AP2CONN_SLPPROT);
  193. if (ret)
  194. return ret;
  195. mt76_wmac_rmw(dev->dcm, MT_INFRACFG_AP2CONN_SLPPROT,
  196. MT_INFRACFG_TX_EN_MASK,
  197. FIELD_PREP(MT_INFRACFG_TX_EN_MASK, enable));
  198. ret = read_poll_timeout(readl, cur, !(cur & MT_INFRACFG_TX_RDY_MASK),
  199. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  200. dev->dcm + MT_INFRACFG_AP2CONN_SLPPROT);
  201. if (ret)
  202. return ret;
  203. mt76_wmac_rmw(dev->dcm, MT_INFRACFG_CONN2AP_SLPPROT,
  204. MT_INFRACFG_RX_EN_MASK,
  205. FIELD_PREP(MT_INFRACFG_RX_EN_MASK, enable));
  206. mt76_wmac_rmw(dev->dcm, MT_INFRACFG_CONN2AP_SLPPROT,
  207. MT_INFRACFG_TX_EN_MASK,
  208. FIELD_PREP(MT_INFRACFG_TX_EN_MASK, enable));
  209. return 0;
  210. }
  211. static int mt798x_wmac_coninfra_check(struct mt7915_dev *dev)
  212. {
  213. u32 cur;
  214. u32 con_infra_version;
  215. if (is_mt7981(&dev->mt76)) {
  216. con_infra_version = MT7981_CON_INFRA_VERSION;
  217. } else if (is_mt7986(&dev->mt76)) {
  218. con_infra_version = MT7986_CON_INFRA_VERSION;
  219. } else {
  220. WARN_ON(1);
  221. return -EINVAL;
  222. }
  223. return read_poll_timeout(mt76_rr, cur, (cur == con_infra_version),
  224. USEC_PER_MSEC, 50 * USEC_PER_MSEC,
  225. false, dev, MT_CONN_INFRA_BASE);
  226. }
  227. static int mt798x_wmac_coninfra_setup(struct mt7915_dev *dev)
  228. {
  229. struct device *pdev = dev->mt76.dev;
  230. struct resource res;
  231. u32 val;
  232. int ret;
  233. ret = of_reserved_mem_region_to_resource(pdev->of_node, 0, &res);
  234. if (ret)
  235. return ret;
  236. val = (res.start >> 16) & MT_TOP_MCU_EMI_BASE_MASK;
  237. if (is_mt7986(&dev->mt76)) {
  238. /* Set conninfra subsys PLL check */
  239. mt76_rmw_field(dev, MT_INFRA_CKGEN_BUS,
  240. MT_INFRA_CKGEN_BUS_RDY_SEL_MASK, 0x1);
  241. mt76_rmw_field(dev, MT_INFRA_CKGEN_BUS,
  242. MT_INFRA_CKGEN_BUS_RDY_SEL_MASK, 0x1);
  243. }
  244. mt76_rmw_field(dev, MT_TOP_MCU_EMI_BASE,
  245. MT_TOP_MCU_EMI_BASE_MASK, val);
  246. if (is_mt7981(&dev->mt76)) {
  247. mt76_rmw_field(dev, MT_TOP_WF_AP_PERI_BASE,
  248. MT_TOP_WF_AP_PERI_BASE_MASK, 0x300d0000 >> 16);
  249. mt76_rmw_field(dev, MT_TOP_EFUSE_BASE,
  250. MT_TOP_EFUSE_BASE_MASK, 0x11f20000 >> 16);
  251. }
  252. mt76_wr(dev, MT_INFRA_BUS_EMI_START, res.start);
  253. mt76_wr(dev, MT_INFRA_BUS_EMI_END, resource_size(&res));
  254. mt76_rr(dev, MT_CONN_INFRA_EFUSE);
  255. /* Set conninfra sysram */
  256. mt76_wr(dev, MT_TOP_RGU_SYSRAM_PDN, 0);
  257. mt76_wr(dev, MT_TOP_RGU_SYSRAM_SLP, 1);
  258. return 0;
  259. }
  260. static int mt798x_wmac_sku_setup(struct mt7915_dev *dev, u32 *adie_type)
  261. {
  262. int ret;
  263. u32 adie_main = 0, adie_ext = 0;
  264. mt76_rmw_field(dev, MT_CONN_INFRA_ADIE_RESET,
  265. MT_CONN_INFRA_ADIE1_RESET_MASK, 0x1);
  266. if (is_mt7986(&dev->mt76)) {
  267. mt76_rmw_field(dev, MT_CONN_INFRA_ADIE_RESET,
  268. MT_CONN_INFRA_ADIE2_RESET_MASK, 0x1);
  269. }
  270. mt76_wmac_spi_lock(dev);
  271. ret = mt76_wmac_spi_read(dev, 0, MT_ADIE_CHIP_ID, &adie_main);
  272. if (ret)
  273. goto out;
  274. if (is_mt7986(&dev->mt76)) {
  275. ret = mt76_wmac_spi_read(dev, 1, MT_ADIE_CHIP_ID, &adie_ext);
  276. if (ret)
  277. goto out;
  278. }
  279. *adie_type = FIELD_GET(MT_ADIE_CHIP_ID_MASK, adie_main) |
  280. (MT_ADIE_CHIP_ID_MASK & adie_ext);
  281. out:
  282. mt76_wmac_spi_unlock(dev);
  283. return 0;
  284. }
  285. static inline u16 mt7986_adie_idx(u8 adie, u32 adie_type)
  286. {
  287. if (adie == 0)
  288. return u32_get_bits(adie_type, MT_ADIE_IDX0);
  289. else
  290. return u32_get_bits(adie_type, MT_ADIE_IDX1);
  291. }
  292. static inline bool is_7975(struct mt7915_dev *dev, u8 adie, u32 adie_type)
  293. {
  294. return mt7986_adie_idx(adie, adie_type) == 0x7975;
  295. }
  296. static inline bool is_7976(struct mt7915_dev *dev, u8 adie, u32 adie_type)
  297. {
  298. return mt7986_adie_idx(adie, adie_type) == 0x7976;
  299. }
  300. static int mt7986_wmac_adie_thermal_cal(struct mt7915_dev *dev, u8 adie)
  301. {
  302. int ret;
  303. u32 data, val;
  304. ret = mt7986_wmac_adie_efuse_read(dev, adie, MT_ADIE_THADC_ANALOG,
  305. &data);
  306. if (ret || FIELD_GET(MT_ADIE_ANA_EN_MASK, data)) {
  307. val = FIELD_GET(MT_ADIE_VRPI_SEL_EFUSE_MASK, data);
  308. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_RG_TOP_THADC_BG,
  309. MT_ADIE_VRPI_SEL_CR_MASK,
  310. FIELD_PREP(MT_ADIE_VRPI_SEL_CR_MASK, val));
  311. if (ret)
  312. return ret;
  313. val = FIELD_GET(MT_ADIE_PGA_GAIN_EFUSE_MASK, data);
  314. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_RG_TOP_THADC,
  315. MT_ADIE_PGA_GAIN_MASK,
  316. FIELD_PREP(MT_ADIE_PGA_GAIN_MASK, val));
  317. if (ret)
  318. return ret;
  319. }
  320. ret = mt7986_wmac_adie_efuse_read(dev, adie, MT_ADIE_THADC_SLOP,
  321. &data);
  322. if (ret || FIELD_GET(MT_ADIE_ANA_EN_MASK, data)) {
  323. val = FIELD_GET(MT_ADIE_LDO_CTRL_EFUSE_MASK, data);
  324. return mt76_wmac_spi_rmw(dev, adie, MT_ADIE_RG_TOP_THADC,
  325. MT_ADIE_LDO_CTRL_MASK,
  326. FIELD_PREP(MT_ADIE_LDO_CTRL_MASK, val));
  327. }
  328. return 0;
  329. }
  330. static int
  331. mt7986_read_efuse_xo_trim_7976(struct mt7915_dev *dev, u8 adie,
  332. bool is_40m, int *result)
  333. {
  334. int ret;
  335. u32 data, addr;
  336. addr = is_40m ? MT_ADIE_XTAL_AXM_40M_OSC : MT_ADIE_XTAL_AXM_80M_OSC;
  337. ret = mt7986_wmac_adie_efuse_read(dev, adie, addr, &data);
  338. if (ret)
  339. return ret;
  340. if (!FIELD_GET(MT_ADIE_XO_TRIM_EN_MASK, data)) {
  341. *result = 64;
  342. } else {
  343. *result = FIELD_GET(MT_ADIE_TRIM_MASK, data);
  344. addr = is_40m ? MT_ADIE_XTAL_TRIM1_40M_OSC :
  345. MT_ADIE_XTAL_TRIM1_80M_OSC;
  346. ret = mt7986_wmac_adie_efuse_read(dev, adie, addr, &data);
  347. if (ret)
  348. return ret;
  349. if (FIELD_GET(MT_ADIE_XO_TRIM_EN_MASK, data) &&
  350. FIELD_GET(MT_ADIE_XTAL_DECREASE_MASK, data))
  351. *result -= FIELD_GET(MT_ADIE_EFUSE_TRIM_MASK, data);
  352. else if (FIELD_GET(MT_ADIE_XO_TRIM_EN_MASK, data))
  353. *result += FIELD_GET(MT_ADIE_EFUSE_TRIM_MASK, data);
  354. *result = max(0, min(127, *result));
  355. }
  356. return 0;
  357. }
  358. static int mt7986_wmac_adie_xtal_trim_7976(struct mt7915_dev *dev, u8 adie)
  359. {
  360. int ret, trim_80m, trim_40m;
  361. u32 data, val, mode;
  362. ret = mt7986_wmac_adie_efuse_read(dev, adie, MT_ADIE_XO_TRIM_FLOW,
  363. &data);
  364. if (ret || !FIELD_GET(BIT(1), data))
  365. return 0;
  366. ret = mt7986_read_efuse_xo_trim_7976(dev, adie, false, &trim_80m);
  367. if (ret)
  368. return ret;
  369. ret = mt7986_read_efuse_xo_trim_7976(dev, adie, true, &trim_40m);
  370. if (ret)
  371. return ret;
  372. ret = mt76_wmac_spi_read(dev, adie, MT_ADIE_RG_STRAP_PIN_IN, &val);
  373. if (ret)
  374. return ret;
  375. mode = FIELD_PREP(GENMASK(6, 4), val);
  376. if (!mode || mode == 0x2) {
  377. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_XTAL_C1,
  378. GENMASK(31, 24),
  379. FIELD_PREP(GENMASK(31, 24), trim_80m));
  380. if (ret)
  381. return ret;
  382. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_XTAL_C2,
  383. GENMASK(31, 24),
  384. FIELD_PREP(GENMASK(31, 24), trim_80m));
  385. } else if (mode == 0x3 || mode == 0x4 || mode == 0x6) {
  386. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_XTAL_C1,
  387. GENMASK(23, 16),
  388. FIELD_PREP(GENMASK(23, 16), trim_40m));
  389. if (ret)
  390. return ret;
  391. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_XTAL_C2,
  392. GENMASK(23, 16),
  393. FIELD_PREP(GENMASK(23, 16), trim_40m));
  394. }
  395. return ret;
  396. }
  397. static int mt798x_wmac_adie_patch_7976(struct mt7915_dev *dev, u8 adie)
  398. {
  399. u32 id, version, rg_xo_01, rg_xo_03;
  400. int ret;
  401. ret = mt76_wmac_spi_read(dev, adie, MT_ADIE_CHIP_ID, &id);
  402. if (ret)
  403. return ret;
  404. version = FIELD_GET(MT_ADIE_VERSION_MASK, id);
  405. ret = mt76_wmac_spi_write(dev, adie, MT_ADIE_RG_TOP_THADC, 0x4a563b00);
  406. if (ret)
  407. return ret;
  408. if (version == 0x8a00 || version == 0x8a10 ||
  409. version == 0x8b00 || version == 0x8c10) {
  410. rg_xo_01 = 0x1d59080f;
  411. rg_xo_03 = 0x34c00fe0;
  412. } else {
  413. if (is_mt7981(&dev->mt76)) {
  414. rg_xo_01 = 0x1959c80f;
  415. } else if (is_mt7986(&dev->mt76)) {
  416. rg_xo_01 = 0x1959f80f;
  417. } else {
  418. WARN_ON(1);
  419. return -EINVAL;
  420. }
  421. rg_xo_03 = 0x34d00fe0;
  422. }
  423. ret = mt76_wmac_spi_write(dev, adie, MT_ADIE_RG_XO_01, rg_xo_01);
  424. if (ret)
  425. return ret;
  426. return mt76_wmac_spi_write(dev, adie, MT_ADIE_RG_XO_03, rg_xo_03);
  427. }
  428. static int
  429. mt7986_read_efuse_xo_trim_7975(struct mt7915_dev *dev, u8 adie,
  430. u32 addr, u32 *result)
  431. {
  432. int ret;
  433. u32 data;
  434. ret = mt7986_wmac_adie_efuse_read(dev, adie, addr, &data);
  435. if (ret)
  436. return ret;
  437. if ((data & MT_ADIE_XO_TRIM_EN_MASK)) {
  438. if ((data & MT_ADIE_XTAL_DECREASE_MASK))
  439. *result -= (data & MT_ADIE_EFUSE_TRIM_MASK);
  440. else
  441. *result += (data & MT_ADIE_EFUSE_TRIM_MASK);
  442. *result = (*result & MT_ADIE_TRIM_MASK);
  443. }
  444. return 0;
  445. }
  446. static int mt7986_wmac_adie_xtal_trim_7975(struct mt7915_dev *dev, u8 adie)
  447. {
  448. int ret;
  449. u32 data, result = 0, value;
  450. ret = mt7986_wmac_adie_efuse_read(dev, adie, MT_ADIE_7975_XTAL_EN,
  451. &data);
  452. if (ret || !(data & BIT(1)))
  453. return 0;
  454. ret = mt7986_wmac_adie_efuse_read(dev, adie, MT_ADIE_7975_XTAL_CAL,
  455. &data);
  456. if (ret)
  457. return ret;
  458. if (data & MT_ADIE_XO_TRIM_EN_MASK)
  459. result = (data & MT_ADIE_TRIM_MASK);
  460. ret = mt7986_read_efuse_xo_trim_7975(dev, adie, MT_ADIE_7975_XO_TRIM2,
  461. &result);
  462. if (ret)
  463. return ret;
  464. ret = mt7986_read_efuse_xo_trim_7975(dev, adie, MT_ADIE_7975_XO_TRIM3,
  465. &result);
  466. if (ret)
  467. return ret;
  468. ret = mt7986_read_efuse_xo_trim_7975(dev, adie, MT_ADIE_7975_XO_TRIM4,
  469. &result);
  470. if (ret)
  471. return ret;
  472. /* Update trim value to C1 and C2*/
  473. value = FIELD_GET(MT_ADIE_7975_XO_CTRL2_C1_MASK, result) |
  474. FIELD_GET(MT_ADIE_7975_XO_CTRL2_C2_MASK, result);
  475. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_7975_XO_CTRL2,
  476. MT_ADIE_7975_XO_CTRL2_MASK, value);
  477. if (ret)
  478. return ret;
  479. ret = mt76_wmac_spi_read(dev, adie, MT_ADIE_7975_XTAL, &value);
  480. if (ret)
  481. return ret;
  482. if (value & MT_ADIE_7975_XTAL_EN_MASK) {
  483. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_7975_XO_2,
  484. MT_ADIE_7975_XO_2_FIX_EN, 0x0);
  485. if (ret)
  486. return ret;
  487. }
  488. return mt76_wmac_spi_rmw(dev, adie, MT_ADIE_7975_XO_CTRL6,
  489. MT_ADIE_7975_XO_CTRL6_MASK, 0x1);
  490. }
  491. static int mt7986_wmac_adie_patch_7975(struct mt7915_dev *dev, u8 adie)
  492. {
  493. int ret;
  494. /* disable CAL LDO and fine tune RFDIG LDO */
  495. ret = mt76_wmac_spi_write(dev, adie, 0x348, 0x00000002);
  496. if (ret)
  497. return ret;
  498. ret = mt76_wmac_spi_write(dev, adie, 0x378, 0x00000002);
  499. if (ret)
  500. return ret;
  501. ret = mt76_wmac_spi_write(dev, adie, 0x3a8, 0x00000002);
  502. if (ret)
  503. return ret;
  504. ret = mt76_wmac_spi_write(dev, adie, 0x3d8, 0x00000002);
  505. if (ret)
  506. return ret;
  507. /* set CKA driving and filter */
  508. ret = mt76_wmac_spi_write(dev, adie, 0xa1c, 0x30000aaa);
  509. if (ret)
  510. return ret;
  511. /* set CKB LDO to 1.4V */
  512. ret = mt76_wmac_spi_write(dev, adie, 0xa84, 0x8470008a);
  513. if (ret)
  514. return ret;
  515. /* turn on SX0 LTBUF */
  516. if (is_mt7981(&dev->mt76)) {
  517. ret = mt76_wmac_spi_write(dev, adie, 0x074, 0x00000007);
  518. } else if (is_mt7986(&dev->mt76)) {
  519. ret = mt76_wmac_spi_write(dev, adie, 0x074, 0x00000002);
  520. } else {
  521. WARN_ON(1);
  522. return -EINVAL;
  523. }
  524. if (ret)
  525. return ret;
  526. /* CK_BUF_SW_EN = 1 (all buf in manual mode.) */
  527. ret = mt76_wmac_spi_write(dev, adie, 0xaa4, 0x01001fc0);
  528. if (ret)
  529. return ret;
  530. /* BT mode/WF normal mode 00000005 */
  531. ret = mt76_wmac_spi_write(dev, adie, 0x070, 0x00000005);
  532. if (ret)
  533. return ret;
  534. /* BG thermal sensor offset update */
  535. ret = mt76_wmac_spi_write(dev, adie, 0x344, 0x00000088);
  536. if (ret)
  537. return ret;
  538. ret = mt76_wmac_spi_write(dev, adie, 0x374, 0x00000088);
  539. if (ret)
  540. return ret;
  541. ret = mt76_wmac_spi_write(dev, adie, 0x3a4, 0x00000088);
  542. if (ret)
  543. return ret;
  544. ret = mt76_wmac_spi_write(dev, adie, 0x3d4, 0x00000088);
  545. if (ret)
  546. return ret;
  547. /* set WCON VDD IPTAT to "0000" */
  548. ret = mt76_wmac_spi_write(dev, adie, 0xa80, 0x44d07000);
  549. if (ret)
  550. return ret;
  551. /* change back LTBUF SX3 drving to default value */
  552. ret = mt76_wmac_spi_write(dev, adie, 0xa88, 0x3900aaaa);
  553. if (ret)
  554. return ret;
  555. /* SM input cap off */
  556. ret = mt76_wmac_spi_write(dev, adie, 0x2c4, 0x00000000);
  557. if (ret)
  558. return ret;
  559. /* set CKB driving and filter */
  560. if (is_mt7986(&dev->mt76))
  561. return mt76_wmac_spi_write(dev, adie, 0x2c8, 0x00000072);
  562. return ret;
  563. }
  564. static int mt7986_wmac_adie_cfg(struct mt7915_dev *dev, u8 adie, u32 adie_type)
  565. {
  566. int ret;
  567. mt76_wmac_spi_lock(dev);
  568. ret = mt76_wmac_spi_write(dev, adie, MT_ADIE_CLK_EN, ~0);
  569. if (ret)
  570. goto out;
  571. if (is_7975(dev, adie, adie_type)) {
  572. ret = mt76_wmac_spi_rmw(dev, adie, MT_ADIE_7975_COCLK,
  573. BIT(1), 0x1);
  574. if (ret)
  575. goto out;
  576. ret = mt7986_wmac_adie_thermal_cal(dev, adie);
  577. if (ret)
  578. goto out;
  579. ret = mt7986_wmac_adie_xtal_trim_7975(dev, adie);
  580. if (ret)
  581. goto out;
  582. ret = mt7986_wmac_adie_patch_7975(dev, adie);
  583. } else if (is_7976(dev, adie, adie_type)) {
  584. if (mt798x_wmac_check_adie_type(dev) == ADIE_DBDC) {
  585. ret = mt76_wmac_spi_write(dev, adie,
  586. MT_ADIE_WRI_CK_SEL, 0x1c);
  587. if (ret)
  588. goto out;
  589. }
  590. ret = mt7986_wmac_adie_thermal_cal(dev, adie);
  591. if (ret)
  592. goto out;
  593. ret = mt7986_wmac_adie_xtal_trim_7976(dev, adie);
  594. if (ret)
  595. goto out;
  596. ret = mt798x_wmac_adie_patch_7976(dev, adie);
  597. }
  598. out:
  599. mt76_wmac_spi_unlock(dev);
  600. return ret;
  601. }
  602. static int
  603. mt7986_wmac_afe_cal(struct mt7915_dev *dev, u8 adie, bool dbdc, u32 adie_type)
  604. {
  605. int ret;
  606. u8 idx;
  607. u32 txcal;
  608. mt76_wmac_spi_lock(dev);
  609. if (is_7975(dev, adie, adie_type))
  610. ret = mt76_wmac_spi_write(dev, adie,
  611. MT_AFE_RG_ENCAL_WBTAC_IF_SW,
  612. 0x80000000);
  613. else
  614. ret = mt76_wmac_spi_write(dev, adie,
  615. MT_AFE_RG_ENCAL_WBTAC_IF_SW,
  616. 0x88888005);
  617. if (ret)
  618. goto out;
  619. idx = dbdc ? ADIE_DBDC : adie;
  620. mt76_rmw_field(dev, MT_AFE_DIG_EN_01(idx),
  621. MT_AFE_RG_WBG_EN_RCK_MASK, 0x1);
  622. usleep_range(60, 100);
  623. mt76_rmw(dev, MT_AFE_DIG_EN_01(idx),
  624. MT_AFE_RG_WBG_EN_RCK_MASK, 0x0);
  625. mt76_rmw_field(dev, MT_AFE_DIG_EN_03(idx),
  626. MT_AFE_RG_WBG_EN_BPLL_UP_MASK, 0x1);
  627. usleep_range(30, 100);
  628. mt76_rmw_field(dev, MT_AFE_DIG_EN_03(idx),
  629. MT_AFE_RG_WBG_EN_WPLL_UP_MASK, 0x1);
  630. usleep_range(60, 100);
  631. txcal = (MT_AFE_RG_WBG_EN_TXCAL_BT |
  632. MT_AFE_RG_WBG_EN_TXCAL_WF0 |
  633. MT_AFE_RG_WBG_EN_TXCAL_WF1 |
  634. MT_AFE_RG_WBG_EN_TXCAL_WF2 |
  635. MT_AFE_RG_WBG_EN_TXCAL_WF3);
  636. if (is_mt7981(&dev->mt76))
  637. txcal |= MT_AFE_RG_WBG_EN_TXCAL_WF4;
  638. mt76_set(dev, MT_AFE_DIG_EN_01(idx), txcal);
  639. usleep_range(800, 1000);
  640. mt76_clear(dev, MT_AFE_DIG_EN_01(idx), txcal);
  641. mt76_rmw(dev, MT_AFE_DIG_EN_03(idx),
  642. MT_AFE_RG_WBG_EN_PLL_UP_MASK, 0x0);
  643. ret = mt76_wmac_spi_write(dev, adie, MT_AFE_RG_ENCAL_WBTAC_IF_SW,
  644. 0x5);
  645. out:
  646. mt76_wmac_spi_unlock(dev);
  647. return ret;
  648. }
  649. static void mt7986_wmac_subsys_pll_initial(struct mt7915_dev *dev, u8 band)
  650. {
  651. mt76_rmw(dev, MT_AFE_PLL_STB_TIME(band),
  652. MT_AFE_PLL_STB_TIME_MASK, MT_AFE_PLL_STB_TIME_VAL);
  653. mt76_rmw(dev, MT_AFE_DIG_EN_02(band),
  654. MT_AFE_PLL_CFG_MASK, MT_AFE_PLL_CFG_VAL);
  655. mt76_rmw(dev, MT_AFE_DIG_TOP_01(band),
  656. MT_AFE_DIG_TOP_01_MASK, MT_AFE_DIG_TOP_01_VAL);
  657. }
  658. static void mt7986_wmac_subsys_setting(struct mt7915_dev *dev)
  659. {
  660. /* Subsys pll init */
  661. mt7986_wmac_subsys_pll_initial(dev, 0);
  662. mt7986_wmac_subsys_pll_initial(dev, 1);
  663. /* Set legacy OSC control stable time*/
  664. mt76_rmw(dev, MT_CONN_INFRA_OSC_RC_EN,
  665. MT_CONN_INFRA_OSC_RC_EN_MASK, 0x0);
  666. mt76_rmw(dev, MT_CONN_INFRA_OSC_CTRL,
  667. MT_CONN_INFRA_OSC_STB_TIME_MASK, 0x80706);
  668. /* prevent subsys from power on/of in a short time interval */
  669. mt76_rmw(dev, MT_TOP_WFSYS_PWR,
  670. MT_TOP_PWR_ACK_MASK | MT_TOP_PWR_KEY_MASK,
  671. MT_TOP_PWR_KEY);
  672. }
  673. static int mt7986_wmac_bus_timeout(struct mt7915_dev *dev)
  674. {
  675. mt76_rmw_field(dev, MT_INFRA_BUS_OFF_TIMEOUT,
  676. MT_INFRA_BUS_TIMEOUT_LIMIT_MASK, 0x2);
  677. mt76_rmw_field(dev, MT_INFRA_BUS_OFF_TIMEOUT,
  678. MT_INFRA_BUS_TIMEOUT_EN_MASK, 0xf);
  679. mt76_rmw_field(dev, MT_INFRA_BUS_ON_TIMEOUT,
  680. MT_INFRA_BUS_TIMEOUT_LIMIT_MASK, 0xc);
  681. mt76_rmw_field(dev, MT_INFRA_BUS_ON_TIMEOUT,
  682. MT_INFRA_BUS_TIMEOUT_EN_MASK, 0xf);
  683. return mt798x_wmac_coninfra_check(dev);
  684. }
  685. static void mt7986_wmac_clock_enable(struct mt7915_dev *dev, u32 adie_type)
  686. {
  687. u32 cur;
  688. mt76_rmw_field(dev, MT_INFRA_CKGEN_BUS_WPLL_DIV_1,
  689. MT_INFRA_CKGEN_DIV_SEL_MASK, 0x1);
  690. mt76_rmw_field(dev, MT_INFRA_CKGEN_BUS_WPLL_DIV_2,
  691. MT_INFRA_CKGEN_DIV_SEL_MASK, 0x1);
  692. mt76_rmw_field(dev, MT_INFRA_CKGEN_BUS_WPLL_DIV_1,
  693. MT_INFRA_CKGEN_DIV_EN_MASK, 0x1);
  694. mt76_rmw_field(dev, MT_INFRA_CKGEN_BUS_WPLL_DIV_2,
  695. MT_INFRA_CKGEN_DIV_EN_MASK, 0x1);
  696. mt76_rmw_field(dev, MT_INFRA_CKGEN_RFSPI_WPLL_DIV,
  697. MT_INFRA_CKGEN_DIV_SEL_MASK, 0x8);
  698. mt76_rmw_field(dev, MT_INFRA_CKGEN_RFSPI_WPLL_DIV,
  699. MT_INFRA_CKGEN_DIV_EN_MASK, 0x1);
  700. mt76_rmw_field(dev, MT_INFRA_CKGEN_BUS,
  701. MT_INFRA_CKGEN_BUS_CLK_SEL_MASK, 0x0);
  702. mt76_rmw_field(dev, MT_CONN_INFRA_HW_CTRL,
  703. MT_CONN_INFRA_HW_CTRL_MASK, 0x1);
  704. mt76_rmw(dev, MT_TOP_CONN_INFRA_WAKEUP,
  705. MT_TOP_CONN_INFRA_WAKEUP_MASK, 0x1);
  706. usleep_range(900, 1000);
  707. mt76_wmac_spi_lock(dev);
  708. if (is_7975(dev, 0, adie_type) || is_7976(dev, 0, adie_type)) {
  709. mt76_rmw_field(dev, MT_ADIE_SLP_CTRL_CK0(0),
  710. MT_SLP_CTRL_EN_MASK, 0x1);
  711. read_poll_timeout(mt76_rr, cur, !(cur & MT_SLP_CTRL_BSY_MASK),
  712. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  713. dev, MT_ADIE_SLP_CTRL_CK0(0));
  714. }
  715. if (is_7975(dev, 1, adie_type) || is_7976(dev, 1, adie_type)) {
  716. mt76_rmw_field(dev, MT_ADIE_SLP_CTRL_CK0(1),
  717. MT_SLP_CTRL_EN_MASK, 0x1);
  718. read_poll_timeout(mt76_rr, cur, !(cur & MT_SLP_CTRL_BSY_MASK),
  719. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  720. dev, MT_ADIE_SLP_CTRL_CK0(0));
  721. }
  722. mt76_wmac_spi_unlock(dev);
  723. mt76_rmw(dev, MT_TOP_CONN_INFRA_WAKEUP,
  724. MT_TOP_CONN_INFRA_WAKEUP_MASK, 0x0);
  725. usleep_range(900, 1000);
  726. }
  727. static int mt7986_wmac_top_wfsys_wakeup(struct mt7915_dev *dev, bool enable)
  728. {
  729. mt76_rmw_field(dev, MT_TOP_WFSYS_WAKEUP,
  730. MT_TOP_WFSYS_WAKEUP_MASK, enable);
  731. usleep_range(900, 1000);
  732. if (!enable)
  733. return 0;
  734. return mt798x_wmac_coninfra_check(dev);
  735. }
  736. static int mt7986_wmac_wm_enable(struct mt7915_dev *dev, bool enable)
  737. {
  738. u32 cur;
  739. if (is_mt7986(&dev->mt76))
  740. mt76_wr(dev, MT_CONNINFRA_SKU_DEC_ADDR, 0);
  741. mt76_rmw_field(dev, MT7986_TOP_WM_RESET,
  742. MT7986_TOP_WM_RESET_MASK, enable);
  743. if (!enable)
  744. return 0;
  745. return read_poll_timeout(mt76_rr, cur, (cur == 0x1d1e),
  746. USEC_PER_MSEC, 5000 * USEC_PER_MSEC, false,
  747. dev, MT_TOP_CFG_ON_ROM_IDX);
  748. }
  749. static int mt7986_wmac_wfsys_poweron(struct mt7915_dev *dev, bool enable)
  750. {
  751. u32 mask = MT_TOP_PWR_EN_MASK | MT_TOP_PWR_KEY_MASK;
  752. u32 cur;
  753. mt76_rmw(dev, MT_TOP_WFSYS_PWR, mask,
  754. MT_TOP_PWR_KEY | FIELD_PREP(MT_TOP_PWR_EN_MASK, enable));
  755. return read_poll_timeout(mt76_rr, cur,
  756. (FIELD_GET(MT_TOP_WFSYS_RESET_STATUS_MASK, cur) == enable),
  757. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  758. dev, MT_TOP_WFSYS_RESET_STATUS);
  759. }
  760. static int mt7986_wmac_wfsys_setting(struct mt7915_dev *dev)
  761. {
  762. int ret;
  763. u32 cur;
  764. /* Turn off wfsys2conn bus sleep protect */
  765. mt76_rmw(dev, MT_CONN_INFRA_WF_SLP_PROT,
  766. MT_CONN_INFRA_WF_SLP_PROT_MASK, 0x0);
  767. ret = mt7986_wmac_wfsys_poweron(dev, true);
  768. if (ret)
  769. return ret;
  770. /* Check bus sleep protect */
  771. ret = read_poll_timeout(mt76_rr, cur,
  772. !(cur & MT_CONN_INFRA_CONN_WF_MASK),
  773. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  774. dev, MT_CONN_INFRA_WF_SLP_PROT_RDY);
  775. if (ret)
  776. return ret;
  777. ret = read_poll_timeout(mt76_rr, cur, !(cur & MT_SLP_WFDMA2CONN_MASK),
  778. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  779. dev, MT_SLP_STATUS);
  780. if (ret)
  781. return ret;
  782. return read_poll_timeout(mt76_rr, cur, (cur == 0x02060000),
  783. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  784. dev, MT_TOP_CFG_IP_VERSION_ADDR);
  785. }
  786. static void mt7986_wmac_wfsys_set_timeout(struct mt7915_dev *dev)
  787. {
  788. u32 mask = MT_MCU_BUS_TIMEOUT_SET_MASK |
  789. MT_MCU_BUS_TIMEOUT_CG_EN_MASK |
  790. MT_MCU_BUS_TIMEOUT_EN_MASK;
  791. u32 val = FIELD_PREP(MT_MCU_BUS_TIMEOUT_SET_MASK, 1) |
  792. FIELD_PREP(MT_MCU_BUS_TIMEOUT_CG_EN_MASK, 1) |
  793. FIELD_PREP(MT_MCU_BUS_TIMEOUT_EN_MASK, 1);
  794. mt76_rmw(dev, MT_MCU_BUS_TIMEOUT, mask, val);
  795. mt76_wr(dev, MT_MCU_BUS_REMAP, 0x810f0000);
  796. mask = MT_MCU_BUS_DBG_TIMEOUT_SET_MASK |
  797. MT_MCU_BUS_DBG_TIMEOUT_CK_EN_MASK |
  798. MT_MCU_BUS_DBG_TIMEOUT_EN_MASK;
  799. val = FIELD_PREP(MT_MCU_BUS_DBG_TIMEOUT_SET_MASK, 0x3aa) |
  800. FIELD_PREP(MT_MCU_BUS_DBG_TIMEOUT_CK_EN_MASK, 1) |
  801. FIELD_PREP(MT_MCU_BUS_DBG_TIMEOUT_EN_MASK, 1);
  802. mt76_rmw(dev, MT_MCU_BUS_DBG_TIMEOUT, mask, val);
  803. }
  804. static int mt7986_wmac_sku_update(struct mt7915_dev *dev, u32 adie_type)
  805. {
  806. u32 val;
  807. if (is_7976(dev, 0, adie_type) && is_7976(dev, 1, adie_type))
  808. val = 0xf;
  809. else if (is_7975(dev, 0, adie_type) && is_7975(dev, 1, adie_type))
  810. val = 0xd;
  811. else if (is_7976(dev, 0, adie_type))
  812. val = 0x7;
  813. else if (is_7975(dev, 1, adie_type))
  814. val = 0x8;
  815. else if (is_7976(dev, 1, adie_type))
  816. val = 0xa;
  817. else
  818. return -EINVAL;
  819. mt76_wmac_rmw(dev->sku, MT_TOP_POS_SKU, MT_TOP_POS_SKU_MASK,
  820. FIELD_PREP(MT_TOP_POS_SKU_MASK, val));
  821. mt76_wr(dev, MT_CONNINFRA_SKU_DEC_ADDR, val);
  822. return 0;
  823. }
  824. static int
  825. mt7986_wmac_adie_setup(struct mt7915_dev *dev, u8 adie, u32 adie_type)
  826. {
  827. int ret;
  828. if (!(is_7975(dev, adie, adie_type) || is_7976(dev, adie, adie_type)))
  829. return 0;
  830. ret = mt7986_wmac_adie_cfg(dev, adie, adie_type);
  831. if (ret)
  832. return ret;
  833. ret = mt7986_wmac_afe_cal(dev, adie, false, adie_type);
  834. if (ret)
  835. return ret;
  836. if (!adie && (mt798x_wmac_check_adie_type(dev) == ADIE_DBDC))
  837. ret = mt7986_wmac_afe_cal(dev, adie, true, adie_type);
  838. return ret;
  839. }
  840. static int mt7986_wmac_subsys_powerup(struct mt7915_dev *dev, u32 adie_type)
  841. {
  842. int ret;
  843. mt7986_wmac_subsys_setting(dev);
  844. ret = mt7986_wmac_bus_timeout(dev);
  845. if (ret)
  846. return ret;
  847. mt7986_wmac_clock_enable(dev, adie_type);
  848. return 0;
  849. }
  850. static int mt7986_wmac_wfsys_powerup(struct mt7915_dev *dev)
  851. {
  852. int ret;
  853. ret = mt7986_wmac_wm_enable(dev, false);
  854. if (ret)
  855. return ret;
  856. ret = mt7986_wmac_wfsys_setting(dev);
  857. if (ret)
  858. return ret;
  859. mt7986_wmac_wfsys_set_timeout(dev);
  860. return mt7986_wmac_wm_enable(dev, true);
  861. }
  862. int mt7986_wmac_enable(struct mt7915_dev *dev)
  863. {
  864. int ret;
  865. u32 adie_type;
  866. ret = mt7986_wmac_consys_reset(dev, true);
  867. if (ret)
  868. return ret;
  869. ret = mt7986_wmac_gpio_setup(dev);
  870. if (ret)
  871. return ret;
  872. ret = mt7986_wmac_consys_lockup(dev, false);
  873. if (ret)
  874. return ret;
  875. ret = mt798x_wmac_coninfra_check(dev);
  876. if (ret)
  877. return ret;
  878. ret = mt798x_wmac_coninfra_setup(dev);
  879. if (ret)
  880. return ret;
  881. ret = mt798x_wmac_sku_setup(dev, &adie_type);
  882. if (ret)
  883. return ret;
  884. ret = mt7986_wmac_adie_setup(dev, 0, adie_type);
  885. if (ret)
  886. return ret;
  887. /* mt7981 doesn't support a second a-die */
  888. if (is_mt7986(&dev->mt76)) {
  889. ret = mt7986_wmac_adie_setup(dev, 1, adie_type);
  890. if (ret)
  891. return ret;
  892. }
  893. ret = mt7986_wmac_subsys_powerup(dev, adie_type);
  894. if (ret)
  895. return ret;
  896. ret = mt7986_wmac_top_wfsys_wakeup(dev, true);
  897. if (ret)
  898. return ret;
  899. ret = mt7986_wmac_wfsys_powerup(dev);
  900. if (ret)
  901. return ret;
  902. return mt7986_wmac_sku_update(dev, adie_type);
  903. }
  904. void mt7986_wmac_disable(struct mt7915_dev *dev)
  905. {
  906. u32 cur;
  907. mt7986_wmac_top_wfsys_wakeup(dev, true);
  908. /* Turn on wfsys2conn bus sleep protect */
  909. mt76_rmw_field(dev, MT_CONN_INFRA_WF_SLP_PROT,
  910. MT_CONN_INFRA_WF_SLP_PROT_MASK, 0x1);
  911. /* Check wfsys2conn bus sleep protect */
  912. read_poll_timeout(mt76_rr, cur, !(cur ^ MT_CONN_INFRA_CONN),
  913. USEC_PER_MSEC, 50 * USEC_PER_MSEC, false,
  914. dev, MT_CONN_INFRA_WF_SLP_PROT_RDY);
  915. mt7986_wmac_wfsys_poweron(dev, false);
  916. /* Turn back wpll setting */
  917. mt76_rmw_field(dev, MT_AFE_DIG_EN_02(0), MT_AFE_MCU_BPLL_CFG_MASK, 0x2);
  918. mt76_rmw_field(dev, MT_AFE_DIG_EN_02(0), MT_AFE_WPLL_CFG_MASK, 0x2);
  919. /* Reset EMI */
  920. mt76_rmw_field(dev, MT_CONN_INFRA_EMI_REQ,
  921. MT_CONN_INFRA_EMI_REQ_MASK, 0x1);
  922. mt76_rmw_field(dev, MT_CONN_INFRA_EMI_REQ,
  923. MT_CONN_INFRA_EMI_REQ_MASK, 0x0);
  924. mt76_rmw_field(dev, MT_CONN_INFRA_EMI_REQ,
  925. MT_CONN_INFRA_INFRA_REQ_MASK, 0x1);
  926. mt76_rmw_field(dev, MT_CONN_INFRA_EMI_REQ,
  927. MT_CONN_INFRA_INFRA_REQ_MASK, 0x0);
  928. mt7986_wmac_top_wfsys_wakeup(dev, false);
  929. mt7986_wmac_consys_lockup(dev, true);
  930. mt7986_wmac_consys_reset(dev, false);
  931. }
  932. static int mt798x_wmac_init(struct mt7915_dev *dev)
  933. {
  934. struct device *pdev = dev->mt76.dev;
  935. struct platform_device *pfdev = to_platform_device(pdev);
  936. struct clk *mcu_clk, *ap_conn_clk;
  937. mcu_clk = devm_clk_get(pdev, "mcu");
  938. if (IS_ERR(mcu_clk))
  939. dev_err(pdev, "mcu clock not found\n");
  940. else if (clk_prepare_enable(mcu_clk))
  941. dev_err(pdev, "mcu clock configuration failed\n");
  942. ap_conn_clk = devm_clk_get(pdev, "ap2conn");
  943. if (IS_ERR(ap_conn_clk))
  944. dev_err(pdev, "ap2conn clock not found\n");
  945. else if (clk_prepare_enable(ap_conn_clk))
  946. dev_err(pdev, "ap2conn clock configuration failed\n");
  947. dev->dcm = devm_platform_ioremap_resource(pfdev, 1);
  948. if (IS_ERR(dev->dcm))
  949. return PTR_ERR(dev->dcm);
  950. dev->sku = devm_platform_ioremap_resource(pfdev, 2);
  951. if (IS_ERR(dev->sku))
  952. return PTR_ERR(dev->sku);
  953. dev->rstc = devm_reset_control_get(pdev, "consys");
  954. return PTR_ERR_OR_ZERO(dev->rstc);
  955. }
  956. static int mt798x_wmac_probe(struct platform_device *pdev)
  957. {
  958. void __iomem *mem_base;
  959. struct mt7915_dev *dev;
  960. struct mt76_dev *mdev;
  961. int irq, ret;
  962. u32 chip_id;
  963. chip_id = (uintptr_t)of_device_get_match_data(&pdev->dev);
  964. mem_base = devm_platform_ioremap_resource(pdev, 0);
  965. if (IS_ERR(mem_base)) {
  966. dev_err(&pdev->dev, "Failed to get memory resource\n");
  967. return PTR_ERR(mem_base);
  968. }
  969. dev = mt7915_mmio_probe(&pdev->dev, mem_base, chip_id);
  970. if (IS_ERR(dev))
  971. return PTR_ERR(dev);
  972. mdev = &dev->mt76;
  973. ret = mt7915_mmio_wed_init(dev, pdev, false, &irq);
  974. if (ret < 0)
  975. goto free_device;
  976. if (!ret) {
  977. irq = platform_get_irq(pdev, 0);
  978. if (irq < 0) {
  979. ret = irq;
  980. goto free_device;
  981. }
  982. }
  983. ret = devm_request_irq(mdev->dev, irq, mt7915_irq_handler,
  984. IRQF_SHARED, KBUILD_MODNAME, dev);
  985. if (ret)
  986. goto free_device;
  987. ret = mt798x_wmac_init(dev);
  988. if (ret)
  989. goto free_irq;
  990. mt7915_wfsys_reset(dev);
  991. ret = mt7915_register_device(dev);
  992. if (ret)
  993. goto free_irq;
  994. return 0;
  995. free_irq:
  996. devm_free_irq(mdev->dev, irq, dev);
  997. free_device:
  998. if (mtk_wed_device_active(&mdev->mmio.wed))
  999. mtk_wed_device_detach(&mdev->mmio.wed);
  1000. mt76_free_device(mdev);
  1001. return ret;
  1002. }
  1003. static void mt798x_wmac_remove(struct platform_device *pdev)
  1004. {
  1005. struct mt7915_dev *dev = platform_get_drvdata(pdev);
  1006. mt7915_unregister_device(dev);
  1007. }
  1008. static const struct of_device_id mt798x_wmac_of_match[] = {
  1009. { .compatible = "mediatek,mt7981-wmac", .data = (u32 *)0x7981 },
  1010. { .compatible = "mediatek,mt7986-wmac", .data = (u32 *)0x7986 },
  1011. {},
  1012. };
  1013. MODULE_DEVICE_TABLE(of, mt798x_wmac_of_match);
  1014. struct platform_driver mt798x_wmac_driver = {
  1015. .driver = {
  1016. .name = "mt798x-wmac",
  1017. .of_match_table = mt798x_wmac_of_match,
  1018. },
  1019. .probe = mt798x_wmac_probe,
  1020. .remove = mt798x_wmac_remove,
  1021. };
  1022. MODULE_FIRMWARE(MT7986_FIRMWARE_WA);
  1023. MODULE_FIRMWARE(MT7986_FIRMWARE_WM);
  1024. MODULE_FIRMWARE(MT7986_FIRMWARE_WM_MT7975);
  1025. MODULE_FIRMWARE(MT7986_ROM_PATCH);
  1026. MODULE_FIRMWARE(MT7986_ROM_PATCH_MT7975);
  1027. MODULE_FIRMWARE(MT7981_FIRMWARE_WA);
  1028. MODULE_FIRMWARE(MT7981_FIRMWARE_WM);
  1029. MODULE_FIRMWARE(MT7981_ROM_PATCH);