diff options
-rw-r--r-- | drivers/mxc/ipu3/ipu_device.c | 40 | ||||
-rw-r--r-- | drivers/mxc/ipu3/ipu_ic.c | 29 | ||||
-rw-r--r-- | include/linux/ipu.h | 60 |
3 files changed, 101 insertions, 28 deletions
diff --git a/drivers/mxc/ipu3/ipu_device.c b/drivers/mxc/ipu3/ipu_device.c index 4c98d4c7edd3..4ac6fc77ca79 100644 --- a/drivers/mxc/ipu3/ipu_device.c +++ b/drivers/mxc/ipu3/ipu_device.c @@ -374,6 +374,46 @@ static int mxc_ipu_ioctl(struct inode *inode, struct file *file, ret = 0; } break; + case IPU_CALC_STRIPES_SIZE: + { + ipu_stripe_parm stripe_parm; + + if (copy_from_user (&stripe_parm, (ipu_stripe_parm *)arg, + sizeof(ipu_stripe_parm))) + return -EFAULT; + ipu_calc_stripes_sizes(stripe_parm.input_width, + stripe_parm.output_width, + stripe_parm.maximal_stripe_width, + stripe_parm.cirr, + stripe_parm.equal_stripes, + stripe_parm.input_pixelformat, + stripe_parm.output_pixelformat, + &stripe_parm.left, + &stripe_parm.right); + if (copy_to_user((ipu_stripe_parm *) arg, &stripe_parm, + sizeof(ipu_stripe_parm)) > 0) + return -EFAULT; + } + break; + case IPU_UPDATE_BUF_OFFSET: + { + ipu_buf_offset_parm offset_parm; + + if (copy_from_user (&offset_parm, (ipu_buf_offset_parm *)arg, + sizeof(ipu_buf_offset_parm))) + return -EFAULT; + ret = ipu_update_channel_offset(offset_parm.channel, + offset_parm.type, + offset_parm.pixel_fmt, + offset_parm.width, + offset_parm.height, + offset_parm.stride, + offset_parm.u_offset, + offset_parm.v_offset, + offset_parm.vertical_offset, + offset_parm.horizontal_offset); + } + break; default: break; } diff --git a/drivers/mxc/ipu3/ipu_ic.c b/drivers/mxc/ipu3/ipu_ic.c index 1a4bda3f071a..564fab0b699a 100644 --- a/drivers/mxc/ipu3/ipu_ic.c +++ b/drivers/mxc/ipu3/ipu_ic.c @@ -226,10 +226,14 @@ void _ipu_ic_init_prpvf(ipu_channel_params_t *params, bool src_is_csi) reg = (downsizeCoeff << 30) | (resizeCoeff << 16); /* Setup horizontal resizing */ - _calc_resize_coeffs(params->mem_prp_vf_mem.in_width, - params->mem_prp_vf_mem.out_width, - &resizeCoeff, &downsizeCoeff); - reg |= (downsizeCoeff << 14) | resizeCoeff; + /* Upadeted for IC split case */ + if (!(params->mem_prp_vf_mem.out_resize_ratio)) { + _calc_resize_coeffs(params->mem_prp_vf_mem.in_width, + params->mem_prp_vf_mem.out_width, + &resizeCoeff, &downsizeCoeff); + reg |= (downsizeCoeff << 14) | resizeCoeff; + } else + reg |= params->mem_prp_vf_mem.out_resize_ratio; __raw_writel(reg, IC_PRP_VF_RSC); @@ -344,10 +348,14 @@ void _ipu_ic_init_prpenc(ipu_channel_params_t *params, bool src_is_csi) reg = (downsizeCoeff << 30) | (resizeCoeff << 16); /* Setup horizontal resizing */ - _calc_resize_coeffs(params->mem_prp_enc_mem.in_width, - params->mem_prp_enc_mem.out_width, - &resizeCoeff, &downsizeCoeff); - reg |= (downsizeCoeff << 14) | resizeCoeff; + /* Upadeted for IC split case */ + if (!(params->mem_prp_enc_mem.out_resize_ratio)) { + _calc_resize_coeffs(params->mem_prp_enc_mem.in_width, + params->mem_prp_enc_mem.out_width, + &resizeCoeff, &downsizeCoeff); + reg |= (downsizeCoeff << 14) | resizeCoeff; + } else + reg |= params->mem_prp_enc_mem.out_resize_ratio; __raw_writel(reg, IC_PRP_ENC_RSC); @@ -416,14 +424,15 @@ void _ipu_ic_init_pp(ipu_channel_params_t *params) reg = (downsizeCoeff << 30) | (resizeCoeff << 16); /* Setup horizontal resizing */ - /* Upadeted for IC split case */ + /* Upadeted for IC split case */ if (!(params->mem_pp_mem.out_resize_ratio)) { _calc_resize_coeffs(params->mem_pp_mem.in_width, params->mem_pp_mem.out_width, &resizeCoeff, &downsizeCoeff); reg |= (downsizeCoeff << 14) | resizeCoeff; - } else + } else { reg |= params->mem_pp_mem.out_resize_ratio; + } __raw_writel(reg, IC_PP_RSC); diff --git a/include/linux/ipu.h b/include/linux/ipu.h index af2bb266244d..c9403280e11c 100644 --- a/include/linux/ipu.h +++ b/include/linux/ipu.h @@ -321,6 +321,7 @@ typedef union { uint32_t out_width; uint32_t out_height; uint32_t out_pixel_fmt; + uint32_t out_resize_ratio; } mem_prp_enc_mem; struct { uint32_t in_width; @@ -363,6 +364,7 @@ typedef union { uint32_t out_width; uint32_t out_height; uint32_t out_pixel_fmt; + uint32_t out_resize_ratio; bool graphics_combine_en; bool global_alpha_en; bool key_color_en; @@ -386,6 +388,7 @@ typedef union { uint32_t out_width; uint32_t out_height; uint32_t out_pixel_fmt; + uint32_t out_resize_ratio; bool graphics_combine_en; bool global_alpha_en; bool key_color_en; @@ -393,7 +396,6 @@ typedef union { uint8_t alpha; uint32_t key_color; bool alpha_chan_en; - uint32_t out_resize_ratio; } mem_pp_mem; struct { uint32_t temp; @@ -1013,6 +1015,30 @@ int ipu_open(void); int ipu_register_generic_isr(int irq, void *dev); void ipu_close(void); +/* two stripe calculations */ +struct stripe_param{ + unsigned int input_width; /* width of the input stripe */ + unsigned int output_width; /* width of the output stripe */ + unsigned int input_column; /* the first column on the input stripe */ + unsigned int output_column; /* the first column on the output stripe */ + unsigned int idr; + /* inverse downisizing ratio parameter; expressed as a power of 2 */ + unsigned int irr; + /* inverse resizing ratio parameter; expressed as a multiple of 2^-13 */ +}; + +typedef struct _ipu_stripe_parm { + unsigned int input_width; + unsigned int output_width; + unsigned int maximal_stripe_width; + unsigned long long cirr; + unsigned int equal_stripes; + u32 input_pixelformat; + u32 output_pixelformat; + struct stripe_param left; + struct stripe_param right; +} ipu_stripe_parm; + typedef struct _ipu_channel_parm { ipu_channel_t channel; ipu_channel_params_t params; @@ -1034,6 +1060,19 @@ typedef struct _ipu_channel_buf_parm { uint32_t bufNum; } ipu_channel_buf_parm; +typedef struct _ipu_buf_offset_parm { + ipu_channel_t channel; + ipu_buffer_t type; + uint32_t pixel_fmt; + uint16_t width; + uint16_t height; + uint16_t stride; + uint32_t u_offset; + uint32_t v_offset; + uint32_t vertical_offset; + uint32_t horizontal_offset; +} ipu_buf_offset_parm; + typedef struct _ipu_channel_link { ipu_channel_t src_ch; ipu_channel_t dest_ch; @@ -1207,22 +1246,8 @@ typedef struct _ipu_mem_info { #define IPU_ALOC_MEM _IOWR('I', 0x24, ipu_mem_info) #define IPU_FREE_MEM _IOW('I', 0x25, ipu_mem_info) #define IPU_IS_CHAN_BUSY _IOW('I', 0x26, ipu_channel_t) - - -/* two stripe calculations */ -struct stripe_param{ - unsigned int input_width; /* width of the input stripe */ - unsigned int output_width; /* width of the output stripe */ - unsigned int input_column; /* the first column on the input stripe */ - unsigned int output_column; /* the first column on the output stripe */ - unsigned int idr; - /* inverse downisizing ratio parameter; expressed as a power of 2 */ - unsigned int irr; - /* inverse resizing ratio parameter; expressed as a multiple of 2^-13 */ -}; - - - +#define IPU_CALC_STRIPES_SIZE _IOWR('I', 0x27, ipu_stripe_parm) +#define IPU_UPDATE_BUF_OFFSET _IOW('I', 0x28, ipu_buf_offset_parm) int ipu_calc_stripes_sizes(const unsigned int input_frame_width, unsigned int output_frame_width, @@ -1233,5 +1258,4 @@ int ipu_calc_stripes_sizes(const unsigned int input_frame_width, u32 output_pixelformat, struct stripe_param *left, struct stripe_param *right); - #endif |