jpeg-hw.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. /* linux/drivers/media/video/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. #ifndef JPEG_HW_H_
  13. #define JPEG_HW_H_
  14. #include <linux/io.h>
  15. #include <linux/videodev2.h>
  16. #include "jpeg-hw.h"
  17. #include "jpeg-regs.h"
  18. #define S5P_JPEG_MIN_WIDTH 32
  19. #define S5P_JPEG_MIN_HEIGHT 32
  20. #define S5P_JPEG_MAX_WIDTH 8192
  21. #define S5P_JPEG_MAX_HEIGHT 8192
  22. #define S5P_JPEG_ENCODE 0
  23. #define S5P_JPEG_DECODE 1
  24. #define S5P_JPEG_RAW_IN_565 0
  25. #define S5P_JPEG_RAW_IN_422 1
  26. #define S5P_JPEG_RAW_OUT_422 0
  27. #define S5P_JPEG_RAW_OUT_420 1
  28. static inline void jpeg_reset(void __iomem *regs)
  29. {
  30. unsigned long reg;
  31. writel(1, regs + S5P_JPG_SW_RESET);
  32. reg = readl(regs + S5P_JPG_SW_RESET);
  33. /* no other way but polling for when JPEG IP becomes operational */
  34. while (reg != 0) {
  35. cpu_relax();
  36. reg = readl(regs + S5P_JPG_SW_RESET);
  37. }
  38. }
  39. static inline void jpeg_poweron(void __iomem *regs)
  40. {
  41. writel(S5P_POWER_ON, regs + S5P_JPGCLKCON);
  42. }
  43. static inline void jpeg_input_raw_mode(void __iomem *regs, unsigned long mode)
  44. {
  45. unsigned long reg, m;
  46. m = S5P_MOD_SEL_565;
  47. if (mode == S5P_JPEG_RAW_IN_565)
  48. m = S5P_MOD_SEL_565;
  49. else if (mode == S5P_JPEG_RAW_IN_422)
  50. m = S5P_MOD_SEL_422;
  51. reg = readl(regs + S5P_JPGCMOD);
  52. reg &= ~S5P_MOD_SEL_MASK;
  53. reg |= m;
  54. writel(reg, regs + S5P_JPGCMOD);
  55. }
  56. static inline void jpeg_input_raw_y16(void __iomem *regs, bool y16)
  57. {
  58. unsigned long reg;
  59. reg = readl(regs + S5P_JPGCMOD);
  60. if (y16)
  61. reg |= S5P_MODE_Y16;
  62. else
  63. reg &= ~S5P_MODE_Y16_MASK;
  64. writel(reg, regs + S5P_JPGCMOD);
  65. }
  66. static inline void jpeg_proc_mode(void __iomem *regs, unsigned long mode)
  67. {
  68. unsigned long reg, m;
  69. m = S5P_PROC_MODE_DECOMPR;
  70. if (mode == S5P_JPEG_ENCODE)
  71. m = S5P_PROC_MODE_COMPR;
  72. else
  73. m = S5P_PROC_MODE_DECOMPR;
  74. reg = readl(regs + S5P_JPGMOD);
  75. reg &= ~S5P_PROC_MODE_MASK;
  76. reg |= m;
  77. writel(reg, regs + S5P_JPGMOD);
  78. }
  79. static inline void jpeg_subsampling_mode(void __iomem *regs, unsigned int mode)
  80. {
  81. unsigned long reg, m;
  82. if (mode == V4L2_JPEG_CHROMA_SUBSAMPLING_420)
  83. m = S5P_SUBSAMPLING_MODE_420;
  84. else
  85. m = S5P_SUBSAMPLING_MODE_422;
  86. reg = readl(regs + S5P_JPGMOD);
  87. reg &= ~S5P_SUBSAMPLING_MODE_MASK;
  88. reg |= m;
  89. writel(reg, regs + S5P_JPGMOD);
  90. }
  91. static inline unsigned int jpeg_get_subsampling_mode(void __iomem *regs)
  92. {
  93. return readl(regs + S5P_JPGMOD) & S5P_SUBSAMPLING_MODE_MASK;
  94. }
  95. static inline void jpeg_dri(void __iomem *regs, unsigned int dri)
  96. {
  97. unsigned long reg;
  98. reg = readl(regs + S5P_JPGDRI_U);
  99. reg &= ~0xff;
  100. reg |= (dri >> 8) & 0xff;
  101. writel(reg, regs + S5P_JPGDRI_U);
  102. reg = readl(regs + S5P_JPGDRI_L);
  103. reg &= ~0xff;
  104. reg |= dri & 0xff;
  105. writel(reg, regs + S5P_JPGDRI_L);
  106. }
  107. static inline void jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n)
  108. {
  109. unsigned long reg;
  110. reg = readl(regs + S5P_JPG_QTBL);
  111. reg &= ~S5P_QT_NUMt_MASK(t);
  112. reg |= (n << S5P_QT_NUMt_SHIFT(t)) & S5P_QT_NUMt_MASK(t);
  113. writel(reg, regs + S5P_JPG_QTBL);
  114. }
  115. static inline void jpeg_htbl_ac(void __iomem *regs, unsigned int t)
  116. {
  117. unsigned long reg;
  118. reg = readl(regs + S5P_JPG_HTBL);
  119. reg &= ~S5P_HT_NUMt_AC_MASK(t);
  120. /* this driver uses table 0 for all color components */
  121. reg |= (0 << S5P_HT_NUMt_AC_SHIFT(t)) & S5P_HT_NUMt_AC_MASK(t);
  122. writel(reg, regs + S5P_JPG_HTBL);
  123. }
  124. static inline void jpeg_htbl_dc(void __iomem *regs, unsigned int t)
  125. {
  126. unsigned long reg;
  127. reg = readl(regs + S5P_JPG_HTBL);
  128. reg &= ~S5P_HT_NUMt_DC_MASK(t);
  129. /* this driver uses table 0 for all color components */
  130. reg |= (0 << S5P_HT_NUMt_DC_SHIFT(t)) & S5P_HT_NUMt_DC_MASK(t);
  131. writel(reg, regs + S5P_JPG_HTBL);
  132. }
  133. static inline void jpeg_y(void __iomem *regs, unsigned int y)
  134. {
  135. unsigned long reg;
  136. reg = readl(regs + S5P_JPGY_U);
  137. reg &= ~0xff;
  138. reg |= (y >> 8) & 0xff;
  139. writel(reg, regs + S5P_JPGY_U);
  140. reg = readl(regs + S5P_JPGY_L);
  141. reg &= ~0xff;
  142. reg |= y & 0xff;
  143. writel(reg, regs + S5P_JPGY_L);
  144. }
  145. static inline void jpeg_x(void __iomem *regs, unsigned int x)
  146. {
  147. unsigned long reg;
  148. reg = readl(regs + S5P_JPGX_U);
  149. reg &= ~0xff;
  150. reg |= (x >> 8) & 0xff;
  151. writel(reg, regs + S5P_JPGX_U);
  152. reg = readl(regs + S5P_JPGX_L);
  153. reg &= ~0xff;
  154. reg |= x & 0xff;
  155. writel(reg, regs + S5P_JPGX_L);
  156. }
  157. static inline void jpeg_rst_int_enable(void __iomem *regs, bool enable)
  158. {
  159. unsigned long reg;
  160. reg = readl(regs + S5P_JPGINTSE);
  161. reg &= ~S5P_RSTm_INT_EN_MASK;
  162. if (enable)
  163. reg |= S5P_RSTm_INT_EN;
  164. writel(reg, regs + S5P_JPGINTSE);
  165. }
  166. static inline void jpeg_data_num_int_enable(void __iomem *regs, bool enable)
  167. {
  168. unsigned long reg;
  169. reg = readl(regs + S5P_JPGINTSE);
  170. reg &= ~S5P_DATA_NUM_INT_EN_MASK;
  171. if (enable)
  172. reg |= S5P_DATA_NUM_INT_EN;
  173. writel(reg, regs + S5P_JPGINTSE);
  174. }
  175. static inline void jpeg_final_mcu_num_int_enable(void __iomem *regs, bool enbl)
  176. {
  177. unsigned long reg;
  178. reg = readl(regs + S5P_JPGINTSE);
  179. reg &= ~S5P_FINAL_MCU_NUM_INT_EN_MASK;
  180. if (enbl)
  181. reg |= S5P_FINAL_MCU_NUM_INT_EN;
  182. writel(reg, regs + S5P_JPGINTSE);
  183. }
  184. static inline void jpeg_timer_enable(void __iomem *regs, unsigned long val)
  185. {
  186. unsigned long reg;
  187. reg = readl(regs + S5P_JPG_TIMER_SE);
  188. reg |= S5P_TIMER_INT_EN;
  189. reg &= ~S5P_TIMER_INIT_MASK;
  190. reg |= val & S5P_TIMER_INIT_MASK;
  191. writel(reg, regs + S5P_JPG_TIMER_SE);
  192. }
  193. static inline void jpeg_timer_disable(void __iomem *regs)
  194. {
  195. unsigned long reg;
  196. reg = readl(regs + S5P_JPG_TIMER_SE);
  197. reg &= ~S5P_TIMER_INT_EN_MASK;
  198. writel(reg, regs + S5P_JPG_TIMER_SE);
  199. }
  200. static inline int jpeg_timer_stat(void __iomem *regs)
  201. {
  202. return (int)((readl(regs + S5P_JPG_TIMER_ST) & S5P_TIMER_INT_STAT_MASK)
  203. >> S5P_TIMER_INT_STAT_SHIFT);
  204. }
  205. static inline void jpeg_clear_timer_stat(void __iomem *regs)
  206. {
  207. unsigned long reg;
  208. reg = readl(regs + S5P_JPG_TIMER_SE);
  209. reg &= ~S5P_TIMER_INT_STAT_MASK;
  210. writel(reg, regs + S5P_JPG_TIMER_SE);
  211. }
  212. static inline void jpeg_enc_stream_int(void __iomem *regs, unsigned long size)
  213. {
  214. unsigned long reg;
  215. reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
  216. reg &= ~S5P_ENC_STREAM_BOUND_MASK;
  217. reg |= S5P_ENC_STREAM_INT_EN;
  218. reg |= size & S5P_ENC_STREAM_BOUND_MASK;
  219. writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
  220. }
  221. static inline int jpeg_enc_stream_stat(void __iomem *regs)
  222. {
  223. return (int)(readl(regs + S5P_JPG_ENC_STREAM_INTST) &
  224. S5P_ENC_STREAM_INT_STAT_MASK);
  225. }
  226. static inline void jpeg_clear_enc_stream_stat(void __iomem *regs)
  227. {
  228. unsigned long reg;
  229. reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE);
  230. reg &= ~S5P_ENC_STREAM_INT_MASK;
  231. writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE);
  232. }
  233. static inline void jpeg_outform_raw(void __iomem *regs, unsigned long format)
  234. {
  235. unsigned long reg, f;
  236. f = S5P_DEC_OUT_FORMAT_422;
  237. if (format == S5P_JPEG_RAW_OUT_422)
  238. f = S5P_DEC_OUT_FORMAT_422;
  239. else if (format == S5P_JPEG_RAW_OUT_420)
  240. f = S5P_DEC_OUT_FORMAT_420;
  241. reg = readl(regs + S5P_JPG_OUTFORM);
  242. reg &= ~S5P_DEC_OUT_FORMAT_MASK;
  243. reg |= f;
  244. writel(reg, regs + S5P_JPG_OUTFORM);
  245. }
  246. static inline void jpeg_jpgadr(void __iomem *regs, unsigned long addr)
  247. {
  248. writel(addr, regs + S5P_JPG_JPGADR);
  249. }
  250. static inline void jpeg_imgadr(void __iomem *regs, unsigned long addr)
  251. {
  252. writel(addr, regs + S5P_JPG_IMGADR);
  253. }
  254. static inline void jpeg_coef(void __iomem *regs, unsigned int i,
  255. unsigned int j, unsigned int coef)
  256. {
  257. unsigned long reg;
  258. reg = readl(regs + S5P_JPG_COEF(i));
  259. reg &= ~S5P_COEFn_MASK(j);
  260. reg |= (coef << S5P_COEFn_SHIFT(j)) & S5P_COEFn_MASK(j);
  261. writel(reg, regs + S5P_JPG_COEF(i));
  262. }
  263. static inline void jpeg_start(void __iomem *regs)
  264. {
  265. writel(1, regs + S5P_JSTART);
  266. }
  267. static inline int jpeg_result_stat_ok(void __iomem *regs)
  268. {
  269. return (int)((readl(regs + S5P_JPGINTST) & S5P_RESULT_STAT_MASK)
  270. >> S5P_RESULT_STAT_SHIFT);
  271. }
  272. static inline int jpeg_stream_stat_ok(void __iomem *regs)
  273. {
  274. return !(int)((readl(regs + S5P_JPGINTST) & S5P_STREAM_STAT_MASK)
  275. >> S5P_STREAM_STAT_SHIFT);
  276. }
  277. static inline void jpeg_clear_int(void __iomem *regs)
  278. {
  279. unsigned long reg;
  280. reg = readl(regs + S5P_JPGINTST);
  281. writel(S5P_INT_RELEASE, regs + S5P_JPGCOM);
  282. reg = readl(regs + S5P_JPGOPR);
  283. }
  284. static inline unsigned int jpeg_compressed_size(void __iomem *regs)
  285. {
  286. unsigned long jpeg_size = 0;
  287. jpeg_size |= (readl(regs + S5P_JPGCNT_U) & 0xff) << 16;
  288. jpeg_size |= (readl(regs + S5P_JPGCNT_M) & 0xff) << 8;
  289. jpeg_size |= (readl(regs + S5P_JPGCNT_L) & 0xff);
  290. return (unsigned int)jpeg_size;
  291. }
  292. #endif /* JPEG_HW_H_ */