jpeg-hw-exynos4.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. udelay(100);
  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. writel(EXYNOS4_INT_EN_ALL, base + EXYNOS4_INT_EN_REG);
  133. }
  134. unsigned int exynos4_jpeg_get_int_status(void __iomem *base)
  135. {
  136. unsigned int int_status;
  137. int_status = readl(base + EXYNOS4_INT_STATUS_REG);
  138. return int_status;
  139. }
  140. unsigned int exynos4_jpeg_get_fifo_status(void __iomem *base)
  141. {
  142. unsigned int fifo_status;
  143. fifo_status = readl(base + EXYNOS4_FIFO_STATUS_REG);
  144. return fifo_status;
  145. }
  146. void exynos4_jpeg_set_huf_table_enable(void __iomem *base, int value)
  147. {
  148. unsigned int reg;
  149. reg = readl(base + EXYNOS4_JPEG_CNTL_REG) & ~EXYNOS4_HUF_TBL_EN;
  150. if (value == 1)
  151. writel(reg | EXYNOS4_HUF_TBL_EN,
  152. base + EXYNOS4_JPEG_CNTL_REG);
  153. else
  154. writel(reg & ~EXYNOS4_HUF_TBL_EN,
  155. base + EXYNOS4_JPEG_CNTL_REG);
  156. }
  157. void exynos4_jpeg_set_sys_int_enable(void __iomem *base, int value)
  158. {
  159. unsigned int reg;
  160. reg = readl(base + EXYNOS4_JPEG_CNTL_REG) & ~(EXYNOS4_SYS_INT_EN);
  161. if (value == 1)
  162. writel(reg | EXYNOS4_SYS_INT_EN, base + EXYNOS4_JPEG_CNTL_REG);
  163. else
  164. writel(reg & ~EXYNOS4_SYS_INT_EN, base + EXYNOS4_JPEG_CNTL_REG);
  165. }
  166. void exynos4_jpeg_set_stream_buf_address(void __iomem *base,
  167. unsigned int address)
  168. {
  169. writel(address, base + EXYNOS4_OUT_MEM_BASE_REG);
  170. }
  171. void exynos4_jpeg_set_stream_size(void __iomem *base,
  172. unsigned int x_value, unsigned int y_value)
  173. {
  174. writel(0x0, base + EXYNOS4_JPEG_IMG_SIZE_REG); /* clear */
  175. writel(EXYNOS4_X_SIZE(x_value) | EXYNOS4_Y_SIZE(y_value),
  176. base + EXYNOS4_JPEG_IMG_SIZE_REG);
  177. }
  178. void exynos4_jpeg_set_frame_buf_address(void __iomem *base,
  179. struct s5p_jpeg_addr *exynos4_jpeg_addr)
  180. {
  181. writel(exynos4_jpeg_addr->y, base + EXYNOS4_IMG_BA_PLANE_1_REG);
  182. writel(exynos4_jpeg_addr->cb, base + EXYNOS4_IMG_BA_PLANE_2_REG);
  183. writel(exynos4_jpeg_addr->cr, base + EXYNOS4_IMG_BA_PLANE_3_REG);
  184. }
  185. void exynos4_jpeg_set_encode_tbl_select(void __iomem *base,
  186. enum exynos4_jpeg_img_quality_level level)
  187. {
  188. unsigned int reg;
  189. reg = EXYNOS4_Q_TBL_COMP1_0 | EXYNOS4_Q_TBL_COMP2_1 |
  190. EXYNOS4_Q_TBL_COMP3_1 |
  191. EXYNOS4_HUFF_TBL_COMP1_AC_0_DC_1 |
  192. EXYNOS4_HUFF_TBL_COMP2_AC_0_DC_0 |
  193. EXYNOS4_HUFF_TBL_COMP3_AC_1_DC_1;
  194. writel(reg, base + EXYNOS4_TBL_SEL_REG);
  195. }
  196. void exynos4_jpeg_set_encode_hoff_cnt(void __iomem *base, unsigned int fmt)
  197. {
  198. if (fmt == V4L2_PIX_FMT_GREY)
  199. writel(0xd2, base + EXYNOS4_HUFF_CNT_REG);
  200. else
  201. writel(0x1a2, base + EXYNOS4_HUFF_CNT_REG);
  202. }
  203. unsigned int exynos4_jpeg_get_stream_size(void __iomem *base)
  204. {
  205. unsigned int size;
  206. size = readl(base + EXYNOS4_BITSTREAM_SIZE_REG);
  207. return size;
  208. }
  209. void exynos4_jpeg_set_dec_bitstream_size(void __iomem *base, unsigned int size)
  210. {
  211. writel(size, base + EXYNOS4_BITSTREAM_SIZE_REG);
  212. }
  213. void exynos4_jpeg_get_frame_size(void __iomem *base,
  214. unsigned int *width, unsigned int *height)
  215. {
  216. *width = (readl(base + EXYNOS4_DECODE_XY_SIZE_REG) &
  217. EXYNOS4_DECODED_SIZE_MASK);
  218. *height = (readl(base + EXYNOS4_DECODE_XY_SIZE_REG) >> 16) &
  219. EXYNOS4_DECODED_SIZE_MASK;
  220. }
  221. unsigned int exynos4_jpeg_get_frame_fmt(void __iomem *base)
  222. {
  223. return readl(base + EXYNOS4_DECODE_IMG_FMT_REG) &
  224. EXYNOS4_JPEG_DECODED_IMG_FMT_MASK;
  225. }
  226. void exynos4_jpeg_set_timer_count(void __iomem *base, unsigned int size)
  227. {
  228. writel(size, base + EXYNOS4_INT_TIMER_COUNT_REG);
  229. }