air_en8811h.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Driver for the Airoha EN8811H and AN8811HB 2.5 Gigabit PHYs.
  4. *
  5. * Limitations:
  6. * - Only full duplex supported
  7. * - Forced speed (AN off) is not supported by hardware (100Mbps)
  8. *
  9. * Source originated from airoha's en8811h.c and en8811h.h v1.2.1
  10. * with AN8811HB bits from air_an8811hb.c v0.0.4
  11. *
  12. * Copyright (C) 2023, 2026 Airoha Technology Corp.
  13. */
  14. #include <linux/clk.h>
  15. #include <linux/clk-provider.h>
  16. #include <linux/phy.h>
  17. #include <linux/phy/phy-common-props.h>
  18. #include <linux/firmware.h>
  19. #include <linux/property.h>
  20. #include <linux/wordpart.h>
  21. #include <linux/unaligned.h>
  22. #define EN8811H_PHY_ID 0x03a2a411
  23. #define AN8811HB_PHY_ID 0xc0ff04a0
  24. #define EN8811H_MD32_DM "airoha/EthMD32.dm.bin"
  25. #define EN8811H_MD32_DSP "airoha/EthMD32.DSP.bin"
  26. #define AN8811HB_MD32_DM "airoha/an8811hb/EthMD32_CRC.DM.bin"
  27. #define AN8811HB_MD32_DSP "airoha/an8811hb/EthMD32_CRC.DSP.bin"
  28. #define AIR_FW_ADDR_DM 0x00000000
  29. #define AIR_FW_ADDR_DSP 0x00100000
  30. /* MII Registers */
  31. #define AIR_AUX_CTRL_STATUS 0x1d
  32. #define AIR_AUX_CTRL_STATUS_SPEED_MASK GENMASK(4, 2)
  33. #define AIR_AUX_CTRL_STATUS_SPEED_10 0x0
  34. #define AIR_AUX_CTRL_STATUS_SPEED_100 0x4
  35. #define AIR_AUX_CTRL_STATUS_SPEED_1000 0x8
  36. #define AIR_AUX_CTRL_STATUS_SPEED_2500 0xc
  37. #define AIR_EXT_PAGE_ACCESS 0x1f
  38. #define AIR_PHY_PAGE_STANDARD 0x0000
  39. #define AIR_PHY_PAGE_EXTENDED_4 0x0004
  40. /* MII Registers Page 4*/
  41. #define AIR_BPBUS_MODE 0x10
  42. #define AIR_BPBUS_MODE_ADDR_FIXED 0x0000
  43. #define AIR_BPBUS_MODE_ADDR_INCR BIT(15)
  44. #define AIR_BPBUS_WR_ADDR_HIGH 0x11
  45. #define AIR_BPBUS_WR_ADDR_LOW 0x12
  46. #define AIR_BPBUS_WR_DATA_HIGH 0x13
  47. #define AIR_BPBUS_WR_DATA_LOW 0x14
  48. #define AIR_BPBUS_RD_ADDR_HIGH 0x15
  49. #define AIR_BPBUS_RD_ADDR_LOW 0x16
  50. #define AIR_BPBUS_RD_DATA_HIGH 0x17
  51. #define AIR_BPBUS_RD_DATA_LOW 0x18
  52. /* Registers on MDIO_MMD_VEND1 */
  53. #define EN8811H_PHY_FW_STATUS 0x8009
  54. #define EN8811H_PHY_READY 0x02
  55. #define AIR_PHY_MCU_CMD_0 0x800b
  56. #define AIR_PHY_MCU_CMD_1 0x800c
  57. #define AIR_PHY_MCU_CMD_1_MODE1 0x0
  58. #define AIR_PHY_MCU_CMD_2 0x800d
  59. #define AIR_PHY_MCU_CMD_2_MODE1 0x0
  60. #define AIR_PHY_MCU_CMD_3 0x800e
  61. #define AIR_PHY_MCU_CMD_3_MODE1 0x1101
  62. #define AIR_PHY_MCU_CMD_3_DOCMD 0x1100
  63. #define AIR_PHY_MCU_CMD_4 0x800f
  64. #define AIR_PHY_MCU_CMD_4_MODE1 0x0002
  65. #define AIR_PHY_MCU_CMD_4_CABLE_PAIR_A 0x00d7
  66. #define AIR_PHY_MCU_CMD_4_CABLE_PAIR_B 0x00d8
  67. #define AIR_PHY_MCU_CMD_4_CABLE_PAIR_C 0x00d9
  68. #define AIR_PHY_MCU_CMD_4_CABLE_PAIR_D 0x00da
  69. #define AIR_PHY_MCU_CMD_4_INTCLR 0x00e4
  70. /* Registers on MDIO_MMD_VEND2 */
  71. #define AIR_PHY_LED_BCR 0x021
  72. #define AIR_PHY_LED_BCR_MODE_MASK GENMASK(1, 0)
  73. #define AIR_PHY_LED_BCR_TIME_TEST BIT(2)
  74. #define AIR_PHY_LED_BCR_CLK_EN BIT(3)
  75. #define AIR_PHY_LED_BCR_EXT_CTRL BIT(15)
  76. #define AIR_PHY_LED_DUR_ON 0x022
  77. #define AIR_PHY_LED_DUR_BLINK 0x023
  78. #define AIR_PHY_LED_ON(i) (0x024 + ((i) * 2))
  79. #define AIR_PHY_LED_ON_MASK (GENMASK(6, 0) | BIT(8))
  80. #define AIR_PHY_LED_ON_LINK1000 BIT(0)
  81. #define AIR_PHY_LED_ON_LINK100 BIT(1)
  82. #define AIR_PHY_LED_ON_LINK10 BIT(2)
  83. #define AIR_PHY_LED_ON_LINKDOWN BIT(3)
  84. #define AIR_PHY_LED_ON_FDX BIT(4) /* Full duplex */
  85. #define AIR_PHY_LED_ON_HDX BIT(5) /* Half duplex */
  86. #define AIR_PHY_LED_ON_FORCE_ON BIT(6)
  87. #define AIR_PHY_LED_ON_LINK2500 BIT(8)
  88. #define AIR_PHY_LED_ON_POLARITY BIT(14)
  89. #define AIR_PHY_LED_ON_ENABLE BIT(15)
  90. #define AIR_PHY_LED_BLINK(i) (0x025 + ((i) * 2))
  91. #define AIR_PHY_LED_BLINK_1000TX BIT(0)
  92. #define AIR_PHY_LED_BLINK_1000RX BIT(1)
  93. #define AIR_PHY_LED_BLINK_100TX BIT(2)
  94. #define AIR_PHY_LED_BLINK_100RX BIT(3)
  95. #define AIR_PHY_LED_BLINK_10TX BIT(4)
  96. #define AIR_PHY_LED_BLINK_10RX BIT(5)
  97. #define AIR_PHY_LED_BLINK_COLLISION BIT(6)
  98. #define AIR_PHY_LED_BLINK_RX_CRC_ERR BIT(7)
  99. #define AIR_PHY_LED_BLINK_RX_IDLE_ERR BIT(8)
  100. #define AIR_PHY_LED_BLINK_FORCE_BLINK BIT(9)
  101. #define AIR_PHY_LED_BLINK_2500TX BIT(10)
  102. #define AIR_PHY_LED_BLINK_2500RX BIT(11)
  103. /* Registers on BUCKPBUS */
  104. #define AIR_PHY_CONTROL 0x3a9c
  105. #define AIR_PHY_CONTROL_INTERNAL BIT(11)
  106. #define EN8811H_2P5G_LPA 0x3b30
  107. #define EN8811H_2P5G_LPA_2P5G BIT(0)
  108. #define EN8811H_FW_VERSION 0x3b3c
  109. #define EN8811H_POLARITY 0xca0f8
  110. #define EN8811H_POLARITY_TX_NORMAL BIT(0)
  111. #define EN8811H_POLARITY_RX_REVERSE BIT(1)
  112. #define EN8811H_GPIO_OUTPUT 0xcf8b8
  113. #define EN8811H_GPIO_OUTPUT_345 (BIT(3) | BIT(4) | BIT(5))
  114. #define EN8811H_HWTRAP1 0xcf914
  115. #define EN8811H_HWTRAP1_CKO BIT(12)
  116. #define EN8811H_CLK_CGM 0xcf958
  117. #define EN8811H_CLK_CGM_CKO BIT(26)
  118. #define EN8811H_FW_CTRL_1 0x0f0018
  119. #define EN8811H_FW_CTRL_1_START 0x0
  120. #define EN8811H_FW_CTRL_1_FINISH 0x1
  121. #define EN8811H_FW_CTRL_2 0x800000
  122. #define EN8811H_FW_CTRL_2_LOADING BIT(11)
  123. #define AN8811HB_CRC_PM_SET1 0xf020c
  124. #define AN8811HB_CRC_PM_MON2 0xf0218
  125. #define AN8811HB_CRC_PM_MON3 0xf021c
  126. #define AN8811HB_CRC_DM_SET1 0xf0224
  127. #define AN8811HB_CRC_DM_MON2 0xf0230
  128. #define AN8811HB_CRC_DM_MON3 0xf0234
  129. #define AN8811HB_CRC_RD_EN BIT(0)
  130. #define AN8811HB_CRC_ST (BIT(0) | BIT(1))
  131. #define AN8811HB_CRC_CHECK_PASS BIT(0)
  132. #define AN8811HB_TX_POLARITY 0x5ce004
  133. #define AN8811HB_TX_POLARITY_NORMAL BIT(7)
  134. #define AN8811HB_RX_POLARITY 0x5ce61c
  135. #define AN8811HB_RX_POLARITY_NORMAL BIT(7)
  136. #define AN8811HB_GPIO_OUTPUT 0x5cf8b8
  137. #define AN8811HB_GPIO_OUTPUT_345 (BIT(3) | BIT(4) | BIT(5))
  138. #define AN8811HB_HWTRAP1 0x5cf910
  139. #define AN8811HB_HWTRAP2 0x5cf914
  140. #define AN8811HB_HWTRAP2_CKO BIT(28)
  141. #define AN8811HB_CLK_DRV 0x5cf9e4
  142. #define AN8811HB_CLK_DRV_CKO_MASK GENMASK(14, 12)
  143. #define AN8811HB_CLK_DRV_CKOPWD BIT(12)
  144. #define AN8811HB_CLK_DRV_CKO_LDPWD BIT(13)
  145. #define AN8811HB_CLK_DRV_CKO_LPPWD BIT(14)
  146. /* Led definitions */
  147. #define EN8811H_LED_COUNT 3
  148. /* Default LED setup:
  149. * GPIO5 <-> LED0 On: Link detected, blink Rx/Tx
  150. * GPIO4 <-> LED1 On: Link detected at 2500 or 1000 Mbps
  151. * GPIO3 <-> LED2 On: Link detected at 2500 or 100 Mbps
  152. */
  153. #define AIR_DEFAULT_TRIGGER_LED0 (BIT(TRIGGER_NETDEV_LINK) | \
  154. BIT(TRIGGER_NETDEV_RX) | \
  155. BIT(TRIGGER_NETDEV_TX))
  156. #define AIR_DEFAULT_TRIGGER_LED1 (BIT(TRIGGER_NETDEV_LINK_2500) | \
  157. BIT(TRIGGER_NETDEV_LINK_1000))
  158. #define AIR_DEFAULT_TRIGGER_LED2 (BIT(TRIGGER_NETDEV_LINK_2500) | \
  159. BIT(TRIGGER_NETDEV_LINK_100))
  160. struct led {
  161. unsigned long rules;
  162. unsigned long state;
  163. };
  164. #define clk_hw_to_en8811h_priv(_hw) \
  165. container_of(_hw, struct en8811h_priv, hw)
  166. struct en8811h_priv {
  167. u32 firmware_version;
  168. bool mcu_needs_restart;
  169. struct led led[EN8811H_LED_COUNT];
  170. struct clk_hw hw;
  171. struct phy_device *phydev;
  172. unsigned int cko_is_enabled;
  173. };
  174. enum {
  175. AIR_PHY_LED_STATE_FORCE_ON,
  176. AIR_PHY_LED_STATE_FORCE_BLINK,
  177. };
  178. enum {
  179. AIR_PHY_LED_DUR_BLINK_32MS,
  180. AIR_PHY_LED_DUR_BLINK_64MS,
  181. AIR_PHY_LED_DUR_BLINK_128MS,
  182. AIR_PHY_LED_DUR_BLINK_256MS,
  183. AIR_PHY_LED_DUR_BLINK_512MS,
  184. AIR_PHY_LED_DUR_BLINK_1024MS,
  185. };
  186. enum {
  187. AIR_LED_DISABLE,
  188. AIR_LED_ENABLE,
  189. };
  190. enum {
  191. AIR_ACTIVE_LOW,
  192. AIR_ACTIVE_HIGH,
  193. };
  194. enum {
  195. AIR_LED_MODE_DISABLE,
  196. AIR_LED_MODE_USER_DEFINE,
  197. };
  198. #define AIR_PHY_LED_DUR_UNIT 1024
  199. #define AIR_PHY_LED_DUR (AIR_PHY_LED_DUR_UNIT << AIR_PHY_LED_DUR_BLINK_64MS)
  200. static const unsigned long en8811h_led_trig = BIT(TRIGGER_NETDEV_FULL_DUPLEX) |
  201. BIT(TRIGGER_NETDEV_LINK) |
  202. BIT(TRIGGER_NETDEV_LINK_10) |
  203. BIT(TRIGGER_NETDEV_LINK_100) |
  204. BIT(TRIGGER_NETDEV_LINK_1000) |
  205. BIT(TRIGGER_NETDEV_LINK_2500) |
  206. BIT(TRIGGER_NETDEV_RX) |
  207. BIT(TRIGGER_NETDEV_TX);
  208. static int air_phy_read_page(struct phy_device *phydev)
  209. {
  210. return __phy_read(phydev, AIR_EXT_PAGE_ACCESS);
  211. }
  212. static int air_phy_write_page(struct phy_device *phydev, int page)
  213. {
  214. return __phy_write(phydev, AIR_EXT_PAGE_ACCESS, page);
  215. }
  216. static int __air_buckpbus_reg_write(struct phy_device *phydev,
  217. u32 pbus_address, u32 pbus_data)
  218. {
  219. int ret;
  220. ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
  221. if (ret < 0)
  222. return ret;
  223. ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
  224. upper_16_bits(pbus_address));
  225. if (ret < 0)
  226. return ret;
  227. ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
  228. lower_16_bits(pbus_address));
  229. if (ret < 0)
  230. return ret;
  231. ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
  232. upper_16_bits(pbus_data));
  233. if (ret < 0)
  234. return ret;
  235. ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
  236. lower_16_bits(pbus_data));
  237. if (ret < 0)
  238. return ret;
  239. return 0;
  240. }
  241. static int air_buckpbus_reg_write(struct phy_device *phydev,
  242. u32 pbus_address, u32 pbus_data)
  243. {
  244. int saved_page;
  245. int ret = 0;
  246. saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
  247. if (saved_page >= 0) {
  248. ret = __air_buckpbus_reg_write(phydev, pbus_address,
  249. pbus_data);
  250. if (ret < 0)
  251. phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
  252. pbus_address, ret);
  253. }
  254. return phy_restore_page(phydev, saved_page, ret);
  255. }
  256. static int __air_buckpbus_reg_read(struct phy_device *phydev,
  257. u32 pbus_address, u32 *pbus_data)
  258. {
  259. int pbus_data_low, pbus_data_high;
  260. int ret;
  261. ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
  262. if (ret < 0)
  263. return ret;
  264. ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
  265. upper_16_bits(pbus_address));
  266. if (ret < 0)
  267. return ret;
  268. ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
  269. lower_16_bits(pbus_address));
  270. if (ret < 0)
  271. return ret;
  272. pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
  273. if (pbus_data_high < 0)
  274. return pbus_data_high;
  275. pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
  276. if (pbus_data_low < 0)
  277. return pbus_data_low;
  278. *pbus_data = pbus_data_low | (pbus_data_high << 16);
  279. return 0;
  280. }
  281. static int air_buckpbus_reg_read(struct phy_device *phydev,
  282. u32 pbus_address, u32 *pbus_data)
  283. {
  284. int saved_page;
  285. int ret = 0;
  286. saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
  287. if (saved_page >= 0) {
  288. ret = __air_buckpbus_reg_read(phydev, pbus_address, pbus_data);
  289. if (ret < 0)
  290. phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
  291. pbus_address, ret);
  292. }
  293. return phy_restore_page(phydev, saved_page, ret);
  294. }
  295. static int __air_buckpbus_reg_modify(struct phy_device *phydev,
  296. u32 pbus_address, u32 mask, u32 set)
  297. {
  298. int pbus_data_low, pbus_data_high;
  299. u32 pbus_data_old, pbus_data_new;
  300. int ret;
  301. ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_FIXED);
  302. if (ret < 0)
  303. return ret;
  304. ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_HIGH,
  305. upper_16_bits(pbus_address));
  306. if (ret < 0)
  307. return ret;
  308. ret = __phy_write(phydev, AIR_BPBUS_RD_ADDR_LOW,
  309. lower_16_bits(pbus_address));
  310. if (ret < 0)
  311. return ret;
  312. pbus_data_high = __phy_read(phydev, AIR_BPBUS_RD_DATA_HIGH);
  313. if (pbus_data_high < 0)
  314. return pbus_data_high;
  315. pbus_data_low = __phy_read(phydev, AIR_BPBUS_RD_DATA_LOW);
  316. if (pbus_data_low < 0)
  317. return pbus_data_low;
  318. pbus_data_old = pbus_data_low | (pbus_data_high << 16);
  319. pbus_data_new = (pbus_data_old & ~mask) | set;
  320. if (pbus_data_new == pbus_data_old)
  321. return 0;
  322. ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
  323. upper_16_bits(pbus_address));
  324. if (ret < 0)
  325. return ret;
  326. ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
  327. lower_16_bits(pbus_address));
  328. if (ret < 0)
  329. return ret;
  330. ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH,
  331. upper_16_bits(pbus_data_new));
  332. if (ret < 0)
  333. return ret;
  334. ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW,
  335. lower_16_bits(pbus_data_new));
  336. if (ret < 0)
  337. return ret;
  338. return 0;
  339. }
  340. static int air_buckpbus_reg_modify(struct phy_device *phydev,
  341. u32 pbus_address, u32 mask, u32 set)
  342. {
  343. int saved_page;
  344. int ret = 0;
  345. saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
  346. if (saved_page >= 0) {
  347. ret = __air_buckpbus_reg_modify(phydev, pbus_address, mask,
  348. set);
  349. if (ret < 0)
  350. phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
  351. pbus_address, ret);
  352. }
  353. return phy_restore_page(phydev, saved_page, ret);
  354. }
  355. static int __air_write_buf(struct phy_device *phydev, u32 address,
  356. const struct firmware *fw)
  357. {
  358. unsigned int offset;
  359. int ret;
  360. u16 val;
  361. ret = __phy_write(phydev, AIR_BPBUS_MODE, AIR_BPBUS_MODE_ADDR_INCR);
  362. if (ret < 0)
  363. return ret;
  364. ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_HIGH,
  365. upper_16_bits(address));
  366. if (ret < 0)
  367. return ret;
  368. ret = __phy_write(phydev, AIR_BPBUS_WR_ADDR_LOW,
  369. lower_16_bits(address));
  370. if (ret < 0)
  371. return ret;
  372. for (offset = 0; offset < fw->size; offset += 4) {
  373. val = get_unaligned_le16(&fw->data[offset + 2]);
  374. ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_HIGH, val);
  375. if (ret < 0)
  376. return ret;
  377. val = get_unaligned_le16(&fw->data[offset]);
  378. ret = __phy_write(phydev, AIR_BPBUS_WR_DATA_LOW, val);
  379. if (ret < 0)
  380. return ret;
  381. }
  382. return 0;
  383. }
  384. static int air_write_buf(struct phy_device *phydev, u32 address,
  385. const struct firmware *fw)
  386. {
  387. int saved_page;
  388. int ret = 0;
  389. saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
  390. if (saved_page >= 0) {
  391. ret = __air_write_buf(phydev, address, fw);
  392. if (ret < 0)
  393. phydev_err(phydev, "%s 0x%08x failed: %d\n", __func__,
  394. address, ret);
  395. }
  396. return phy_restore_page(phydev, saved_page, ret);
  397. }
  398. static int en8811h_wait_mcu_ready(struct phy_device *phydev)
  399. {
  400. int ret, reg_value;
  401. ret = air_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
  402. EN8811H_FW_CTRL_1_FINISH);
  403. if (ret)
  404. return ret;
  405. /* Because of mdio-lock, may have to wait for multiple loads */
  406. ret = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
  407. EN8811H_PHY_FW_STATUS, reg_value,
  408. reg_value == EN8811H_PHY_READY,
  409. 20000, 7500000, true);
  410. if (ret) {
  411. phydev_err(phydev, "MCU not ready: 0x%x\n", reg_value);
  412. return -ENODEV;
  413. }
  414. return 0;
  415. }
  416. static int an8811hb_check_crc(struct phy_device *phydev, u32 set1,
  417. u32 mon2, u32 mon3)
  418. {
  419. u32 pbus_value;
  420. int retry = 25;
  421. int ret;
  422. /* Configure CRC */
  423. ret = air_buckpbus_reg_modify(phydev, set1,
  424. AN8811HB_CRC_RD_EN,
  425. AN8811HB_CRC_RD_EN);
  426. if (ret < 0)
  427. return ret;
  428. air_buckpbus_reg_read(phydev, set1, &pbus_value);
  429. do {
  430. msleep(300);
  431. air_buckpbus_reg_read(phydev, mon2, &pbus_value);
  432. /* We do not know what errors this check is supposed
  433. * catch or what to do about a failure. So print the
  434. * result and continue like the vendor driver does.
  435. */
  436. if (pbus_value & AN8811HB_CRC_ST) {
  437. air_buckpbus_reg_read(phydev, mon3, &pbus_value);
  438. phydev_dbg(phydev, "CRC Check %s!\n",
  439. pbus_value & AN8811HB_CRC_CHECK_PASS ?
  440. "PASS" : "FAIL");
  441. return air_buckpbus_reg_modify(phydev, set1,
  442. AN8811HB_CRC_RD_EN, 0);
  443. }
  444. } while (--retry);
  445. phydev_err(phydev, "CRC Check is not ready (%u)\n", pbus_value);
  446. return -ENODEV;
  447. }
  448. static void en8811h_print_fw_version(struct phy_device *phydev)
  449. {
  450. struct en8811h_priv *priv = phydev->priv;
  451. air_buckpbus_reg_read(phydev, EN8811H_FW_VERSION,
  452. &priv->firmware_version);
  453. phydev_info(phydev, "MD32 firmware version: %08x\n",
  454. priv->firmware_version);
  455. }
  456. static int an8811hb_load_file(struct phy_device *phydev, const char *name,
  457. u32 address)
  458. {
  459. struct device *dev = &phydev->mdio.dev;
  460. const struct firmware *fw;
  461. int ret;
  462. ret = request_firmware_direct(&fw, name, dev);
  463. if (ret < 0)
  464. return ret;
  465. ret = air_write_buf(phydev, address, fw);
  466. release_firmware(fw);
  467. return ret;
  468. }
  469. static int an8811hb_load_firmware(struct phy_device *phydev)
  470. {
  471. int ret;
  472. ret = air_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
  473. EN8811H_FW_CTRL_1_START);
  474. if (ret < 0)
  475. return ret;
  476. ret = an8811hb_load_file(phydev, AN8811HB_MD32_DM, AIR_FW_ADDR_DM);
  477. if (ret < 0)
  478. return ret;
  479. ret = an8811hb_check_crc(phydev, AN8811HB_CRC_DM_SET1,
  480. AN8811HB_CRC_DM_MON2,
  481. AN8811HB_CRC_DM_MON3);
  482. if (ret < 0)
  483. return ret;
  484. ret = an8811hb_load_file(phydev, AN8811HB_MD32_DSP, AIR_FW_ADDR_DSP);
  485. if (ret < 0)
  486. return ret;
  487. ret = an8811hb_check_crc(phydev, AN8811HB_CRC_PM_SET1,
  488. AN8811HB_CRC_PM_MON2,
  489. AN8811HB_CRC_PM_MON3);
  490. if (ret < 0)
  491. return ret;
  492. return en8811h_wait_mcu_ready(phydev);
  493. }
  494. static int en8811h_load_firmware(struct phy_device *phydev)
  495. {
  496. struct device *dev = &phydev->mdio.dev;
  497. const struct firmware *fw1, *fw2;
  498. int ret;
  499. ret = request_firmware_direct(&fw1, EN8811H_MD32_DM, dev);
  500. if (ret < 0)
  501. return ret;
  502. ret = request_firmware_direct(&fw2, EN8811H_MD32_DSP, dev);
  503. if (ret < 0)
  504. goto en8811h_load_firmware_rel1;
  505. ret = air_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
  506. EN8811H_FW_CTRL_1_START);
  507. if (ret < 0)
  508. goto en8811h_load_firmware_out;
  509. ret = air_buckpbus_reg_modify(phydev, EN8811H_FW_CTRL_2,
  510. EN8811H_FW_CTRL_2_LOADING,
  511. EN8811H_FW_CTRL_2_LOADING);
  512. if (ret < 0)
  513. goto en8811h_load_firmware_out;
  514. ret = air_write_buf(phydev, AIR_FW_ADDR_DM, fw1);
  515. if (ret < 0)
  516. goto en8811h_load_firmware_out;
  517. ret = air_write_buf(phydev, AIR_FW_ADDR_DSP, fw2);
  518. if (ret < 0)
  519. goto en8811h_load_firmware_out;
  520. ret = air_buckpbus_reg_modify(phydev, EN8811H_FW_CTRL_2,
  521. EN8811H_FW_CTRL_2_LOADING, 0);
  522. if (ret < 0)
  523. goto en8811h_load_firmware_out;
  524. ret = en8811h_wait_mcu_ready(phydev);
  525. if (ret < 0)
  526. goto en8811h_load_firmware_out;
  527. en8811h_print_fw_version(phydev);
  528. en8811h_load_firmware_out:
  529. release_firmware(fw2);
  530. en8811h_load_firmware_rel1:
  531. release_firmware(fw1);
  532. if (ret < 0)
  533. phydev_err(phydev, "Load firmware failed: %d\n", ret);
  534. return ret;
  535. }
  536. static int en8811h_restart_mcu(struct phy_device *phydev)
  537. {
  538. int ret;
  539. ret = air_buckpbus_reg_write(phydev, EN8811H_FW_CTRL_1,
  540. EN8811H_FW_CTRL_1_START);
  541. if (ret < 0)
  542. return ret;
  543. return en8811h_wait_mcu_ready(phydev);
  544. }
  545. static int air_hw_led_on_set(struct phy_device *phydev, u8 index, bool on)
  546. {
  547. struct en8811h_priv *priv = phydev->priv;
  548. bool changed;
  549. if (index >= EN8811H_LED_COUNT)
  550. return -EINVAL;
  551. if (on)
  552. changed = !test_and_set_bit(AIR_PHY_LED_STATE_FORCE_ON,
  553. &priv->led[index].state);
  554. else
  555. changed = !!test_and_clear_bit(AIR_PHY_LED_STATE_FORCE_ON,
  556. &priv->led[index].state);
  557. changed |= (priv->led[index].rules != 0);
  558. /* clear netdev trigger rules in case LED_OFF has been set */
  559. if (!on)
  560. priv->led[index].rules = 0;
  561. if (changed)
  562. return phy_modify_mmd(phydev, MDIO_MMD_VEND2,
  563. AIR_PHY_LED_ON(index),
  564. AIR_PHY_LED_ON_MASK,
  565. on ? AIR_PHY_LED_ON_FORCE_ON : 0);
  566. return 0;
  567. }
  568. static int air_hw_led_blink_set(struct phy_device *phydev, u8 index,
  569. bool blinking)
  570. {
  571. struct en8811h_priv *priv = phydev->priv;
  572. bool changed;
  573. if (index >= EN8811H_LED_COUNT)
  574. return -EINVAL;
  575. if (blinking)
  576. changed = !test_and_set_bit(AIR_PHY_LED_STATE_FORCE_BLINK,
  577. &priv->led[index].state);
  578. else
  579. changed = !!test_and_clear_bit(AIR_PHY_LED_STATE_FORCE_BLINK,
  580. &priv->led[index].state);
  581. changed |= (priv->led[index].rules != 0);
  582. if (changed)
  583. return phy_write_mmd(phydev, MDIO_MMD_VEND2,
  584. AIR_PHY_LED_BLINK(index),
  585. blinking ?
  586. AIR_PHY_LED_BLINK_FORCE_BLINK : 0);
  587. else
  588. return 0;
  589. }
  590. static int air_led_blink_set(struct phy_device *phydev, u8 index,
  591. unsigned long *delay_on,
  592. unsigned long *delay_off)
  593. {
  594. struct en8811h_priv *priv = phydev->priv;
  595. bool blinking = false;
  596. int err;
  597. if (index >= EN8811H_LED_COUNT)
  598. return -EINVAL;
  599. if (delay_on && delay_off && (*delay_on > 0) && (*delay_off > 0)) {
  600. blinking = true;
  601. *delay_on = 50;
  602. *delay_off = 50;
  603. }
  604. err = air_hw_led_blink_set(phydev, index, blinking);
  605. if (err)
  606. return err;
  607. /* led-blink set, so switch led-on off */
  608. err = air_hw_led_on_set(phydev, index, false);
  609. if (err)
  610. return err;
  611. /* hw-control is off*/
  612. if (!!test_bit(AIR_PHY_LED_STATE_FORCE_BLINK, &priv->led[index].state))
  613. priv->led[index].rules = 0;
  614. return 0;
  615. }
  616. static int air_led_brightness_set(struct phy_device *phydev, u8 index,
  617. enum led_brightness value)
  618. {
  619. struct en8811h_priv *priv = phydev->priv;
  620. int err;
  621. if (index >= EN8811H_LED_COUNT)
  622. return -EINVAL;
  623. /* led-on set, so switch led-blink off */
  624. err = air_hw_led_blink_set(phydev, index, false);
  625. if (err)
  626. return err;
  627. err = air_hw_led_on_set(phydev, index, (value != LED_OFF));
  628. if (err)
  629. return err;
  630. /* hw-control is off */
  631. if (!!test_bit(AIR_PHY_LED_STATE_FORCE_ON, &priv->led[index].state))
  632. priv->led[index].rules = 0;
  633. return 0;
  634. }
  635. static int air_led_hw_control_get(struct phy_device *phydev, u8 index,
  636. unsigned long *rules)
  637. {
  638. struct en8811h_priv *priv = phydev->priv;
  639. if (index >= EN8811H_LED_COUNT)
  640. return -EINVAL;
  641. *rules = priv->led[index].rules;
  642. return 0;
  643. };
  644. static int air_led_hw_control_set(struct phy_device *phydev, u8 index,
  645. unsigned long rules)
  646. {
  647. struct en8811h_priv *priv = phydev->priv;
  648. u16 on = 0, blink = 0;
  649. int ret;
  650. if (index >= EN8811H_LED_COUNT)
  651. return -EINVAL;
  652. priv->led[index].rules = rules;
  653. if (rules & BIT(TRIGGER_NETDEV_FULL_DUPLEX))
  654. on |= AIR_PHY_LED_ON_FDX;
  655. if (rules & (BIT(TRIGGER_NETDEV_LINK_10) | BIT(TRIGGER_NETDEV_LINK)))
  656. on |= AIR_PHY_LED_ON_LINK10;
  657. if (rules & (BIT(TRIGGER_NETDEV_LINK_100) | BIT(TRIGGER_NETDEV_LINK)))
  658. on |= AIR_PHY_LED_ON_LINK100;
  659. if (rules & (BIT(TRIGGER_NETDEV_LINK_1000) | BIT(TRIGGER_NETDEV_LINK)))
  660. on |= AIR_PHY_LED_ON_LINK1000;
  661. if (rules & (BIT(TRIGGER_NETDEV_LINK_2500) | BIT(TRIGGER_NETDEV_LINK)))
  662. on |= AIR_PHY_LED_ON_LINK2500;
  663. if (rules & BIT(TRIGGER_NETDEV_RX)) {
  664. blink |= AIR_PHY_LED_BLINK_10RX |
  665. AIR_PHY_LED_BLINK_100RX |
  666. AIR_PHY_LED_BLINK_1000RX |
  667. AIR_PHY_LED_BLINK_2500RX;
  668. }
  669. if (rules & BIT(TRIGGER_NETDEV_TX)) {
  670. blink |= AIR_PHY_LED_BLINK_10TX |
  671. AIR_PHY_LED_BLINK_100TX |
  672. AIR_PHY_LED_BLINK_1000TX |
  673. AIR_PHY_LED_BLINK_2500TX;
  674. }
  675. if (blink || on) {
  676. /* switch hw-control on, so led-on and led-blink are off */
  677. clear_bit(AIR_PHY_LED_STATE_FORCE_ON,
  678. &priv->led[index].state);
  679. clear_bit(AIR_PHY_LED_STATE_FORCE_BLINK,
  680. &priv->led[index].state);
  681. } else {
  682. priv->led[index].rules = 0;
  683. }
  684. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_ON(index),
  685. AIR_PHY_LED_ON_MASK, on);
  686. if (ret < 0)
  687. return ret;
  688. return phy_write_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_BLINK(index),
  689. blink);
  690. };
  691. static int air_led_init(struct phy_device *phydev, u8 index, u8 state, u8 pol)
  692. {
  693. int val = 0;
  694. int err;
  695. if (index >= EN8811H_LED_COUNT)
  696. return -EINVAL;
  697. if (state == AIR_LED_ENABLE)
  698. val |= AIR_PHY_LED_ON_ENABLE;
  699. else
  700. val &= ~AIR_PHY_LED_ON_ENABLE;
  701. if (pol == AIR_ACTIVE_HIGH)
  702. val |= AIR_PHY_LED_ON_POLARITY;
  703. else
  704. val &= ~AIR_PHY_LED_ON_POLARITY;
  705. err = phy_modify_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_ON(index),
  706. AIR_PHY_LED_ON_ENABLE |
  707. AIR_PHY_LED_ON_POLARITY, val);
  708. if (err < 0)
  709. return err;
  710. return 0;
  711. }
  712. static int air_leds_init(struct phy_device *phydev, int num, int dur, int mode)
  713. {
  714. struct en8811h_priv *priv = phydev->priv;
  715. int ret, i;
  716. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_DUR_BLINK,
  717. dur);
  718. if (ret < 0)
  719. return ret;
  720. ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_DUR_ON,
  721. dur >> 1);
  722. if (ret < 0)
  723. return ret;
  724. switch (mode) {
  725. case AIR_LED_MODE_DISABLE:
  726. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_BCR,
  727. AIR_PHY_LED_BCR_EXT_CTRL |
  728. AIR_PHY_LED_BCR_MODE_MASK, 0);
  729. if (ret < 0)
  730. return ret;
  731. break;
  732. case AIR_LED_MODE_USER_DEFINE:
  733. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, AIR_PHY_LED_BCR,
  734. AIR_PHY_LED_BCR_EXT_CTRL |
  735. AIR_PHY_LED_BCR_CLK_EN,
  736. AIR_PHY_LED_BCR_EXT_CTRL |
  737. AIR_PHY_LED_BCR_CLK_EN);
  738. if (ret < 0)
  739. return ret;
  740. break;
  741. default:
  742. phydev_err(phydev, "LED mode %d is not supported\n", mode);
  743. return -EINVAL;
  744. }
  745. for (i = 0; i < num; ++i) {
  746. ret = air_led_init(phydev, i, AIR_LED_ENABLE, AIR_ACTIVE_HIGH);
  747. if (ret < 0) {
  748. phydev_err(phydev, "LED%d init failed: %d\n", i, ret);
  749. return ret;
  750. }
  751. air_led_hw_control_set(phydev, i, priv->led[i].rules);
  752. }
  753. return 0;
  754. }
  755. static int en8811h_led_hw_is_supported(struct phy_device *phydev, u8 index,
  756. unsigned long rules)
  757. {
  758. if (index >= EN8811H_LED_COUNT)
  759. return -EINVAL;
  760. /* All combinations of the supported triggers are allowed */
  761. if (rules & ~en8811h_led_trig)
  762. return -EOPNOTSUPP;
  763. return 0;
  764. };
  765. static unsigned long an8811hb_clk_recalc_rate(struct clk_hw *hw,
  766. unsigned long parent)
  767. {
  768. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  769. struct phy_device *phydev = priv->phydev;
  770. u32 pbus_value;
  771. int ret;
  772. ret = air_buckpbus_reg_read(phydev, AN8811HB_HWTRAP2, &pbus_value);
  773. if (ret < 0)
  774. return ret;
  775. return (pbus_value & AN8811HB_HWTRAP2_CKO) ? 50000000 : 25000000;
  776. }
  777. static int an8811hb_clk_enable(struct clk_hw *hw)
  778. {
  779. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  780. struct phy_device *phydev = priv->phydev;
  781. return air_buckpbus_reg_modify(phydev, AN8811HB_CLK_DRV,
  782. AN8811HB_CLK_DRV_CKO_MASK,
  783. AN8811HB_CLK_DRV_CKO_MASK);
  784. }
  785. static void an8811hb_clk_disable(struct clk_hw *hw)
  786. {
  787. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  788. struct phy_device *phydev = priv->phydev;
  789. air_buckpbus_reg_modify(phydev, AN8811HB_CLK_DRV,
  790. AN8811HB_CLK_DRV_CKO_MASK, 0);
  791. }
  792. static int an8811hb_clk_is_enabled(struct clk_hw *hw)
  793. {
  794. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  795. struct phy_device *phydev = priv->phydev;
  796. u32 pbus_value;
  797. int ret;
  798. ret = air_buckpbus_reg_read(phydev, AN8811HB_CLK_DRV, &pbus_value);
  799. if (ret < 0)
  800. return ret;
  801. return (pbus_value & AN8811HB_CLK_DRV_CKO_MASK);
  802. }
  803. static int an8811hb_clk_save_context(struct clk_hw *hw)
  804. {
  805. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  806. priv->cko_is_enabled = an8811hb_clk_is_enabled(hw);
  807. return 0;
  808. }
  809. static void an8811hb_clk_restore_context(struct clk_hw *hw)
  810. {
  811. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  812. if (!priv->cko_is_enabled)
  813. an8811hb_clk_disable(hw);
  814. }
  815. static const struct clk_ops an8811hb_clk_ops = {
  816. .recalc_rate = an8811hb_clk_recalc_rate,
  817. .enable = an8811hb_clk_enable,
  818. .disable = an8811hb_clk_disable,
  819. .is_enabled = an8811hb_clk_is_enabled,
  820. .save_context = an8811hb_clk_save_context,
  821. .restore_context = an8811hb_clk_restore_context,
  822. };
  823. static int an8811hb_clk_provider_setup(struct device *dev, struct clk_hw *hw)
  824. {
  825. struct clk_init_data init;
  826. int ret;
  827. if (!IS_ENABLED(CONFIG_COMMON_CLK))
  828. return 0;
  829. init.name = devm_kasprintf(dev, GFP_KERNEL, "%s-cko",
  830. fwnode_get_name(dev_fwnode(dev)));
  831. if (!init.name)
  832. return -ENOMEM;
  833. init.ops = &an8811hb_clk_ops;
  834. init.flags = 0;
  835. init.num_parents = 0;
  836. hw->init = &init;
  837. ret = devm_clk_hw_register(dev, hw);
  838. if (ret)
  839. return ret;
  840. return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
  841. }
  842. static unsigned long en8811h_clk_recalc_rate(struct clk_hw *hw,
  843. unsigned long parent)
  844. {
  845. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  846. struct phy_device *phydev = priv->phydev;
  847. u32 pbus_value;
  848. int ret;
  849. ret = air_buckpbus_reg_read(phydev, EN8811H_HWTRAP1, &pbus_value);
  850. if (ret < 0)
  851. return ret;
  852. return (pbus_value & EN8811H_HWTRAP1_CKO) ? 50000000 : 25000000;
  853. }
  854. static int en8811h_clk_enable(struct clk_hw *hw)
  855. {
  856. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  857. struct phy_device *phydev = priv->phydev;
  858. return air_buckpbus_reg_modify(phydev, EN8811H_CLK_CGM,
  859. EN8811H_CLK_CGM_CKO,
  860. EN8811H_CLK_CGM_CKO);
  861. }
  862. static void en8811h_clk_disable(struct clk_hw *hw)
  863. {
  864. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  865. struct phy_device *phydev = priv->phydev;
  866. air_buckpbus_reg_modify(phydev, EN8811H_CLK_CGM,
  867. EN8811H_CLK_CGM_CKO, 0);
  868. }
  869. static int en8811h_clk_is_enabled(struct clk_hw *hw)
  870. {
  871. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  872. struct phy_device *phydev = priv->phydev;
  873. u32 pbus_value;
  874. int ret;
  875. ret = air_buckpbus_reg_read(phydev, EN8811H_CLK_CGM, &pbus_value);
  876. if (ret < 0)
  877. return ret;
  878. return (pbus_value & EN8811H_CLK_CGM_CKO);
  879. }
  880. static int en8811h_clk_save_context(struct clk_hw *hw)
  881. {
  882. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  883. priv->cko_is_enabled = en8811h_clk_is_enabled(hw);
  884. return 0;
  885. }
  886. static void en8811h_clk_restore_context(struct clk_hw *hw)
  887. {
  888. struct en8811h_priv *priv = clk_hw_to_en8811h_priv(hw);
  889. if (!priv->cko_is_enabled)
  890. en8811h_clk_disable(hw);
  891. }
  892. static const struct clk_ops en8811h_clk_ops = {
  893. .recalc_rate = en8811h_clk_recalc_rate,
  894. .enable = en8811h_clk_enable,
  895. .disable = en8811h_clk_disable,
  896. .is_enabled = en8811h_clk_is_enabled,
  897. .save_context = en8811h_clk_save_context,
  898. .restore_context = en8811h_clk_restore_context,
  899. };
  900. static int en8811h_clk_provider_setup(struct device *dev, struct clk_hw *hw)
  901. {
  902. struct clk_init_data init;
  903. int ret;
  904. if (!IS_ENABLED(CONFIG_COMMON_CLK))
  905. return 0;
  906. init.name = devm_kasprintf(dev, GFP_KERNEL, "%s-cko",
  907. fwnode_get_name(dev_fwnode(dev)));
  908. if (!init.name)
  909. return -ENOMEM;
  910. init.ops = &en8811h_clk_ops;
  911. init.flags = 0;
  912. init.num_parents = 0;
  913. hw->init = &init;
  914. ret = devm_clk_hw_register(dev, hw);
  915. if (ret)
  916. return ret;
  917. return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, hw);
  918. }
  919. static int en8811h_leds_setup(struct phy_device *phydev)
  920. {
  921. struct en8811h_priv *priv = phydev->priv;
  922. int ret;
  923. priv->led[0].rules = AIR_DEFAULT_TRIGGER_LED0;
  924. priv->led[1].rules = AIR_DEFAULT_TRIGGER_LED1;
  925. priv->led[2].rules = AIR_DEFAULT_TRIGGER_LED2;
  926. ret = air_leds_init(phydev, EN8811H_LED_COUNT, AIR_PHY_LED_DUR,
  927. AIR_LED_MODE_DISABLE);
  928. if (ret < 0)
  929. phydev_err(phydev, "Failed to disable leds: %d\n", ret);
  930. return ret;
  931. }
  932. static int an8811hb_probe(struct phy_device *phydev)
  933. {
  934. struct en8811h_priv *priv;
  935. int ret;
  936. priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct en8811h_priv),
  937. GFP_KERNEL);
  938. if (!priv)
  939. return -ENOMEM;
  940. phydev->priv = priv;
  941. ret = an8811hb_load_firmware(phydev);
  942. if (ret < 0) {
  943. phydev_err(phydev, "Load firmware failed: %d\n", ret);
  944. return ret;
  945. }
  946. en8811h_print_fw_version(phydev);
  947. /* mcu has just restarted after firmware load */
  948. priv->mcu_needs_restart = false;
  949. /* MDIO_DEVS1/2 empty, so set mmds_present bits here */
  950. phydev->c45_ids.mmds_present |= MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
  951. ret = en8811h_leds_setup(phydev);
  952. if (ret < 0)
  953. return ret;
  954. priv->phydev = phydev;
  955. /* Co-Clock Output */
  956. ret = an8811hb_clk_provider_setup(&phydev->mdio.dev, &priv->hw);
  957. if (ret)
  958. return ret;
  959. /* Configure led gpio pins as output */
  960. ret = air_buckpbus_reg_modify(phydev, AN8811HB_GPIO_OUTPUT,
  961. AN8811HB_GPIO_OUTPUT_345,
  962. AN8811HB_GPIO_OUTPUT_345);
  963. if (ret < 0)
  964. return ret;
  965. return 0;
  966. }
  967. static int en8811h_probe(struct phy_device *phydev)
  968. {
  969. struct en8811h_priv *priv;
  970. int ret;
  971. priv = devm_kzalloc(&phydev->mdio.dev, sizeof(struct en8811h_priv),
  972. GFP_KERNEL);
  973. if (!priv)
  974. return -ENOMEM;
  975. phydev->priv = priv;
  976. ret = en8811h_load_firmware(phydev);
  977. if (ret < 0)
  978. return ret;
  979. /* mcu has just restarted after firmware load */
  980. priv->mcu_needs_restart = false;
  981. /* MDIO_DEVS1/2 empty, so set mmds_present bits here */
  982. phydev->c45_ids.mmds_present |= MDIO_DEVS_PMAPMD | MDIO_DEVS_AN;
  983. ret = en8811h_leds_setup(phydev);
  984. if (ret < 0)
  985. return ret;
  986. priv->phydev = phydev;
  987. /* Co-Clock Output */
  988. ret = en8811h_clk_provider_setup(&phydev->mdio.dev, &priv->hw);
  989. if (ret)
  990. return ret;
  991. /* Configure led gpio pins as output */
  992. ret = air_buckpbus_reg_modify(phydev, EN8811H_GPIO_OUTPUT,
  993. EN8811H_GPIO_OUTPUT_345,
  994. EN8811H_GPIO_OUTPUT_345);
  995. if (ret < 0)
  996. return ret;
  997. return 0;
  998. }
  999. static int an8811hb_config_serdes_polarity(struct phy_device *phydev)
  1000. {
  1001. struct device *dev = &phydev->mdio.dev;
  1002. u32 pbus_value = 0;
  1003. unsigned int pol;
  1004. int ret;
  1005. ret = phy_get_manual_rx_polarity(dev_fwnode(dev),
  1006. phy_modes(phydev->interface), &pol);
  1007. if (ret)
  1008. return ret;
  1009. if (pol == PHY_POL_NORMAL)
  1010. pbus_value |= AN8811HB_RX_POLARITY_NORMAL;
  1011. ret = air_buckpbus_reg_modify(phydev, AN8811HB_RX_POLARITY,
  1012. AN8811HB_RX_POLARITY_NORMAL,
  1013. pbus_value);
  1014. if (ret < 0)
  1015. return ret;
  1016. ret = phy_get_manual_tx_polarity(dev_fwnode(dev),
  1017. phy_modes(phydev->interface), &pol);
  1018. if (ret)
  1019. return ret;
  1020. pbus_value = 0;
  1021. if (pol == PHY_POL_NORMAL)
  1022. pbus_value |= AN8811HB_TX_POLARITY_NORMAL;
  1023. return air_buckpbus_reg_modify(phydev, AN8811HB_TX_POLARITY,
  1024. AN8811HB_TX_POLARITY_NORMAL,
  1025. pbus_value);
  1026. }
  1027. static int en8811h_config_serdes_polarity(struct phy_device *phydev)
  1028. {
  1029. struct device *dev = &phydev->mdio.dev;
  1030. unsigned int pol, default_pol;
  1031. u32 pbus_value = 0;
  1032. int ret;
  1033. default_pol = PHY_POL_NORMAL;
  1034. if (device_property_read_bool(dev, "airoha,pnswap-rx"))
  1035. default_pol = PHY_POL_INVERT;
  1036. ret = phy_get_rx_polarity(dev_fwnode(dev), phy_modes(phydev->interface),
  1037. BIT(PHY_POL_NORMAL) | BIT(PHY_POL_INVERT),
  1038. default_pol, &pol);
  1039. if (ret)
  1040. return ret;
  1041. if (pol == PHY_POL_INVERT)
  1042. pbus_value |= EN8811H_POLARITY_RX_REVERSE;
  1043. default_pol = PHY_POL_NORMAL;
  1044. if (device_property_read_bool(dev, "airoha,pnswap-tx"))
  1045. default_pol = PHY_POL_INVERT;
  1046. ret = phy_get_tx_polarity(dev_fwnode(dev), phy_modes(phydev->interface),
  1047. BIT(PHY_POL_NORMAL) | BIT(PHY_POL_INVERT),
  1048. default_pol, &pol);
  1049. if (ret)
  1050. return ret;
  1051. if (pol == PHY_POL_NORMAL)
  1052. pbus_value |= EN8811H_POLARITY_TX_NORMAL;
  1053. return air_buckpbus_reg_modify(phydev, EN8811H_POLARITY,
  1054. EN8811H_POLARITY_RX_REVERSE |
  1055. EN8811H_POLARITY_TX_NORMAL, pbus_value);
  1056. }
  1057. static int an8811hb_config_init(struct phy_device *phydev)
  1058. {
  1059. struct en8811h_priv *priv = phydev->priv;
  1060. int ret;
  1061. /* If restart happened in .probe(), no need to restart now */
  1062. if (priv->mcu_needs_restart) {
  1063. ret = en8811h_restart_mcu(phydev);
  1064. if (ret < 0)
  1065. return ret;
  1066. } else {
  1067. /* Next calls to .config_init() mcu needs to restart */
  1068. priv->mcu_needs_restart = true;
  1069. }
  1070. ret = an8811hb_config_serdes_polarity(phydev);
  1071. if (ret < 0)
  1072. return ret;
  1073. ret = air_leds_init(phydev, EN8811H_LED_COUNT, AIR_PHY_LED_DUR,
  1074. AIR_LED_MODE_USER_DEFINE);
  1075. if (ret < 0)
  1076. phydev_err(phydev, "Failed to initialize leds: %d\n", ret);
  1077. return ret;
  1078. }
  1079. static int en8811h_config_init(struct phy_device *phydev)
  1080. {
  1081. struct en8811h_priv *priv = phydev->priv;
  1082. int ret;
  1083. /* If restart happened in .probe(), no need to restart now */
  1084. if (priv->mcu_needs_restart) {
  1085. ret = en8811h_restart_mcu(phydev);
  1086. if (ret < 0)
  1087. return ret;
  1088. } else {
  1089. /* Next calls to .config_init() mcu needs to restart */
  1090. priv->mcu_needs_restart = true;
  1091. }
  1092. /* Select mode 1, the only mode supported.
  1093. * Configures the SerDes for 2500Base-X with rate adaptation
  1094. */
  1095. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_1,
  1096. AIR_PHY_MCU_CMD_1_MODE1);
  1097. if (ret < 0)
  1098. return ret;
  1099. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_2,
  1100. AIR_PHY_MCU_CMD_2_MODE1);
  1101. if (ret < 0)
  1102. return ret;
  1103. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_3,
  1104. AIR_PHY_MCU_CMD_3_MODE1);
  1105. if (ret < 0)
  1106. return ret;
  1107. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_4,
  1108. AIR_PHY_MCU_CMD_4_MODE1);
  1109. if (ret < 0)
  1110. return ret;
  1111. ret = en8811h_config_serdes_polarity(phydev);
  1112. if (ret < 0)
  1113. return ret;
  1114. ret = air_leds_init(phydev, EN8811H_LED_COUNT, AIR_PHY_LED_DUR,
  1115. AIR_LED_MODE_USER_DEFINE);
  1116. if (ret < 0) {
  1117. phydev_err(phydev, "Failed to initialize leds: %d\n", ret);
  1118. return ret;
  1119. }
  1120. return 0;
  1121. }
  1122. static int en8811h_get_features(struct phy_device *phydev)
  1123. {
  1124. linkmode_set_bit_array(phy_basic_ports_array,
  1125. ARRAY_SIZE(phy_basic_ports_array),
  1126. phydev->supported);
  1127. return genphy_c45_pma_read_abilities(phydev);
  1128. }
  1129. static int en8811h_get_rate_matching(struct phy_device *phydev,
  1130. phy_interface_t iface)
  1131. {
  1132. return RATE_MATCH_PAUSE;
  1133. }
  1134. static int en8811h_config_aneg(struct phy_device *phydev)
  1135. {
  1136. bool changed = false;
  1137. int ret;
  1138. u32 adv;
  1139. if (phydev->autoneg == AUTONEG_DISABLE) {
  1140. phydev_warn(phydev, "Disabling autoneg is not supported\n");
  1141. return -EINVAL;
  1142. }
  1143. adv = linkmode_adv_to_mii_10gbt_adv_t(phydev->advertising);
  1144. ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL,
  1145. MDIO_AN_10GBT_CTRL_ADV2_5G, adv);
  1146. if (ret < 0)
  1147. return ret;
  1148. if (ret > 0)
  1149. changed = true;
  1150. return __genphy_config_aneg(phydev, changed);
  1151. }
  1152. static int en8811h_read_status(struct phy_device *phydev)
  1153. {
  1154. struct en8811h_priv *priv = phydev->priv;
  1155. u32 pbus_value;
  1156. int ret, val;
  1157. ret = genphy_update_link(phydev);
  1158. if (ret)
  1159. return ret;
  1160. phydev->master_slave_get = MASTER_SLAVE_CFG_UNSUPPORTED;
  1161. phydev->master_slave_state = MASTER_SLAVE_STATE_UNSUPPORTED;
  1162. phydev->speed = SPEED_UNKNOWN;
  1163. phydev->duplex = DUPLEX_UNKNOWN;
  1164. phydev->pause = 0;
  1165. phydev->asym_pause = 0;
  1166. phydev->rate_matching = RATE_MATCH_PAUSE;
  1167. ret = genphy_read_master_slave(phydev);
  1168. if (ret < 0)
  1169. return ret;
  1170. ret = genphy_read_lpa(phydev);
  1171. if (ret < 0)
  1172. return ret;
  1173. if (phy_id_compare_model(phydev->phy_id, AN8811HB_PHY_ID)) {
  1174. val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT);
  1175. if (val < 0)
  1176. return val;
  1177. linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  1178. phydev->lp_advertising,
  1179. val & MDIO_AN_10GBT_STAT_LP2_5G);
  1180. } else {
  1181. /* Get link partner 2.5GBASE-T ability from vendor register */
  1182. ret = air_buckpbus_reg_read(phydev, EN8811H_2P5G_LPA,
  1183. &pbus_value);
  1184. if (ret < 0)
  1185. return ret;
  1186. linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  1187. phydev->lp_advertising,
  1188. pbus_value & EN8811H_2P5G_LPA_2P5G);
  1189. }
  1190. if (phydev->autoneg_complete)
  1191. phy_resolve_aneg_pause(phydev);
  1192. if (!phydev->link)
  1193. return 0;
  1194. /* Get real speed from vendor register */
  1195. val = phy_read(phydev, AIR_AUX_CTRL_STATUS);
  1196. if (val < 0)
  1197. return val;
  1198. switch (val & AIR_AUX_CTRL_STATUS_SPEED_MASK) {
  1199. case AIR_AUX_CTRL_STATUS_SPEED_2500:
  1200. phydev->speed = SPEED_2500;
  1201. break;
  1202. case AIR_AUX_CTRL_STATUS_SPEED_1000:
  1203. phydev->speed = SPEED_1000;
  1204. break;
  1205. case AIR_AUX_CTRL_STATUS_SPEED_100:
  1206. phydev->speed = SPEED_100;
  1207. break;
  1208. case AIR_AUX_CTRL_STATUS_SPEED_10:
  1209. phydev->speed = SPEED_10;
  1210. break;
  1211. }
  1212. /* Firmware before version 24011202 has no vendor register 2P5G_LPA.
  1213. * Assume link partner advertised it if connected at 2500Mbps.
  1214. */
  1215. if (priv->firmware_version < 0x24011202) {
  1216. linkmode_mod_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  1217. phydev->lp_advertising,
  1218. phydev->speed == SPEED_2500);
  1219. }
  1220. /* Only supports full duplex */
  1221. phydev->duplex = DUPLEX_FULL;
  1222. return 0;
  1223. }
  1224. static int en8811h_clear_intr(struct phy_device *phydev)
  1225. {
  1226. int ret;
  1227. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_3,
  1228. AIR_PHY_MCU_CMD_3_DOCMD);
  1229. if (ret < 0)
  1230. return ret;
  1231. ret = phy_write_mmd(phydev, MDIO_MMD_VEND1, AIR_PHY_MCU_CMD_4,
  1232. AIR_PHY_MCU_CMD_4_INTCLR);
  1233. if (ret < 0)
  1234. return ret;
  1235. return 0;
  1236. }
  1237. static irqreturn_t en8811h_handle_interrupt(struct phy_device *phydev)
  1238. {
  1239. int ret;
  1240. ret = en8811h_clear_intr(phydev);
  1241. if (ret < 0) {
  1242. phy_error(phydev);
  1243. return IRQ_NONE;
  1244. }
  1245. phy_trigger_machine(phydev);
  1246. return IRQ_HANDLED;
  1247. }
  1248. static int en8811h_resume(struct phy_device *phydev)
  1249. {
  1250. clk_restore_context();
  1251. return genphy_resume(phydev);
  1252. }
  1253. static int en8811h_suspend(struct phy_device *phydev)
  1254. {
  1255. clk_save_context();
  1256. return genphy_suspend(phydev);
  1257. }
  1258. static struct phy_driver en8811h_driver[] = {
  1259. {
  1260. PHY_ID_MATCH_MODEL(EN8811H_PHY_ID),
  1261. .name = "Airoha EN8811H",
  1262. .probe = en8811h_probe,
  1263. .get_features = en8811h_get_features,
  1264. .config_init = en8811h_config_init,
  1265. .get_rate_matching = en8811h_get_rate_matching,
  1266. .config_aneg = en8811h_config_aneg,
  1267. .read_status = en8811h_read_status,
  1268. .resume = en8811h_resume,
  1269. .suspend = en8811h_suspend,
  1270. .config_intr = en8811h_clear_intr,
  1271. .handle_interrupt = en8811h_handle_interrupt,
  1272. .led_hw_is_supported = en8811h_led_hw_is_supported,
  1273. .read_page = air_phy_read_page,
  1274. .write_page = air_phy_write_page,
  1275. .led_blink_set = air_led_blink_set,
  1276. .led_brightness_set = air_led_brightness_set,
  1277. .led_hw_control_set = air_led_hw_control_set,
  1278. .led_hw_control_get = air_led_hw_control_get,
  1279. },
  1280. {
  1281. PHY_ID_MATCH_MODEL(AN8811HB_PHY_ID),
  1282. .name = "Airoha AN8811HB",
  1283. .probe = an8811hb_probe,
  1284. .get_features = en8811h_get_features,
  1285. .config_init = an8811hb_config_init,
  1286. .get_rate_matching = en8811h_get_rate_matching,
  1287. .config_aneg = en8811h_config_aneg,
  1288. .read_status = en8811h_read_status,
  1289. .resume = en8811h_resume,
  1290. .suspend = en8811h_suspend,
  1291. .config_intr = en8811h_clear_intr,
  1292. .handle_interrupt = en8811h_handle_interrupt,
  1293. .led_hw_is_supported = en8811h_led_hw_is_supported,
  1294. .read_page = air_phy_read_page,
  1295. .write_page = air_phy_write_page,
  1296. .led_blink_set = air_led_blink_set,
  1297. .led_brightness_set = air_led_brightness_set,
  1298. .led_hw_control_set = air_led_hw_control_set,
  1299. .led_hw_control_get = air_led_hw_control_get,
  1300. } };
  1301. module_phy_driver(en8811h_driver);
  1302. static const struct mdio_device_id __maybe_unused en8811h_tbl[] = {
  1303. { PHY_ID_MATCH_MODEL(EN8811H_PHY_ID) },
  1304. { PHY_ID_MATCH_MODEL(AN8811HB_PHY_ID) },
  1305. { }
  1306. };
  1307. MODULE_DEVICE_TABLE(mdio, en8811h_tbl);
  1308. MODULE_FIRMWARE(EN8811H_MD32_DM);
  1309. MODULE_FIRMWARE(EN8811H_MD32_DSP);
  1310. MODULE_FIRMWARE(AN8811HB_MD32_DM);
  1311. MODULE_FIRMWARE(AN8811HB_MD32_DSP);
  1312. MODULE_DESCRIPTION("Airoha EN8811H and AN8811HB PHY drivers");
  1313. MODULE_AUTHOR("Airoha");
  1314. MODULE_AUTHOR("Eric Woudstra <ericwouds@gmail.com>");
  1315. MODULE_LICENSE("GPL");