jpeg-hw-s5p.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. /* linux/drivers/media/platform/s5p-jpeg/jpeg-hw.h
  2. *
  3. * Copyright (c) 2011 Samsung Electronics Co., Ltd.
  4. * http://www.samsung.com
  5. *
  6. * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/io.h>
  13. #include <linux/videodev2.h>
  14. #include "jpeg-core.h"
  15. #include "jpeg-regs.h"
  16. #include "jpeg-hw-s5p.h"
  17. void s5p_jpeg_reset(void __iomem *regs)
  18. {
  19. unsigned long reg;
  20. writel(1, regs + S5P_JPG_SW_RESET);
  21. reg = readl(regs + S5P_JPG_SW_RESET);
  22. /* no other way but polling for when JPEG IP becomes operational */
  23. while (reg != 0) {
  24. cpu_relax();
  25. reg = readl(regs + S5P_JPG_SW_RESET);
  26. }
  27. }
  28. void s5p_jpeg_poweron(void __iomem *regs)
  29. {
  30. writel(S5P_POWER_ON, regs + S5P_JPGCLKCON);
  31. }
  32. void s5p_jpeg_input_raw_mode(void __iomem *regs, unsigned long mode)
  33. {
  34. unsigned long reg, m;
  35. m = S5P_MOD_SEL_565;
  36. if (mode == S5P_JPEG_RAW_IN_565)
  37. m = S5P_MOD_SEL_565;
  38. else if (mode == S5P_JPEG_RAW_IN_422)
  39. m = S5P_MOD_SEL_422;
  40. reg = readl(regs + S5P_JPGCMOD);
  41. reg &= ~S5P_MOD_SEL_MASK;
  42. reg |= m;
  43. writel(reg, regs + S5P_JPGCMOD);
  44. }
  45. void s5p_jpeg_input_raw_y16(void __iomem *regs, bool y16)
  46. {
  47. unsigned long reg;
  48. reg = readl(regs + S5P_JPGCMOD);
  49. if (y16)
  50. reg |= S5P_MODE_Y16;
  51. else
  52. reg &= ~S5P_MODE_Y16_MASK;
  53. writel(reg, regs + S5P_JPGCMOD);
  54. }
  55. void s5p_jpeg_proc_mode(void __iomem *regs, unsigned long mode)
  56. {
  57. unsigned long reg, m;
  58. m = S5P_PROC_MODE_DECOMPR;
  59. if (mode == S5P_JPEG_ENCODE)
  60. m = S5P_PROC_MODE_COMPR;
  61. else
  62. m = S5P_PROC_MODE_DECOMPR;
  63. reg = readl(regs + S5P_JPGMOD);
  64. reg &= ~S5P_PROC_MODE_MASK;
  65. reg |= m;
  66. writel(reg, regs + S5P_JPGMOD);
  67. }
  68. void s5p_jpeg_subsampling_mode(void __iomem *regs, unsigned int mode)
  69. {
  70. unsigned long reg, m;
  71. if (mode == V4L2_JPEG_CHROMA_SUBSAMPLING_420)
  72. m = S5P_SUBSAMPLING_MODE_420;
  73. else
  74. m = S5P_SUBSAMPLING_MODE_422;
  75. reg = readl(regs + S5P_JPGMOD);
  76. reg &= ~S5P_SUBSAMPLING_MODE_MASK;
  77. reg |= m;
  78. writel(reg, regs + S5P_JPGMOD);
  79. }
  80. unsigned int s5p_jpeg_get_subsampling_mode(void __iomem *regs)
  81. {
  82. return readl(regs + S5P_JPGMOD) & S5P_SUBSAMPLING_MODE_MASK;
  83. }
  84. void s5p_jpeg_dri(void __iomem *regs, unsigned int dri)
  85. {
  86. unsigned long reg;
  87. reg = readl(regs + S5P_JPGDRI_U);
  88. reg &= ~0xff;
  89. reg |= (dri >> 8) & 0xff;
  90. writel(reg, regs + S5P_JPGDRI_U);
  91. reg = readl(regs + S5P_JPGDRI_L);
  92. reg &= ~0xff;
  93. reg |= dri & 0xff;
  94. writel(reg, regs + S5P_JPGDRI_L);
  95. }
  96. void s5p_jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n)
  97. {
  98. unsigned long reg;
  99. reg = readl(regs + S5P_JPG_QTBL);
  100. reg &= ~S5P_QT_NUMt_MASK(t);
  101. reg |= (n << S5P_QT_NUMt_SHIFT(t)) & S5P_QT_NUMt_MASK(t);
  102. writel(reg, regs + S5P_JPG_QTBL);
  103. }
  104. void s5p_jpeg_htbl_ac(void __iomem *regs, unsigned int t)
  105. {
  106. unsigned long reg;
  107. reg = readl(regs + S5P_JPG_HTBL);
  108. reg &= ~S5P_HT_NUMt_AC_MASK(t);
  109. /* this driver uses table 0 for all color components */
  110. reg |= (0 << S5P_HT_NUMt_AC_SHIFT(t)) & S5P_HT_NUMt_AC_MASK(t);
  111. writel(reg, regs + S5P_JPG_HTBL);
  112. }
  113. void s5p_jpeg_htbl_dc(void __iomem *regs, unsigned int t)
  114. {
  115. unsigned long reg;
  116. reg = readl(regs + S5P_JPG_HTBL);
  117. reg &= ~S5P_HT_NUMt_DC_MASK(t);
  118. /* this driver uses table 0 for all color components */
  119. reg |= (0 << S5P_HT_NUMt_DC_SHIFT(t)) & S5P_HT_NUMt_DC_MASK(t);
  120. writel(reg, regs + S5P_JPG_HTBL);
  121. }
  122. void s5p_jpeg_y(void __iomem *regs, unsigned int y)
  123. {
  124. unsigned long reg;
  125. reg = readl(regs + S5P_JPGY_U);
  126. reg &= ~0xff;
  127. reg |= (y >> 8) & 0xff;
  128. writel(reg, regs + S5P_JPGY_U);
  129. reg = readl(regs + S5P_JPGY_L);
  130. reg &= ~0xff;
  131. reg |= y & 0xff;
  132. writel(reg, regs + S5P_JPGY_L);
  133. }
  134. void s5p_jpeg_x(void __iomem *regs, unsigned int x)
  135. {
  136. unsigned long reg;
  137. reg = readl(regs + S5P_JPGX_U);
  138. reg &= ~0xff;
  139. reg |= (x >> 8) & 0xff;
  140. writel(reg, regs + S5P_JPGX_U);
  141. reg = readl(regs + S5P_JPGX_L);
  142. reg &= ~0xff;
  143. reg |= x & 0xff;
  144. writel(reg, regs + S5P_JPGX_L);
  145. }
  146. void s5p_jpeg_rst_int_enable(void __iomem *regs, bool enable)
  147. {
  148. unsigned long reg;
  149. reg = readl(regs + S5P_JPGINTSE);
  150. reg &= ~S5P_RSTm_INT_EN_MASK;
  151. if (enable)
  152. reg |= S5P_RSTm_INT_EN;
  153. writel(reg, regs + S5P_JPGINTSE);
  154. }
  155. void s5p_jpeg_data_num_int_enable(void __iomem *regs, bool enable)
  156. {
  157. unsigned long reg;
  158. reg = readl(regs + S5P_JPGINTSE);
  159. reg &= ~S5P_DATA_NUM_INT_EN_MASK;
  160. if (enable)
  161. reg |= S5P_DATA_NUM_INT_EN;
  162. writel(reg, regs + S5P_JPGINTSE);
  163. }
  164. void s5p_jpeg_final_mcu_num_int_enable(void __iomem *regs, bool enbl)
  165. {
  166. unsigned long reg;
  167. reg = readl(regs + S5P_JPGINTSE);
  168. reg &= ~S5P_FINAL_MCU_NUM_INT_EN_MASK;
  169. if (enbl)
  170. reg |= S5P_FINAL_MCU_NUM_INT_EN;
  171. writel(reg, regs + S5P_JPGINTSE);
  172. }
  173. void s5p_jpeg_timer_enable(void __iomem *regs, unsigned long val)
  174. {
  175. unsigned long reg;
  176. reg = readl(regs + S5P_JPG_TIMER_SE);
  177. reg |= S5P_TIMER_INT_EN;
  178. reg &= ~S5P_TIMER_INIT_MASK;
  179. reg |= val & S5P_TIMER_INIT_MASK;
  180. writel(reg, regs + S5P_JPG_TIMER_SE);
  181. }
  182. void s5p_jpeg_timer_disable(void __iomem *regs)
  183. {
  184. unsigned long reg;
  185. reg = readl(regs + S5P_JPG_TIMER_SE);
  186. reg &= ~S5P_TIMER_INT_EN_MASK;
  187. writel(reg, regs + S5P_JPG_TIMER_SE);
  188. }
  189. int s5p_jpeg_timer_stat(void __iomem *regs)
  190. {
  191. return (int)((readl(regs + S5P_JPG_TIMER_ST) & S5P_TIMER_INT_STAT_MASK)
  192. >> S5P_TIMER_INT_STAT_SHIFT);
  193. }
  194. void s5p_jpeg_clear_timer_stat(void __iomem *regs)
  195. {
  196. unsigned long reg;
  197. reg = readl(regs + S5P_JPG_TIMER_SE);
  198. reg &= ~S5P_TIMER_INT_STAT_MASK;
  199. writel(reg, regs + S5P_JPG_TIMER_SE);
  200. }
  201. void s5p_jpeg_enc_stream_int(void __iomem *regs, unsigned long size)
  202. {
  203. unsigned long reg;
  204. reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
  205. reg &= ~S5P_ENC_STREAM_BOUND_MASK;
  206. reg |= S5P_ENC_STREAM_INT_EN;
  207. reg |= size & S5P_ENC_STREAM_BOUND_MASK;
  208. writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
  209. }
  210. int s5p_jpeg_enc_stream_stat(void __iomem *regs)
  211. {
  212. return (int)(readl(regs + S5P_JPG_ENC_STREAM_INTST) &
  213. S5P_ENC_STREAM_INT_STAT_MASK);
  214. }
  215. void s5p_jpeg_clear_enc_stream_stat(void __iomem *regs)
  216. {
  217. unsigned long reg;
  218. reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
  219. reg &= ~S5P_ENC_STREAM_INT_MASK;
  220. writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
  221. }
  222. void s5p_jpeg_outform_raw(void __iomem *regs, unsigned long format)
  223. {
  224. unsigned long reg, f;
  225. f = S5P_DEC_OUT_FORMAT_422;
  226. if (format == S5P_JPEG_RAW_OUT_422)
  227. f = S5P_DEC_OUT_FORMAT_422;
  228. else if (format == S5P_JPEG_RAW_OUT_420)
  229. f = S5P_DEC_OUT_FORMAT_420;
  230. reg = readl(regs + S5P_JPG_OUTFORM);
  231. reg &= ~S5P_DEC_OUT_FORMAT_MASK;
  232. reg |= f;
  233. writel(reg, regs + S5P_JPG_OUTFORM);
  234. }
  235. void s5p_jpeg_jpgadr(void __iomem *regs, unsigned long addr)
  236. {
  237. writel(addr, regs + S5P_JPG_JPGADR);
  238. }
  239. void s5p_jpeg_imgadr(void __iomem *regs, unsigned long addr)
  240. {
  241. writel(addr, regs + S5P_JPG_IMGADR);
  242. }
  243. void s5p_jpeg_coef(void __iomem *regs, unsigned int i,
  244. unsigned int j, unsigned int coef)
  245. {
  246. unsigned long reg;
  247. reg = readl(regs + S5P_JPG_COEF(i));
  248. reg &= ~S5P_COEFn_MASK(j);
  249. reg |= (coef << S5P_COEFn_SHIFT(j)) & S5P_COEFn_MASK(j);
  250. writel(reg, regs + S5P_JPG_COEF(i));
  251. }
  252. void s5p_jpeg_start(void __iomem *regs)
  253. {
  254. writel(1, regs + S5P_JSTART);
  255. }
  256. int s5p_jpeg_result_stat_ok(void __iomem *regs)
  257. {
  258. return (int)((readl(regs + S5P_JPGINTST) & S5P_RESULT_STAT_MASK)
  259. >> S5P_RESULT_STAT_SHIFT);
  260. }
  261. int s5p_jpeg_stream_stat_ok(void __iomem *regs)
  262. {
  263. return !(int)((readl(regs + S5P_JPGINTST) & S5P_STREAM_STAT_MASK)
  264. >> S5P_STREAM_STAT_SHIFT);
  265. }
  266. void s5p_jpeg_clear_int(void __iomem *regs)
  267. {
  268. unsigned long reg;
  269. reg = readl(regs + S5P_JPGINTST);
  270. writel(S5P_INT_RELEASE, regs + S5P_JPGCOM);
  271. reg = readl(regs + S5P_JPGOPR);
  272. }
  273. unsigned int s5p_jpeg_compressed_size(void __iomem *regs)
  274. {
  275. unsigned long jpeg_size = 0;
  276. jpeg_size |= (readl(regs + S5P_JPGCNT_U) & 0xff) << 16;
  277. jpeg_size |= (readl(regs + S5P_JPGCNT_M) & 0xff) << 8;
  278. jpeg_size |= (readl(regs + S5P_JPGCNT_L) & 0xff);
  279. return (unsigned int)jpeg_size;
  280. }