aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/samsung/jpeg_v2x
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/samsung/jpeg_v2x')
-rw-r--r--drivers/media/video/samsung/jpeg_v2x/jpeg_conf.h44
-rw-r--r--drivers/media/video/samsung/jpeg_v2x/jpeg_dev.c29
-rw-r--r--drivers/media/video/samsung/jpeg_v2x/jpeg_mem.h5
-rw-r--r--drivers/media/video/samsung/jpeg_v2x/jpeg_regs.c103
-rw-r--r--drivers/media/video/samsung/jpeg_v2x/jpeg_regs.h2
5 files changed, 137 insertions, 46 deletions
diff --git a/drivers/media/video/samsung/jpeg_v2x/jpeg_conf.h b/drivers/media/video/samsung/jpeg_v2x/jpeg_conf.h
index 6fcc276..086c20a 100644
--- a/drivers/media/video/samsung/jpeg_v2x/jpeg_conf.h
+++ b/drivers/media/video/samsung/jpeg_v2x/jpeg_conf.h
@@ -15,27 +15,37 @@
/* Q-table for JPEG */
/* ITU standard Q-table */
-const unsigned int ITU_Q_tbl[4][16] = {
+const unsigned int ITU_Q_tbl[6][16] = {
{
- 0x01010101, 0x01020303, 0x01010101, 0x01030303, /* Y */
- 0x01010101, 0x02030303, 0x01010101, 0x03040403,
- 0x01010203, 0x03050504, 0x01020303, 0x04050605,
- 0x02030404, 0x05060605, 0x04050505, 0x06050505
+ 0x06030303, 0x07070706, 0x03030303, 0x08080804, /* Y QF:97 */
+ 0x01010101, 0x03040303, 0x03010101, 0x04050503,
+ 0x03030101, 0x05060704, 0x04030301, 0x06070605,
+ 0x05050403, 0x06070706, 0x06060604, 0x06070707
} , {
- 0x01010102, 0x05050505, 0x01010103, 0x05050505, /* CbCr */
- 0x01010503, 0x05050505, 0x02030505, 0x05050505,
- 0x05050505, 0x05050505, 0x05050505, 0x05050505,
- 0x05050505, 0x05050505, 0x05050505, 0x05050505
+ 0x06030303, 0x07070706, 0x04030303, 0x08080806, /* CbCr QF:97 */
+ 0x06030301, 0x06060606, 0x06060403, 0x06060606,
+ 0x06060606, 0x06060606, 0x06060606, 0x06060606,
+ 0x06060606, 0x06060606, 0x06060606, 0x06060606
} , {
- 0x05020205, 0x0a161e25, 0x02020307, 0x0c232521, /* Y */
- 0x0302050a, 0x16222b22, 0x0305090e, 0x1e393326,
- 0x06091422, 0x2a384431, 0x0a122118, 0x34454b3c,
- 0x1d283238, 0x44525142, 0x2d3c3e40, 0x4a424441
+ 0x06030303, 0x0a080706, 0x03030303, 0x090a0904, /* Y QF:92 */
+ 0x04030303, 0x090b0906, 0x05040303, 0x0a0d0e08,
+ 0x09060403, 0x0c10110d, 0x0a090604, 0x0f12110d,
+ 0x0e0c0a08, 0x10131310, 0x100f0f0c, 0x10101012
} , {
- 0x05020205, 0x251e160a, 0x07030202, 0x2125230c, /* CbCr */
- 0x0a050203, 0x222b2216, 0x0e090503, 0x2633391e,
- 0x22140906, 0x3144382a, 0x1821120a, 0x3c4b4534,
- 0x3832281d, 0x42515244, 0x403e3c2d, 0x4144424a
+ 0x08040303, 0x10101010, 0x0b040303, 0x10101010, /* CbCr QF:92 */
+ 0x10090404, 0x10101010, 0x10100b08, 0x10101010,
+ 0x10101010, 0x10101010, 0x10101010, 0x10101010,
+ 0x10101010, 0x10101010, 0x10101010, 0x10101010
+ } , {
+ 0x06030304, 0x0e0c0a06, 0x05030303, 0x0d0e0e06, /* Y QF:88 */
+ 0x06040303, 0x0d110e0a, 0x07050403, 0x0f13150c,
+ 0x0d090504, 0x12191a10, 0x0f0d0806, 0x161b1913,
+ 0x15130f0c, 0x181d1d19, 0x18171611, 0x1819181b
+ } , {
+ 0x0b060404, 0x18181818, 0x10060504, 0x18181818, /* CbCr QF:88 */
+ 0x180d0606, 0x18181818, 0x1818100b, 0x18181818,
+ 0x18181818, 0x18181818, 0x18181818, 0x18181818,
+ 0x18181818, 0x18181818, 0x18181818, 0x18181818
}
};
diff --git a/drivers/media/video/samsung/jpeg_v2x/jpeg_dev.c b/drivers/media/video/samsung/jpeg_v2x/jpeg_dev.c
index 1e6b085..eb026ab 100644
--- a/drivers/media/video/samsung/jpeg_v2x/jpeg_dev.c
+++ b/drivers/media/video/samsung/jpeg_v2x/jpeg_dev.c
@@ -504,7 +504,7 @@ static void jpeg_device_enc_run(void *priv)
jpeg_sw_reset(dev->reg_base);
jpeg_set_interrupt(dev->reg_base);
jpeg_set_huf_table_enable(dev->reg_base, 1);
- jpeg_set_enc_tbl(dev->reg_base);
+ jpeg_set_enc_tbl(dev->reg_base, enc_param.quality);
jpeg_set_encode_tbl_select(dev->reg_base, enc_param.quality);
jpeg_set_stream_size(dev->reg_base,
enc_param.in_width, enc_param.in_height);
@@ -893,12 +893,16 @@ static int jpeg_probe(struct platform_device *pdev)
#endif
#ifdef CONFIG_JPEG_V2_1
- dev->watchdog_workqueue = create_singlethread_workqueue(JPEG_NAME);
- INIT_WORK(&dev->watchdog_work, jpeg_watchdog_worker);
- atomic_set(&dev->watchdog_cnt, 0);
- init_timer(&dev->watchdog_timer);
- dev->watchdog_timer.data = (unsigned long)dev;
- dev->watchdog_timer.function = jpeg_watchdog;
+ dev->watchdog_workqueue = create_singlethread_workqueue(JPEG_NAME);
+ if (!dev->watchdog_workqueue) {
+ ret = -ENOMEM;
+ goto err_video_reg;
+ }
+ INIT_WORK(&dev->watchdog_work, jpeg_watchdog_worker);
+ atomic_set(&dev->watchdog_cnt, 0);
+ init_timer(&dev->watchdog_timer);
+ dev->watchdog_timer.data = (unsigned long)dev;
+ dev->watchdog_timer.function = jpeg_watchdog;
#endif
/* clock disable */
clk_disable(dev->clk);
@@ -1043,7 +1047,8 @@ static int jpeg_runtime_suspend(struct device *dev)
struct jpeg_dev *jpeg_drv = platform_get_drvdata(pdev);
#if defined(CONFIG_BUSFREQ_OPP) || defined(CONFIG_BUSFREQ_LOCK_WRAPPER)
/* lock bus frequency */
- dev_unlock(jpeg_drv->bus_dev, dev);
+ if (samsung_rev() < EXYNOS4412_REV_2_0)
+ dev_unlock(jpeg_drv->bus_dev, dev);
#endif
jpeg_drv->vb2->suspend(jpeg_drv->alloc_ctx);
/* clock disable */
@@ -1057,7 +1062,9 @@ static int jpeg_runtime_resume(struct device *dev)
struct jpeg_dev *jpeg_drv = platform_get_drvdata(pdev);
#if defined(CONFIG_BUSFREQ_OPP) || defined(CONFIG_BUSFREQ_LOCK_WRAPPER)
/* lock bus frequency */
- dev_lock(jpeg_drv->bus_dev, &jpeg_drv->plat_dev->dev, BUSFREQ_400MHZ);
+ if (samsung_rev() < EXYNOS4412_REV_2_0)
+ dev_lock(jpeg_drv->bus_dev,
+ &jpeg_drv->plat_dev->dev, BUSFREQ_400MHZ);
#endif
clk_enable(jpeg_drv->clk);
jpeg_drv->vb2->resume(jpeg_drv->alloc_ctx);
@@ -1104,9 +1111,7 @@ static int __init jpeg_init(void)
{
printk(KERN_CRIT "Initialize JPEG driver\n");
- platform_driver_register(&jpeg_driver);
-
- return 0;
+ return platform_driver_register(&jpeg_driver);
}
static void __exit jpeg_exit(void)
diff --git a/drivers/media/video/samsung/jpeg_v2x/jpeg_mem.h b/drivers/media/video/samsung/jpeg_v2x/jpeg_mem.h
index d912628..9336bb8 100644
--- a/drivers/media/video/samsung/jpeg_v2x/jpeg_mem.h
+++ b/drivers/media/video/samsung/jpeg_v2x/jpeg_mem.h
@@ -33,7 +33,12 @@ extern const struct jpeg_vb2 jpeg_vb2_cma;
extern const struct jpeg_vb2 jpeg_vb2_ion;
#endif
+#if defined(CONFIG_MACH_GC1)
+#define MAX_JPEG_WIDTH 4608
+#define MAX_JPEG_HEIGHT 3456
+#else
#define MAX_JPEG_WIDTH 3264
#define MAX_JPEG_HEIGHT 2448
+#endif
#endif /* __JPEG_MEM_H__ */
diff --git a/drivers/media/video/samsung/jpeg_v2x/jpeg_regs.c b/drivers/media/video/samsung/jpeg_v2x/jpeg_regs.c
index e3300cc..0c9bc4b 100644
--- a/drivers/media/video/samsung/jpeg_v2x/jpeg_regs.c
+++ b/drivers/media/video/samsung/jpeg_v2x/jpeg_regs.c
@@ -341,28 +341,99 @@ void jpeg_set_enc_out_fmt(void __iomem *base,
writel(reg, base + S5P_JPEG_IMG_FMT_REG);
}
-void jpeg_set_enc_tbl(void __iomem *base)
+void jpeg_set_enc_tbl(void __iomem *base,
+ enum jpeg_img_quality_level level)
{
int i;
- for (i = 0; i < 16; i++) {
- writel((unsigned int)ITU_Q_tbl[0][i],
- base + S5P_JPEG_QUAN_TBL_ENTRY_REG + (i*0x04));
- }
+ switch (level) {
+ case QUALITY_LEVEL_1:
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[0][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + (i*0x04));
+ }
- for (i = 0; i < 16; i++) {
- writel((unsigned int)ITU_Q_tbl[1][i],
- base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x40 + (i*0x04));
- }
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[1][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x40 + (i*0x04));
+ }
- for (i = 0; i < 16; i++) {
- writel((unsigned int)ITU_Q_tbl[2][i],
- base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x80 + (i*0x04));
- }
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[0][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x80 + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[1][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0xc0 + (i*0x04));
+ }
+ break;
+
+ case QUALITY_LEVEL_2:
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[2][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[3][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x40 + (i*0x04));
+ }
- for (i = 0; i < 16; i++) {
- writel((unsigned int)ITU_Q_tbl[3][i],
- base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0xc0 + (i*0x04));
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[2][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x80 + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[3][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0xc0 + (i*0x04));
+ }
+ break;
+
+ case QUALITY_LEVEL_3:
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[4][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[5][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x40 + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[4][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x80 + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[5][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0xc0 + (i*0x04));
+ }
+ break;
+
+ default:
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[0][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[1][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x40 + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[0][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0x80 + (i*0x04));
+ }
+
+ for (i = 0; i < 16; i++) {
+ writel((unsigned int)ITU_Q_tbl[1][i],
+ base + S5P_JPEG_QUAN_TBL_ENTRY_REG + 0xc0 + (i*0x04));
+ }
+ break;
}
for (i = 0; i < 4; i++) {
diff --git a/drivers/media/video/samsung/jpeg_v2x/jpeg_regs.h b/drivers/media/video/samsung/jpeg_v2x/jpeg_regs.h
index 535a3f9..1dee4b2 100644
--- a/drivers/media/video/samsung/jpeg_v2x/jpeg_regs.h
+++ b/drivers/media/video/samsung/jpeg_v2x/jpeg_regs.h
@@ -23,7 +23,7 @@ void jpeg_set_enc_in_fmt(void __iomem *base,
enum jpeg_frame_format in_fmt);
void jpeg_set_enc_out_fmt(void __iomem *base,
enum jpeg_stream_format out_fmt);
-void jpeg_set_enc_tbl(void __iomem *base);
+void jpeg_set_enc_tbl(void __iomem *base, enum jpeg_img_quality_level level);
void jpeg_set_interrupt(void __iomem *base);
void jpeg_clean_interrupt(void __iomem *base);
unsigned int jpeg_get_int_status(void __iomem *base);