int fimc_hwset_camera_offset(struct fimc_control *ctrl) { struct s3c_platform_camera *cam = ctrl->cam; struct v4l2_rect *rect = &cam->window; u32 cfg, h1, h2, v1, v2; if (!cam) { fimc_err("%s: no active camera\n", __func__); return -ENODEV; } h1 = rect->left; h2 = cam->width - rect->width - rect->left; v1 = rect->top; v2 = cam->height - rect->height - rect->top; cfg = readl(ctrl->regs + S3C_CIWDOFST); cfg &= ~(S3C_CIWDOFST_WINHOROFST_MASK | S3C_CIWDOFST_WINVEROFST_MASK); cfg |= S3C_CIWDOFST_WINHOROFST(h1); cfg |= S3C_CIWDOFST_WINVEROFST(v1); cfg |= S3C_CIWDOFST_WINOFSEN; writel(cfg, ctrl->regs + S3C_CIWDOFST); cfg = 0; cfg |= S3C_CIWDOFST2_WINHOROFST2(h2); cfg |= S3C_CIWDOFST2_WINVEROFST2(v2); writel(cfg, ctrl->regs + S3C_CIWDOFST2); return 0; }
void s3c_fimc_set_window_offset(struct s3c_fimc_control *ctrl) { struct s3c_fimc_window_offset *offset = &ctrl->in_cam->offset; u32 cfg; cfg = readl(ctrl->regs + S3C_CIWDOFST); cfg &= ~(S3C_CIWDOFST_WINHOROFST_MASK | S3C_CIWDOFST_WINVEROFST_MASK); cfg |= S3C_CIWDOFST_WINHOROFST(offset->h1); cfg |= S3C_CIWDOFST_WINVEROFST(offset->v1); cfg |= S3C_CIWDOFST_WINOFSEN; writel(cfg, ctrl->regs + S3C_CIWDOFST); cfg = 0; cfg |= S3C_CIWDOFST2_WINHOROFST2(offset->h2); cfg |= S3C_CIWDOFST2_WINVEROFST2(offset->v2); writel(cfg, ctrl->regs + S3C_CIWDOFST2); }