Lines Matching +full:video +full:- +full:scaler
1 // SPDX-License-Identifier: GPL-2.0-only
11 #include "camif-regs.h"
13 #define camif_write(_camif, _off, _val) writel(_val, (_camif)->io_base + (_off))
14 #define camif_read(_camif, _off) readl((_camif)->io_base + (_off))
27 if (camif->variant->ip_revision == S3C6410_CAMIF_IP_REV) in camif_hw_reset()
40 u32 cfg = camif_read(vp->camif, S3C_CAMIF_REG_CIGCTRL); in camif_hw_clear_pending_irq()
41 cfg |= CIGCTRL_IRQ_CLR(vp->id); in camif_hw_clear_pending_irq()
42 camif_write(vp->camif, S3C_CAMIF_REG_CIGCTRL, cfg); in camif_hw_clear_pending_irq()
46 * Sets video test pattern (off, color bar, horizontal or vertical gradient).
79 cfg = camif_read(camif, S3C_CAMIF_REG_CIIMGEFF(camif->vp->offset)); in camif_hw_set_effect()
84 if (camif->variant->ip_revision >= S3C6400_CAMIF_IP_REV) { in camif_hw_set_effect()
92 camif_write(camif, S3C_CAMIF_REG_CIIMGEFF(camif->vp->offset), cfg); in camif_hw_set_effect()
105 struct v4l2_mbus_framefmt *mf = &camif->mbus_fmt; in camif_hw_set_source_format()
109 for (i = ARRAY_SIZE(src_pixfmt_map) - 1; i >= 0; i--) { in camif_hw_set_source_format()
110 if (src_pixfmt_map[i][0] == mf->code) in camif_hw_set_source_format()
115 dev_err(camif->dev, in camif_hw_set_source_format()
122 cfg |= (mf->width << 16) | mf->height; in camif_hw_set_source_format()
130 struct v4l2_mbus_framefmt *mf = &camif->mbus_fmt; in camif_hw_set_camera_crop()
131 struct v4l2_rect *crop = &camif->camif_crop; in camif_hw_set_camera_crop()
135 /* Note: s3c244x requirement: left = f_width - rect.width / 2 */ in camif_hw_set_camera_crop()
138 cfg |= (crop->left << 16) | crop->top; in camif_hw_set_camera_crop()
139 if (crop->left != 0 || crop->top != 0) in camif_hw_set_camera_crop()
143 if (camif->variant->ip_revision == S3C6410_CAMIF_IP_REV) { in camif_hw_set_camera_crop()
144 hoff2 = mf->width - crop->width - crop->left; in camif_hw_set_camera_crop()
145 voff2 = mf->height - crop->height - crop->top; in camif_hw_set_camera_crop()
153 struct camif_dev *camif = vp->camif; in camif_hw_clear_fifo_overflow()
157 if (vp->id == 0) in camif_hw_clear_fifo_overflow()
166 /* Set video bus signals polarity */
169 unsigned int flags = camif->pdata.sensor.flags; in camif_hw_set_camera_bus()
189 if (camif->variant->ip_revision == S3C6410_CAMIF_IP_REV) { in camif_hw_set_camera_bus()
203 struct camif_dev *camif = vp->camif; in camif_hw_set_output_addr()
205 camif_write(camif, S3C_CAMIF_REG_CIYSA(vp->id, i), paddr->y); in camif_hw_set_output_addr()
206 if (camif->variant->ip_revision == S3C6410_CAMIF_IP_REV in camif_hw_set_output_addr()
207 || vp->id == VP_CODEC) { in camif_hw_set_output_addr()
208 camif_write(camif, S3C_CAMIF_REG_CICBSA(vp->id, i), in camif_hw_set_output_addr()
209 paddr->cb); in camif_hw_set_output_addr()
210 camif_write(camif, S3C_CAMIF_REG_CICRSA(vp->id, i), in camif_hw_set_output_addr()
211 paddr->cr); in camif_hw_set_output_addr()
215 i, &paddr->y, &paddr->cb, &paddr->cr); in camif_hw_set_output_addr()
220 struct camif_frame *frame = &vp->out_frame; in camif_hw_set_out_dma_size()
223 cfg = camif_read(vp->camif, S3C_CAMIF_REG_CITRGFMT(vp->id, vp->offset)); in camif_hw_set_out_dma_size()
225 cfg |= (frame->f_width << 16) | frame->f_height; in camif_hw_set_out_dma_size()
226 camif_write(vp->camif, S3C_CAMIF_REG_CITRGFMT(vp->id, vp->offset), cfg); in camif_hw_set_out_dma_size()
241 rem = nwords & (div - 1); in camif_get_dma_burst()
257 struct camif_dev *camif = vp->camif; in camif_hw_set_output_dma()
258 struct camif_frame *frame = &vp->out_frame; in camif_hw_set_output_dma()
259 const struct camif_fmt *fmt = vp->out_fmt; in camif_hw_set_output_dma()
265 if (camif->variant->ip_revision == S3C6410_CAMIF_IP_REV) { in camif_hw_set_output_dma()
266 struct camif_dma_offset *offset = &frame->dma_offset; in camif_hw_set_output_dma()
268 cfg = S3C_CISS_OFFS_INITIAL(offset->initial); in camif_hw_set_output_dma()
269 cfg |= S3C_CISS_OFFS_LINE(offset->line); in camif_hw_set_output_dma()
270 camif_write(camif, S3C_CAMIF_REG_CISSY(vp->id), cfg); in camif_hw_set_output_dma()
271 camif_write(camif, S3C_CAMIF_REG_CISSCB(vp->id), cfg); in camif_hw_set_output_dma()
272 camif_write(camif, S3C_CAMIF_REG_CISSCR(vp->id), cfg); in camif_hw_set_output_dma()
276 camif_get_dma_burst(frame->rect.width, fmt->ybpp, &ymburst, &yrburst); in camif_hw_set_output_dma()
278 cfg = camif_read(camif, S3C_CAMIF_REG_CICTRL(vp->id, vp->offset)); in camif_hw_set_output_dma()
284 camif_write(camif, S3C_CAMIF_REG_CICTRL(vp->id, vp->offset), cfg); in camif_hw_set_output_dma()
291 u32 cfg = camif_read(vp->camif, S3C_CAMIF_REG_MSCTRL(vp->id)); in camif_hw_set_input_path()
293 camif_write(vp->camif, S3C_CAMIF_REG_MSCTRL(vp->id), cfg); in camif_hw_set_input_path()
298 struct camif_dev *camif = vp->camif; in camif_hw_set_target_format()
299 struct camif_frame *frame = &vp->out_frame; in camif_hw_set_target_format()
302 pr_debug("fw: %d, fh: %d color: %d\n", frame->f_width, in camif_hw_set_target_format()
303 frame->f_height, vp->out_fmt->color); in camif_hw_set_target_format()
305 cfg = camif_read(camif, S3C_CAMIF_REG_CITRGFMT(vp->id, vp->offset)); in camif_hw_set_target_format()
308 if (camif->variant->ip_revision == S3C244X_CAMIF_IP_REV) { in camif_hw_set_target_format()
312 if (vp->out_fmt->color == IMG_FMT_YCBCR422P) in camif_hw_set_target_format()
316 switch (vp->out_fmt->color) { in camif_hw_set_target_format()
333 if (vp->rotation == 90 || vp->rotation == 270) in camif_hw_set_target_format()
334 cfg |= (frame->f_height << 16) | frame->f_width; in camif_hw_set_target_format()
336 cfg |= (frame->f_width << 16) | frame->f_height; in camif_hw_set_target_format()
337 camif_write(camif, S3C_CAMIF_REG_CITRGFMT(vp->id, vp->offset), cfg); in camif_hw_set_target_format()
340 cfg = camif_read(camif, S3C_CAMIF_REG_CITAREA(vp->id, vp->offset)); in camif_hw_set_target_format()
342 cfg |= (frame->f_width * frame->f_height); in camif_hw_set_target_format()
343 camif_write(camif, S3C_CAMIF_REG_CITAREA(vp->id, vp->offset), cfg); in camif_hw_set_target_format()
348 u32 cfg = camif_read(vp->camif, in camif_hw_set_flip()
349 S3C_CAMIF_REG_CITRGFMT(vp->id, vp->offset)); in camif_hw_set_flip()
353 if (vp->hflip) in camif_hw_set_flip()
355 if (vp->vflip) in camif_hw_set_flip()
358 camif_write(vp->camif, S3C_CAMIF_REG_CITRGFMT(vp->id, vp->offset), cfg); in camif_hw_set_flip()
363 struct camif_dev *camif = vp->camif; in camif_hw_set_prescaler()
364 struct camif_scaler *sc = &vp->scaler; in camif_hw_set_prescaler()
367 addr = S3C_CAMIF_REG_CISCPRERATIO(vp->id, vp->offset); in camif_hw_set_prescaler()
369 shfactor = 10 - (sc->h_shift + sc->v_shift); in camif_hw_set_prescaler()
372 cfg |= (sc->pre_h_ratio << 16) | sc->pre_v_ratio; in camif_hw_set_prescaler()
375 cfg = (sc->pre_dst_width << 16) | sc->pre_dst_height; in camif_hw_set_prescaler()
376 camif_write(camif, S3C_CAMIF_REG_CISCPREDST(vp->id, vp->offset), cfg); in camif_hw_set_prescaler()
381 struct camif_dev *camif = vp->camif; in camif_s3c244x_hw_set_scaler()
382 struct camif_scaler *scaler = &vp->scaler; in camif_s3c244x_hw_set_scaler() local
383 unsigned int color = vp->out_fmt->color; in camif_s3c244x_hw_set_scaler()
388 cfg = camif_read(camif, S3C_CAMIF_REG_CISCCTRL(vp->id, vp->offset)); in camif_s3c244x_hw_set_scaler()
393 if (scaler->enable) { in camif_s3c244x_hw_set_scaler()
394 if (scaler->scaleup_h) { in camif_s3c244x_hw_set_scaler()
395 if (vp->id == VP_CODEC) in camif_s3c244x_hw_set_scaler()
400 if (scaler->scaleup_v) { in camif_s3c244x_hw_set_scaler()
401 if (vp->id == VP_CODEC) in camif_s3c244x_hw_set_scaler()
407 if (vp->id == VP_CODEC) in camif_s3c244x_hw_set_scaler()
411 cfg |= ((scaler->main_h_ratio & 0x1ff) << 16); in camif_s3c244x_hw_set_scaler()
412 cfg |= scaler->main_v_ratio & 0x1ff; in camif_s3c244x_hw_set_scaler()
414 if (vp->id == VP_PREVIEW) { in camif_s3c244x_hw_set_scaler()
420 camif_write(camif, S3C_CAMIF_REG_CISCCTRL(vp->id, vp->offset), cfg); in camif_s3c244x_hw_set_scaler()
423 scaler->main_h_ratio, scaler->main_v_ratio); in camif_s3c244x_hw_set_scaler()
428 struct camif_dev *camif = vp->camif; in camif_s3c64xx_hw_set_scaler()
429 struct camif_scaler *scaler = &vp->scaler; in camif_s3c64xx_hw_set_scaler() local
430 unsigned int color = vp->out_fmt->color; in camif_s3c64xx_hw_set_scaler()
435 cfg = camif_read(camif, S3C_CAMIF_REG_CISCCTRL(vp->id, vp->offset)); in camif_s3c64xx_hw_set_scaler()
446 if (!scaler->enable) { in camif_s3c64xx_hw_set_scaler()
449 if (scaler->scaleup_h) in camif_s3c64xx_hw_set_scaler()
451 if (scaler->scaleup_v) in camif_s3c64xx_hw_set_scaler()
453 if (scaler->copy) in camif_s3c64xx_hw_set_scaler()
466 cfg |= (scaler->main_h_ratio & 0x1ff) << 16; in camif_s3c64xx_hw_set_scaler()
467 cfg |= scaler->main_v_ratio & 0x1ff; in camif_s3c64xx_hw_set_scaler()
469 camif_write(camif, S3C_CAMIF_REG_CISCCTRL(vp->id, vp->offset), cfg); in camif_s3c64xx_hw_set_scaler()
472 scaler->main_h_ratio, scaler->main_v_ratio); in camif_s3c64xx_hw_set_scaler()
477 unsigned int ip_rev = vp->camif->variant->ip_revision; in camif_hw_set_scaler()
487 u32 addr = S3C_CAMIF_REG_CISCCTRL(vp->id, vp->offset); in camif_hw_enable_scaler()
490 cfg = camif_read(vp->camif, addr); in camif_hw_enable_scaler()
495 camif_write(vp->camif, addr, cfg); in camif_hw_enable_scaler()
500 u32 addr = S3C_CAMIF_REG_CICTRL(vp->id, vp->offset); in camif_hw_set_lastirq()
503 cfg = camif_read(vp->camif, addr); in camif_hw_set_lastirq()
508 camif_write(vp->camif, addr, cfg); in camif_hw_set_lastirq()
513 struct camif_dev *camif = vp->camif; in camif_hw_enable_capture()
516 cfg = camif_read(camif, S3C_CAMIF_REG_CIIMGCPT(vp->offset)); in camif_hw_enable_capture()
517 camif->stream_count++; in camif_hw_enable_capture()
519 if (camif->variant->ip_revision == S3C6410_CAMIF_IP_REV) in camif_hw_enable_capture()
520 cfg |= CIIMGCPT_CPT_FREN_ENABLE(vp->id); in camif_hw_enable_capture()
522 if (vp->scaler.enable) in camif_hw_enable_capture()
523 cfg |= CIIMGCPT_IMGCPTEN_SC(vp->id); in camif_hw_enable_capture()
525 if (camif->stream_count == 1) in camif_hw_enable_capture()
528 camif_write(camif, S3C_CAMIF_REG_CIIMGCPT(vp->offset), cfg); in camif_hw_enable_capture()
530 pr_debug("CIIMGCPT: %#x, camif->stream_count: %d\n", in camif_hw_enable_capture()
531 cfg, camif->stream_count); in camif_hw_enable_capture()
536 struct camif_dev *camif = vp->camif; in camif_hw_disable_capture()
539 cfg = camif_read(camif, S3C_CAMIF_REG_CIIMGCPT(vp->offset)); in camif_hw_disable_capture()
540 cfg &= ~CIIMGCPT_IMGCPTEN_SC(vp->id); in camif_hw_disable_capture()
542 if (WARN_ON(--(camif->stream_count) < 0)) in camif_hw_disable_capture()
543 camif->stream_count = 0; in camif_hw_disable_capture()
545 if (camif->stream_count == 0) in camif_hw_disable_capture()
548 pr_debug("CIIMGCPT: %#x, camif->stream_count: %d\n", in camif_hw_disable_capture()
549 cfg, camif->stream_count); in camif_hw_disable_capture()
551 camif_write(camif, S3C_CAMIF_REG_CIIMGCPT(vp->offset), cfg); in camif_hw_disable_capture()
598 pr_info("--- %s ---\n", label); in camif_hw_dump_regs()
600 u32 cfg = readl(camif->io_base + registers[i].offset); in camif_hw_dump_regs()
601 dev_info(camif->dev, "%s:\t0x%08x\n", registers[i].name, cfg); in camif_hw_dump_regs()