12c3fb08b3f74b8792004095a1f6881a3296ff643Mauro Carvalho Chehab/* linux/drivers/media/platform/s5p-jpeg/jpeg-hw.h 2bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * 3bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * Copyright (c) 2011 Samsung Electronics Co., Ltd. 4bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * http://www.samsung.com 5bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * 6bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 7bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * 8bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * This program is free software; you can redistribute it and/or modify 9bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * it under the terms of the GNU General Public License version 2 as 10bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz * published by the Free Software Foundation. 11bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz */ 12bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 13bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz#include <linux/io.h> 1415f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki#include <linux/videodev2.h> 15bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 169f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewski#include "jpeg-core.h" 17bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz#include "jpeg-regs.h" 189f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewski#include "jpeg-hw-s5p.h" 19bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 209f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_reset(void __iomem *regs) 21bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 22bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 23bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 24bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(1, regs + S5P_JPG_SW_RESET); 25bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_SW_RESET); 26bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz /* no other way but polling for when JPEG IP becomes operational */ 27bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz while (reg != 0) { 28bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz cpu_relax(); 29bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_SW_RESET); 30bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz } 31bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 32bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 339f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_poweron(void __iomem *regs) 34bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 35bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(S5P_POWER_ON, regs + S5P_JPGCLKCON); 36bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 37bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 389f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_input_raw_mode(void __iomem *regs, unsigned long mode) 39bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 40bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg, m; 41bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 42bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz m = S5P_MOD_SEL_565; 43bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz if (mode == S5P_JPEG_RAW_IN_565) 44bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz m = S5P_MOD_SEL_565; 45bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz else if (mode == S5P_JPEG_RAW_IN_422) 46bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz m = S5P_MOD_SEL_422; 47bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 48bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGCMOD); 49bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_MOD_SEL_MASK; 50bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= m; 51bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGCMOD); 52bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 53bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 549f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_input_raw_y16(void __iomem *regs, bool y16) 55bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 56bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 57bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 58bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGCMOD); 59bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz if (y16) 60bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= S5P_MODE_Y16; 61bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz else 62bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_MODE_Y16_MASK; 63bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGCMOD); 64bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 65bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 669f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_proc_mode(void __iomem *regs, unsigned long mode) 67bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 68bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg, m; 69bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 70bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz m = S5P_PROC_MODE_DECOMPR; 71bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz if (mode == S5P_JPEG_ENCODE) 72bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz m = S5P_PROC_MODE_COMPR; 73bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz else 74bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz m = S5P_PROC_MODE_DECOMPR; 75bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGMOD); 76bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_PROC_MODE_MASK; 77bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= m; 78bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGMOD); 79bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 80bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 819f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_subsampling_mode(void __iomem *regs, unsigned int mode) 82bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 83bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg, m; 84bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 8515f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki if (mode == V4L2_JPEG_CHROMA_SUBSAMPLING_420) 86bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz m = S5P_SUBSAMPLING_MODE_420; 8715f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki else 8815f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki m = S5P_SUBSAMPLING_MODE_422; 8915f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki 90bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGMOD); 91bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_SUBSAMPLING_MODE_MASK; 92bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= m; 93bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGMOD); 94bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 95bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 969f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiunsigned int s5p_jpeg_get_subsampling_mode(void __iomem *regs) 9715f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki{ 9815f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki return readl(regs + S5P_JPGMOD) & S5P_SUBSAMPLING_MODE_MASK; 9915f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki} 10015f4bc3b1f42ca73ad073d7390aa34fa358f02a3Sylwester Nawrocki 1019f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_dri(void __iomem *regs, unsigned int dri) 102bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 103bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 104bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 105bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGDRI_U); 106bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~0xff; 107bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= (dri >> 8) & 0xff; 108bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGDRI_U); 109bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 110bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGDRI_L); 111bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~0xff; 112bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= dri & 0xff; 113bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGDRI_L); 114bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 115bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 1169f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_qtbl(void __iomem *regs, unsigned int t, unsigned int n) 117bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 118bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 119bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 120bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_QTBL); 121bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_QT_NUMt_MASK(t); 122bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= (n << S5P_QT_NUMt_SHIFT(t)) & S5P_QT_NUMt_MASK(t); 123bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_QTBL); 124bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 125bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 1269f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_htbl_ac(void __iomem *regs, unsigned int t) 127bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 128bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 129bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 130bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_HTBL); 131bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_HT_NUMt_AC_MASK(t); 132bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz /* this driver uses table 0 for all color components */ 133bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= (0 << S5P_HT_NUMt_AC_SHIFT(t)) & S5P_HT_NUMt_AC_MASK(t); 134bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_HTBL); 135bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 136bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 1379f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_htbl_dc(void __iomem *regs, unsigned int t) 138bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 139bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 140bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 141bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_HTBL); 142bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_HT_NUMt_DC_MASK(t); 143bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz /* this driver uses table 0 for all color components */ 144bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= (0 << S5P_HT_NUMt_DC_SHIFT(t)) & S5P_HT_NUMt_DC_MASK(t); 145bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_HTBL); 146bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 147bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 1489f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_y(void __iomem *regs, unsigned int y) 149bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 150bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 151bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 152bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGY_U); 153bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~0xff; 154bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= (y >> 8) & 0xff; 155bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGY_U); 156bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 157bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGY_L); 158bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~0xff; 159bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= y & 0xff; 160bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGY_L); 161bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 162bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 1639f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_x(void __iomem *regs, unsigned int x) 164bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 165bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 166bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 167bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGX_U); 168bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~0xff; 169bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= (x >> 8) & 0xff; 170bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGX_U); 171bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 172bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGX_L); 173bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~0xff; 174bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= x & 0xff; 175bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGX_L); 176bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 177bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 1789f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_rst_int_enable(void __iomem *regs, bool enable) 179bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 180bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 181bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 182bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGINTSE); 183bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_RSTm_INT_EN_MASK; 184bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz if (enable) 185bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= S5P_RSTm_INT_EN; 186bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGINTSE); 187bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 188bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 1899f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_data_num_int_enable(void __iomem *regs, bool enable) 190bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 191bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 192bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 193bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGINTSE); 194bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_DATA_NUM_INT_EN_MASK; 195bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz if (enable) 196bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= S5P_DATA_NUM_INT_EN; 197bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGINTSE); 198bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 199bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2009f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_final_mcu_num_int_enable(void __iomem *regs, bool enbl) 201bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 202bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 203bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 204bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPGINTSE); 205bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_FINAL_MCU_NUM_INT_EN_MASK; 206bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz if (enbl) 207bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= S5P_FINAL_MCU_NUM_INT_EN; 208bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPGINTSE); 209bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 210bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2119f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_timer_enable(void __iomem *regs, unsigned long val) 212bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 213bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 214bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 215bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_TIMER_SE); 216bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= S5P_TIMER_INT_EN; 217bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_TIMER_INIT_MASK; 218bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= val & S5P_TIMER_INIT_MASK; 219bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_TIMER_SE); 220bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 221bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2229f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_timer_disable(void __iomem *regs) 223bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 224bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 225bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 226bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_TIMER_SE); 227bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_TIMER_INT_EN_MASK; 228bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_TIMER_SE); 229bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 230bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2319f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiint s5p_jpeg_timer_stat(void __iomem *regs) 232bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 233bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz return (int)((readl(regs + S5P_JPG_TIMER_ST) & S5P_TIMER_INT_STAT_MASK) 234bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz >> S5P_TIMER_INT_STAT_SHIFT); 235bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 236bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2379f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_clear_timer_stat(void __iomem *regs) 238bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 239bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 240bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 241bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_TIMER_SE); 242bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_TIMER_INT_STAT_MASK; 243bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_TIMER_SE); 244bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 245bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2469f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_enc_stream_int(void __iomem *regs, unsigned long size) 247bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 248bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 249bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 250bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE); 251bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_ENC_STREAM_BOUND_MASK; 252bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= S5P_ENC_STREAM_INT_EN; 253bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= size & S5P_ENC_STREAM_BOUND_MASK; 254bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE); 255bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 256bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2579f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiint s5p_jpeg_enc_stream_stat(void __iomem *regs) 258bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 259bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz return (int)(readl(regs + S5P_JPG_ENC_STREAM_INTST) & 260bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz S5P_ENC_STREAM_INT_STAT_MASK); 261bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 262bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2639f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_clear_enc_stream_stat(void __iomem *regs) 264bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 265bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 266bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 267bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_ENC_STREAM_INTSE); 268bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_ENC_STREAM_INT_MASK; 269bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_ENC_STREAM_INTSE); 270bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 271bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2729f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_outform_raw(void __iomem *regs, unsigned long format) 273bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 274bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg, f; 275bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 276bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz f = S5P_DEC_OUT_FORMAT_422; 277bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz if (format == S5P_JPEG_RAW_OUT_422) 278bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz f = S5P_DEC_OUT_FORMAT_422; 279bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz else if (format == S5P_JPEG_RAW_OUT_420) 280bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz f = S5P_DEC_OUT_FORMAT_420; 281bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_OUTFORM); 282bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_DEC_OUT_FORMAT_MASK; 283bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= f; 284bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_OUTFORM); 285bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 286bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2879f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_jpgadr(void __iomem *regs, unsigned long addr) 288bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 289bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(addr, regs + S5P_JPG_JPGADR); 290bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 291bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2929f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_imgadr(void __iomem *regs, unsigned long addr) 293bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 294bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(addr, regs + S5P_JPG_IMGADR); 295bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 296bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 2979f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_coef(void __iomem *regs, unsigned int i, 298bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned int j, unsigned int coef) 299bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 300bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long reg; 301bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 302bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg = readl(regs + S5P_JPG_COEF(i)); 303bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg &= ~S5P_COEFn_MASK(j); 304bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz reg |= (coef << S5P_COEFn_SHIFT(j)) & S5P_COEFn_MASK(j); 305bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(reg, regs + S5P_JPG_COEF(i)); 306bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 307bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 3089f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_start(void __iomem *regs) 309bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 310bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(1, regs + S5P_JSTART); 311bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 312bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 3139f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiint s5p_jpeg_result_stat_ok(void __iomem *regs) 314bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 315bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz return (int)((readl(regs + S5P_JPGINTST) & S5P_RESULT_STAT_MASK) 316bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz >> S5P_RESULT_STAT_SHIFT); 317bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 318bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 3199f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiint s5p_jpeg_stream_stat_ok(void __iomem *regs) 320bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 321bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz return !(int)((readl(regs + S5P_JPGINTST) & S5P_STREAM_STAT_MASK) 322bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz >> S5P_STREAM_STAT_SHIFT); 323bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 324bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 3259f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskivoid s5p_jpeg_clear_int(void __iomem *regs) 326bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 327c438269948c420518101a836b526f71d389f80ddMauro Carvalho Chehab readl(regs + S5P_JPGINTST); 328bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz writel(S5P_INT_RELEASE, regs + S5P_JPGCOM); 3290cd9b21ed5453055752e7f8ef4887fbc409b77dcJacek Anaszewski readl(regs + S5P_JPGOPR); 330bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 331bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 3329f7b62d9f961e0a839de7dc5547db0f5a612cfd4Jacek Anaszewskiunsigned int s5p_jpeg_compressed_size(void __iomem *regs) 333bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz{ 334bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz unsigned long jpeg_size = 0; 335bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 336bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz jpeg_size |= (readl(regs + S5P_JPGCNT_U) & 0xff) << 16; 337bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz jpeg_size |= (readl(regs + S5P_JPGCNT_M) & 0xff) << 8; 338bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz jpeg_size |= (readl(regs + S5P_JPGCNT_L) & 0xff); 339bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz 340bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz return (unsigned int)jpeg_size; 341bb677f3ac434cb1708938f1e76a41d9098affd05Andrzej Pietrasiewicz} 342