jpeg-hw-exynos4.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /* Copyright (c) 2013 Samsung Electronics Co., Ltd.
  2. * http://www.samsung.com/
  3. *
  4. * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
  5. *
  6. * Register interface file for JPEG driver on Exynos4x12.
  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/delay.h>
  14. #include "jpeg-core.h"
  15. #include "jpeg-hw-exynos4.h"
  16. #include "jpeg-regs.h"
  17. void exynos4_jpeg_sw_reset(void __iomem *base)
  18. {
  19. unsigned int reg;
  20. reg = readl(base + EXYNOS4_JPEG_CNTL_REG);
  21. writel(reg & ~EXYNOS4_SOFT_RESET_HI, base + EXYNOS4_JPEG_CNTL_REG);
  22. ndelay(100000);
  23. writel(reg | EXYNOS4_SOFT_RESET_HI, base + EXYNOS4_JPEG_CNTL_REG);
  24. }
  25. void exynos4_jpeg_set_enc_dec_mode(void __iomem *base, unsigned int mode)
  26. {
  27. unsigned int reg;
  28. reg = readl(base + EXYNOS4_JPEG_CNTL_REG);
  29. /* set exynos4_jpeg mod register */
  30. if (mode == S5P_JPEG_DECODE) {
  31. writel((reg & EXYNOS4_ENC_DEC_MODE_MASK) |
  32. EXYNOS4_DEC_MODE,
  33. base + EXYNOS4_JPEG_CNTL_REG);
  34. } else {/* encode */
  35. writel((reg & EXYNOS4_ENC_DEC_MODE_MASK) |
  36. EXYNOS4_ENC_MODE,
  37. base + EXYNOS4_JPEG_CNTL_REG);
  38. }
  39. }
  40. void exynos4_jpeg_set_img_fmt(void __iomem *base, unsigned int img_fmt)
  41. {
  42. unsigned int reg;
  43. reg = readl(base + EXYNOS4_IMG_FMT_REG) &
  44. EXYNOS4_ENC_IN_FMT_MASK; /* clear except enc format */
  45. switch (img_fmt) {
  46. case V4L2_PIX_FMT_GREY:
  47. reg = reg | EXYNOS4_ENC_GRAY_IMG | EXYNOS4_GRAY_IMG_IP;
  48. break;
  49. case V4L2_PIX_FMT_RGB32:
  50. reg = reg | EXYNOS4_ENC_RGB_IMG |
  51. EXYNOS4_RGB_IP_RGB_32BIT_IMG;
  52. break;
  53. case V4L2_PIX_FMT_RGB565:
  54. reg = reg | EXYNOS4_ENC_RGB_IMG |
  55. EXYNOS4_RGB_IP_RGB_16BIT_IMG;
  56. break;
  57. case V4L2_PIX_FMT_NV24:
  58. reg = reg | EXYNOS4_ENC_YUV_444_IMG |
  59. EXYNOS4_YUV_444_IP_YUV_444_2P_IMG |
  60. EXYNOS4_SWAP_CHROMA_CBCR;
  61. break;
  62. case V4L2_PIX_FMT_NV42:
  63. reg = reg | EXYNOS4_ENC_YUV_444_IMG |
  64. EXYNOS4_YUV_444_IP_YUV_444_2P_IMG |
  65. EXYNOS4_SWAP_CHROMA_CRCB;
  66. break;
  67. case V4L2_PIX_FMT_YUYV:
  68. reg = reg | EXYNOS4_DEC_YUV_422_IMG |
  69. EXYNOS4_YUV_422_IP_YUV_422_1P_IMG |
  70. EXYNOS4_SWAP_CHROMA_CBCR;
  71. break;
  72. case V4L2_PIX_FMT_YVYU:
  73. reg = reg | EXYNOS4_DEC_YUV_422_IMG |
  74. EXYNOS4_YUV_422_IP_YUV_422_1P_IMG |
  75. EXYNOS4_SWAP_CHROMA_CRCB;
  76. break;
  77. case V4L2_PIX_FMT_NV16:
  78. reg = reg | EXYNOS4_DEC_YUV_422_IMG |
  79. EXYNOS4_YUV_422_IP_YUV_422_2P_IMG |
  80. EXYNOS4_SWAP_CHROMA_CBCR;
  81. break;
  82. case V4L2_PIX_FMT_NV61:
  83. reg = reg | EXYNOS4_DEC_YUV_422_IMG |
  84. EXYNOS4_YUV_422_IP_YUV_422_2P_IMG |
  85. EXYNOS4_SWAP_CHROMA_CRCB;
  86. break;
  87. case V4L2_PIX_FMT_NV12:
  88. reg = reg | EXYNOS4_DEC_YUV_420_IMG |
  89. EXYNOS4_YUV_420_IP_YUV_420_2P_IMG |
  90. EXYNOS4_SWAP_CHROMA_CBCR;
  91. break;
  92. case V4L2_PIX_FMT_NV21:
  93. reg = reg | EXYNOS4_DEC_YUV_420_IMG |
  94. EXYNOS4_YUV_420_IP_YUV_420_2P_IMG |
  95. EXYNOS4_SWAP_CHROMA_CRCB;
  96. break;
  97. case V4L2_PIX_FMT_YUV420:
  98. reg = reg | EXYNOS4_DEC_YUV_420_IMG |
  99. EXYNOS4_YUV_420_IP_YUV_420_3P_IMG |
  100. EXYNOS4_SWAP_CHROMA_CBCR;
  101. break;
  102. default:
  103. break;
  104. }
  105. writel(reg, base + EXYNOS4_IMG_FMT_REG);
  106. }
  107. void exynos4_jpeg_set_enc_out_fmt(void __iomem *base, unsigned int out_fmt)
  108. {
  109. unsigned int reg;
  110. reg = readl(base + EXYNOS4_IMG_FMT_REG) &
  111. ~EXYNOS4_ENC_FMT_MASK; /* clear enc format */
  112. switch (out_fmt) {
  113. case V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY:
  114. reg = reg | EXYNOS4_ENC_FMT_GRAY;
  115. break;
  116. case V4L2_JPEG_CHROMA_SUBSAMPLING_444:
  117. reg = reg | EXYNOS4_ENC_FMT_YUV_444;
  118. break;
  119. case V4L2_JPEG_CHROMA_SUBSAMPLING_422:
  120. reg = reg | EXYNOS4_ENC_FMT_YUV_422;
  121. break;
  122. case V4L2_JPEG_CHROMA_SUBSAMPLING_420:
  123. reg = reg | EXYNOS4_ENC_FMT_YUV_420;
  124. break;
  125. default:
  126. break;
  127. }
  128. writel(reg, base + EXYNOS4_IMG_FMT_REG);
  129. }
  130. void exynos4_jpeg_set_interrupt(void __iomem *base)
  131. {
  132. unsigned int reg;
  133. reg = readl(base + EXYNOS4_INT_EN_REG) & ~EXYNOS4_INT_EN_MASK;
  134. writel(EXYNOS4_INT_EN_ALL, base + EXYNOS4_INT_EN_REG);
  135. }
  136. unsigned int exynos4_jpeg_get_int_status(void __iomem *base)
  137. {
  138. unsigned int int_status;
  139. int_status = readl(base + EXYNOS4_INT_STATUS_REG);
  140. return int_status;
  141. }
  142. unsigned int exynos4_jpeg_get_fifo_status(void __iomem *base)
  143. {
  144. unsigned int fifo_status;
  145. fifo_status = readl(base + EXYNOS4_FIFO_STATUS_REG);
  146. return fifo_status;
  147. }
  148. void exynos4_jpeg_set_huf_table_enable(void __iomem *base, int value)
  149. {
  150. unsigned int reg;
  151. reg = readl(base + EXYNOS4_JPEG_CNTL_REG) & ~EXYNOS4_HUF_TBL_EN;
  152. if (value == 1)
  153. writel(reg | EXYNOS4_HUF_TBL_EN,
  154. base + EXYNOS4_JPEG_CNTL_REG);
  155. else
  156. writel(reg | ~EXYNOS4_HUF_TBL_EN,
  157. base + EXYNOS4_JPEG_CNTL_REG);
  158. }
  159. void exynos4_jpeg_set_sys_int_enable(void __iomem *base, int value)
  160. {
  161. unsigned int reg;
  162. reg = readl(base + EXYNOS4_JPEG_CNTL_REG) & ~(EXYNOS4_SYS_INT_EN);
  163. if (value == 1)
  164. writel(EXYNOS4_SYS_INT_EN, base + EXYNOS4_JPEG_CNTL_REG);
  165. else
  166. writel(~EXYNOS4_SYS_INT_EN, base + EXYNOS4_JPEG_CNTL_REG);
  167. }
  168. void exynos4_jpeg_set_stream_buf_address(void __iomem *base,
  169. unsigned int address)
  170. {
  171. writel(address, base + EXYNOS4_OUT_MEM_BASE_REG);
  172. }
  173. void exynos4_jpeg_set_stream_size(void __iomem *base,
  174. unsigned int x_value, unsigned int y_value)
  175. {
  176. writel(0x0, base + EXYNOS4_JPEG_IMG_SIZE_REG); /* clear */
  177. writel(EXYNOS4_X_SIZE(x_value) | EXYNOS4_Y_SIZE(y_value),
  178. base + EXYNOS4_JPEG_IMG_SIZE_REG);
  179. }
  180. void exynos4_jpeg_set_frame_buf_address(void __iomem *base,
  181. struct s5p_jpeg_addr *exynos4_jpeg_addr)
  182. {
  183. writel(exynos4_jpeg_addr->y, base + EXYNOS4_IMG_BA_PLANE_1_REG);
  184. writel(exynos4_jpeg_addr->cb, base + EXYNOS4_IMG_BA_PLANE_2_REG);
  185. writel(exynos4_jpeg_addr->cr, base + EXYNOS4_IMG_BA_PLANE_3_REG);
  186. }
  187. void exynos4_jpeg_set_encode_tbl_select(void __iomem *base,
  188. enum exynos4_jpeg_img_quality_level level)
  189. {
  190. unsigned int reg;
  191. reg = EXYNOS4_Q_TBL_COMP1_0 | EXYNOS4_Q_TBL_COMP2_1 |
  192. EXYNOS4_Q_TBL_COMP3_1 |
  193. EXYNOS4_HUFF_TBL_COMP1_AC_0_DC_1 |
  194. EXYNOS4_HUFF_TBL_COMP2_AC_0_DC_0 |
  195. EXYNOS4_HUFF_TBL_COMP3_AC_1_DC_1;
  196. writel(reg, base + EXYNOS4_TBL_SEL_REG);
  197. }
  198. void exynos4_jpeg_set_encode_hoff_cnt(void __iomem *base, unsigned int fmt)
  199. {
  200. if (fmt == V4L2_PIX_FMT_GREY)
  201. writel(0xd2, base + EXYNOS4_HUFF_CNT_REG);
  202. else
  203. writel(0x1a2, base + EXYNOS4_HUFF_CNT_REG);
  204. }
  205. unsigned int exynos4_jpeg_get_stream_size(void __iomem *base)
  206. {
  207. unsigned int size;
  208. size = readl(base + EXYNOS4_BITSTREAM_SIZE_REG);
  209. return size;
  210. }
  211. void exynos4_jpeg_set_dec_bitstream_size(void __iomem *base, unsigned int size)
  212. {
  213. writel(size, base + EXYNOS4_BITSTREAM_SIZE_REG);
  214. }
  215. void exynos4_jpeg_get_frame_size(void __iomem *base,
  216. unsigned int *width, unsigned int *height)
  217. {
  218. *width = (readl(base + EXYNOS4_DECODE_XY_SIZE_REG) &
  219. EXYNOS4_DECODED_SIZE_MASK);
  220. *height = (readl(base + EXYNOS4_DECODE_XY_SIZE_REG) >> 16) &
  221. EXYNOS4_DECODED_SIZE_MASK;
  222. }
  223. unsigned int exynos4_jpeg_get_frame_fmt(void __iomem *base)
  224. {
  225. return readl(base + EXYNOS4_DECODE_IMG_FMT_REG) &
  226. EXYNOS4_JPEG_DECODED_IMG_FMT_MASK;
  227. }
  228. void exynos4_jpeg_set_timer_count(void __iomem *base, unsigned int size)
  229. {
  230. writel(size, base + EXYNOS4_INT_TIMER_COUNT_REG);
  231. }