/** * ispresizer_config_size - Configures input and output image size. * @input_w: input width for the resizer in number of pixels per line. * @input_h: input height for the resizer in number of lines. * @output_w: output width from the resizer in number of pixels per line. * @output_h: output height for the resizer in number of lines. * * 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_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h) { int i, j; u32 res; DPRINTK_ISPRESZ("ispresizer_config_size()+, input_w = %d,input_h =" " %d, output_w = %d, output_h" " = %d,hresz = %d,vresz = %d," " hcrop = %d, vcrop = %d," " hstph = %d, vstph = %d\n", ispres_obj.inputwidth, ispres_obj.inputheight, ispres_obj.outputwidth, ispres_obj.outputheight, ispres_obj.h_resz, ispres_obj.v_resz, ispres_obj.ipwd_crop, ispres_obj.ipht_crop, ispres_obj.h_startphase, ispres_obj.v_startphase); if ((output_w != ispres_obj.outputwidth) || (output_h != ispres_obj.outputheight)) { printk(KERN_ERR "Output parameters passed do not match the" " values calculated by the" " trysize passed w %d, h %d" " \n", output_w , output_h); return -EINVAL; } /* Set Resizer input address and offset adderss */ ispresizer_config_inlineoffset(isp_reg_readl(OMAP3_ISP_IOMEM_PREV, ISPPRV_WADD_OFFSET)); res = isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT) & ~(ISPRSZ_CNT_HSTPH_MASK | ISPRSZ_CNT_VSTPH_MASK); isp_reg_writel(res | (ispres_obj.h_startphase << ISPRSZ_CNT_HSTPH_SHIFT) | (ispres_obj.v_startphase << ISPRSZ_CNT_VSTPH_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT); /* Set start address for cropping */ isp_reg_writel(ispres_obj.tmp_buf + isp_get_buf_offset(), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INADD); /* isp_reg_writel( ((ispres_obj.ipwd_crop & 15) << ISPRSZ_IN_START_HORZ_ST_SHIFT) | (0x00 << ISPRSZ_IN_START_VERT_ST_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_START); */ isp_reg_writel((0x00 << ISPRSZ_IN_START_HORZ_ST_SHIFT) | (0x00 << ISPRSZ_IN_START_VERT_ST_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_START); isp_reg_writel((ispres_obj.inputwidth << ISPRSZ_IN_SIZE_HORZ_SHIFT) | (ispres_obj.inputheight << ISPRSZ_IN_SIZE_VERT_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_SIZE); if (!ispres_obj.algo) { isp_reg_writel((output_w << ISPRSZ_OUT_SIZE_HORZ_SHIFT) | (output_h << ISPRSZ_OUT_SIZE_VERT_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_OUT_SIZE); } else { isp_reg_writel(((output_w - 4) << ISPRSZ_OUT_SIZE_HORZ_SHIFT) | (output_h << ISPRSZ_OUT_SIZE_VERT_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_OUT_SIZE); } res = isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT) & ~(ISPRSZ_CNT_HRSZ_MASK | ISPRSZ_CNT_VRSZ_MASK); isp_reg_writel(res | ((ispres_obj.h_resz - 1) << ISPRSZ_CNT_HRSZ_SHIFT) | ((ispres_obj.v_resz - 1) << ISPRSZ_CNT_VRSZ_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT); /* write filter coefficients */ /* why not call isp_write_filter_coefs() ? */ if (ispres_obj.h_resz <= MID_RESIZE_VALUE) { j = 0; for (i = 0; i < 16; i++) { isp_reg_writel( (ispres_obj.coeflist.h_filter_coef_4tap[j] << ISPRSZ_HFILT10_COEF0_SHIFT) | (ispres_obj.coeflist.h_filter_coef_4tap[j + 1] << ISPRSZ_HFILT10_COEF1_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT10 + (i * 0x04)); j += 2; } } else { j = 0; for (i = 0; i < 16; i++) { if ((i + 1) % 4 == 0) { isp_reg_writel((ispres_obj.coeflist. h_filter_coef_7tap[j] << ISPRSZ_HFILT10_COEF0_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT10 + (i * 0x04)); j += 1; } else { isp_reg_writel((ispres_obj.coeflist. h_filter_coef_7tap[j] << ISPRSZ_HFILT10_COEF0_SHIFT) | (ispres_obj.coeflist. h_filter_coef_7tap[j+1] << ISPRSZ_HFILT10_COEF1_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT10 + (i * 0x04)); j += 2; } } } if (ispres_obj.v_resz <= MID_RESIZE_VALUE) { j = 0; for (i = 0; i < 16; i++) { isp_reg_writel((ispres_obj.coeflist. v_filter_coef_4tap[j] << ISPRSZ_VFILT10_COEF0_SHIFT) | (ispres_obj.coeflist. v_filter_coef_4tap[j + 1] << ISPRSZ_VFILT10_COEF1_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT10 + (i * 0x04)); j += 2; } } else { j = 0; for (i = 0; i < 16; i++) { if ((i + 1) % 4 == 0) { isp_reg_writel((ispres_obj.coeflist. v_filter_coef_7tap[j] << ISPRSZ_VFILT10_COEF0_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT10 + (i * 0x04)); j += 1; } else { isp_reg_writel((ispres_obj.coeflist. v_filter_coef_7tap[j] << ISPRSZ_VFILT10_COEF0_SHIFT) | (ispres_obj.coeflist. v_filter_coef_7tap[j+1] << ISPRSZ_VFILT10_COEF1_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT10 + (i * 0x04)); j += 2; } } } ispresizer_config_outlineoffset(output_w*2); DPRINTK_ISPRESZ("ispresizer_config_size()-\n"); return 0; }
/** * ispresizer_config_size - Configures input and output image size. * @input_w: input width for the resizer in number of pixels per line. * @input_h: input height for the resizer in number of lines. * @output_w: output width from the resizer in number of pixels per line. * @output_h: output height for the resizer in number of lines. * * Configures the appropriate values stored in the isp_res structure in the * resizer registers. * * Returns 0 if successful, or -1 if passed values haven't been verified * with ispresizer_try_size() previously. **/ int ispresizer_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h) { int i, j; u32 res; DPRINTK_ISPRESZ("ispresizer_config_size()+, input_w = %d,input_h =" " %d, output_w = %d, output_h" " = %d,hresz = %d,vresz = %d," " hcrop = %d, vcrop = %d," " hstph = %d, vstph = %d," "algo = %d\n", ispres_obj.inputwidth, ispres_obj.inputheight, ispres_obj.outputwidth, ispres_obj.outputheight, ispres_obj.h_resz, ispres_obj.v_resz, ispres_obj.ipwd_crop, ispres_obj.ipht_crop, ispres_obj.h_startphase, ispres_obj.v_startphase, ispres_obj.algo); if ((output_w != ispres_obj.outputwidth) || (output_h != ispres_obj.outputheight)) { DPRINTK_ISPRESZ( "Output parameters passed do not match the" " values calculated by the" " trysize passed w %d, h %d" " \n", output_w , output_h); return -1; } res = isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT) & ~(ISPRSZ_CNT_HSTPH_MASK | ISPRSZ_CNT_VSTPH_MASK); isp_reg_writel(res | (ispres_obj.h_startphase << ISPRSZ_CNT_HSTPH_SHIFT) | (ispres_obj.v_startphase << ISPRSZ_CNT_VSTPH_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT); isp_reg_writel(0,OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INADD); isp_reg_writel(0,OMAP3_ISP_IOMEM_RESZ, ISPRSZ_SDR_INOFF); isp_reg_writel( ((ispres_obj.ipwd_crop * 2 + 1) << ISPRSZ_IN_START_HORZ_ST_SHIFT) | (ispres_obj.ipht_crop << ISPRSZ_IN_START_VERT_ST_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_START); #if 0 isp_reg_writel((0x00 << ISPRSZ_IN_START_HORZ_ST_SHIFT) | (0x00 << ISPRSZ_IN_START_VERT_ST_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_START); #endif isp_reg_writel((ispres_obj.inputwidth << ISPRSZ_IN_SIZE_HORZ_SHIFT) | (ispres_obj.inputheight << ISPRSZ_IN_SIZE_VERT_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_IN_SIZE); if (!ispres_obj.algo) { isp_reg_writel((output_w << ISPRSZ_OUT_SIZE_HORZ_SHIFT) | (output_h << ISPRSZ_OUT_SIZE_VERT_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_OUT_SIZE); } else { isp_reg_writel(((output_w - 4) << ISPRSZ_OUT_SIZE_HORZ_SHIFT) | (output_h << ISPRSZ_OUT_SIZE_VERT_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_OUT_SIZE); } res = isp_reg_readl(OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT) & ~(ISPRSZ_CNT_HRSZ_MASK | ISPRSZ_CNT_VRSZ_MASK); isp_reg_writel(res | ((ispres_obj.h_resz - 1) << ISPRSZ_CNT_HRSZ_SHIFT) | ((ispres_obj.v_resz - 1) << ISPRSZ_CNT_VRSZ_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_CNT); if (ispres_obj.h_resz <= MID_RESIZE_VALUE) { j = 0; for (i = 0; i < 16; i++) { isp_reg_writel( (ispres_obj.coeflist.h_filter_coef_4tap[j] << ISPRSZ_HFILT10_COEF0_SHIFT) | (ispres_obj.coeflist.h_filter_coef_4tap[j + 1] << ISPRSZ_HFILT10_COEF1_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT10 + (i * 0x04)); j += 2; } } else { j = 0; for (i = 0; i < 16; i++) { if ((i + 1) % 4 == 0) { isp_reg_writel((ispres_obj.coeflist. h_filter_coef_7tap[j] << ISPRSZ_HFILT10_COEF0_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT10 + (i * 0x04)); j += 1; } else { isp_reg_writel((ispres_obj.coeflist. h_filter_coef_7tap[j] << ISPRSZ_HFILT10_COEF0_SHIFT) | (ispres_obj.coeflist. h_filter_coef_7tap[j+1] << ISPRSZ_HFILT10_COEF1_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_HFILT10 + (i * 0x04)); j += 2; } } } if (ispres_obj.v_resz <= MID_RESIZE_VALUE) { j = 0; for (i = 0; i < 16; i++) { isp_reg_writel((ispres_obj.coeflist. v_filter_coef_4tap[j] << ISPRSZ_VFILT10_COEF0_SHIFT) | (ispres_obj.coeflist. v_filter_coef_4tap[j + 1] << ISPRSZ_VFILT10_COEF1_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT10 + (i * 0x04)); j += 2; } } else { j = 0; for (i = 0; i < 16; i++) { if ((i + 1) % 4 == 0) { isp_reg_writel((ispres_obj.coeflist. v_filter_coef_7tap[j] << ISPRSZ_VFILT10_COEF0_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT10 + (i * 0x04)); j += 1; } else { isp_reg_writel((ispres_obj.coeflist. v_filter_coef_7tap[j] << ISPRSZ_VFILT10_COEF0_SHIFT) | (ispres_obj.coeflist. v_filter_coef_7tap[j+1] << ISPRSZ_VFILT10_COEF1_SHIFT), OMAP3_ISP_IOMEM_RESZ, ISPRSZ_VFILT10 + (i * 0x04)); j += 2; } } } ispresizer_config_outlineoffset(output_w*2); DPRINTK_ISPRESZ("ispresizer_config_size()-\n"); return 0; }