/** * ispresizer_config_size - Configures input and output image size. * @pipe: Resizer data path parameters. * * Configures the appropriate values stored in the isp_res structure in the * resizer registers. * * Returns 0 if successful, or -EINVAL if passed values haven't been verified * with ispresizer_try_size() previously. **/ int ispresizer_s_pipeline(struct isp_res_device *isp_res, struct isp_node *pipe) { struct device *dev = to_device(isp_res); int bpp = ISP_BYTES_PER_PIXEL; ispresizer_set_source(isp_res, pipe->in.path); ispresizer_set_intype(isp_res, pipe->in.path); ispresizer_set_start_phase(dev, NULL); ispresizer_set_luma_enhance(dev, NULL); if (pipe->in.image.pixelformat == V4L2_PIX_FMT_YUYV) ispresizer_config_ycpos(isp_res, 1); else ispresizer_config_ycpos(isp_res, 0); ispresizer_try_pipeline(isp_res, pipe); ispresizer_set_ratio(dev, isp_res->h_resz, isp_res->v_resz); ispresizer_set_coeffs(dev, NULL, isp_res->h_resz, isp_res->v_resz); /* Switch filter, releated to up/down scale */ if (ispresizer_is_upscale(pipe)) ispresizer_enable_cbilin(isp_res, 1); else ispresizer_enable_cbilin(isp_res, 0); /* Set input and output size */ ispresizer_set_input_size(dev, isp_res->phy_rect.width, isp_res->phy_rect.height); ispresizer_set_output_size(dev, pipe->out.image.width, pipe->out.image.height); /* Set input address and line offset address */ if (pipe->in.path != RSZ_OTFLY_YUV) { /* Set the input address, plus calculated crop offset */ ispresizer_set_inaddr(isp_res, isp_res->in_buff_addr, pipe); /* Set the input line offset/length */ ispresizer_set_in_offset(isp_res, pipe->in.image.bytesperline); } else { /* Set the input address.*/ ispresizer_set_inaddr(isp_res, 0, NULL); /* Set the starting pixel offset */ ispresizer_set_start(dev, isp_res->phy_rect.left * bpp, isp_res->phy_rect.top); ispresizer_set_in_offset(isp_res, 0); } /* Set output line offset */ ispresizer_set_out_offset(isp_res, pipe->out.image.bytesperline); return 0; }
/** * ispresizer_config_datapath - Specifies which input to use in resizer module * @input: Indicates the module that gives the image to resizer. * * Sets up the default resizer configuration according to the arguments. * * Returns 0 if successful, or -1 if an unsupported input was requested. **/ int ispresizer_config_datapath(enum ispresizer_input input) { u32 cnt = 0; DPRINTK_ISPRESZ("ispresizer_config_datapath()+\n"); ispres_obj.resinput = input; switch (input) { case RSZ_OTFLY_YUV: cnt &= ~ISPRSZ_CNT_INPTYP; cnt &= ~ISPRSZ_CNT_INPSRC; ispresizer_set_inaddr(0); ispresizer_config_inlineoffset(0); break; case RSZ_MEM_YUV: cnt |= ISPRSZ_CNT_INPSRC; cnt &= ~ISPRSZ_CNT_INPTYP; break; case RSZ_MEM_COL8: cnt |= ISPRSZ_CNT_INPSRC; cnt |= ISPRSZ_CNT_INPTYP; break; default: DPRINTK_ISPRESZ( "ISP_ERR : Wrong Input\n"); return -1; } isp_reg_or(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT, cnt); //ispresizer_config_ycpos(0); ispresizer_config_ycpos(1); ispresizer_config_filter_coef(&ispreszdefcoef); ispresizer_enable_cbilin(0); ispresizer_config_luma_enhance(&ispreszdefaultyenh); DPRINTK_ISPRESZ("ispresizer_config_datapath()-\n"); return 0; }
/** * ispresizer_applycrop - Apply crop to input image. **/ void ispresizer_applycrop(struct isp_res_device *isp_res) { struct isp_device *isp = to_isp_device(isp_res); struct isp_node *pipe = &isp->pipeline.rsz; int bpp = ISP_BYTES_PER_PIXEL; if (!isp_res->applycrop) return; ispresizer_set_ratio(isp->dev, isp_res->h_resz, isp_res->v_resz); ispresizer_set_coeffs(isp->dev, NULL, isp_res->h_resz, isp_res->v_resz); /* Switch filter, releated to up/down scale */ if (ispresizer_is_upscale(pipe)) ispresizer_enable_cbilin(isp_res, 1); else ispresizer_enable_cbilin(isp_res, 0); /* Set input and output size */ ispresizer_set_input_size(isp->dev, isp_res->phy_rect.width, isp_res->phy_rect.height); ispresizer_set_output_size(isp->dev, pipe->out.image.width, pipe->out.image.height); /* Set input address and line offset address */ if (pipe->in.path != RSZ_OTFLY_YUV) { /* Set the input address, plus calculated crop offset */ ispresizer_set_inaddr(isp_res, isp_res->in_buff_addr, pipe); /* Set the input line offset/length */ ispresizer_set_in_offset(isp_res, pipe->in.image.bytesperline); } else { /* Set the input address.*/ ispresizer_set_inaddr(isp_res, 0, NULL); /* Set the starting pixel offset */ ispresizer_set_start(isp->dev, isp_res->phy_rect.left * bpp, isp_res->phy_rect.top); ispresizer_set_in_offset(isp_res, 0); } /* Set output line offset */ ispresizer_set_out_offset(isp_res, pipe->out.image.bytesperline); isp_res->applycrop = 0; }
/** * ispresizer_config_datapath - Specifies which input to use in resizer module * @input: Indicates the module that gives the image to resizer. * * Sets up the default resizer configuration according to the arguments. * * Returns 0 if successful, or -EINVAL if an unsupported input was requested. **/ int ispresizer_config_datapath(enum ispresizer_input input) { u32 cnt = 0; DPRINTK_ISPRESZ("ispresizer_config_datapath()+\n"); ispres_obj.resinput = input; switch (input) { case RSZ_OTFLY_YUV: cnt &= ~ISPRSZ_CNT_INPTYP; cnt &= ~ISPRSZ_CNT_INPSRC; ispresizer_set_inaddr(0); ispresizer_config_inlineoffset(0); break; case RSZ_MEM_YUV: cnt |= ISPRSZ_CNT_INPSRC; cnt &= ~ISPRSZ_CNT_INPTYP; break; case RSZ_MEM_COL8: cnt |= ISPRSZ_CNT_INPSRC; cnt |= ISPRSZ_CNT_INPTYP; break; default: printk(KERN_ERR "ISP_ERR : Wrong Input\n"); return -EINVAL; } isp_reg_or(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT, cnt); /* Use bilinear interpolation for upsampling per TRM */ if (ispres_obj.outputwidth > ispres_obj.inputwidth) ispresizer_enable_cbilin(1); else ispresizer_enable_cbilin(0); ispresizer_config_ycpos(0); ispresizer_config_filter_coef(&ispreszdefcoef); ispresizer_config_luma_enhance(&ispreszdefaultyenh); DPRINTK_ISPRESZ("ispresizer_config_datapath()-\n"); return 0; }