123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489 |
- /* linux/drivers/media/platform/exynos3250-jpeg/jpeg-hw.h
- *
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
- * http://www.samsung.com
- *
- * Author: Jacek Anaszewski <j.anaszewski@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
- #include <linux/io.h>
- #include <linux/videodev2.h>
- #include <linux/delay.h>
- #include "jpeg-core.h"
- #include "jpeg-regs.h"
- #include "jpeg-hw-exynos3250.h"
- void exynos3250_jpeg_reset(void __iomem *regs)
- {
- u32 reg = 1;
- int count = 1000;
- writel(1, regs + EXYNOS3250_SW_RESET);
- /* no other way but polling for when JPEG IP becomes operational */
- while (reg != 0 && --count > 0) {
- udelay(1);
- cpu_relax();
- reg = readl(regs + EXYNOS3250_SW_RESET);
- }
- reg = 0;
- count = 1000;
- while (reg != 1 && --count > 0) {
- writel(1, regs + EXYNOS3250_JPGDRI);
- udelay(1);
- cpu_relax();
- reg = readl(regs + EXYNOS3250_JPGDRI);
- }
- writel(0, regs + EXYNOS3250_JPGDRI);
- }
- void exynos3250_jpeg_poweron(void __iomem *regs)
- {
- writel(EXYNOS3250_POWER_ON, regs + EXYNOS3250_JPGCLKCON);
- }
- void exynos3250_jpeg_set_dma_num(void __iomem *regs)
- {
- writel(((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_WDMA_ISSUE_NUM_SHIFT) &
- EXYNOS3250_WDMA_ISSUE_NUM_MASK) |
- ((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_RDMA_ISSUE_NUM_SHIFT) &
- EXYNOS3250_RDMA_ISSUE_NUM_MASK) |
- ((EXYNOS3250_DMA_MO_COUNT << EXYNOS3250_ISSUE_GATHER_NUM_SHIFT) &
- EXYNOS3250_ISSUE_GATHER_NUM_MASK),
- regs + EXYNOS3250_DMA_ISSUE_NUM);
- }
- void exynos3250_jpeg_clk_set(void __iomem *base)
- {
- u32 reg;
- reg = readl(base + EXYNOS3250_JPGCMOD) & ~EXYNOS3250_HALF_EN_MASK;
- writel(reg | EXYNOS3250_HALF_EN, base + EXYNOS3250_JPGCMOD);
- }
- void exynos3250_jpeg_input_raw_fmt(void __iomem *regs, unsigned int fmt)
- {
- u32 reg;
- reg = readl(regs + EXYNOS3250_JPGCMOD) &
- EXYNOS3250_MODE_Y16_MASK;
- switch (fmt) {
- case V4L2_PIX_FMT_RGB32:
- reg |= EXYNOS3250_MODE_SEL_ARGB8888;
- break;
- case V4L2_PIX_FMT_BGR32:
- reg |= EXYNOS3250_MODE_SEL_ARGB8888 | EXYNOS3250_SRC_SWAP_RGB;
- break;
- case V4L2_PIX_FMT_RGB565:
- reg |= EXYNOS3250_MODE_SEL_RGB565;
- break;
- case V4L2_PIX_FMT_RGB565X:
- reg |= EXYNOS3250_MODE_SEL_RGB565 | EXYNOS3250_SRC_SWAP_RGB;
- break;
- case V4L2_PIX_FMT_YUYV:
- reg |= EXYNOS3250_MODE_SEL_422_1P_LUM_CHR;
- break;
- case V4L2_PIX_FMT_YVYU:
- reg |= EXYNOS3250_MODE_SEL_422_1P_LUM_CHR |
- EXYNOS3250_SRC_SWAP_UV;
- break;
- case V4L2_PIX_FMT_UYVY:
- reg |= EXYNOS3250_MODE_SEL_422_1P_CHR_LUM;
- break;
- case V4L2_PIX_FMT_VYUY:
- reg |= EXYNOS3250_MODE_SEL_422_1P_CHR_LUM |
- EXYNOS3250_SRC_SWAP_UV;
- break;
- case V4L2_PIX_FMT_NV12:
- reg |= EXYNOS3250_MODE_SEL_420_2P | EXYNOS3250_SRC_NV12;
- break;
- case V4L2_PIX_FMT_NV21:
- reg |= EXYNOS3250_MODE_SEL_420_2P | EXYNOS3250_SRC_NV21;
- break;
- case V4L2_PIX_FMT_YUV420:
- reg |= EXYNOS3250_MODE_SEL_420_3P;
- break;
- default:
- break;
- }
- writel(reg, regs + EXYNOS3250_JPGCMOD);
- }
- void exynos3250_jpeg_set_y16(void __iomem *regs, bool y16)
- {
- u32 reg;
- reg = readl(regs + EXYNOS3250_JPGCMOD);
- if (y16)
- reg |= EXYNOS3250_MODE_Y16;
- else
- reg &= ~EXYNOS3250_MODE_Y16_MASK;
- writel(reg, regs + EXYNOS3250_JPGCMOD);
- }
- void exynos3250_jpeg_proc_mode(void __iomem *regs, unsigned int mode)
- {
- u32 reg, m;
- if (mode == S5P_JPEG_ENCODE)
- m = EXYNOS3250_PROC_MODE_COMPR;
- else
- m = EXYNOS3250_PROC_MODE_DECOMPR;
- reg = readl(regs + EXYNOS3250_JPGMOD);
- reg &= ~EXYNOS3250_PROC_MODE_MASK;
- reg |= m;
- writel(reg, regs + EXYNOS3250_JPGMOD);
- }
- void exynos3250_jpeg_subsampling_mode(void __iomem *regs, unsigned int mode)
- {
- u32 reg, m = 0;
- switch (mode) {
- case V4L2_JPEG_CHROMA_SUBSAMPLING_444:
- m = EXYNOS3250_SUBSAMPLING_MODE_444;
- break;
- case V4L2_JPEG_CHROMA_SUBSAMPLING_422:
- m = EXYNOS3250_SUBSAMPLING_MODE_422;
- break;
- case V4L2_JPEG_CHROMA_SUBSAMPLING_420:
- m = EXYNOS3250_SUBSAMPLING_MODE_420;
- break;
- }
- reg = readl(regs + EXYNOS3250_JPGMOD);
- reg &= ~EXYNOS3250_SUBSAMPLING_MODE_MASK;
- reg |= m;
- writel(reg, regs + EXYNOS3250_JPGMOD);
- }
- unsigned int exynos3250_jpeg_get_subsampling_mode(void __iomem *regs)
- {
- return readl(regs + EXYNOS3250_JPGMOD) &
- EXYNOS3250_SUBSAMPLING_MODE_MASK;
- }
- void exynos3250_jpeg_dri(void __iomem *regs, unsigned int dri)
- {
- u32 reg;
- reg = dri & EXYNOS3250_JPGDRI_MASK;
- writel(reg, regs + EXYNOS3250_JPGDRI);
- }
- void exynos3250_jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n)
- {
- unsigned long reg;
- reg = readl(regs + EXYNOS3250_QHTBL);
- reg &= ~EXYNOS3250_QT_NUM_MASK(t);
- reg |= (n << EXYNOS3250_QT_NUM_SHIFT(t)) &
- EXYNOS3250_QT_NUM_MASK(t);
- writel(reg, regs + EXYNOS3250_QHTBL);
- }
- void exynos3250_jpeg_htbl_ac(void __iomem *regs, unsigned int t)
- {
- unsigned long reg;
- reg = readl(regs + EXYNOS3250_QHTBL);
- reg &= ~EXYNOS3250_HT_NUM_AC_MASK(t);
- /* this driver uses table 0 for all color components */
- reg |= (0 << EXYNOS3250_HT_NUM_AC_SHIFT(t)) &
- EXYNOS3250_HT_NUM_AC_MASK(t);
- writel(reg, regs + EXYNOS3250_QHTBL);
- }
- void exynos3250_jpeg_htbl_dc(void __iomem *regs, unsigned int t)
- {
- unsigned long reg;
- reg = readl(regs + EXYNOS3250_QHTBL);
- reg &= ~EXYNOS3250_HT_NUM_DC_MASK(t);
- /* this driver uses table 0 for all color components */
- reg |= (0 << EXYNOS3250_HT_NUM_DC_SHIFT(t)) &
- EXYNOS3250_HT_NUM_DC_MASK(t);
- writel(reg, regs + EXYNOS3250_QHTBL);
- }
- void exynos3250_jpeg_set_y(void __iomem *regs, unsigned int y)
- {
- u32 reg;
- reg = y & EXYNOS3250_JPGY_MASK;
- writel(reg, regs + EXYNOS3250_JPGY);
- }
- void exynos3250_jpeg_set_x(void __iomem *regs, unsigned int x)
- {
- u32 reg;
- reg = x & EXYNOS3250_JPGX_MASK;
- writel(reg, regs + EXYNOS3250_JPGX);
- }
- #if 0 /* Currently unused */
- unsigned int exynos3250_jpeg_get_y(void __iomem *regs)
- {
- return readl(regs + EXYNOS3250_JPGY);
- }
- unsigned int exynos3250_jpeg_get_x(void __iomem *regs)
- {
- return readl(regs + EXYNOS3250_JPGX);
- }
- #endif
- void exynos3250_jpeg_interrupts_enable(void __iomem *regs)
- {
- u32 reg;
- reg = readl(regs + EXYNOS3250_JPGINTSE);
- reg |= (EXYNOS3250_JPEG_DONE_EN |
- EXYNOS3250_WDMA_DONE_EN |
- EXYNOS3250_RDMA_DONE_EN |
- EXYNOS3250_ENC_STREAM_INT_EN |
- EXYNOS3250_CORE_DONE_EN |
- EXYNOS3250_ERR_INT_EN |
- EXYNOS3250_HEAD_INT_EN);
- writel(reg, regs + EXYNOS3250_JPGINTSE);
- }
- void exynos3250_jpeg_enc_stream_bound(void __iomem *regs, unsigned int size)
- {
- u32 reg;
- reg = size & EXYNOS3250_ENC_STREAM_BOUND_MASK;
- writel(reg, regs + EXYNOS3250_ENC_STREAM_BOUND);
- }
- void exynos3250_jpeg_output_raw_fmt(void __iomem *regs, unsigned int fmt)
- {
- u32 reg;
- switch (fmt) {
- case V4L2_PIX_FMT_RGB32:
- reg = EXYNOS3250_OUT_FMT_ARGB8888;
- break;
- case V4L2_PIX_FMT_BGR32:
- reg = EXYNOS3250_OUT_FMT_ARGB8888 | EXYNOS3250_OUT_SWAP_RGB;
- break;
- case V4L2_PIX_FMT_RGB565:
- reg = EXYNOS3250_OUT_FMT_RGB565;
- break;
- case V4L2_PIX_FMT_RGB565X:
- reg = EXYNOS3250_OUT_FMT_RGB565 | EXYNOS3250_OUT_SWAP_RGB;
- break;
- case V4L2_PIX_FMT_YUYV:
- reg = EXYNOS3250_OUT_FMT_422_1P_LUM_CHR;
- break;
- case V4L2_PIX_FMT_YVYU:
- reg = EXYNOS3250_OUT_FMT_422_1P_LUM_CHR |
- EXYNOS3250_OUT_SWAP_UV;
- break;
- case V4L2_PIX_FMT_UYVY:
- reg = EXYNOS3250_OUT_FMT_422_1P_CHR_LUM;
- break;
- case V4L2_PIX_FMT_VYUY:
- reg = EXYNOS3250_OUT_FMT_422_1P_CHR_LUM |
- EXYNOS3250_OUT_SWAP_UV;
- break;
- case V4L2_PIX_FMT_NV12:
- reg = EXYNOS3250_OUT_FMT_420_2P | EXYNOS3250_OUT_NV12;
- break;
- case V4L2_PIX_FMT_NV21:
- reg = EXYNOS3250_OUT_FMT_420_2P | EXYNOS3250_OUT_NV21;
- break;
- case V4L2_PIX_FMT_YUV420:
- reg = EXYNOS3250_OUT_FMT_420_3P;
- break;
- default:
- reg = 0;
- break;
- }
- writel(reg, regs + EXYNOS3250_OUTFORM);
- }
- void exynos3250_jpeg_jpgadr(void __iomem *regs, unsigned int addr)
- {
- writel(addr, regs + EXYNOS3250_JPG_JPGADR);
- }
- void exynos3250_jpeg_imgadr(void __iomem *regs, struct s5p_jpeg_addr *img_addr)
- {
- writel(img_addr->y, regs + EXYNOS3250_LUMA_BASE);
- writel(img_addr->cb, regs + EXYNOS3250_CHROMA_BASE);
- writel(img_addr->cr, regs + EXYNOS3250_CHROMA_CR_BASE);
- }
- void exynos3250_jpeg_stride(void __iomem *regs, unsigned int img_fmt,
- unsigned int width)
- {
- u32 reg_luma = 0, reg_cr = 0, reg_cb = 0;
- switch (img_fmt) {
- case V4L2_PIX_FMT_RGB32:
- reg_luma = 4 * width;
- break;
- case V4L2_PIX_FMT_RGB565:
- case V4L2_PIX_FMT_RGB565X:
- case V4L2_PIX_FMT_YUYV:
- case V4L2_PIX_FMT_YVYU:
- case V4L2_PIX_FMT_UYVY:
- case V4L2_PIX_FMT_VYUY:
- reg_luma = 2 * width;
- break;
- case V4L2_PIX_FMT_NV12:
- case V4L2_PIX_FMT_NV21:
- reg_luma = width;
- reg_cb = reg_luma;
- break;
- case V4L2_PIX_FMT_YUV420:
- reg_luma = width;
- reg_cb = reg_cr = reg_luma / 2;
- break;
- default:
- break;
- }
- writel(reg_luma, regs + EXYNOS3250_LUMA_STRIDE);
- writel(reg_cb, regs + EXYNOS3250_CHROMA_STRIDE);
- writel(reg_cr, regs + EXYNOS3250_CHROMA_CR_STRIDE);
- }
- void exynos3250_jpeg_offset(void __iomem *regs, unsigned int x_offset,
- unsigned int y_offset)
- {
- u32 reg;
- reg = (y_offset << EXYNOS3250_LUMA_YY_OFFSET_SHIFT) &
- EXYNOS3250_LUMA_YY_OFFSET_MASK;
- reg |= (x_offset << EXYNOS3250_LUMA_YX_OFFSET_SHIFT) &
- EXYNOS3250_LUMA_YX_OFFSET_MASK;
- writel(reg, regs + EXYNOS3250_LUMA_XY_OFFSET);
- reg = (y_offset << EXYNOS3250_CHROMA_YY_OFFSET_SHIFT) &
- EXYNOS3250_CHROMA_YY_OFFSET_MASK;
- reg |= (x_offset << EXYNOS3250_CHROMA_YX_OFFSET_SHIFT) &
- EXYNOS3250_CHROMA_YX_OFFSET_MASK;
- writel(reg, regs + EXYNOS3250_CHROMA_XY_OFFSET);
- reg = (y_offset << EXYNOS3250_CHROMA_CR_YY_OFFSET_SHIFT) &
- EXYNOS3250_CHROMA_CR_YY_OFFSET_MASK;
- reg |= (x_offset << EXYNOS3250_CHROMA_CR_YX_OFFSET_SHIFT) &
- EXYNOS3250_CHROMA_CR_YX_OFFSET_MASK;
- writel(reg, regs + EXYNOS3250_CHROMA_CR_XY_OFFSET);
- }
- void exynos3250_jpeg_coef(void __iomem *base, unsigned int mode)
- {
- if (mode == S5P_JPEG_ENCODE) {
- writel(EXYNOS3250_JPEG_ENC_COEF1,
- base + EXYNOS3250_JPG_COEF(1));
- writel(EXYNOS3250_JPEG_ENC_COEF2,
- base + EXYNOS3250_JPG_COEF(2));
- writel(EXYNOS3250_JPEG_ENC_COEF3,
- base + EXYNOS3250_JPG_COEF(3));
- } else {
- writel(EXYNOS3250_JPEG_DEC_COEF1,
- base + EXYNOS3250_JPG_COEF(1));
- writel(EXYNOS3250_JPEG_DEC_COEF2,
- base + EXYNOS3250_JPG_COEF(2));
- writel(EXYNOS3250_JPEG_DEC_COEF3,
- base + EXYNOS3250_JPG_COEF(3));
- }
- }
- void exynos3250_jpeg_start(void __iomem *regs)
- {
- writel(1, regs + EXYNOS3250_JSTART);
- }
- void exynos3250_jpeg_rstart(void __iomem *regs)
- {
- writel(1, regs + EXYNOS3250_JRSTART);
- }
- unsigned int exynos3250_jpeg_get_int_status(void __iomem *regs)
- {
- return readl(regs + EXYNOS3250_JPGINTST);
- }
- void exynos3250_jpeg_clear_int_status(void __iomem *regs,
- unsigned int value)
- {
- return writel(value, regs + EXYNOS3250_JPGINTST);
- }
- unsigned int exynos3250_jpeg_operating(void __iomem *regs)
- {
- return readl(regs + S5P_JPGOPR) & EXYNOS3250_JPGOPR_MASK;
- }
- unsigned int exynos3250_jpeg_compressed_size(void __iomem *regs)
- {
- return readl(regs + EXYNOS3250_JPGCNT) & EXYNOS3250_JPGCNT_MASK;
- }
- void exynos3250_jpeg_dec_stream_size(void __iomem *regs,
- unsigned int size)
- {
- writel(size & EXYNOS3250_DEC_STREAM_MASK,
- regs + EXYNOS3250_DEC_STREAM_SIZE);
- }
- void exynos3250_jpeg_dec_scaling_ratio(void __iomem *regs,
- unsigned int sratio)
- {
- switch (sratio) {
- case 1:
- default:
- sratio = EXYNOS3250_DEC_SCALE_FACTOR_8_8;
- break;
- case 2:
- sratio = EXYNOS3250_DEC_SCALE_FACTOR_4_8;
- break;
- case 4:
- sratio = EXYNOS3250_DEC_SCALE_FACTOR_2_8;
- break;
- case 8:
- sratio = EXYNOS3250_DEC_SCALE_FACTOR_1_8;
- break;
- }
- writel(sratio & EXYNOS3250_DEC_SCALE_FACTOR_MASK,
- regs + EXYNOS3250_DEC_SCALING_RATIO);
- }
- void exynos3250_jpeg_set_timer(void __iomem *regs, unsigned int time_value)
- {
- time_value &= EXYNOS3250_TIMER_INIT_MASK;
- writel(EXYNOS3250_TIMER_INT_STAT | time_value,
- regs + EXYNOS3250_TIMER_SE);
- }
- unsigned int exynos3250_jpeg_get_timer_status(void __iomem *regs)
- {
- return readl(regs + EXYNOS3250_TIMER_ST);
- }
- void exynos3250_jpeg_clear_timer_status(void __iomem *regs)
- {
- writel(EXYNOS3250_TIMER_INT_STAT, regs + EXYNOS3250_TIMER_ST);
- }
|