void fimc_hw_set_target_format(struct fimc_ctx *ctx) { u32 cfg, cfg_ext; struct fimc_dev *dev = ctx->fimc_dev; struct fimc_frame *frame = &ctx->d_frame; dbg("w= %d, h= %d color: %d", frame->width, frame->height, frame->fmt->color); cfg_ext = readl(dev->regs + S5P_CIEXTEN); cfg_ext &= ~(S5P_CIEXTEN_TRGHSIZE_EXT_MASK | S5P_CIEXTEN_TRGVSIZE_EXT_MASK); cfg = readl(dev->regs + S5P_CITRGFMT); cfg &= ~(S5P_CITRGFMT_FMT_MASK | S5P_CITRGFMT_HSIZE_MASK | S5P_CITRGFMT_VSIZE_MASK); switch (frame->fmt->color) { case S5P_FIMC_RGB565...S5P_FIMC_RGB444: cfg |= S5P_CITRGFMT_RGB; break; case S5P_FIMC_YCBCR420: /* fall through */ case S5P_FIMC_YCRCB420: cfg |= S5P_CITRGFMT_YCBCR420; break; case S5P_FIMC_YCBYCR422...S5P_FIMC_CRYCBY422: if (frame->fmt->colplanes == 1) cfg |= S5P_CITRGFMT_YCBCR422_1P; else cfg |= S5P_CITRGFMT_YCBCR422; break; default: break; } if (ctx->rotation == 90 || ctx->rotation == 270) { cfg |= S5P_CITRGFMT_HSIZE(frame->height); cfg |= S5P_CITRGFMT_VSIZE(frame->width); cfg_ext |= S5P_CIEXTEN_TRGHSIZE_EXT(frame->height); cfg_ext |= S5P_CIEXTEN_TRGVSIZE_EXT(frame->width); } else { cfg |= S5P_CITRGFMT_HSIZE(frame->width); cfg |= S5P_CITRGFMT_VSIZE(frame->height); cfg_ext |= S5P_CIEXTEN_TRGHSIZE_EXT(frame->width); cfg_ext |= S5P_CIEXTEN_TRGVSIZE_EXT(frame->height); } writel(cfg, dev->regs + S5P_CITRGFMT); writel(cfg_ext, dev->regs + S5P_CIEXTEN); cfg = readl(dev->regs + S5P_CITAREA) & ~S5P_CITAREA_MASK; if (frame->fmt->fourcc == V4L2_PIX_FMT_JPEG) cfg |= frame->payload[0]; else cfg |= (frame->width * frame->height); writel(cfg, dev->regs + S5P_CITAREA); }
void fimc_hw_set_target_format(struct fimc_ctx *ctx) { u32 cfg; struct fimc_dev *dev = ctx->fimc_dev; struct fimc_frame *frame = &ctx->d_frame; dbg("w= %d, h= %d color: %d", frame->width, frame->height, frame->fmt->color); cfg = readl(dev->regs + S5P_CITRGFMT); cfg &= ~(S5P_CITRGFMT_FMT_MASK | S5P_CITRGFMT_HSIZE_MASK | S5P_CITRGFMT_VSIZE_MASK); switch (frame->fmt->color) { case S5P_FIMC_RGB565...S5P_FIMC_RGB888: cfg |= S5P_CITRGFMT_RGB; break; case S5P_FIMC_YCBCR420: cfg |= S5P_CITRGFMT_YCBCR420; break; case S5P_FIMC_YCBYCR422...S5P_FIMC_CRYCBY422: if (frame->fmt->colplanes == 1) cfg |= S5P_CITRGFMT_YCBCR422_1P; else cfg |= S5P_CITRGFMT_YCBCR422; break; default: break; } if (ctx->rotation == 90 || ctx->rotation == 270) { cfg |= S5P_CITRGFMT_HSIZE(frame->height); cfg |= S5P_CITRGFMT_VSIZE(frame->width); } else { cfg |= S5P_CITRGFMT_HSIZE(frame->width); cfg |= S5P_CITRGFMT_VSIZE(frame->height); } writel(cfg, dev->regs + S5P_CITRGFMT); cfg = readl(dev->regs + S5P_CITAREA) & ~S5P_CITAREA_MASK; cfg |= (frame->width * frame->height); writel(cfg, dev->regs + S5P_CITAREA); }