162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* linux/drivers/media/platform/exynos3250-jpeg/jpeg-hw.h 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2014 Samsung Electronics Co., Ltd. 562306a36Sopenharmony_ci * http://www.samsung.com 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: Jacek Anaszewski <j.anaszewski@samsung.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/io.h> 1162306a36Sopenharmony_ci#include <linux/videodev2.h> 1262306a36Sopenharmony_ci#include <linux/delay.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include "jpeg-core.h" 1562306a36Sopenharmony_ci#include "jpeg-regs.h" 1662306a36Sopenharmony_ci#include "jpeg-hw-exynos3250.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_civoid exynos3250_jpeg_reset(void __iomem *regs) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci u32 reg = 1; 2162306a36Sopenharmony_ci int count = 1000; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci writel(1, regs + EXYNOS3250_SW_RESET); 2462306a36Sopenharmony_ci /* no other way but polling for when JPEG IP becomes operational */ 2562306a36Sopenharmony_ci while (reg != 0 && --count > 0) { 2662306a36Sopenharmony_ci udelay(1); 2762306a36Sopenharmony_ci cpu_relax(); 2862306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_SW_RESET); 2962306a36Sopenharmony_ci } 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci reg = 0; 3262306a36Sopenharmony_ci count = 1000; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci while (reg != 1 && --count > 0) { 3562306a36Sopenharmony_ci writel(1, regs + EXYNOS3250_JPGDRI); 3662306a36Sopenharmony_ci udelay(1); 3762306a36Sopenharmony_ci cpu_relax(); 3862306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_JPGDRI); 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci writel(0, regs + EXYNOS3250_JPGDRI); 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_civoid exynos3250_jpeg_poweron(void __iomem *regs) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci writel(EXYNOS3250_POWER_ON, regs + EXYNOS3250_JPGCLKCON); 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_civoid exynos3250_jpeg_set_dma_num(void __iomem *regs) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci writel(((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_WDMA_ISSUE_NUM_SHIFT) & 5262306a36Sopenharmony_ci EXYNOS3250_WDMA_ISSUE_NUM_MASK) | 5362306a36Sopenharmony_ci ((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_RDMA_ISSUE_NUM_SHIFT) & 5462306a36Sopenharmony_ci EXYNOS3250_RDMA_ISSUE_NUM_MASK) | 5562306a36Sopenharmony_ci ((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_ISSUE_GATHER_NUM_SHIFT) & 5662306a36Sopenharmony_ci EXYNOS3250_ISSUE_GATHER_NUM_MASK), 5762306a36Sopenharmony_ci regs + EXYNOS3250_DMA_ISSUE_NUM); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_civoid exynos3250_jpeg_clk_set(void __iomem *base) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci u32 reg; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci reg = readl(base + EXYNOS3250_JPGCMOD) & ~EXYNOS3250_HALF_EN_MASK; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci writel(reg | EXYNOS3250_HALF_EN, base + EXYNOS3250_JPGCMOD); 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_civoid exynos3250_jpeg_input_raw_fmt(void __iomem *regs, unsigned int fmt) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci u32 reg; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_JPGCMOD) & 7462306a36Sopenharmony_ci EXYNOS3250_MODE_Y16_MASK; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci switch (fmt) { 7762306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB32: 7862306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_ARGB8888; 7962306a36Sopenharmony_ci break; 8062306a36Sopenharmony_ci case V4L2_PIX_FMT_BGR32: 8162306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_ARGB8888 | EXYNOS3250_SRC_SWAP_RGB; 8262306a36Sopenharmony_ci break; 8362306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB565: 8462306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_RGB565; 8562306a36Sopenharmony_ci break; 8662306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB565X: 8762306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_RGB565 | EXYNOS3250_SRC_SWAP_RGB; 8862306a36Sopenharmony_ci break; 8962306a36Sopenharmony_ci case V4L2_PIX_FMT_YUYV: 9062306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_422_1P_LUM_CHR; 9162306a36Sopenharmony_ci break; 9262306a36Sopenharmony_ci case V4L2_PIX_FMT_YVYU: 9362306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_422_1P_LUM_CHR | 9462306a36Sopenharmony_ci EXYNOS3250_SRC_SWAP_UV; 9562306a36Sopenharmony_ci break; 9662306a36Sopenharmony_ci case V4L2_PIX_FMT_UYVY: 9762306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_422_1P_CHR_LUM; 9862306a36Sopenharmony_ci break; 9962306a36Sopenharmony_ci case V4L2_PIX_FMT_VYUY: 10062306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_422_1P_CHR_LUM | 10162306a36Sopenharmony_ci EXYNOS3250_SRC_SWAP_UV; 10262306a36Sopenharmony_ci break; 10362306a36Sopenharmony_ci case V4L2_PIX_FMT_NV12: 10462306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_420_2P | EXYNOS3250_SRC_NV12; 10562306a36Sopenharmony_ci break; 10662306a36Sopenharmony_ci case V4L2_PIX_FMT_NV21: 10762306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_420_2P | EXYNOS3250_SRC_NV21; 10862306a36Sopenharmony_ci break; 10962306a36Sopenharmony_ci case V4L2_PIX_FMT_YUV420: 11062306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_SEL_420_3P; 11162306a36Sopenharmony_ci break; 11262306a36Sopenharmony_ci default: 11362306a36Sopenharmony_ci break; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci } 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_JPGCMOD); 11862306a36Sopenharmony_ci} 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_civoid exynos3250_jpeg_set_y16(void __iomem *regs, bool y16) 12162306a36Sopenharmony_ci{ 12262306a36Sopenharmony_ci u32 reg; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_JPGCMOD); 12562306a36Sopenharmony_ci if (y16) 12662306a36Sopenharmony_ci reg |= EXYNOS3250_MODE_Y16; 12762306a36Sopenharmony_ci else 12862306a36Sopenharmony_ci reg &= ~EXYNOS3250_MODE_Y16_MASK; 12962306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_JPGCMOD); 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_civoid exynos3250_jpeg_proc_mode(void __iomem *regs, unsigned int mode) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci u32 reg, m; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci if (mode == S5P_JPEG_ENCODE) 13762306a36Sopenharmony_ci m = EXYNOS3250_PROC_MODE_COMPR; 13862306a36Sopenharmony_ci else 13962306a36Sopenharmony_ci m = EXYNOS3250_PROC_MODE_DECOMPR; 14062306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_JPGMOD); 14162306a36Sopenharmony_ci reg &= ~EXYNOS3250_PROC_MODE_MASK; 14262306a36Sopenharmony_ci reg |= m; 14362306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_JPGMOD); 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_civoid exynos3250_jpeg_subsampling_mode(void __iomem *regs, unsigned int mode) 14762306a36Sopenharmony_ci{ 14862306a36Sopenharmony_ci u32 reg, m = 0; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci switch (mode) { 15162306a36Sopenharmony_ci case V4L2_JPEG_CHROMA_SUBSAMPLING_444: 15262306a36Sopenharmony_ci m = EXYNOS3250_SUBSAMPLING_MODE_444; 15362306a36Sopenharmony_ci break; 15462306a36Sopenharmony_ci case V4L2_JPEG_CHROMA_SUBSAMPLING_422: 15562306a36Sopenharmony_ci m = EXYNOS3250_SUBSAMPLING_MODE_422; 15662306a36Sopenharmony_ci break; 15762306a36Sopenharmony_ci case V4L2_JPEG_CHROMA_SUBSAMPLING_420: 15862306a36Sopenharmony_ci m = EXYNOS3250_SUBSAMPLING_MODE_420; 15962306a36Sopenharmony_ci break; 16062306a36Sopenharmony_ci } 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_JPGMOD); 16362306a36Sopenharmony_ci reg &= ~EXYNOS3250_SUBSAMPLING_MODE_MASK; 16462306a36Sopenharmony_ci reg |= m; 16562306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_JPGMOD); 16662306a36Sopenharmony_ci} 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ciunsigned int exynos3250_jpeg_get_subsampling_mode(void __iomem *regs) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci return readl(regs + EXYNOS3250_JPGMOD) & 17162306a36Sopenharmony_ci EXYNOS3250_SUBSAMPLING_MODE_MASK; 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_civoid exynos3250_jpeg_dri(void __iomem *regs, unsigned int dri) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci u32 reg; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci reg = dri & EXYNOS3250_JPGDRI_MASK; 17962306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_JPGDRI); 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_civoid exynos3250_jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci unsigned long reg; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_QHTBL); 18762306a36Sopenharmony_ci reg &= ~EXYNOS3250_QT_NUM_MASK(t); 18862306a36Sopenharmony_ci reg |= (n << EXYNOS3250_QT_NUM_SHIFT(t)) & 18962306a36Sopenharmony_ci EXYNOS3250_QT_NUM_MASK(t); 19062306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_QHTBL); 19162306a36Sopenharmony_ci} 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_civoid exynos3250_jpeg_htbl_ac(void __iomem *regs, unsigned int t) 19462306a36Sopenharmony_ci{ 19562306a36Sopenharmony_ci unsigned long reg; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_QHTBL); 19862306a36Sopenharmony_ci reg &= ~EXYNOS3250_HT_NUM_AC_MASK(t); 19962306a36Sopenharmony_ci /* this driver uses table 0 for all color components */ 20062306a36Sopenharmony_ci reg |= (0 << EXYNOS3250_HT_NUM_AC_SHIFT(t)) & 20162306a36Sopenharmony_ci EXYNOS3250_HT_NUM_AC_MASK(t); 20262306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_QHTBL); 20362306a36Sopenharmony_ci} 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_civoid exynos3250_jpeg_htbl_dc(void __iomem *regs, unsigned int t) 20662306a36Sopenharmony_ci{ 20762306a36Sopenharmony_ci unsigned long reg; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_QHTBL); 21062306a36Sopenharmony_ci reg &= ~EXYNOS3250_HT_NUM_DC_MASK(t); 21162306a36Sopenharmony_ci /* this driver uses table 0 for all color components */ 21262306a36Sopenharmony_ci reg |= (0 << EXYNOS3250_HT_NUM_DC_SHIFT(t)) & 21362306a36Sopenharmony_ci EXYNOS3250_HT_NUM_DC_MASK(t); 21462306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_QHTBL); 21562306a36Sopenharmony_ci} 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_civoid exynos3250_jpeg_set_y(void __iomem *regs, unsigned int y) 21862306a36Sopenharmony_ci{ 21962306a36Sopenharmony_ci u32 reg; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci reg = y & EXYNOS3250_JPGY_MASK; 22262306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_JPGY); 22362306a36Sopenharmony_ci} 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_civoid exynos3250_jpeg_set_x(void __iomem *regs, unsigned int x) 22662306a36Sopenharmony_ci{ 22762306a36Sopenharmony_ci u32 reg; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci reg = x & EXYNOS3250_JPGX_MASK; 23062306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_JPGX); 23162306a36Sopenharmony_ci} 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci#if 0 /* Currently unused */ 23462306a36Sopenharmony_ciunsigned int exynos3250_jpeg_get_y(void __iomem *regs) 23562306a36Sopenharmony_ci{ 23662306a36Sopenharmony_ci return readl(regs + EXYNOS3250_JPGY); 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ciunsigned int exynos3250_jpeg_get_x(void __iomem *regs) 24062306a36Sopenharmony_ci{ 24162306a36Sopenharmony_ci return readl(regs + EXYNOS3250_JPGX); 24262306a36Sopenharmony_ci} 24362306a36Sopenharmony_ci#endif 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_civoid exynos3250_jpeg_interrupts_enable(void __iomem *regs) 24662306a36Sopenharmony_ci{ 24762306a36Sopenharmony_ci u32 reg; 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci reg = readl(regs + EXYNOS3250_JPGINTSE); 25062306a36Sopenharmony_ci reg |= (EXYNOS3250_JPEG_DONE_EN | 25162306a36Sopenharmony_ci EXYNOS3250_WDMA_DONE_EN | 25262306a36Sopenharmony_ci EXYNOS3250_RDMA_DONE_EN | 25362306a36Sopenharmony_ci EXYNOS3250_ENC_STREAM_INT_EN | 25462306a36Sopenharmony_ci EXYNOS3250_CORE_DONE_EN | 25562306a36Sopenharmony_ci EXYNOS3250_ERR_INT_EN | 25662306a36Sopenharmony_ci EXYNOS3250_HEAD_INT_EN); 25762306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_JPGINTSE); 25862306a36Sopenharmony_ci} 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_civoid exynos3250_jpeg_enc_stream_bound(void __iomem *regs, unsigned int size) 26162306a36Sopenharmony_ci{ 26262306a36Sopenharmony_ci u32 reg; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci reg = size & EXYNOS3250_ENC_STREAM_BOUND_MASK; 26562306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_ENC_STREAM_BOUND); 26662306a36Sopenharmony_ci} 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_civoid exynos3250_jpeg_output_raw_fmt(void __iomem *regs, unsigned int fmt) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci u32 reg; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci switch (fmt) { 27362306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB32: 27462306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_ARGB8888; 27562306a36Sopenharmony_ci break; 27662306a36Sopenharmony_ci case V4L2_PIX_FMT_BGR32: 27762306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_ARGB8888 | EXYNOS3250_OUT_SWAP_RGB; 27862306a36Sopenharmony_ci break; 27962306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB565: 28062306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_RGB565; 28162306a36Sopenharmony_ci break; 28262306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB565X: 28362306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_RGB565 | EXYNOS3250_OUT_SWAP_RGB; 28462306a36Sopenharmony_ci break; 28562306a36Sopenharmony_ci case V4L2_PIX_FMT_YUYV: 28662306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_422_1P_LUM_CHR; 28762306a36Sopenharmony_ci break; 28862306a36Sopenharmony_ci case V4L2_PIX_FMT_YVYU: 28962306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_422_1P_LUM_CHR | 29062306a36Sopenharmony_ci EXYNOS3250_OUT_SWAP_UV; 29162306a36Sopenharmony_ci break; 29262306a36Sopenharmony_ci case V4L2_PIX_FMT_UYVY: 29362306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_422_1P_CHR_LUM; 29462306a36Sopenharmony_ci break; 29562306a36Sopenharmony_ci case V4L2_PIX_FMT_VYUY: 29662306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_422_1P_CHR_LUM | 29762306a36Sopenharmony_ci EXYNOS3250_OUT_SWAP_UV; 29862306a36Sopenharmony_ci break; 29962306a36Sopenharmony_ci case V4L2_PIX_FMT_NV12: 30062306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_420_2P | EXYNOS3250_OUT_NV12; 30162306a36Sopenharmony_ci break; 30262306a36Sopenharmony_ci case V4L2_PIX_FMT_NV21: 30362306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_420_2P | EXYNOS3250_OUT_NV21; 30462306a36Sopenharmony_ci break; 30562306a36Sopenharmony_ci case V4L2_PIX_FMT_YUV420: 30662306a36Sopenharmony_ci reg = EXYNOS3250_OUT_FMT_420_3P; 30762306a36Sopenharmony_ci break; 30862306a36Sopenharmony_ci default: 30962306a36Sopenharmony_ci reg = 0; 31062306a36Sopenharmony_ci break; 31162306a36Sopenharmony_ci } 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_OUTFORM); 31462306a36Sopenharmony_ci} 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_civoid exynos3250_jpeg_jpgadr(void __iomem *regs, unsigned int addr) 31762306a36Sopenharmony_ci{ 31862306a36Sopenharmony_ci writel(addr, regs + EXYNOS3250_JPG_JPGADR); 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_civoid exynos3250_jpeg_imgadr(void __iomem *regs, struct s5p_jpeg_addr *img_addr) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci writel(img_addr->y, regs + EXYNOS3250_LUMA_BASE); 32462306a36Sopenharmony_ci writel(img_addr->cb, regs + EXYNOS3250_CHROMA_BASE); 32562306a36Sopenharmony_ci writel(img_addr->cr, regs + EXYNOS3250_CHROMA_CR_BASE); 32662306a36Sopenharmony_ci} 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_civoid exynos3250_jpeg_stride(void __iomem *regs, unsigned int img_fmt, 32962306a36Sopenharmony_ci unsigned int width) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci u32 reg_luma = 0, reg_cr = 0, reg_cb = 0; 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci switch (img_fmt) { 33462306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB32: 33562306a36Sopenharmony_ci reg_luma = 4 * width; 33662306a36Sopenharmony_ci break; 33762306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB565: 33862306a36Sopenharmony_ci case V4L2_PIX_FMT_RGB565X: 33962306a36Sopenharmony_ci case V4L2_PIX_FMT_YUYV: 34062306a36Sopenharmony_ci case V4L2_PIX_FMT_YVYU: 34162306a36Sopenharmony_ci case V4L2_PIX_FMT_UYVY: 34262306a36Sopenharmony_ci case V4L2_PIX_FMT_VYUY: 34362306a36Sopenharmony_ci reg_luma = 2 * width; 34462306a36Sopenharmony_ci break; 34562306a36Sopenharmony_ci case V4L2_PIX_FMT_NV12: 34662306a36Sopenharmony_ci case V4L2_PIX_FMT_NV21: 34762306a36Sopenharmony_ci reg_luma = width; 34862306a36Sopenharmony_ci reg_cb = reg_luma; 34962306a36Sopenharmony_ci break; 35062306a36Sopenharmony_ci case V4L2_PIX_FMT_YUV420: 35162306a36Sopenharmony_ci reg_luma = width; 35262306a36Sopenharmony_ci reg_cb = reg_cr = reg_luma / 2; 35362306a36Sopenharmony_ci break; 35462306a36Sopenharmony_ci default: 35562306a36Sopenharmony_ci break; 35662306a36Sopenharmony_ci } 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci writel(reg_luma, regs + EXYNOS3250_LUMA_STRIDE); 35962306a36Sopenharmony_ci writel(reg_cb, regs + EXYNOS3250_CHROMA_STRIDE); 36062306a36Sopenharmony_ci writel(reg_cr, regs + EXYNOS3250_CHROMA_CR_STRIDE); 36162306a36Sopenharmony_ci} 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_civoid exynos3250_jpeg_offset(void __iomem *regs, unsigned int x_offset, 36462306a36Sopenharmony_ci unsigned int y_offset) 36562306a36Sopenharmony_ci{ 36662306a36Sopenharmony_ci u32 reg; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci reg = (y_offset << EXYNOS3250_LUMA_YY_OFFSET_SHIFT) & 36962306a36Sopenharmony_ci EXYNOS3250_LUMA_YY_OFFSET_MASK; 37062306a36Sopenharmony_ci reg |= (x_offset << EXYNOS3250_LUMA_YX_OFFSET_SHIFT) & 37162306a36Sopenharmony_ci EXYNOS3250_LUMA_YX_OFFSET_MASK; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_LUMA_XY_OFFSET); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci reg = (y_offset << EXYNOS3250_CHROMA_YY_OFFSET_SHIFT) & 37662306a36Sopenharmony_ci EXYNOS3250_CHROMA_YY_OFFSET_MASK; 37762306a36Sopenharmony_ci reg |= (x_offset << EXYNOS3250_CHROMA_YX_OFFSET_SHIFT) & 37862306a36Sopenharmony_ci EXYNOS3250_CHROMA_YX_OFFSET_MASK; 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_CHROMA_XY_OFFSET); 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci reg = (y_offset << EXYNOS3250_CHROMA_CR_YY_OFFSET_SHIFT) & 38362306a36Sopenharmony_ci EXYNOS3250_CHROMA_CR_YY_OFFSET_MASK; 38462306a36Sopenharmony_ci reg |= (x_offset << EXYNOS3250_CHROMA_CR_YX_OFFSET_SHIFT) & 38562306a36Sopenharmony_ci EXYNOS3250_CHROMA_CR_YX_OFFSET_MASK; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci writel(reg, regs + EXYNOS3250_CHROMA_CR_XY_OFFSET); 38862306a36Sopenharmony_ci} 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_civoid exynos3250_jpeg_coef(void __iomem *base, unsigned int mode) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci if (mode == S5P_JPEG_ENCODE) { 39362306a36Sopenharmony_ci writel(EXYNOS3250_JPEG_ENC_COEF1, 39462306a36Sopenharmony_ci base + EXYNOS3250_JPG_COEF(1)); 39562306a36Sopenharmony_ci writel(EXYNOS3250_JPEG_ENC_COEF2, 39662306a36Sopenharmony_ci base + EXYNOS3250_JPG_COEF(2)); 39762306a36Sopenharmony_ci writel(EXYNOS3250_JPEG_ENC_COEF3, 39862306a36Sopenharmony_ci base + EXYNOS3250_JPG_COEF(3)); 39962306a36Sopenharmony_ci } else { 40062306a36Sopenharmony_ci writel(EXYNOS3250_JPEG_DEC_COEF1, 40162306a36Sopenharmony_ci base + EXYNOS3250_JPG_COEF(1)); 40262306a36Sopenharmony_ci writel(EXYNOS3250_JPEG_DEC_COEF2, 40362306a36Sopenharmony_ci base + EXYNOS3250_JPG_COEF(2)); 40462306a36Sopenharmony_ci writel(EXYNOS3250_JPEG_DEC_COEF3, 40562306a36Sopenharmony_ci base + EXYNOS3250_JPG_COEF(3)); 40662306a36Sopenharmony_ci } 40762306a36Sopenharmony_ci} 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_civoid exynos3250_jpeg_start(void __iomem *regs) 41062306a36Sopenharmony_ci{ 41162306a36Sopenharmony_ci writel(1, regs + EXYNOS3250_JSTART); 41262306a36Sopenharmony_ci} 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_civoid exynos3250_jpeg_rstart(void __iomem *regs) 41562306a36Sopenharmony_ci{ 41662306a36Sopenharmony_ci writel(1, regs + EXYNOS3250_JRSTART); 41762306a36Sopenharmony_ci} 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ciunsigned int exynos3250_jpeg_get_int_status(void __iomem *regs) 42062306a36Sopenharmony_ci{ 42162306a36Sopenharmony_ci return readl(regs + EXYNOS3250_JPGINTST); 42262306a36Sopenharmony_ci} 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_civoid exynos3250_jpeg_clear_int_status(void __iomem *regs, 42562306a36Sopenharmony_ci unsigned int value) 42662306a36Sopenharmony_ci{ 42762306a36Sopenharmony_ci writel(value, regs + EXYNOS3250_JPGINTST); 42862306a36Sopenharmony_ci} 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ciunsigned int exynos3250_jpeg_operating(void __iomem *regs) 43162306a36Sopenharmony_ci{ 43262306a36Sopenharmony_ci return readl(regs + S5P_JPGOPR) & EXYNOS3250_JPGOPR_MASK; 43362306a36Sopenharmony_ci} 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ciunsigned int exynos3250_jpeg_compressed_size(void __iomem *regs) 43662306a36Sopenharmony_ci{ 43762306a36Sopenharmony_ci return readl(regs + EXYNOS3250_JPGCNT) & EXYNOS3250_JPGCNT_MASK; 43862306a36Sopenharmony_ci} 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_civoid exynos3250_jpeg_dec_stream_size(void __iomem *regs, 44162306a36Sopenharmony_ci unsigned int size) 44262306a36Sopenharmony_ci{ 44362306a36Sopenharmony_ci writel(size & EXYNOS3250_DEC_STREAM_MASK, 44462306a36Sopenharmony_ci regs + EXYNOS3250_DEC_STREAM_SIZE); 44562306a36Sopenharmony_ci} 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_civoid exynos3250_jpeg_dec_scaling_ratio(void __iomem *regs, 44862306a36Sopenharmony_ci unsigned int sratio) 44962306a36Sopenharmony_ci{ 45062306a36Sopenharmony_ci switch (sratio) { 45162306a36Sopenharmony_ci case 1: 45262306a36Sopenharmony_ci default: 45362306a36Sopenharmony_ci sratio = EXYNOS3250_DEC_SCALE_FACTOR_8_8; 45462306a36Sopenharmony_ci break; 45562306a36Sopenharmony_ci case 2: 45662306a36Sopenharmony_ci sratio = EXYNOS3250_DEC_SCALE_FACTOR_4_8; 45762306a36Sopenharmony_ci break; 45862306a36Sopenharmony_ci case 4: 45962306a36Sopenharmony_ci sratio = EXYNOS3250_DEC_SCALE_FACTOR_2_8; 46062306a36Sopenharmony_ci break; 46162306a36Sopenharmony_ci case 8: 46262306a36Sopenharmony_ci sratio = EXYNOS3250_DEC_SCALE_FACTOR_1_8; 46362306a36Sopenharmony_ci break; 46462306a36Sopenharmony_ci } 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci writel(sratio & EXYNOS3250_DEC_SCALE_FACTOR_MASK, 46762306a36Sopenharmony_ci regs + EXYNOS3250_DEC_SCALING_RATIO); 46862306a36Sopenharmony_ci} 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_civoid exynos3250_jpeg_set_timer(void __iomem *regs, unsigned int time_value) 47162306a36Sopenharmony_ci{ 47262306a36Sopenharmony_ci time_value &= EXYNOS3250_TIMER_INIT_MASK; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci writel(EXYNOS3250_TIMER_INT_STAT | time_value, 47562306a36Sopenharmony_ci regs + EXYNOS3250_TIMER_SE); 47662306a36Sopenharmony_ci} 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ciunsigned int exynos3250_jpeg_get_timer_status(void __iomem *regs) 47962306a36Sopenharmony_ci{ 48062306a36Sopenharmony_ci return readl(regs + EXYNOS3250_TIMER_ST); 48162306a36Sopenharmony_ci} 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_civoid exynos3250_jpeg_clear_timer_status(void __iomem *regs) 48462306a36Sopenharmony_ci{ 48562306a36Sopenharmony_ci writel(EXYNOS3250_TIMER_INT_STAT, regs + EXYNOS3250_TIMER_ST); 48662306a36Sopenharmony_ci} 487