diff options
Diffstat (limited to 'drivers/media/video/samsung/jpeg_v2x')
-rw-r--r-- | drivers/media/video/samsung/jpeg_v2x/jpeg_conf.h | 44 | ||||
-rw-r--r-- | drivers/media/video/samsung/jpeg_v2x/jpeg_dev.c | 29 | ||||
-rw-r--r-- | drivers/media/video/samsung/jpeg_v2x/jpeg_mem.h | 5 | ||||
-rw-r--r-- | drivers/media/video/samsung/jpeg_v2x/jpeg_regs.c | 103 | ||||
-rw-r--r-- | drivers/media/video/samsung/jpeg_v2x/jpeg_regs.h | 2 |
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); |