phy-rockchip-inno-hdmi.c 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 2017 Rockchip Electronics Co. Ltd.
  4. *
  5. * Author: Zheng Yang <[email protected]>
  6. * Heiko Stuebner <[email protected]>
  7. */
  8. #include <linux/clk.h>
  9. #include <linux/clk-provider.h>
  10. #include <linux/delay.h>
  11. #include <linux/io.h>
  12. #include <linux/interrupt.h>
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/nvmem-consumer.h>
  16. #include <linux/of.h>
  17. #include <linux/of_device.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/regmap.h>
  20. #include <linux/phy/phy.h>
  21. #include <linux/slab.h>
  22. #define UPDATE(x, h, l) (((x) << (l)) & GENMASK((h), (l)))
  23. /* REG: 0x00 */
  24. #define RK3228_PRE_PLL_REFCLK_SEL_PCLK BIT(0)
  25. /* REG: 0x01 */
  26. #define RK3228_BYPASS_RXSENSE_EN BIT(2)
  27. #define RK3228_BYPASS_PWRON_EN BIT(1)
  28. #define RK3228_BYPASS_PLLPD_EN BIT(0)
  29. /* REG: 0x02 */
  30. #define RK3228_BYPASS_PDATA_EN BIT(4)
  31. #define RK3228_PDATAEN_DISABLE BIT(0)
  32. /* REG: 0x03 */
  33. #define RK3228_BYPASS_AUTO_TERM_RES_CAL BIT(7)
  34. #define RK3228_AUTO_TERM_RES_CAL_SPEED_14_8(x) UPDATE(x, 6, 0)
  35. /* REG: 0x04 */
  36. #define RK3228_AUTO_TERM_RES_CAL_SPEED_7_0(x) UPDATE(x, 7, 0)
  37. /* REG: 0xaa */
  38. #define RK3228_POST_PLL_CTRL_MANUAL BIT(0)
  39. /* REG: 0xe0 */
  40. #define RK3228_POST_PLL_POWER_DOWN BIT(5)
  41. #define RK3228_PRE_PLL_POWER_DOWN BIT(4)
  42. #define RK3228_RXSENSE_CLK_CH_ENABLE BIT(3)
  43. #define RK3228_RXSENSE_DATA_CH2_ENABLE BIT(2)
  44. #define RK3228_RXSENSE_DATA_CH1_ENABLE BIT(1)
  45. #define RK3228_RXSENSE_DATA_CH0_ENABLE BIT(0)
  46. /* REG: 0xe1 */
  47. #define RK3228_BANDGAP_ENABLE BIT(4)
  48. #define RK3228_TMDS_DRIVER_ENABLE GENMASK(3, 0)
  49. /* REG: 0xe2 */
  50. #define RK3228_PRE_PLL_FB_DIV_8_MASK BIT(7)
  51. #define RK3228_PRE_PLL_FB_DIV_8(x) UPDATE((x) >> 8, 7, 7)
  52. #define RK3228_PCLK_VCO_DIV_5_MASK BIT(5)
  53. #define RK3228_PCLK_VCO_DIV_5(x) UPDATE(x, 5, 5)
  54. #define RK3228_PRE_PLL_PRE_DIV_MASK GENMASK(4, 0)
  55. #define RK3228_PRE_PLL_PRE_DIV(x) UPDATE(x, 4, 0)
  56. /* REG: 0xe3 */
  57. #define RK3228_PRE_PLL_FB_DIV_7_0(x) UPDATE(x, 7, 0)
  58. /* REG: 0xe4 */
  59. #define RK3228_PRE_PLL_PCLK_DIV_B_MASK GENMASK(6, 5)
  60. #define RK3228_PRE_PLL_PCLK_DIV_B_SHIFT 5
  61. #define RK3228_PRE_PLL_PCLK_DIV_B(x) UPDATE(x, 6, 5)
  62. #define RK3228_PRE_PLL_PCLK_DIV_A_MASK GENMASK(4, 0)
  63. #define RK3228_PRE_PLL_PCLK_DIV_A(x) UPDATE(x, 4, 0)
  64. /* REG: 0xe5 */
  65. #define RK3228_PRE_PLL_PCLK_DIV_C_MASK GENMASK(6, 5)
  66. #define RK3228_PRE_PLL_PCLK_DIV_C(x) UPDATE(x, 6, 5)
  67. #define RK3228_PRE_PLL_PCLK_DIV_D_MASK GENMASK(4, 0)
  68. #define RK3228_PRE_PLL_PCLK_DIV_D(x) UPDATE(x, 4, 0)
  69. /* REG: 0xe6 */
  70. #define RK3228_PRE_PLL_TMDSCLK_DIV_C_MASK GENMASK(5, 4)
  71. #define RK3228_PRE_PLL_TMDSCLK_DIV_C(x) UPDATE(x, 5, 4)
  72. #define RK3228_PRE_PLL_TMDSCLK_DIV_A_MASK GENMASK(3, 2)
  73. #define RK3228_PRE_PLL_TMDSCLK_DIV_A(x) UPDATE(x, 3, 2)
  74. #define RK3228_PRE_PLL_TMDSCLK_DIV_B_MASK GENMASK(1, 0)
  75. #define RK3228_PRE_PLL_TMDSCLK_DIV_B(x) UPDATE(x, 1, 0)
  76. /* REG: 0xe8 */
  77. #define RK3228_PRE_PLL_LOCK_STATUS BIT(0)
  78. /* REG: 0xe9 */
  79. #define RK3228_POST_PLL_POST_DIV_ENABLE UPDATE(3, 7, 6)
  80. #define RK3228_POST_PLL_PRE_DIV_MASK GENMASK(4, 0)
  81. #define RK3228_POST_PLL_PRE_DIV(x) UPDATE(x, 4, 0)
  82. /* REG: 0xea */
  83. #define RK3228_POST_PLL_FB_DIV_7_0(x) UPDATE(x, 7, 0)
  84. /* REG: 0xeb */
  85. #define RK3228_POST_PLL_FB_DIV_8_MASK BIT(7)
  86. #define RK3228_POST_PLL_FB_DIV_8(x) UPDATE((x) >> 8, 7, 7)
  87. #define RK3228_POST_PLL_POST_DIV_MASK GENMASK(5, 4)
  88. #define RK3228_POST_PLL_POST_DIV(x) UPDATE(x, 5, 4)
  89. #define RK3228_POST_PLL_LOCK_STATUS BIT(0)
  90. /* REG: 0xee */
  91. #define RK3228_TMDS_CH_TA_ENABLE GENMASK(7, 4)
  92. /* REG: 0xef */
  93. #define RK3228_TMDS_CLK_CH_TA(x) UPDATE(x, 7, 6)
  94. #define RK3228_TMDS_DATA_CH2_TA(x) UPDATE(x, 5, 4)
  95. #define RK3228_TMDS_DATA_CH1_TA(x) UPDATE(x, 3, 2)
  96. #define RK3228_TMDS_DATA_CH0_TA(x) UPDATE(x, 1, 0)
  97. /* REG: 0xf0 */
  98. #define RK3228_TMDS_DATA_CH2_PRE_EMPHASIS_MASK GENMASK(5, 4)
  99. #define RK3228_TMDS_DATA_CH2_PRE_EMPHASIS(x) UPDATE(x, 5, 4)
  100. #define RK3228_TMDS_DATA_CH1_PRE_EMPHASIS_MASK GENMASK(3, 2)
  101. #define RK3228_TMDS_DATA_CH1_PRE_EMPHASIS(x) UPDATE(x, 3, 2)
  102. #define RK3228_TMDS_DATA_CH0_PRE_EMPHASIS_MASK GENMASK(1, 0)
  103. #define RK3228_TMDS_DATA_CH0_PRE_EMPHASIS(x) UPDATE(x, 1, 0)
  104. /* REG: 0xf1 */
  105. #define RK3228_TMDS_CLK_CH_OUTPUT_SWING(x) UPDATE(x, 7, 4)
  106. #define RK3228_TMDS_DATA_CH2_OUTPUT_SWING(x) UPDATE(x, 3, 0)
  107. /* REG: 0xf2 */
  108. #define RK3228_TMDS_DATA_CH1_OUTPUT_SWING(x) UPDATE(x, 7, 4)
  109. #define RK3228_TMDS_DATA_CH0_OUTPUT_SWING(x) UPDATE(x, 3, 0)
  110. /* REG: 0x01 */
  111. #define RK3328_BYPASS_RXSENSE_EN BIT(2)
  112. #define RK3328_BYPASS_POWERON_EN BIT(1)
  113. #define RK3328_BYPASS_PLLPD_EN BIT(0)
  114. /* REG: 0x02 */
  115. #define RK3328_INT_POL_HIGH BIT(7)
  116. #define RK3328_BYPASS_PDATA_EN BIT(4)
  117. #define RK3328_PDATA_EN BIT(0)
  118. /* REG:0x05 */
  119. #define RK3328_INT_TMDS_CLK(x) UPDATE(x, 7, 4)
  120. #define RK3328_INT_TMDS_D2(x) UPDATE(x, 3, 0)
  121. /* REG:0x07 */
  122. #define RK3328_INT_TMDS_D1(x) UPDATE(x, 7, 4)
  123. #define RK3328_INT_TMDS_D0(x) UPDATE(x, 3, 0)
  124. /* for all RK3328_INT_TMDS_*, ESD_DET as defined in 0xc8-0xcb */
  125. #define RK3328_INT_AGND_LOW_PULSE_LOCKED BIT(3)
  126. #define RK3328_INT_RXSENSE_LOW_PULSE_LOCKED BIT(2)
  127. #define RK3328_INT_VSS_AGND_ESD_DET BIT(1)
  128. #define RK3328_INT_AGND_VSS_ESD_DET BIT(0)
  129. /* REG: 0xa0 */
  130. #define RK3328_PCLK_VCO_DIV_5_MASK BIT(1)
  131. #define RK3328_PCLK_VCO_DIV_5(x) UPDATE(x, 1, 1)
  132. #define RK3328_PRE_PLL_POWER_DOWN BIT(0)
  133. /* REG: 0xa1 */
  134. #define RK3328_PRE_PLL_PRE_DIV_MASK GENMASK(5, 0)
  135. #define RK3328_PRE_PLL_PRE_DIV(x) UPDATE(x, 5, 0)
  136. /* REG: 0xa2 */
  137. /* unset means center spread */
  138. #define RK3328_SPREAD_SPECTRUM_MOD_DOWN BIT(7)
  139. #define RK3328_SPREAD_SPECTRUM_MOD_DISABLE BIT(6)
  140. #define RK3328_PRE_PLL_FRAC_DIV_DISABLE UPDATE(3, 5, 4)
  141. #define RK3328_PRE_PLL_FB_DIV_11_8_MASK GENMASK(3, 0)
  142. #define RK3328_PRE_PLL_FB_DIV_11_8(x) UPDATE((x) >> 8, 3, 0)
  143. /* REG: 0xa3 */
  144. #define RK3328_PRE_PLL_FB_DIV_7_0(x) UPDATE(x, 7, 0)
  145. /* REG: 0xa4*/
  146. #define RK3328_PRE_PLL_TMDSCLK_DIV_C_MASK GENMASK(1, 0)
  147. #define RK3328_PRE_PLL_TMDSCLK_DIV_C(x) UPDATE(x, 1, 0)
  148. #define RK3328_PRE_PLL_TMDSCLK_DIV_B_MASK GENMASK(3, 2)
  149. #define RK3328_PRE_PLL_TMDSCLK_DIV_B(x) UPDATE(x, 3, 2)
  150. #define RK3328_PRE_PLL_TMDSCLK_DIV_A_MASK GENMASK(5, 4)
  151. #define RK3328_PRE_PLL_TMDSCLK_DIV_A(x) UPDATE(x, 5, 4)
  152. /* REG: 0xa5 */
  153. #define RK3328_PRE_PLL_PCLK_DIV_B_SHIFT 5
  154. #define RK3328_PRE_PLL_PCLK_DIV_B_MASK GENMASK(6, 5)
  155. #define RK3328_PRE_PLL_PCLK_DIV_B(x) UPDATE(x, 6, 5)
  156. #define RK3328_PRE_PLL_PCLK_DIV_A_MASK GENMASK(4, 0)
  157. #define RK3328_PRE_PLL_PCLK_DIV_A(x) UPDATE(x, 4, 0)
  158. /* REG: 0xa6 */
  159. #define RK3328_PRE_PLL_PCLK_DIV_C_SHIFT 5
  160. #define RK3328_PRE_PLL_PCLK_DIV_C_MASK GENMASK(6, 5)
  161. #define RK3328_PRE_PLL_PCLK_DIV_C(x) UPDATE(x, 6, 5)
  162. #define RK3328_PRE_PLL_PCLK_DIV_D_MASK GENMASK(4, 0)
  163. #define RK3328_PRE_PLL_PCLK_DIV_D(x) UPDATE(x, 4, 0)
  164. /* REG: 0xa9 */
  165. #define RK3328_PRE_PLL_LOCK_STATUS BIT(0)
  166. /* REG: 0xaa */
  167. #define RK3328_POST_PLL_POST_DIV_ENABLE GENMASK(3, 2)
  168. #define RK3328_POST_PLL_REFCLK_SEL_TMDS BIT(1)
  169. #define RK3328_POST_PLL_POWER_DOWN BIT(0)
  170. /* REG:0xab */
  171. #define RK3328_POST_PLL_FB_DIV_8(x) UPDATE((x) >> 8, 7, 7)
  172. #define RK3328_POST_PLL_PRE_DIV(x) UPDATE(x, 4, 0)
  173. /* REG: 0xac */
  174. #define RK3328_POST_PLL_FB_DIV_7_0(x) UPDATE(x, 7, 0)
  175. /* REG: 0xad */
  176. #define RK3328_POST_PLL_POST_DIV_MASK GENMASK(1, 0)
  177. #define RK3328_POST_PLL_POST_DIV_2 0x0
  178. #define RK3328_POST_PLL_POST_DIV_4 0x1
  179. #define RK3328_POST_PLL_POST_DIV_8 0x3
  180. /* REG: 0xaf */
  181. #define RK3328_POST_PLL_LOCK_STATUS BIT(0)
  182. /* REG: 0xb0 */
  183. #define RK3328_BANDGAP_ENABLE BIT(2)
  184. /* REG: 0xb2 */
  185. #define RK3328_TMDS_CLK_DRIVER_EN BIT(3)
  186. #define RK3328_TMDS_D2_DRIVER_EN BIT(2)
  187. #define RK3328_TMDS_D1_DRIVER_EN BIT(1)
  188. #define RK3328_TMDS_D0_DRIVER_EN BIT(0)
  189. #define RK3328_TMDS_DRIVER_ENABLE (RK3328_TMDS_CLK_DRIVER_EN | \
  190. RK3328_TMDS_D2_DRIVER_EN | \
  191. RK3328_TMDS_D1_DRIVER_EN | \
  192. RK3328_TMDS_D0_DRIVER_EN)
  193. /* REG:0xc5 */
  194. #define RK3328_BYPASS_TERM_RESISTOR_CALIB BIT(7)
  195. #define RK3328_TERM_RESISTOR_CALIB_SPEED_14_8(x) UPDATE((x) >> 8, 6, 0)
  196. /* REG:0xc6 */
  197. #define RK3328_TERM_RESISTOR_CALIB_SPEED_7_0(x) UPDATE(x, 7, 0)
  198. /* REG:0xc7 */
  199. #define RK3328_TERM_RESISTOR_50 UPDATE(0, 2, 1)
  200. #define RK3328_TERM_RESISTOR_62_5 UPDATE(1, 2, 1)
  201. #define RK3328_TERM_RESISTOR_75 UPDATE(2, 2, 1)
  202. #define RK3328_TERM_RESISTOR_100 UPDATE(3, 2, 1)
  203. /* REG 0xc8 - 0xcb */
  204. #define RK3328_ESD_DETECT_MASK GENMASK(7, 6)
  205. #define RK3328_ESD_DETECT_340MV (0x0 << 6)
  206. #define RK3328_ESD_DETECT_280MV (0x1 << 6)
  207. #define RK3328_ESD_DETECT_260MV (0x2 << 6)
  208. #define RK3328_ESD_DETECT_240MV (0x3 << 6)
  209. /* resistors can be used in parallel */
  210. #define RK3328_TMDS_TERM_RESIST_MASK GENMASK(5, 0)
  211. #define RK3328_TMDS_TERM_RESIST_75 BIT(5)
  212. #define RK3328_TMDS_TERM_RESIST_150 BIT(4)
  213. #define RK3328_TMDS_TERM_RESIST_300 BIT(3)
  214. #define RK3328_TMDS_TERM_RESIST_600 BIT(2)
  215. #define RK3328_TMDS_TERM_RESIST_1000 BIT(1)
  216. #define RK3328_TMDS_TERM_RESIST_2000 BIT(0)
  217. /* REG: 0xd1 */
  218. #define RK3328_PRE_PLL_FRAC_DIV_23_16(x) UPDATE((x) >> 16, 7, 0)
  219. /* REG: 0xd2 */
  220. #define RK3328_PRE_PLL_FRAC_DIV_15_8(x) UPDATE((x) >> 8, 7, 0)
  221. /* REG: 0xd3 */
  222. #define RK3328_PRE_PLL_FRAC_DIV_7_0(x) UPDATE(x, 7, 0)
  223. struct inno_hdmi_phy_drv_data;
  224. struct inno_hdmi_phy {
  225. struct device *dev;
  226. struct regmap *regmap;
  227. int irq;
  228. struct phy *phy;
  229. struct clk *sysclk;
  230. struct clk *refoclk;
  231. struct clk *refpclk;
  232. /* platform data */
  233. const struct inno_hdmi_phy_drv_data *plat_data;
  234. int chip_version;
  235. /* clk provider */
  236. struct clk_hw hw;
  237. struct clk *phyclk;
  238. unsigned long pixclock;
  239. };
  240. struct pre_pll_config {
  241. unsigned long pixclock;
  242. unsigned long tmdsclock;
  243. u8 prediv;
  244. u16 fbdiv;
  245. u8 tmds_div_a;
  246. u8 tmds_div_b;
  247. u8 tmds_div_c;
  248. u8 pclk_div_a;
  249. u8 pclk_div_b;
  250. u8 pclk_div_c;
  251. u8 pclk_div_d;
  252. u8 vco_div_5_en;
  253. u32 fracdiv;
  254. };
  255. struct post_pll_config {
  256. unsigned long tmdsclock;
  257. u8 prediv;
  258. u16 fbdiv;
  259. u8 postdiv;
  260. u8 version;
  261. };
  262. struct phy_config {
  263. unsigned long tmdsclock;
  264. u8 regs[14];
  265. };
  266. struct inno_hdmi_phy_ops {
  267. int (*init)(struct inno_hdmi_phy *inno);
  268. int (*power_on)(struct inno_hdmi_phy *inno,
  269. const struct post_pll_config *cfg,
  270. const struct phy_config *phy_cfg);
  271. void (*power_off)(struct inno_hdmi_phy *inno);
  272. };
  273. struct inno_hdmi_phy_drv_data {
  274. const struct inno_hdmi_phy_ops *ops;
  275. const struct clk_ops *clk_ops;
  276. const struct phy_config *phy_cfg_table;
  277. };
  278. static const struct pre_pll_config pre_pll_cfg_table[] = {
  279. { 27000000, 27000000, 1, 90, 3, 2, 2, 10, 3, 3, 4, 0, 0},
  280. { 27000000, 33750000, 1, 90, 1, 3, 3, 10, 3, 3, 4, 0, 0},
  281. { 40000000, 40000000, 1, 80, 2, 2, 2, 12, 2, 2, 2, 0, 0},
  282. { 59341000, 59341000, 1, 98, 3, 1, 2, 1, 3, 3, 4, 0, 0xE6AE6B},
  283. { 59400000, 59400000, 1, 99, 3, 1, 1, 1, 3, 3, 4, 0, 0},
  284. { 59341000, 74176250, 1, 98, 0, 3, 3, 1, 3, 3, 4, 0, 0xE6AE6B},
  285. { 59400000, 74250000, 1, 99, 1, 2, 2, 1, 3, 3, 4, 0, 0},
  286. { 74176000, 74176000, 1, 98, 1, 2, 2, 1, 2, 3, 4, 0, 0xE6AE6B},
  287. { 74250000, 74250000, 1, 99, 1, 2, 2, 1, 2, 3, 4, 0, 0},
  288. { 74176000, 92720000, 4, 494, 1, 2, 2, 1, 3, 3, 4, 0, 0x816817},
  289. { 74250000, 92812500, 4, 495, 1, 2, 2, 1, 3, 3, 4, 0, 0},
  290. {148352000, 148352000, 1, 98, 1, 1, 1, 1, 2, 2, 2, 0, 0xE6AE6B},
  291. {148500000, 148500000, 1, 99, 1, 1, 1, 1, 2, 2, 2, 0, 0},
  292. {148352000, 185440000, 4, 494, 0, 2, 2, 1, 3, 2, 2, 0, 0x816817},
  293. {148500000, 185625000, 4, 495, 0, 2, 2, 1, 3, 2, 2, 0, 0},
  294. {296703000, 296703000, 1, 98, 0, 1, 1, 1, 0, 2, 2, 0, 0xE6AE6B},
  295. {297000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 2, 0, 0},
  296. {296703000, 370878750, 4, 494, 1, 2, 0, 1, 3, 1, 1, 0, 0x816817},
  297. {297000000, 371250000, 4, 495, 1, 2, 0, 1, 3, 1, 1, 0, 0},
  298. {593407000, 296703500, 1, 98, 0, 1, 1, 1, 0, 2, 1, 0, 0xE6AE6B},
  299. {594000000, 297000000, 1, 99, 0, 1, 1, 1, 0, 2, 1, 0, 0},
  300. {593407000, 370879375, 4, 494, 1, 2, 0, 1, 3, 1, 1, 1, 0x816817},
  301. {594000000, 371250000, 4, 495, 1, 2, 0, 1, 3, 1, 1, 1, 0},
  302. {593407000, 593407000, 1, 98, 0, 2, 0, 1, 0, 1, 1, 0, 0xE6AE6B},
  303. {594000000, 594000000, 1, 99, 0, 2, 0, 1, 0, 1, 1, 0, 0},
  304. { /* sentinel */ }
  305. };
  306. static const struct post_pll_config post_pll_cfg_table[] = {
  307. {33750000, 1, 40, 8, 1},
  308. {33750000, 1, 80, 8, 2},
  309. {74250000, 1, 40, 8, 1},
  310. {74250000, 18, 80, 8, 2},
  311. {148500000, 2, 40, 4, 3},
  312. {297000000, 4, 40, 2, 3},
  313. {594000000, 8, 40, 1, 3},
  314. { /* sentinel */ }
  315. };
  316. /* phy tuning values for an undocumented set of registers */
  317. static const struct phy_config rk3228_phy_cfg[] = {
  318. { 165000000, {
  319. 0xaa, 0x00, 0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,
  320. 0x00, 0x00, 0x00, 0x00, 0x00,
  321. },
  322. }, {
  323. 340000000, {
  324. 0xaa, 0x15, 0x6a, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00,
  325. 0x00, 0x00, 0x00, 0x00, 0x00,
  326. },
  327. }, {
  328. 594000000, {
  329. 0xaa, 0x15, 0x7a, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00,
  330. 0x00, 0x00, 0x00, 0x00, 0x00,
  331. },
  332. }, { /* sentinel */ },
  333. };
  334. /* phy tuning values for an undocumented set of registers */
  335. static const struct phy_config rk3328_phy_cfg[] = {
  336. { 165000000, {
  337. 0x07, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x08, 0x08, 0x08,
  338. 0x00, 0xac, 0xcc, 0xcc, 0xcc,
  339. },
  340. }, {
  341. 340000000, {
  342. 0x0b, 0x0d, 0x0d, 0x0d, 0x07, 0x15, 0x08, 0x08, 0x08,
  343. 0x3f, 0xac, 0xcc, 0xcd, 0xdd,
  344. },
  345. }, {
  346. 594000000, {
  347. 0x10, 0x1a, 0x1a, 0x1a, 0x07, 0x15, 0x08, 0x08, 0x08,
  348. 0x00, 0xac, 0xcc, 0xcc, 0xcc,
  349. },
  350. }, { /* sentinel */ },
  351. };
  352. static inline struct inno_hdmi_phy *to_inno_hdmi_phy(struct clk_hw *hw)
  353. {
  354. return container_of(hw, struct inno_hdmi_phy, hw);
  355. }
  356. /*
  357. * The register description of the IP block does not use any distinct names
  358. * but instead the databook simply numbers the registers in one-increments.
  359. * As the registers are obviously 32bit sized, the inno_* functions
  360. * translate the databook register names to the actual registers addresses.
  361. */
  362. static inline void inno_write(struct inno_hdmi_phy *inno, u32 reg, u8 val)
  363. {
  364. regmap_write(inno->regmap, reg * 4, val);
  365. }
  366. static inline u8 inno_read(struct inno_hdmi_phy *inno, u32 reg)
  367. {
  368. u32 val;
  369. regmap_read(inno->regmap, reg * 4, &val);
  370. return val;
  371. }
  372. static inline void inno_update_bits(struct inno_hdmi_phy *inno, u8 reg,
  373. u8 mask, u8 val)
  374. {
  375. regmap_update_bits(inno->regmap, reg * 4, mask, val);
  376. }
  377. #define inno_poll(inno, reg, val, cond, sleep_us, timeout_us) \
  378. regmap_read_poll_timeout((inno)->regmap, (reg) * 4, val, cond, \
  379. sleep_us, timeout_us)
  380. static unsigned long inno_hdmi_phy_get_tmdsclk(struct inno_hdmi_phy *inno,
  381. unsigned long rate)
  382. {
  383. int bus_width = phy_get_bus_width(inno->phy);
  384. switch (bus_width) {
  385. case 4:
  386. case 5:
  387. case 6:
  388. case 10:
  389. case 12:
  390. case 16:
  391. return (u64)rate * bus_width / 8;
  392. default:
  393. return rate;
  394. }
  395. }
  396. static irqreturn_t inno_hdmi_phy_rk3328_hardirq(int irq, void *dev_id)
  397. {
  398. struct inno_hdmi_phy *inno = dev_id;
  399. int intr_stat1, intr_stat2, intr_stat3;
  400. intr_stat1 = inno_read(inno, 0x04);
  401. intr_stat2 = inno_read(inno, 0x06);
  402. intr_stat3 = inno_read(inno, 0x08);
  403. if (intr_stat1)
  404. inno_write(inno, 0x04, intr_stat1);
  405. if (intr_stat2)
  406. inno_write(inno, 0x06, intr_stat2);
  407. if (intr_stat3)
  408. inno_write(inno, 0x08, intr_stat3);
  409. if (intr_stat1 || intr_stat2 || intr_stat3)
  410. return IRQ_WAKE_THREAD;
  411. return IRQ_HANDLED;
  412. }
  413. static irqreturn_t inno_hdmi_phy_rk3328_irq(int irq, void *dev_id)
  414. {
  415. struct inno_hdmi_phy *inno = dev_id;
  416. inno_update_bits(inno, 0x02, RK3328_PDATA_EN, 0);
  417. usleep_range(10, 20);
  418. inno_update_bits(inno, 0x02, RK3328_PDATA_EN, RK3328_PDATA_EN);
  419. return IRQ_HANDLED;
  420. }
  421. static int inno_hdmi_phy_power_on(struct phy *phy)
  422. {
  423. struct inno_hdmi_phy *inno = phy_get_drvdata(phy);
  424. const struct post_pll_config *cfg = post_pll_cfg_table;
  425. const struct phy_config *phy_cfg = inno->plat_data->phy_cfg_table;
  426. unsigned long tmdsclock = inno_hdmi_phy_get_tmdsclk(inno,
  427. inno->pixclock);
  428. int ret;
  429. if (!tmdsclock) {
  430. dev_err(inno->dev, "TMDS clock is zero!\n");
  431. return -EINVAL;
  432. }
  433. if (!inno->plat_data->ops->power_on)
  434. return -EINVAL;
  435. for (; cfg->tmdsclock != 0; cfg++)
  436. if (tmdsclock <= cfg->tmdsclock &&
  437. cfg->version & inno->chip_version)
  438. break;
  439. for (; phy_cfg->tmdsclock != 0; phy_cfg++)
  440. if (tmdsclock <= phy_cfg->tmdsclock)
  441. break;
  442. if (cfg->tmdsclock == 0 || phy_cfg->tmdsclock == 0)
  443. return -EINVAL;
  444. dev_dbg(inno->dev, "Inno HDMI PHY Power On\n");
  445. ret = clk_prepare_enable(inno->phyclk);
  446. if (ret)
  447. return ret;
  448. ret = inno->plat_data->ops->power_on(inno, cfg, phy_cfg);
  449. if (ret) {
  450. clk_disable_unprepare(inno->phyclk);
  451. return ret;
  452. }
  453. return 0;
  454. }
  455. static int inno_hdmi_phy_power_off(struct phy *phy)
  456. {
  457. struct inno_hdmi_phy *inno = phy_get_drvdata(phy);
  458. if (!inno->plat_data->ops->power_off)
  459. return -EINVAL;
  460. inno->plat_data->ops->power_off(inno);
  461. clk_disable_unprepare(inno->phyclk);
  462. dev_dbg(inno->dev, "Inno HDMI PHY Power Off\n");
  463. return 0;
  464. }
  465. static const struct phy_ops inno_hdmi_phy_ops = {
  466. .owner = THIS_MODULE,
  467. .power_on = inno_hdmi_phy_power_on,
  468. .power_off = inno_hdmi_phy_power_off,
  469. };
  470. static const
  471. struct pre_pll_config *inno_hdmi_phy_get_pre_pll_cfg(struct inno_hdmi_phy *inno,
  472. unsigned long rate)
  473. {
  474. const struct pre_pll_config *cfg = pre_pll_cfg_table;
  475. unsigned long tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, rate);
  476. for (; cfg->pixclock != 0; cfg++)
  477. if (cfg->pixclock == rate && cfg->tmdsclock == tmdsclock)
  478. break;
  479. if (cfg->pixclock == 0)
  480. return ERR_PTR(-EINVAL);
  481. return cfg;
  482. }
  483. static int inno_hdmi_phy_rk3228_clk_is_prepared(struct clk_hw *hw)
  484. {
  485. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  486. u8 status;
  487. status = inno_read(inno, 0xe0) & RK3228_PRE_PLL_POWER_DOWN;
  488. return status ? 0 : 1;
  489. }
  490. static int inno_hdmi_phy_rk3228_clk_prepare(struct clk_hw *hw)
  491. {
  492. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  493. inno_update_bits(inno, 0xe0, RK3228_PRE_PLL_POWER_DOWN, 0);
  494. return 0;
  495. }
  496. static void inno_hdmi_phy_rk3228_clk_unprepare(struct clk_hw *hw)
  497. {
  498. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  499. inno_update_bits(inno, 0xe0, RK3228_PRE_PLL_POWER_DOWN,
  500. RK3228_PRE_PLL_POWER_DOWN);
  501. }
  502. static
  503. unsigned long inno_hdmi_phy_rk3228_clk_recalc_rate(struct clk_hw *hw,
  504. unsigned long parent_rate)
  505. {
  506. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  507. u8 nd, no_a, no_b, no_d;
  508. u64 vco;
  509. u16 nf;
  510. nd = inno_read(inno, 0xe2) & RK3228_PRE_PLL_PRE_DIV_MASK;
  511. nf = (inno_read(inno, 0xe2) & RK3228_PRE_PLL_FB_DIV_8_MASK) << 1;
  512. nf |= inno_read(inno, 0xe3);
  513. vco = parent_rate * nf;
  514. if (inno_read(inno, 0xe2) & RK3228_PCLK_VCO_DIV_5_MASK) {
  515. do_div(vco, nd * 5);
  516. } else {
  517. no_a = inno_read(inno, 0xe4) & RK3228_PRE_PLL_PCLK_DIV_A_MASK;
  518. if (!no_a)
  519. no_a = 1;
  520. no_b = inno_read(inno, 0xe4) & RK3228_PRE_PLL_PCLK_DIV_B_MASK;
  521. no_b >>= RK3228_PRE_PLL_PCLK_DIV_B_SHIFT;
  522. no_b += 2;
  523. no_d = inno_read(inno, 0xe5) & RK3228_PRE_PLL_PCLK_DIV_D_MASK;
  524. do_div(vco, (nd * (no_a == 1 ? no_b : no_a) * no_d * 2));
  525. }
  526. inno->pixclock = vco;
  527. dev_dbg(inno->dev, "%s rate %lu\n", __func__, inno->pixclock);
  528. return vco;
  529. }
  530. static long inno_hdmi_phy_rk3228_clk_round_rate(struct clk_hw *hw,
  531. unsigned long rate,
  532. unsigned long *parent_rate)
  533. {
  534. const struct pre_pll_config *cfg = pre_pll_cfg_table;
  535. rate = (rate / 1000) * 1000;
  536. for (; cfg->pixclock != 0; cfg++)
  537. if (cfg->pixclock == rate && !cfg->fracdiv)
  538. break;
  539. if (cfg->pixclock == 0)
  540. return -EINVAL;
  541. return cfg->pixclock;
  542. }
  543. static int inno_hdmi_phy_rk3228_clk_set_rate(struct clk_hw *hw,
  544. unsigned long rate,
  545. unsigned long parent_rate)
  546. {
  547. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  548. const struct pre_pll_config *cfg;
  549. unsigned long tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, rate);
  550. u32 v;
  551. int ret;
  552. dev_dbg(inno->dev, "%s rate %lu tmdsclk %lu\n",
  553. __func__, rate, tmdsclock);
  554. cfg = inno_hdmi_phy_get_pre_pll_cfg(inno, rate);
  555. if (IS_ERR(cfg))
  556. return PTR_ERR(cfg);
  557. /* Power down PRE-PLL */
  558. inno_update_bits(inno, 0xe0, RK3228_PRE_PLL_POWER_DOWN,
  559. RK3228_PRE_PLL_POWER_DOWN);
  560. inno_update_bits(inno, 0xe2, RK3228_PRE_PLL_FB_DIV_8_MASK |
  561. RK3228_PCLK_VCO_DIV_5_MASK |
  562. RK3228_PRE_PLL_PRE_DIV_MASK,
  563. RK3228_PRE_PLL_FB_DIV_8(cfg->fbdiv) |
  564. RK3228_PCLK_VCO_DIV_5(cfg->vco_div_5_en) |
  565. RK3228_PRE_PLL_PRE_DIV(cfg->prediv));
  566. inno_write(inno, 0xe3, RK3228_PRE_PLL_FB_DIV_7_0(cfg->fbdiv));
  567. inno_update_bits(inno, 0xe4, RK3228_PRE_PLL_PCLK_DIV_B_MASK |
  568. RK3228_PRE_PLL_PCLK_DIV_A_MASK,
  569. RK3228_PRE_PLL_PCLK_DIV_B(cfg->pclk_div_b) |
  570. RK3228_PRE_PLL_PCLK_DIV_A(cfg->pclk_div_a));
  571. inno_update_bits(inno, 0xe5, RK3228_PRE_PLL_PCLK_DIV_C_MASK |
  572. RK3228_PRE_PLL_PCLK_DIV_D_MASK,
  573. RK3228_PRE_PLL_PCLK_DIV_C(cfg->pclk_div_c) |
  574. RK3228_PRE_PLL_PCLK_DIV_D(cfg->pclk_div_d));
  575. inno_update_bits(inno, 0xe6, RK3228_PRE_PLL_TMDSCLK_DIV_C_MASK |
  576. RK3228_PRE_PLL_TMDSCLK_DIV_A_MASK |
  577. RK3228_PRE_PLL_TMDSCLK_DIV_B_MASK,
  578. RK3228_PRE_PLL_TMDSCLK_DIV_C(cfg->tmds_div_c) |
  579. RK3228_PRE_PLL_TMDSCLK_DIV_A(cfg->tmds_div_a) |
  580. RK3228_PRE_PLL_TMDSCLK_DIV_B(cfg->tmds_div_b));
  581. /* Power up PRE-PLL */
  582. inno_update_bits(inno, 0xe0, RK3228_PRE_PLL_POWER_DOWN, 0);
  583. /* Wait for Pre-PLL lock */
  584. ret = inno_poll(inno, 0xe8, v, v & RK3228_PRE_PLL_LOCK_STATUS,
  585. 100, 100000);
  586. if (ret) {
  587. dev_err(inno->dev, "Pre-PLL locking failed\n");
  588. return ret;
  589. }
  590. inno->pixclock = rate;
  591. return 0;
  592. }
  593. static const struct clk_ops inno_hdmi_phy_rk3228_clk_ops = {
  594. .prepare = inno_hdmi_phy_rk3228_clk_prepare,
  595. .unprepare = inno_hdmi_phy_rk3228_clk_unprepare,
  596. .is_prepared = inno_hdmi_phy_rk3228_clk_is_prepared,
  597. .recalc_rate = inno_hdmi_phy_rk3228_clk_recalc_rate,
  598. .round_rate = inno_hdmi_phy_rk3228_clk_round_rate,
  599. .set_rate = inno_hdmi_phy_rk3228_clk_set_rate,
  600. };
  601. static int inno_hdmi_phy_rk3328_clk_is_prepared(struct clk_hw *hw)
  602. {
  603. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  604. u8 status;
  605. status = inno_read(inno, 0xa0) & RK3328_PRE_PLL_POWER_DOWN;
  606. return status ? 0 : 1;
  607. }
  608. static int inno_hdmi_phy_rk3328_clk_prepare(struct clk_hw *hw)
  609. {
  610. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  611. inno_update_bits(inno, 0xa0, RK3328_PRE_PLL_POWER_DOWN, 0);
  612. return 0;
  613. }
  614. static void inno_hdmi_phy_rk3328_clk_unprepare(struct clk_hw *hw)
  615. {
  616. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  617. inno_update_bits(inno, 0xa0, RK3328_PRE_PLL_POWER_DOWN,
  618. RK3328_PRE_PLL_POWER_DOWN);
  619. }
  620. static
  621. unsigned long inno_hdmi_phy_rk3328_clk_recalc_rate(struct clk_hw *hw,
  622. unsigned long parent_rate)
  623. {
  624. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  625. unsigned long frac;
  626. u8 nd, no_a, no_b, no_c, no_d;
  627. u64 vco;
  628. u16 nf;
  629. nd = inno_read(inno, 0xa1) & RK3328_PRE_PLL_PRE_DIV_MASK;
  630. nf = ((inno_read(inno, 0xa2) & RK3328_PRE_PLL_FB_DIV_11_8_MASK) << 8);
  631. nf |= inno_read(inno, 0xa3);
  632. vco = parent_rate * nf;
  633. if (!(inno_read(inno, 0xa2) & RK3328_PRE_PLL_FRAC_DIV_DISABLE)) {
  634. frac = inno_read(inno, 0xd3) |
  635. (inno_read(inno, 0xd2) << 8) |
  636. (inno_read(inno, 0xd1) << 16);
  637. vco += DIV_ROUND_CLOSEST(parent_rate * frac, (1 << 24));
  638. }
  639. if (inno_read(inno, 0xa0) & RK3328_PCLK_VCO_DIV_5_MASK) {
  640. do_div(vco, nd * 5);
  641. } else {
  642. no_a = inno_read(inno, 0xa5) & RK3328_PRE_PLL_PCLK_DIV_A_MASK;
  643. no_b = inno_read(inno, 0xa5) & RK3328_PRE_PLL_PCLK_DIV_B_MASK;
  644. no_b >>= RK3328_PRE_PLL_PCLK_DIV_B_SHIFT;
  645. no_b += 2;
  646. no_c = inno_read(inno, 0xa6) & RK3328_PRE_PLL_PCLK_DIV_C_MASK;
  647. no_c >>= RK3328_PRE_PLL_PCLK_DIV_C_SHIFT;
  648. no_c = 1 << no_c;
  649. no_d = inno_read(inno, 0xa6) & RK3328_PRE_PLL_PCLK_DIV_D_MASK;
  650. do_div(vco, (nd * (no_a == 1 ? no_b : no_a) * no_d * 2));
  651. }
  652. inno->pixclock = DIV_ROUND_CLOSEST((unsigned long)vco, 1000) * 1000;
  653. dev_dbg(inno->dev, "%s rate %lu vco %llu\n",
  654. __func__, inno->pixclock, vco);
  655. return inno->pixclock;
  656. }
  657. static long inno_hdmi_phy_rk3328_clk_round_rate(struct clk_hw *hw,
  658. unsigned long rate,
  659. unsigned long *parent_rate)
  660. {
  661. const struct pre_pll_config *cfg = pre_pll_cfg_table;
  662. rate = (rate / 1000) * 1000;
  663. for (; cfg->pixclock != 0; cfg++)
  664. if (cfg->pixclock == rate)
  665. break;
  666. if (cfg->pixclock == 0)
  667. return -EINVAL;
  668. return cfg->pixclock;
  669. }
  670. static int inno_hdmi_phy_rk3328_clk_set_rate(struct clk_hw *hw,
  671. unsigned long rate,
  672. unsigned long parent_rate)
  673. {
  674. struct inno_hdmi_phy *inno = to_inno_hdmi_phy(hw);
  675. const struct pre_pll_config *cfg;
  676. unsigned long tmdsclock = inno_hdmi_phy_get_tmdsclk(inno, rate);
  677. u32 val;
  678. int ret;
  679. dev_dbg(inno->dev, "%s rate %lu tmdsclk %lu\n",
  680. __func__, rate, tmdsclock);
  681. cfg = inno_hdmi_phy_get_pre_pll_cfg(inno, rate);
  682. if (IS_ERR(cfg))
  683. return PTR_ERR(cfg);
  684. inno_update_bits(inno, 0xa0, RK3328_PRE_PLL_POWER_DOWN,
  685. RK3328_PRE_PLL_POWER_DOWN);
  686. /* Configure pre-pll */
  687. inno_update_bits(inno, 0xa0, RK3328_PCLK_VCO_DIV_5_MASK,
  688. RK3328_PCLK_VCO_DIV_5(cfg->vco_div_5_en));
  689. inno_write(inno, 0xa1, RK3328_PRE_PLL_PRE_DIV(cfg->prediv));
  690. val = RK3328_SPREAD_SPECTRUM_MOD_DISABLE;
  691. if (!cfg->fracdiv)
  692. val |= RK3328_PRE_PLL_FRAC_DIV_DISABLE;
  693. inno_write(inno, 0xa2, RK3328_PRE_PLL_FB_DIV_11_8(cfg->fbdiv) | val);
  694. inno_write(inno, 0xa3, RK3328_PRE_PLL_FB_DIV_7_0(cfg->fbdiv));
  695. inno_write(inno, 0xa5, RK3328_PRE_PLL_PCLK_DIV_A(cfg->pclk_div_a) |
  696. RK3328_PRE_PLL_PCLK_DIV_B(cfg->pclk_div_b));
  697. inno_write(inno, 0xa6, RK3328_PRE_PLL_PCLK_DIV_C(cfg->pclk_div_c) |
  698. RK3328_PRE_PLL_PCLK_DIV_D(cfg->pclk_div_d));
  699. inno_write(inno, 0xa4, RK3328_PRE_PLL_TMDSCLK_DIV_C(cfg->tmds_div_c) |
  700. RK3328_PRE_PLL_TMDSCLK_DIV_A(cfg->tmds_div_a) |
  701. RK3328_PRE_PLL_TMDSCLK_DIV_B(cfg->tmds_div_b));
  702. inno_write(inno, 0xd3, RK3328_PRE_PLL_FRAC_DIV_7_0(cfg->fracdiv));
  703. inno_write(inno, 0xd2, RK3328_PRE_PLL_FRAC_DIV_15_8(cfg->fracdiv));
  704. inno_write(inno, 0xd1, RK3328_PRE_PLL_FRAC_DIV_23_16(cfg->fracdiv));
  705. inno_update_bits(inno, 0xa0, RK3328_PRE_PLL_POWER_DOWN, 0);
  706. /* Wait for Pre-PLL lock */
  707. ret = inno_poll(inno, 0xa9, val, val & RK3328_PRE_PLL_LOCK_STATUS,
  708. 1000, 10000);
  709. if (ret) {
  710. dev_err(inno->dev, "Pre-PLL locking failed\n");
  711. return ret;
  712. }
  713. inno->pixclock = rate;
  714. return 0;
  715. }
  716. static const struct clk_ops inno_hdmi_phy_rk3328_clk_ops = {
  717. .prepare = inno_hdmi_phy_rk3328_clk_prepare,
  718. .unprepare = inno_hdmi_phy_rk3328_clk_unprepare,
  719. .is_prepared = inno_hdmi_phy_rk3328_clk_is_prepared,
  720. .recalc_rate = inno_hdmi_phy_rk3328_clk_recalc_rate,
  721. .round_rate = inno_hdmi_phy_rk3328_clk_round_rate,
  722. .set_rate = inno_hdmi_phy_rk3328_clk_set_rate,
  723. };
  724. static int inno_hdmi_phy_clk_register(struct inno_hdmi_phy *inno)
  725. {
  726. struct device *dev = inno->dev;
  727. struct device_node *np = dev->of_node;
  728. struct clk_init_data init;
  729. const char *parent_name;
  730. int ret;
  731. parent_name = __clk_get_name(inno->refoclk);
  732. init.parent_names = &parent_name;
  733. init.num_parents = 1;
  734. init.flags = 0;
  735. init.name = "pin_hd20_pclk";
  736. init.ops = inno->plat_data->clk_ops;
  737. /* optional override of the clock name */
  738. of_property_read_string(np, "clock-output-names", &init.name);
  739. inno->hw.init = &init;
  740. inno->phyclk = devm_clk_register(dev, &inno->hw);
  741. if (IS_ERR(inno->phyclk)) {
  742. ret = PTR_ERR(inno->phyclk);
  743. dev_err(dev, "failed to register clock: %d\n", ret);
  744. return ret;
  745. }
  746. ret = of_clk_add_provider(np, of_clk_src_simple_get, inno->phyclk);
  747. if (ret) {
  748. dev_err(dev, "failed to register clock provider: %d\n", ret);
  749. return ret;
  750. }
  751. return 0;
  752. }
  753. static int inno_hdmi_phy_rk3228_init(struct inno_hdmi_phy *inno)
  754. {
  755. /*
  756. * Use phy internal register control
  757. * rxsense/poweron/pllpd/pdataen signal.
  758. */
  759. inno_write(inno, 0x01, RK3228_BYPASS_RXSENSE_EN |
  760. RK3228_BYPASS_PWRON_EN |
  761. RK3228_BYPASS_PLLPD_EN);
  762. inno_update_bits(inno, 0x02, RK3228_BYPASS_PDATA_EN,
  763. RK3228_BYPASS_PDATA_EN);
  764. /* manual power down post-PLL */
  765. inno_update_bits(inno, 0xaa, RK3228_POST_PLL_CTRL_MANUAL,
  766. RK3228_POST_PLL_CTRL_MANUAL);
  767. inno->chip_version = 1;
  768. return 0;
  769. }
  770. static int
  771. inno_hdmi_phy_rk3228_power_on(struct inno_hdmi_phy *inno,
  772. const struct post_pll_config *cfg,
  773. const struct phy_config *phy_cfg)
  774. {
  775. int ret;
  776. u32 v;
  777. inno_update_bits(inno, 0x02, RK3228_PDATAEN_DISABLE,
  778. RK3228_PDATAEN_DISABLE);
  779. inno_update_bits(inno, 0xe0, RK3228_PRE_PLL_POWER_DOWN |
  780. RK3228_POST_PLL_POWER_DOWN,
  781. RK3228_PRE_PLL_POWER_DOWN |
  782. RK3228_POST_PLL_POWER_DOWN);
  783. /* Post-PLL update */
  784. inno_update_bits(inno, 0xe9, RK3228_POST_PLL_PRE_DIV_MASK,
  785. RK3228_POST_PLL_PRE_DIV(cfg->prediv));
  786. inno_update_bits(inno, 0xeb, RK3228_POST_PLL_FB_DIV_8_MASK,
  787. RK3228_POST_PLL_FB_DIV_8(cfg->fbdiv));
  788. inno_write(inno, 0xea, RK3228_POST_PLL_FB_DIV_7_0(cfg->fbdiv));
  789. if (cfg->postdiv == 1) {
  790. inno_update_bits(inno, 0xe9, RK3228_POST_PLL_POST_DIV_ENABLE,
  791. 0);
  792. } else {
  793. int div = cfg->postdiv / 2 - 1;
  794. inno_update_bits(inno, 0xe9, RK3228_POST_PLL_POST_DIV_ENABLE,
  795. RK3228_POST_PLL_POST_DIV_ENABLE);
  796. inno_update_bits(inno, 0xeb, RK3228_POST_PLL_POST_DIV_MASK,
  797. RK3228_POST_PLL_POST_DIV(div));
  798. }
  799. for (v = 0; v < 4; v++)
  800. inno_write(inno, 0xef + v, phy_cfg->regs[v]);
  801. inno_update_bits(inno, 0xe0, RK3228_PRE_PLL_POWER_DOWN |
  802. RK3228_POST_PLL_POWER_DOWN, 0);
  803. inno_update_bits(inno, 0xe1, RK3228_BANDGAP_ENABLE,
  804. RK3228_BANDGAP_ENABLE);
  805. inno_update_bits(inno, 0xe1, RK3228_TMDS_DRIVER_ENABLE,
  806. RK3228_TMDS_DRIVER_ENABLE);
  807. /* Wait for post PLL lock */
  808. ret = inno_poll(inno, 0xeb, v, v & RK3228_POST_PLL_LOCK_STATUS,
  809. 100, 100000);
  810. if (ret) {
  811. dev_err(inno->dev, "Post-PLL locking failed\n");
  812. return ret;
  813. }
  814. if (cfg->tmdsclock > 340000000)
  815. msleep(100);
  816. inno_update_bits(inno, 0x02, RK3228_PDATAEN_DISABLE, 0);
  817. return 0;
  818. }
  819. static void inno_hdmi_phy_rk3228_power_off(struct inno_hdmi_phy *inno)
  820. {
  821. inno_update_bits(inno, 0xe1, RK3228_TMDS_DRIVER_ENABLE, 0);
  822. inno_update_bits(inno, 0xe1, RK3228_BANDGAP_ENABLE, 0);
  823. inno_update_bits(inno, 0xe0, RK3228_POST_PLL_POWER_DOWN,
  824. RK3228_POST_PLL_POWER_DOWN);
  825. }
  826. static const struct inno_hdmi_phy_ops rk3228_hdmi_phy_ops = {
  827. .init = inno_hdmi_phy_rk3228_init,
  828. .power_on = inno_hdmi_phy_rk3228_power_on,
  829. .power_off = inno_hdmi_phy_rk3228_power_off,
  830. };
  831. static int inno_hdmi_phy_rk3328_init(struct inno_hdmi_phy *inno)
  832. {
  833. struct nvmem_cell *cell;
  834. unsigned char *efuse_buf;
  835. size_t len;
  836. /*
  837. * Use phy internal register control
  838. * rxsense/poweron/pllpd/pdataen signal.
  839. */
  840. inno_write(inno, 0x01, RK3328_BYPASS_RXSENSE_EN |
  841. RK3328_BYPASS_POWERON_EN |
  842. RK3328_BYPASS_PLLPD_EN);
  843. inno_write(inno, 0x02, RK3328_INT_POL_HIGH | RK3328_BYPASS_PDATA_EN |
  844. RK3328_PDATA_EN);
  845. /* Disable phy irq */
  846. inno_write(inno, 0x05, 0);
  847. inno_write(inno, 0x07, 0);
  848. /* try to read the chip-version */
  849. inno->chip_version = 1;
  850. cell = nvmem_cell_get(inno->dev, "cpu-version");
  851. if (IS_ERR(cell)) {
  852. if (PTR_ERR(cell) == -EPROBE_DEFER)
  853. return -EPROBE_DEFER;
  854. return 0;
  855. }
  856. efuse_buf = nvmem_cell_read(cell, &len);
  857. nvmem_cell_put(cell);
  858. if (IS_ERR(efuse_buf))
  859. return 0;
  860. if (len == 1)
  861. inno->chip_version = efuse_buf[0] + 1;
  862. kfree(efuse_buf);
  863. return 0;
  864. }
  865. static int
  866. inno_hdmi_phy_rk3328_power_on(struct inno_hdmi_phy *inno,
  867. const struct post_pll_config *cfg,
  868. const struct phy_config *phy_cfg)
  869. {
  870. int ret;
  871. u32 v;
  872. inno_update_bits(inno, 0x02, RK3328_PDATA_EN, 0);
  873. inno_update_bits(inno, 0xaa, RK3328_POST_PLL_POWER_DOWN,
  874. RK3328_POST_PLL_POWER_DOWN);
  875. inno_write(inno, 0xac, RK3328_POST_PLL_FB_DIV_7_0(cfg->fbdiv));
  876. if (cfg->postdiv == 1) {
  877. inno_write(inno, 0xab, RK3328_POST_PLL_FB_DIV_8(cfg->fbdiv) |
  878. RK3328_POST_PLL_PRE_DIV(cfg->prediv));
  879. inno_write(inno, 0xaa, RK3328_POST_PLL_REFCLK_SEL_TMDS |
  880. RK3328_POST_PLL_POWER_DOWN);
  881. } else {
  882. v = (cfg->postdiv / 2) - 1;
  883. v &= RK3328_POST_PLL_POST_DIV_MASK;
  884. inno_write(inno, 0xad, v);
  885. inno_write(inno, 0xab, RK3328_POST_PLL_FB_DIV_8(cfg->fbdiv) |
  886. RK3328_POST_PLL_PRE_DIV(cfg->prediv));
  887. inno_write(inno, 0xaa, RK3328_POST_PLL_POST_DIV_ENABLE |
  888. RK3328_POST_PLL_REFCLK_SEL_TMDS |
  889. RK3328_POST_PLL_POWER_DOWN);
  890. }
  891. for (v = 0; v < 14; v++)
  892. inno_write(inno, 0xb5 + v, phy_cfg->regs[v]);
  893. /* set ESD detection threshold for TMDS CLK, D2, D1 and D0 */
  894. for (v = 0; v < 4; v++)
  895. inno_update_bits(inno, 0xc8 + v, RK3328_ESD_DETECT_MASK,
  896. RK3328_ESD_DETECT_340MV);
  897. if (phy_cfg->tmdsclock > 340000000) {
  898. /* Set termination resistor to 100ohm */
  899. v = clk_get_rate(inno->sysclk) / 100000;
  900. inno_write(inno, 0xc5, RK3328_TERM_RESISTOR_CALIB_SPEED_14_8(v)
  901. | RK3328_BYPASS_TERM_RESISTOR_CALIB);
  902. inno_write(inno, 0xc6, RK3328_TERM_RESISTOR_CALIB_SPEED_7_0(v));
  903. inno_write(inno, 0xc7, RK3328_TERM_RESISTOR_100);
  904. inno_update_bits(inno, 0xc5,
  905. RK3328_BYPASS_TERM_RESISTOR_CALIB, 0);
  906. } else {
  907. inno_write(inno, 0xc5, RK3328_BYPASS_TERM_RESISTOR_CALIB);
  908. /* clk termination resistor is 50ohm (parallel resistors) */
  909. if (phy_cfg->tmdsclock > 165000000)
  910. inno_update_bits(inno, 0xc8,
  911. RK3328_TMDS_TERM_RESIST_MASK,
  912. RK3328_TMDS_TERM_RESIST_75 |
  913. RK3328_TMDS_TERM_RESIST_150);
  914. /* data termination resistor for D2, D1 and D0 is 150ohm */
  915. for (v = 0; v < 3; v++)
  916. inno_update_bits(inno, 0xc9 + v,
  917. RK3328_TMDS_TERM_RESIST_MASK,
  918. RK3328_TMDS_TERM_RESIST_150);
  919. }
  920. inno_update_bits(inno, 0xaa, RK3328_POST_PLL_POWER_DOWN, 0);
  921. inno_update_bits(inno, 0xb0, RK3328_BANDGAP_ENABLE,
  922. RK3328_BANDGAP_ENABLE);
  923. inno_update_bits(inno, 0xb2, RK3328_TMDS_DRIVER_ENABLE,
  924. RK3328_TMDS_DRIVER_ENABLE);
  925. /* Wait for post PLL lock */
  926. ret = inno_poll(inno, 0xaf, v, v & RK3328_POST_PLL_LOCK_STATUS,
  927. 1000, 10000);
  928. if (ret) {
  929. dev_err(inno->dev, "Post-PLL locking failed\n");
  930. return ret;
  931. }
  932. if (phy_cfg->tmdsclock > 340000000)
  933. msleep(100);
  934. inno_update_bits(inno, 0x02, RK3328_PDATA_EN, RK3328_PDATA_EN);
  935. /* Enable PHY IRQ */
  936. inno_write(inno, 0x05, RK3328_INT_TMDS_CLK(RK3328_INT_VSS_AGND_ESD_DET)
  937. | RK3328_INT_TMDS_D2(RK3328_INT_VSS_AGND_ESD_DET));
  938. inno_write(inno, 0x07, RK3328_INT_TMDS_D1(RK3328_INT_VSS_AGND_ESD_DET)
  939. | RK3328_INT_TMDS_D0(RK3328_INT_VSS_AGND_ESD_DET));
  940. return 0;
  941. }
  942. static void inno_hdmi_phy_rk3328_power_off(struct inno_hdmi_phy *inno)
  943. {
  944. inno_update_bits(inno, 0xb2, RK3328_TMDS_DRIVER_ENABLE, 0);
  945. inno_update_bits(inno, 0xb0, RK3328_BANDGAP_ENABLE, 0);
  946. inno_update_bits(inno, 0xaa, RK3328_POST_PLL_POWER_DOWN,
  947. RK3328_POST_PLL_POWER_DOWN);
  948. /* Disable PHY IRQ */
  949. inno_write(inno, 0x05, 0);
  950. inno_write(inno, 0x07, 0);
  951. }
  952. static const struct inno_hdmi_phy_ops rk3328_hdmi_phy_ops = {
  953. .init = inno_hdmi_phy_rk3328_init,
  954. .power_on = inno_hdmi_phy_rk3328_power_on,
  955. .power_off = inno_hdmi_phy_rk3328_power_off,
  956. };
  957. static const struct inno_hdmi_phy_drv_data rk3228_hdmi_phy_drv_data = {
  958. .ops = &rk3228_hdmi_phy_ops,
  959. .clk_ops = &inno_hdmi_phy_rk3228_clk_ops,
  960. .phy_cfg_table = rk3228_phy_cfg,
  961. };
  962. static const struct inno_hdmi_phy_drv_data rk3328_hdmi_phy_drv_data = {
  963. .ops = &rk3328_hdmi_phy_ops,
  964. .clk_ops = &inno_hdmi_phy_rk3328_clk_ops,
  965. .phy_cfg_table = rk3328_phy_cfg,
  966. };
  967. static const struct regmap_config inno_hdmi_phy_regmap_config = {
  968. .reg_bits = 32,
  969. .val_bits = 32,
  970. .reg_stride = 4,
  971. .max_register = 0x400,
  972. };
  973. static void inno_hdmi_phy_action(void *data)
  974. {
  975. struct inno_hdmi_phy *inno = data;
  976. clk_disable_unprepare(inno->refpclk);
  977. clk_disable_unprepare(inno->sysclk);
  978. }
  979. static int inno_hdmi_phy_probe(struct platform_device *pdev)
  980. {
  981. struct inno_hdmi_phy *inno;
  982. struct phy_provider *phy_provider;
  983. void __iomem *regs;
  984. int ret;
  985. inno = devm_kzalloc(&pdev->dev, sizeof(*inno), GFP_KERNEL);
  986. if (!inno)
  987. return -ENOMEM;
  988. inno->dev = &pdev->dev;
  989. inno->plat_data = of_device_get_match_data(inno->dev);
  990. if (!inno->plat_data || !inno->plat_data->ops)
  991. return -EINVAL;
  992. regs = devm_platform_ioremap_resource(pdev, 0);
  993. if (IS_ERR(regs))
  994. return PTR_ERR(regs);
  995. inno->sysclk = devm_clk_get(inno->dev, "sysclk");
  996. if (IS_ERR(inno->sysclk)) {
  997. ret = PTR_ERR(inno->sysclk);
  998. dev_err(inno->dev, "failed to get sysclk: %d\n", ret);
  999. return ret;
  1000. }
  1001. inno->refpclk = devm_clk_get(inno->dev, "refpclk");
  1002. if (IS_ERR(inno->refpclk)) {
  1003. ret = PTR_ERR(inno->refpclk);
  1004. dev_err(inno->dev, "failed to get ref clock: %d\n", ret);
  1005. return ret;
  1006. }
  1007. inno->refoclk = devm_clk_get(inno->dev, "refoclk");
  1008. if (IS_ERR(inno->refoclk)) {
  1009. ret = PTR_ERR(inno->refoclk);
  1010. dev_err(inno->dev, "failed to get oscillator-ref clock: %d\n",
  1011. ret);
  1012. return ret;
  1013. }
  1014. ret = clk_prepare_enable(inno->sysclk);
  1015. if (ret) {
  1016. dev_err(inno->dev, "Cannot enable inno phy sysclk: %d\n", ret);
  1017. return ret;
  1018. }
  1019. /*
  1020. * Refpclk needs to be on, on at least the rk3328 for still
  1021. * unknown reasons.
  1022. */
  1023. ret = clk_prepare_enable(inno->refpclk);
  1024. if (ret) {
  1025. dev_err(inno->dev, "failed to enable refpclk\n");
  1026. clk_disable_unprepare(inno->sysclk);
  1027. return ret;
  1028. }
  1029. ret = devm_add_action_or_reset(inno->dev, inno_hdmi_phy_action,
  1030. inno);
  1031. if (ret)
  1032. return ret;
  1033. inno->regmap = devm_regmap_init_mmio(inno->dev, regs,
  1034. &inno_hdmi_phy_regmap_config);
  1035. if (IS_ERR(inno->regmap))
  1036. return PTR_ERR(inno->regmap);
  1037. /* only the newer rk3328 hdmiphy has an interrupt */
  1038. inno->irq = platform_get_irq(pdev, 0);
  1039. if (inno->irq > 0) {
  1040. ret = devm_request_threaded_irq(inno->dev, inno->irq,
  1041. inno_hdmi_phy_rk3328_hardirq,
  1042. inno_hdmi_phy_rk3328_irq,
  1043. IRQF_SHARED,
  1044. dev_name(inno->dev), inno);
  1045. if (ret)
  1046. return ret;
  1047. }
  1048. inno->phy = devm_phy_create(inno->dev, NULL, &inno_hdmi_phy_ops);
  1049. if (IS_ERR(inno->phy)) {
  1050. dev_err(inno->dev, "failed to create HDMI PHY\n");
  1051. return PTR_ERR(inno->phy);
  1052. }
  1053. phy_set_drvdata(inno->phy, inno);
  1054. phy_set_bus_width(inno->phy, 8);
  1055. if (inno->plat_data->ops->init) {
  1056. ret = inno->plat_data->ops->init(inno);
  1057. if (ret)
  1058. return ret;
  1059. }
  1060. ret = inno_hdmi_phy_clk_register(inno);
  1061. if (ret)
  1062. return ret;
  1063. phy_provider = devm_of_phy_provider_register(inno->dev,
  1064. of_phy_simple_xlate);
  1065. return PTR_ERR_OR_ZERO(phy_provider);
  1066. }
  1067. static int inno_hdmi_phy_remove(struct platform_device *pdev)
  1068. {
  1069. of_clk_del_provider(pdev->dev.of_node);
  1070. return 0;
  1071. }
  1072. static const struct of_device_id inno_hdmi_phy_of_match[] = {
  1073. {
  1074. .compatible = "rockchip,rk3228-hdmi-phy",
  1075. .data = &rk3228_hdmi_phy_drv_data
  1076. }, {
  1077. .compatible = "rockchip,rk3328-hdmi-phy",
  1078. .data = &rk3328_hdmi_phy_drv_data
  1079. }, { /* sentinel */ }
  1080. };
  1081. MODULE_DEVICE_TABLE(of, inno_hdmi_phy_of_match);
  1082. static struct platform_driver inno_hdmi_phy_driver = {
  1083. .probe = inno_hdmi_phy_probe,
  1084. .remove = inno_hdmi_phy_remove,
  1085. .driver = {
  1086. .name = "inno-hdmi-phy",
  1087. .of_match_table = inno_hdmi_phy_of_match,
  1088. },
  1089. };
  1090. module_platform_driver(inno_hdmi_phy_driver);
  1091. MODULE_AUTHOR("Zheng Yang <[email protected]>");
  1092. MODULE_DESCRIPTION("Innosilion HDMI 2.0 Transmitter PHY Driver");
  1093. MODULE_LICENSE("GPL v2");