sde_rsc_hw.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
  4. */
  5. #define pr_fmt(fmt) "[sde_rsc_hw:%s:%d]: " fmt, __func__, __LINE__
  6. #include <linux/kernel.h>
  7. #include <linux/debugfs.h>
  8. #include <linux/delay.h>
  9. #include "sde_rsc_priv.h"
  10. #include "sde_dbg.h"
  11. #include "sde_rsc_hw.h"
  12. static void rsc_event_trigger(struct sde_rsc_priv *rsc, uint32_t event_type)
  13. {
  14. struct sde_rsc_event *event;
  15. list_for_each_entry(event, &rsc->event_list, list)
  16. if (event->event_type & event_type)
  17. event->cb_func(event_type, event->usr);
  18. }
  19. static int rsc_hw_qtimer_init(struct sde_rsc_priv *rsc)
  20. {
  21. pr_debug("rsc hardware qtimer init\n");
  22. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_QTMR_AC_HW_FRAME_SEL_1,
  23. 0xffffffff, rsc->debug_mode);
  24. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_QTMR_AC_HW_FRAME_SEL_2,
  25. 0xffffffff, rsc->debug_mode);
  26. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_QTMR_AC_CNTACR0_FG0,
  27. 0x1, rsc->debug_mode);
  28. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_QTMR_AC_CNTACR1_FG0,
  29. 0x1, rsc->debug_mode);
  30. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_LO,
  31. 0xffffffff, rsc->debug_mode);
  32. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_HI,
  33. 0xffffffff, rsc->debug_mode);
  34. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_LO,
  35. 0xffffffff, rsc->debug_mode);
  36. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_HI,
  37. 0xffffffff, rsc->debug_mode);
  38. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CTL,
  39. 0x1, rsc->debug_mode);
  40. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CTL,
  41. 0x1, rsc->debug_mode);
  42. return 0;
  43. }
  44. static int rsc_hw_pdc_init(struct sde_rsc_priv *rsc)
  45. {
  46. pr_debug("rsc hardware pdc init\n");
  47. dss_reg_w(&rsc->drv_io, SDE_RSCC_PDC_SEQ_START_ADDR_REG_OFFSET_DRV0,
  48. 0x4520, rsc->debug_mode);
  49. dss_reg_w(&rsc->drv_io, SDE_RSCC_PDC_MATCH_VALUE_LO_REG_OFFSET_DRV0,
  50. 0x4510, rsc->debug_mode);
  51. dss_reg_w(&rsc->drv_io, SDE_RSCC_PDC_MATCH_VALUE_HI_REG_OFFSET_DRV0,
  52. 0x4514, rsc->debug_mode);
  53. dss_reg_w(&rsc->drv_io, SDE_RSCC_PDC_SLAVE_ID_DRV0,
  54. 0x1, rsc->debug_mode);
  55. return 0;
  56. }
  57. static int rsc_hw_wrapper_init(struct sde_rsc_priv *rsc)
  58. {
  59. pr_debug("rsc hardware wrapper init\n");
  60. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_STATIC_WAKEUP_0,
  61. rsc->timer_config.static_wakeup_time_ns, rsc->debug_mode);
  62. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_RSCC_MODE_THRESHOLD,
  63. rsc->timer_config.rsc_mode_threshold_time_ns, rsc->debug_mode);
  64. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  65. BIT(8), rsc->debug_mode);
  66. return 0;
  67. }
  68. static int rsc_hw_seq_memory_init_v2(struct sde_rsc_priv *rsc)
  69. {
  70. const u32 mode_0_start_addr = 0x0;
  71. const u32 mode_1_start_addr = 0xc;
  72. const u32 mode_2_start_addr = 0x18;
  73. pr_debug("rsc sequencer memory init v2\n");
  74. /* Mode - 0 sequence */
  75. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x0,
  76. 0xe0bb9ebe, rsc->debug_mode);
  77. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x4,
  78. 0x9ebeff39, rsc->debug_mode);
  79. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x8,
  80. 0x2020209b, rsc->debug_mode);
  81. /* Mode - 1 sequence */
  82. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0xc,
  83. 0x38bb9ebe, rsc->debug_mode);
  84. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x10,
  85. 0xbeff39e0, rsc->debug_mode);
  86. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x14,
  87. 0x20209b9e, rsc->debug_mode);
  88. /* Mode - 2 sequence */
  89. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x18,
  90. 0xb9bae5a0, rsc->debug_mode);
  91. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x1c,
  92. 0xbdbbf9fa, rsc->debug_mode);
  93. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x20,
  94. 0x38999afe, rsc->debug_mode);
  95. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x24,
  96. 0xac81e1a1, rsc->debug_mode);
  97. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x28,
  98. 0x82e2a2e0, rsc->debug_mode);
  99. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x2c,
  100. 0x8cfd9d39, rsc->debug_mode);
  101. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x30,
  102. 0xbc20209b, rsc->debug_mode);
  103. /* tcs sleep & wake sequence */
  104. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x34,
  105. 0xe601a6fc, rsc->debug_mode);
  106. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x38,
  107. 0xbc20209c, rsc->debug_mode);
  108. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x3c,
  109. 0xe701a7fc, rsc->debug_mode);
  110. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x40,
  111. 0x0000209c, rsc->debug_mode);
  112. /* branch address */
  113. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_CFG_BR_ADDR_0_DRV0,
  114. 0x33, rsc->debug_mode);
  115. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_CFG_BR_ADDR_1_DRV0,
  116. 0x3b, rsc->debug_mode);
  117. /* start address */
  118. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_OVERRIDE_CTRL_DRV0,
  119. mode_0_start_addr,
  120. rsc->debug_mode);
  121. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE0,
  122. mode_0_start_addr,
  123. rsc->debug_mode);
  124. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE1,
  125. mode_1_start_addr,
  126. rsc->debug_mode);
  127. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE2,
  128. mode_2_start_addr,
  129. rsc->debug_mode);
  130. return 0;
  131. }
  132. static int rsc_hw_seq_memory_init(struct sde_rsc_priv *rsc)
  133. {
  134. const u32 mode_0_start_addr = 0x0;
  135. const u32 mode_1_start_addr = 0xa;
  136. const u32 mode_2_start_addr = 0x15;
  137. pr_debug("rsc sequencer memory init\n");
  138. /* Mode - 0 sequence */
  139. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x0,
  140. 0xe0a88bab, rsc->debug_mode);
  141. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x4,
  142. 0x8babec39, rsc->debug_mode);
  143. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x8,
  144. 0x8bab2088, rsc->debug_mode);
  145. /* Mode - 1 sequence */
  146. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0xc,
  147. 0x39e038a8, rsc->debug_mode);
  148. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x10,
  149. 0x888babec, rsc->debug_mode);
  150. /* Mode - 2 sequence */
  151. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x14,
  152. 0xaaa8a020, rsc->debug_mode);
  153. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x18,
  154. 0xe1a138eb, rsc->debug_mode);
  155. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x1c,
  156. 0xe0aca581, rsc->debug_mode);
  157. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x20,
  158. 0x82e2a2ed, rsc->debug_mode);
  159. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x24,
  160. 0x8cea8a39, rsc->debug_mode);
  161. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x28,
  162. 0xe9a92088, rsc->debug_mode);
  163. /* tcs sleep & wake sequence */
  164. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x2c,
  165. 0x89e686a6, rsc->debug_mode);
  166. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x30,
  167. 0xa7e9a920, rsc->debug_mode);
  168. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x34,
  169. 0x2089e787, rsc->debug_mode);
  170. /* branch address */
  171. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_CFG_BR_ADDR_0_DRV0,
  172. 0x2a, rsc->debug_mode);
  173. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_CFG_BR_ADDR_1_DRV0,
  174. 0x31, rsc->debug_mode);
  175. /* start address */
  176. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_OVERRIDE_CTRL_DRV0,
  177. mode_0_start_addr,
  178. rsc->debug_mode);
  179. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE0,
  180. mode_0_start_addr,
  181. rsc->debug_mode);
  182. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE1,
  183. mode_1_start_addr,
  184. rsc->debug_mode);
  185. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE2,
  186. mode_2_start_addr,
  187. rsc->debug_mode);
  188. return 0;
  189. }
  190. static int rsc_hw_solver_init(struct sde_rsc_priv *rsc)
  191. {
  192. pr_debug("rsc solver init\n");
  193. dss_reg_w(&rsc->drv_io, SDE_RSCC_SOFT_WAKEUP_TIME_LO_DRV0,
  194. 0xFFFFFFFF, rsc->debug_mode);
  195. dss_reg_w(&rsc->drv_io, SDE_RSCC_SOFT_WAKEUP_TIME_HI_DRV0,
  196. 0xFFFFFFFF, rsc->debug_mode);
  197. dss_reg_w(&rsc->drv_io, SDE_RSCC_MAX_IDLE_DURATION_DRV0,
  198. 0xEFFFFFFF, rsc->debug_mode);
  199. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_0_DRV0,
  200. 0x0, rsc->debug_mode);
  201. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_1_DRV0,
  202. rsc->timer_config.rsc_time_slot_0_ns, rsc->debug_mode);
  203. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_2_DRV0,
  204. rsc->timer_config.rsc_time_slot_1_ns, rsc->debug_mode);
  205. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_3_DRV0,
  206. rsc->timer_config.rsc_time_slot_2_ns, rsc->debug_mode);
  207. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_SOLVER_MODES_ENABLED_DRV0,
  208. 0x7, rsc->debug_mode);
  209. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT0_PRI0_DRV0,
  210. 0x0, rsc->debug_mode);
  211. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT1_PRI0_DRV0,
  212. 0x1, rsc->debug_mode);
  213. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT1_PRI3_DRV0,
  214. 0x1, rsc->debug_mode);
  215. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT2_PRI0_DRV0,
  216. 0x2, rsc->debug_mode);
  217. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT2_PRI3_DRV0,
  218. 0x2, rsc->debug_mode);
  219. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_OVERRIDE_MODE_DRV0,
  220. 0x0, rsc->debug_mode);
  221. dss_reg_w(&rsc->drv_io, SDE_RSC_TIMERS_CONSIDERED_DRV0,
  222. 0x1, rsc->debug_mode);
  223. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_OVERRIDE_IDLE_TIME_DRV0,
  224. 0x01000010, rsc->debug_mode);
  225. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM1_DRV0_MODE0,
  226. 0x80000000, rsc->debug_mode);
  227. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE0,
  228. rsc->timer_config.rsc_backoff_time_ns, rsc->debug_mode);
  229. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE0,
  230. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  231. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM1_DRV0_MODE1,
  232. 0x80000000, rsc->debug_mode);
  233. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE1,
  234. rsc->timer_config.rsc_backoff_time_ns, rsc->debug_mode);
  235. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE1,
  236. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  237. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM1_DRV0_MODE2,
  238. 0x80000000, rsc->debug_mode);
  239. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE2,
  240. 0x0, rsc->debug_mode);
  241. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE2,
  242. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  243. return 0;
  244. }
  245. static int rsc_hw_timer_update(struct sde_rsc_priv *rsc)
  246. {
  247. if (!rsc) {
  248. pr_debug("invalid input param\n");
  249. return -EINVAL;
  250. }
  251. pr_debug("rsc hw timer update\n");
  252. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_1_DRV0,
  253. rsc->timer_config.rsc_time_slot_0_ns, rsc->debug_mode);
  254. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_2_DRV0,
  255. rsc->timer_config.rsc_time_slot_1_ns, rsc->debug_mode);
  256. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_3_DRV0,
  257. rsc->timer_config.rsc_time_slot_2_ns, rsc->debug_mode);
  258. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE0,
  259. rsc->timer_config.rsc_backoff_time_ns, rsc->debug_mode);
  260. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE0,
  261. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  262. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE1,
  263. rsc->timer_config.rsc_backoff_time_ns, rsc->debug_mode);
  264. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE1,
  265. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  266. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE2,
  267. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  268. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_STATIC_WAKEUP_0,
  269. rsc->timer_config.static_wakeup_time_ns, rsc->debug_mode);
  270. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_RSCC_MODE_THRESHOLD,
  271. rsc->timer_config.rsc_mode_threshold_time_ns, rsc->debug_mode);
  272. /* make sure that hw timers are updated */
  273. wmb();
  274. return 0;
  275. }
  276. int sde_rsc_mode2_exit(struct sde_rsc_priv *rsc, enum sde_rsc_state state)
  277. {
  278. int rc = -EBUSY;
  279. int count, reg;
  280. unsigned long power_status;
  281. rsc_event_trigger(rsc, SDE_RSC_EVENT_PRE_CORE_RESTORE);
  282. /**
  283. * force busy and idle during clk & video mode state because it
  284. * is trying to entry in mode-2 without turning on the vysnc.
  285. */
  286. if ((state == SDE_RSC_VID_STATE) || (state == SDE_RSC_CLK_STATE)) {
  287. reg = dss_reg_r(&rsc->wrapper_io,
  288. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  289. reg &= ~(BIT(8) | BIT(0));
  290. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  291. reg, rsc->debug_mode);
  292. }
  293. // needs review with HPG sequence
  294. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_LO,
  295. 0x0, rsc->debug_mode);
  296. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_HI,
  297. 0x0, rsc->debug_mode);
  298. reg = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  299. rsc->debug_mode);
  300. reg &= ~BIT(3);
  301. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  302. reg, rsc->debug_mode);
  303. if (rsc->version < SDE_RSC_REV_2) {
  304. reg = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_SPARE_PWR_EVENT,
  305. rsc->debug_mode);
  306. reg |= BIT(13);
  307. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_SPARE_PWR_EVENT,
  308. reg, rsc->debug_mode);
  309. }
  310. /* make sure that mode-2 exit before wait*/
  311. wmb();
  312. /* this wait is required to make sure that gdsc is powered on */
  313. for (count = MAX_CHECK_LOOPS; count > 0; count--) {
  314. power_status = dss_reg_r(&rsc->wrapper_io,
  315. SDE_RSCC_PWR_CTRL, rsc->debug_mode);
  316. if (!test_bit(POWER_CTRL_BIT_12, &power_status)) {
  317. reg = dss_reg_r(&rsc->drv_io,
  318. SDE_RSCC_SEQ_PROGRAM_COUNTER, rsc->debug_mode);
  319. SDE_EVT32_VERBOSE(count, reg, power_status);
  320. rc = 0;
  321. break;
  322. }
  323. usleep_range(10, 100);
  324. }
  325. if (rsc->version < SDE_RSC_REV_2) {
  326. reg = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_SPARE_PWR_EVENT,
  327. rsc->debug_mode);
  328. reg &= ~BIT(13);
  329. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_SPARE_PWR_EVENT,
  330. reg, rsc->debug_mode);
  331. }
  332. if (rc)
  333. pr_err("vdd reg is not enabled yet\n");
  334. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_SOLVER_MODES_ENABLED_DRV0,
  335. 0x3, rsc->debug_mode);
  336. reg = dss_reg_r(&rsc->wrapper_io,
  337. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  338. reg &= ~(BIT(0) | BIT(8));
  339. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  340. reg, rsc->debug_mode);
  341. wmb(); /* make sure to disable rsc solver state */
  342. reg = dss_reg_r(&rsc->wrapper_io,
  343. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  344. reg |= (BIT(0) | BIT(8));
  345. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  346. reg, rsc->debug_mode);
  347. wmb(); /* make sure to enable rsc solver state */
  348. rsc_event_trigger(rsc, SDE_RSC_EVENT_POST_CORE_RESTORE);
  349. return rc;
  350. }
  351. static int sde_rsc_mode2_entry_trigger(struct sde_rsc_priv *rsc)
  352. {
  353. int rc;
  354. int count, wrapper_status;
  355. unsigned long reg;
  356. /* update qtimers to high during clk & video mode state */
  357. if ((rsc->current_state == SDE_RSC_VID_STATE) ||
  358. (rsc->current_state == SDE_RSC_CLK_STATE)) {
  359. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_HI,
  360. 0xffffffff, rsc->debug_mode);
  361. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_LO,
  362. 0xffffffff, rsc->debug_mode);
  363. }
  364. wrapper_status = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  365. rsc->debug_mode);
  366. wrapper_status |= BIT(3);
  367. wrapper_status |= BIT(0);
  368. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  369. wrapper_status, rsc->debug_mode);
  370. /**
  371. * force busy and idle during clk & video mode state because it
  372. * is trying to entry in mode-2 without turning on the vysnc.
  373. */
  374. if ((rsc->current_state == SDE_RSC_VID_STATE) ||
  375. (rsc->current_state == SDE_RSC_CLK_STATE)) {
  376. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  377. BIT(0) | BIT(1), rsc->debug_mode);
  378. wmb(); /* force busy gurantee */
  379. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  380. BIT(0) | BIT(9), rsc->debug_mode);
  381. }
  382. /* make sure that mode-2 is triggered before wait*/
  383. wmb();
  384. rc = -EBUSY;
  385. /* this wait is required to turn off the rscc clocks */
  386. for (count = MAX_CHECK_LOOPS; count > 0; count--) {
  387. reg = dss_reg_r(&rsc->wrapper_io,
  388. SDE_RSCC_PWR_CTRL, rsc->debug_mode);
  389. if (test_bit(POWER_CTRL_BIT_12, &reg)) {
  390. rc = 0;
  391. break;
  392. }
  393. usleep_range(10, 100);
  394. }
  395. return rc;
  396. }
  397. static void sde_rsc_reset_mode_0_1(struct sde_rsc_priv *rsc)
  398. {
  399. u32 seq_busy, current_mode, curr_inst_addr;
  400. seq_busy = dss_reg_r(&rsc->drv_io, SDE_RSCC_SEQ_BUSY_DRV0,
  401. rsc->debug_mode);
  402. current_mode = dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS2_DRV0,
  403. rsc->debug_mode);
  404. curr_inst_addr = dss_reg_r(&rsc->drv_io, SDE_RSCC_SEQ_PROGRAM_COUNTER,
  405. rsc->debug_mode);
  406. SDE_EVT32(seq_busy, current_mode, curr_inst_addr);
  407. if (seq_busy && (current_mode == SDE_RSC_MODE_0_VAL ||
  408. current_mode == SDE_RSC_MODE_1_VAL)) {
  409. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_HI,
  410. 0xffffff, rsc->debug_mode);
  411. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_LO,
  412. 0xffffffff, rsc->debug_mode);
  413. /* unstick f1 qtimer */
  414. wmb();
  415. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_HI,
  416. 0x0, rsc->debug_mode);
  417. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_LO,
  418. 0x0, rsc->debug_mode);
  419. /* manually trigger f1 qtimer interrupt */
  420. wmb();
  421. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_HI,
  422. 0xffffff, rsc->debug_mode);
  423. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_LO,
  424. 0xffffffff, rsc->debug_mode);
  425. /* unstick f0 qtimer */
  426. wmb();
  427. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_HI,
  428. 0x0, rsc->debug_mode);
  429. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_LO,
  430. 0x0, rsc->debug_mode);
  431. /* manually trigger f0 qtimer interrupt */
  432. wmb();
  433. }
  434. }
  435. static int sde_rsc_mode2_entry(struct sde_rsc_priv *rsc)
  436. {
  437. int rc = 0, i;
  438. u32 reg;
  439. if (rsc->power_collapse_block)
  440. return -EINVAL;
  441. if (rsc->sw_fs_enabled) {
  442. rc = regulator_set_mode(rsc->fs, REGULATOR_MODE_FAST);
  443. if (rc) {
  444. pr_err("vdd reg fast mode set failed rc:%d\n", rc);
  445. return rc;
  446. }
  447. }
  448. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_SOLVER_MODES_ENABLED_DRV0,
  449. 0x7, rsc->debug_mode);
  450. rsc_event_trigger(rsc, SDE_RSC_EVENT_PRE_CORE_PC);
  451. for (i = 0; i <= MAX_MODE2_ENTRY_TRY; i++) {
  452. rc = sde_rsc_mode2_entry_trigger(rsc);
  453. if (!rc)
  454. break;
  455. reg = dss_reg_r(&rsc->drv_io,
  456. SDE_RSCC_SEQ_PROGRAM_COUNTER, rsc->debug_mode);
  457. pr_err("mdss gdsc power down failed, instruction:0x%x, rc:%d\n",
  458. reg, rc);
  459. SDE_EVT32(rc, reg, SDE_EVTLOG_ERROR);
  460. /* avoid touching f1 qtimer for last try */
  461. if (i != MAX_MODE2_ENTRY_TRY)
  462. sde_rsc_reset_mode_0_1(rsc);
  463. }
  464. if (rc)
  465. goto end;
  466. if ((rsc->current_state == SDE_RSC_VID_STATE) ||
  467. (rsc->current_state == SDE_RSC_CLK_STATE)) {
  468. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  469. BIT(0) | BIT(8), rsc->debug_mode);
  470. wmb(); /* force busy on vsync */
  471. }
  472. rsc_event_trigger(rsc, SDE_RSC_EVENT_POST_CORE_PC);
  473. if (rsc->sw_fs_enabled) {
  474. regulator_disable(rsc->fs);
  475. rsc->sw_fs_enabled = false;
  476. }
  477. return 0;
  478. end:
  479. sde_rsc_mode2_exit(rsc, rsc->current_state);
  480. return rc;
  481. }
  482. static int sde_rsc_state_update(struct sde_rsc_priv *rsc,
  483. enum sde_rsc_state state)
  484. {
  485. int rc = 0;
  486. int reg;
  487. if (rsc->power_collapse) {
  488. rc = sde_rsc_mode2_exit(rsc, state);
  489. if (rc)
  490. pr_err("power collapse: mode2 exit failed\n");
  491. else
  492. rsc->power_collapse = false;
  493. }
  494. switch (state) {
  495. case SDE_RSC_CMD_STATE:
  496. pr_debug("command mode handling\n");
  497. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  498. 0x1, rsc->debug_mode);
  499. dss_reg_w(&rsc->drv_io, SDE_RSCC_SOLVER_OVERRIDE_CTRL_DRV0,
  500. 0x0, rsc->debug_mode);
  501. reg = dss_reg_r(&rsc->wrapper_io,
  502. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  503. reg |= (BIT(0) | BIT(8));
  504. reg &= ~(BIT(1) | BIT(2) | BIT(3) | BIT(6) | BIT(7) | BIT(9));
  505. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  506. reg, rsc->debug_mode);
  507. /* make sure that solver is enabled */
  508. wmb();
  509. rsc_event_trigger(rsc, SDE_RSC_EVENT_SOLVER_ENABLED);
  510. break;
  511. case SDE_RSC_VID_STATE:
  512. pr_debug("video mode handling\n");
  513. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  514. 0x1, rsc->debug_mode);
  515. reg = dss_reg_r(&rsc->wrapper_io,
  516. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  517. reg |= BIT(8);
  518. reg &= ~(BIT(1) | BIT(0));
  519. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  520. reg, rsc->debug_mode);
  521. /* make sure that solver mode is override */
  522. wmb();
  523. rsc_event_trigger(rsc, SDE_RSC_EVENT_SOLVER_DISABLED);
  524. break;
  525. case SDE_RSC_CLK_STATE:
  526. pr_debug("clk state handling\n");
  527. reg = dss_reg_r(&rsc->wrapper_io,
  528. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  529. reg &= ~BIT(0);
  530. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  531. reg, rsc->debug_mode);
  532. /* make sure that solver mode is disabled */
  533. wmb();
  534. break;
  535. case SDE_RSC_IDLE_STATE:
  536. rc = sde_rsc_mode2_entry(rsc);
  537. if (rc)
  538. pr_err("power collapse - mode 2 entry failed\n");
  539. else
  540. rsc->power_collapse = true;
  541. break;
  542. default:
  543. pr_err("state:%d handling is not supported\n", state);
  544. break;
  545. }
  546. return rc;
  547. }
  548. int rsc_hw_init(struct sde_rsc_priv *rsc)
  549. {
  550. int rc = 0;
  551. rc = rsc_hw_qtimer_init(rsc);
  552. if (rc) {
  553. pr_err("rsc hw qtimer init failed\n");
  554. goto end;
  555. }
  556. rc = rsc_hw_wrapper_init(rsc);
  557. if (rc) {
  558. pr_err("rsc hw wrapper init failed\n");
  559. goto end;
  560. }
  561. if (rsc->version == SDE_RSC_REV_2)
  562. rc = rsc_hw_seq_memory_init_v2(rsc);
  563. else
  564. rc = rsc_hw_seq_memory_init(rsc);
  565. if (rc) {
  566. pr_err("rsc sequencer memory init failed\n");
  567. goto end;
  568. }
  569. rc = rsc_hw_solver_init(rsc);
  570. if (rc) {
  571. pr_err("rsc solver init failed\n");
  572. goto end;
  573. }
  574. rc = rsc_hw_pdc_init(rsc);
  575. if (rc) {
  576. pr_err("rsc hw pdc init failed\n");
  577. goto end;
  578. }
  579. /* make sure that hw is initialized */
  580. wmb();
  581. pr_info("sde rsc init successfully done\n");
  582. end:
  583. return rc;
  584. }
  585. int rsc_hw_mode_ctrl(struct sde_rsc_priv *rsc, enum rsc_mode_req request,
  586. char *buffer, int buffer_size, u32 mode)
  587. {
  588. u32 blen = 0;
  589. u32 slot_time;
  590. switch (request) {
  591. case MODE_READ:
  592. if (!buffer || !buffer_size)
  593. return blen;
  594. blen = scnprintf(buffer, buffer_size, "mode_status:0x%x\n",
  595. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS2_DRV0,
  596. rsc->debug_mode));
  597. break;
  598. case MODE_UPDATE:
  599. slot_time = mode & BIT(0) ? 0x0 :
  600. rsc->timer_config.rsc_time_slot_2_ns;
  601. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_0_DRV0,
  602. slot_time, rsc->debug_mode);
  603. slot_time = mode & BIT(1) ?
  604. rsc->timer_config.rsc_time_slot_0_ns :
  605. rsc->timer_config.rsc_time_slot_2_ns;
  606. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_1_DRV0,
  607. slot_time, rsc->debug_mode);
  608. rsc->power_collapse_block = !(mode & BIT(2));
  609. break;
  610. default:
  611. break;
  612. }
  613. return blen;
  614. }
  615. int sde_rsc_debug_show(struct seq_file *s, struct sde_rsc_priv *rsc)
  616. {
  617. seq_printf(s, "override ctrl:0x%x\n",
  618. dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  619. rsc->debug_mode));
  620. seq_printf(s, "power ctrl:0x%x\n",
  621. dss_reg_r(&rsc->wrapper_io, SDE_RSCC_PWR_CTRL,
  622. rsc->debug_mode));
  623. seq_printf(s, "vsycn timestamp0:0x%x\n",
  624. dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP0,
  625. rsc->debug_mode));
  626. seq_printf(s, "vsycn timestamp1:0x%x\n",
  627. dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP1,
  628. rsc->debug_mode));
  629. seq_printf(s, "error irq status:0x%x\n",
  630. dss_reg_r(&rsc->drv_io, SDE_RSCC_ERROR_IRQ_STATUS_DRV0,
  631. rsc->debug_mode));
  632. seq_printf(s, "seq busy status:0x%x\n",
  633. dss_reg_r(&rsc->drv_io, SDE_RSCC_SEQ_BUSY_DRV0,
  634. rsc->debug_mode));
  635. seq_printf(s, "solver override ctrl status:0x%x\n",
  636. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_OVERRIDE_CTRL_DRV0,
  637. rsc->debug_mode));
  638. seq_printf(s, "solver override status:0x%x\n",
  639. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS0_DRV0,
  640. rsc->debug_mode));
  641. seq_printf(s, "solver timeslot status:0x%x\n",
  642. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS1_DRV0,
  643. rsc->debug_mode));
  644. seq_printf(s, "solver mode status:0x%x\n",
  645. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS2_DRV0,
  646. rsc->debug_mode));
  647. seq_printf(s, "amc status:0x%x\n",
  648. dss_reg_r(&rsc->drv_io, SDE_RSCC_AMC_TCS_MODE_IRQ_STATUS_DRV0,
  649. rsc->debug_mode));
  650. return 0;
  651. }
  652. int rsc_hw_vsync(struct sde_rsc_priv *rsc, enum rsc_vsync_req request,
  653. char *buffer, int buffer_size, u32 mode)
  654. {
  655. u32 blen = 0, reg;
  656. switch (request) {
  657. case VSYNC_READ:
  658. if (!buffer || !buffer_size)
  659. return blen;
  660. blen = scnprintf(buffer, buffer_size, "vsync0:0x%x\n",
  661. dss_reg_r(&rsc->wrapper_io,
  662. SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP0,
  663. rsc->debug_mode));
  664. blen += scnprintf(buffer + blen, buffer_size - blen,
  665. "vsync1:0x%x\n",
  666. dss_reg_r(&rsc->wrapper_io,
  667. SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP1,
  668. rsc->debug_mode));
  669. break;
  670. case VSYNC_READ_VSYNC0:
  671. return dss_reg_r(&rsc->wrapper_io,
  672. SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP0,
  673. rsc->debug_mode);
  674. case VSYNC_ENABLE:
  675. /* clear the current VSYNC value */
  676. reg = BIT(9) | ((mode & 0x7) << 10);
  677. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_DEBUG_BUS,
  678. reg, rsc->debug_mode);
  679. /* enable the VSYNC logging */
  680. reg = BIT(8) | ((mode & 0x7) << 10);
  681. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_DEBUG_BUS,
  682. reg, rsc->debug_mode);
  683. /* ensure vsync config has been written before waiting on it */
  684. wmb();
  685. break;
  686. case VSYNC_DISABLE:
  687. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_DEBUG_BUS,
  688. 0x0, rsc->debug_mode);
  689. break;
  690. }
  691. return blen;
  692. }
  693. void rsc_hw_debug_dump(struct sde_rsc_priv *rsc, u32 mux_sel)
  694. {
  695. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_DEBUG_BUS,
  696. ((mux_sel & 0xf) << 1) | BIT(0), rsc->debug_mode);
  697. }
  698. bool rsc_hw_is_amc_mode(struct sde_rsc_priv *rsc)
  699. {
  700. return dss_reg_r(&rsc->drv_io, SDE_RSCC_TCS_DRV0_CONTROL,
  701. rsc->debug_mode) & BIT(16);
  702. }
  703. int rsc_hw_tcs_wait(struct sde_rsc_priv *rsc)
  704. {
  705. int rc = -EBUSY;
  706. int count, seq_status;
  707. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  708. 0x0, rsc->debug_mode);
  709. seq_status = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  710. rsc->debug_mode) & BIT(1);
  711. /* if seq busy - set TCS use OK to high and wait for 200us */
  712. if (seq_status) {
  713. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  714. 0x1, rsc->debug_mode);
  715. usleep_range(100, 200);
  716. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  717. 0x0, rsc->debug_mode);
  718. }
  719. /* check for sequence running status before exiting */
  720. for (count = (MAX_CHECK_LOOPS / 4); count > 0; count--) {
  721. seq_status = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  722. rsc->debug_mode) & BIT(1);
  723. if (!seq_status) {
  724. rc = 0;
  725. break;
  726. }
  727. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  728. 0x1, rsc->debug_mode);
  729. usleep_range(3, 4);
  730. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  731. 0x0, rsc->debug_mode);
  732. }
  733. return rc;
  734. }
  735. int rsc_hw_tcs_use_ok(struct sde_rsc_priv *rsc)
  736. {
  737. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  738. 0x1, rsc->debug_mode);
  739. return 0;
  740. }
  741. int sde_rsc_hw_register(struct sde_rsc_priv *rsc)
  742. {
  743. pr_debug("rsc hardware register\n");
  744. rsc->hw_ops.init = rsc_hw_init;
  745. rsc->hw_ops.timer_update = rsc_hw_timer_update;
  746. rsc->hw_ops.tcs_wait = rsc_hw_tcs_wait;
  747. rsc->hw_ops.tcs_use_ok = rsc_hw_tcs_use_ok;
  748. rsc->hw_ops.is_amc_mode = rsc_hw_is_amc_mode;
  749. rsc->hw_ops.hw_vsync = rsc_hw_vsync;
  750. rsc->hw_ops.state_update = sde_rsc_state_update;
  751. rsc->hw_ops.debug_show = sde_rsc_debug_show;
  752. rsc->hw_ops.mode_ctrl = rsc_hw_mode_ctrl;
  753. rsc->hw_ops.debug_dump = rsc_hw_debug_dump;
  754. return 0;
  755. }