2012-08-14 17:31:16 -03:00
/* linux/drivers/media/platform/s5p-jpeg/jpeg-hw.h
2011-11-24 11:15:23 -03:00
*
* Copyright ( c ) 2011 Samsung Electronics Co . , Ltd .
* http : //www.samsung.com
*
* Author : Andrzej Pietrasiewicz < andrzej . p @ 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>
2012-02-17 11:39:36 -03:00
# include <linux/videodev2.h>
2011-11-24 11:15:23 -03:00
2013-12-18 09:32:50 -03:00
# include "jpeg-core.h"
2011-11-24 11:15:23 -03:00
# include "jpeg-regs.h"
2013-12-18 09:32:50 -03:00
# include "jpeg-hw-s5p.h"
2011-11-24 11:15:23 -03:00
2013-12-18 09:32:50 -03:00
void s5p_jpeg_reset ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
writel ( 1 , regs + S5P_JPG_SW_RESET ) ;
reg = readl ( regs + S5P_JPG_SW_RESET ) ;
/* no other way but polling for when JPEG IP becomes operational */
while ( reg ! = 0 ) {
cpu_relax ( ) ;
reg = readl ( regs + S5P_JPG_SW_RESET ) ;
}
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_poweron ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
writel ( S5P_POWER_ON , regs + S5P_JPGCLKCON ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_input_raw_mode ( void __iomem * regs , unsigned long mode )
2011-11-24 11:15:23 -03:00
{
unsigned long reg , m ;
m = S5P_MOD_SEL_565 ;
if ( mode = = S5P_JPEG_RAW_IN_565 )
m = S5P_MOD_SEL_565 ;
else if ( mode = = S5P_JPEG_RAW_IN_422 )
m = S5P_MOD_SEL_422 ;
reg = readl ( regs + S5P_JPGCMOD ) ;
reg & = ~ S5P_MOD_SEL_MASK ;
reg | = m ;
writel ( reg , regs + S5P_JPGCMOD ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_proc_mode ( void __iomem * regs , unsigned long mode )
2011-11-24 11:15:23 -03:00
{
unsigned long reg , m ;
m = S5P_PROC_MODE_DECOMPR ;
if ( mode = = S5P_JPEG_ENCODE )
m = S5P_PROC_MODE_COMPR ;
else
m = S5P_PROC_MODE_DECOMPR ;
reg = readl ( regs + S5P_JPGMOD ) ;
reg & = ~ S5P_PROC_MODE_MASK ;
reg | = m ;
writel ( reg , regs + S5P_JPGMOD ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_subsampling_mode ( void __iomem * regs , unsigned int mode )
2011-11-24 11:15:23 -03:00
{
unsigned long reg , m ;
2012-02-17 11:39:36 -03:00
if ( mode = = V4L2_JPEG_CHROMA_SUBSAMPLING_420 )
2011-11-24 11:15:23 -03:00
m = S5P_SUBSAMPLING_MODE_420 ;
2012-02-17 11:39:36 -03:00
else
m = S5P_SUBSAMPLING_MODE_422 ;
2011-11-24 11:15:23 -03:00
reg = readl ( regs + S5P_JPGMOD ) ;
reg & = ~ S5P_SUBSAMPLING_MODE_MASK ;
reg | = m ;
writel ( reg , regs + S5P_JPGMOD ) ;
}
2013-12-18 09:32:50 -03:00
unsigned int s5p_jpeg_get_subsampling_mode ( void __iomem * regs )
2012-02-17 11:39:36 -03:00
{
return readl ( regs + S5P_JPGMOD ) & S5P_SUBSAMPLING_MODE_MASK ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_dri ( void __iomem * regs , unsigned int dri )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPGDRI_U ) ;
reg & = ~ 0xff ;
reg | = ( dri > > 8 ) & 0xff ;
writel ( reg , regs + S5P_JPGDRI_U ) ;
reg = readl ( regs + S5P_JPGDRI_L ) ;
reg & = ~ 0xff ;
reg | = dri & 0xff ;
writel ( reg , regs + S5P_JPGDRI_L ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_qtbl ( void __iomem * regs , unsigned int t , unsigned int n )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPG_QTBL ) ;
reg & = ~ S5P_QT_NUMt_MASK ( t ) ;
reg | = ( n < < S5P_QT_NUMt_SHIFT ( t ) ) & S5P_QT_NUMt_MASK ( t ) ;
writel ( reg , regs + S5P_JPG_QTBL ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_htbl_ac ( void __iomem * regs , unsigned int t )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPG_HTBL ) ;
reg & = ~ S5P_HT_NUMt_AC_MASK ( t ) ;
/* this driver uses table 0 for all color components */
reg | = ( 0 < < S5P_HT_NUMt_AC_SHIFT ( t ) ) & S5P_HT_NUMt_AC_MASK ( t ) ;
writel ( reg , regs + S5P_JPG_HTBL ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_htbl_dc ( void __iomem * regs , unsigned int t )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPG_HTBL ) ;
reg & = ~ S5P_HT_NUMt_DC_MASK ( t ) ;
/* this driver uses table 0 for all color components */
reg | = ( 0 < < S5P_HT_NUMt_DC_SHIFT ( t ) ) & S5P_HT_NUMt_DC_MASK ( t ) ;
writel ( reg , regs + S5P_JPG_HTBL ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_y ( void __iomem * regs , unsigned int y )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPGY_U ) ;
reg & = ~ 0xff ;
reg | = ( y > > 8 ) & 0xff ;
writel ( reg , regs + S5P_JPGY_U ) ;
reg = readl ( regs + S5P_JPGY_L ) ;
reg & = ~ 0xff ;
reg | = y & 0xff ;
writel ( reg , regs + S5P_JPGY_L ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_x ( void __iomem * regs , unsigned int x )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPGX_U ) ;
reg & = ~ 0xff ;
reg | = ( x > > 8 ) & 0xff ;
writel ( reg , regs + S5P_JPGX_U ) ;
reg = readl ( regs + S5P_JPGX_L ) ;
reg & = ~ 0xff ;
reg | = x & 0xff ;
writel ( reg , regs + S5P_JPGX_L ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_rst_int_enable ( void __iomem * regs , bool enable )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPGINTSE ) ;
reg & = ~ S5P_RSTm_INT_EN_MASK ;
if ( enable )
reg | = S5P_RSTm_INT_EN ;
writel ( reg , regs + S5P_JPGINTSE ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_data_num_int_enable ( void __iomem * regs , bool enable )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPGINTSE ) ;
reg & = ~ S5P_DATA_NUM_INT_EN_MASK ;
if ( enable )
reg | = S5P_DATA_NUM_INT_EN ;
writel ( reg , regs + S5P_JPGINTSE ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_final_mcu_num_int_enable ( void __iomem * regs , bool enbl )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPGINTSE ) ;
reg & = ~ S5P_FINAL_MCU_NUM_INT_EN_MASK ;
if ( enbl )
reg | = S5P_FINAL_MCU_NUM_INT_EN ;
writel ( reg , regs + S5P_JPGINTSE ) ;
}
2013-12-18 09:32:50 -03:00
int s5p_jpeg_timer_stat ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
return ( int ) ( ( readl ( regs + S5P_JPG_TIMER_ST ) & S5P_TIMER_INT_STAT_MASK )
> > S5P_TIMER_INT_STAT_SHIFT ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_clear_timer_stat ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPG_TIMER_SE ) ;
reg & = ~ S5P_TIMER_INT_STAT_MASK ;
writel ( reg , regs + S5P_JPG_TIMER_SE ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_enc_stream_int ( void __iomem * regs , unsigned long size )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPG_ENC_STREAM_INTSE ) ;
reg & = ~ S5P_ENC_STREAM_BOUND_MASK ;
reg | = S5P_ENC_STREAM_INT_EN ;
reg | = size & S5P_ENC_STREAM_BOUND_MASK ;
writel ( reg , regs + S5P_JPG_ENC_STREAM_INTSE ) ;
}
2013-12-18 09:32:50 -03:00
int s5p_jpeg_enc_stream_stat ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
return ( int ) ( readl ( regs + S5P_JPG_ENC_STREAM_INTST ) &
S5P_ENC_STREAM_INT_STAT_MASK ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_clear_enc_stream_stat ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
unsigned long reg ;
reg = readl ( regs + S5P_JPG_ENC_STREAM_INTSE ) ;
reg & = ~ S5P_ENC_STREAM_INT_MASK ;
writel ( reg , regs + S5P_JPG_ENC_STREAM_INTSE ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_outform_raw ( void __iomem * regs , unsigned long format )
2011-11-24 11:15:23 -03:00
{
unsigned long reg , f ;
f = S5P_DEC_OUT_FORMAT_422 ;
if ( format = = S5P_JPEG_RAW_OUT_422 )
f = S5P_DEC_OUT_FORMAT_422 ;
else if ( format = = S5P_JPEG_RAW_OUT_420 )
f = S5P_DEC_OUT_FORMAT_420 ;
reg = readl ( regs + S5P_JPG_OUTFORM ) ;
reg & = ~ S5P_DEC_OUT_FORMAT_MASK ;
reg | = f ;
writel ( reg , regs + S5P_JPG_OUTFORM ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_jpgadr ( void __iomem * regs , unsigned long addr )
2011-11-24 11:15:23 -03:00
{
writel ( addr , regs + S5P_JPG_JPGADR ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_imgadr ( void __iomem * regs , unsigned long addr )
2011-11-24 11:15:23 -03:00
{
writel ( addr , regs + S5P_JPG_IMGADR ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_coef ( void __iomem * regs , unsigned int i ,
2011-11-24 11:15:23 -03:00
unsigned int j , unsigned int coef )
{
unsigned long reg ;
reg = readl ( regs + S5P_JPG_COEF ( i ) ) ;
reg & = ~ S5P_COEFn_MASK ( j ) ;
reg | = ( coef < < S5P_COEFn_SHIFT ( j ) ) & S5P_COEFn_MASK ( j ) ;
writel ( reg , regs + S5P_JPG_COEF ( i ) ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_start ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
writel ( 1 , regs + S5P_JSTART ) ;
}
2013-12-18 09:32:50 -03:00
int s5p_jpeg_result_stat_ok ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
return ( int ) ( ( readl ( regs + S5P_JPGINTST ) & S5P_RESULT_STAT_MASK )
> > S5P_RESULT_STAT_SHIFT ) ;
}
2013-12-18 09:32:50 -03:00
int s5p_jpeg_stream_stat_ok ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
return ! ( int ) ( ( readl ( regs + S5P_JPGINTST ) & S5P_STREAM_STAT_MASK )
> > S5P_STREAM_STAT_SHIFT ) ;
}
2013-12-18 09:32:50 -03:00
void s5p_jpeg_clear_int ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
2014-08-26 11:23:58 -03:00
readl ( regs + S5P_JPGINTST ) ;
2011-11-24 11:15:23 -03:00
writel ( S5P_INT_RELEASE , regs + S5P_JPGCOM ) ;
2014-09-01 10:05:49 -03:00
readl ( regs + S5P_JPGOPR ) ;
2011-11-24 11:15:23 -03:00
}
2013-12-18 09:32:50 -03:00
unsigned int s5p_jpeg_compressed_size ( void __iomem * regs )
2011-11-24 11:15:23 -03:00
{
unsigned long jpeg_size = 0 ;
jpeg_size | = ( readl ( regs + S5P_JPGCNT_U ) & 0xff ) < < 16 ;
jpeg_size | = ( readl ( regs + S5P_JPGCNT_M ) & 0xff ) < < 8 ;
jpeg_size | = ( readl ( regs + S5P_JPGCNT_L ) & 0xff ) ;
return ( unsigned int ) jpeg_size ;
}