Lines Matching +full:pre +full:- +full:scaler

1 // SPDX-License-Identifier: GPL-2.0+
3 * Driver for Renesas R-Car VIN
6 * Copyright (C) 2011-2013 Renesas Solutions Corp.
10 * Based on the soc-camera rcar_vin driver
17 #include <media/videobuf2-dma-contig.h>
19 #include "rcar-vin.h"
21 /* -----------------------------------------------------------------------------
25 /* Register offsets for R-Car VIN */
29 #define VNSLPRC_REG 0x0C /* Video n Start Line Pre-Clip Register */
30 #define VNELPRC_REG 0x10 /* Video n End Line Pre-Clip Register */
31 #define VNSPPRC_REG 0x14 /* Video n Start Pixel Pre-Clip Register */
32 #define VNEPPRC_REG 0x18 /* Video n End Pixel Pre-Clip Register */
44 #define VNSLPOC_REG 0x1C /* Video n Start Line Post-Clip Register */
45 #define VNELPOC_REG 0x20 /* Video n End Line Post-Clip Register */
46 #define VNSPPOC_REG 0x24 /* Video n Start Pixel Post-Clip Register */
47 #define VNEPPOC_REG 0x28 /* Video n End Pixel Post-Clip Register */
82 /* Register bit fields for R-Car VIN */
159 vb)->list)
163 iowrite32(value, vin->base + offset); in rvin_write()
168 return ioread32(vin->base + offset); in rvin_read()
171 /* -----------------------------------------------------------------------------
177 return !(vin->crop.width == vin->format.width && in rvin_scaler_needed()
178 vin->compose.width == vin->format.width && in rvin_scaler_needed()
179 vin->crop.height == vin->format.height && in rvin_scaler_needed()
180 vin->compose.height == vin->format.height); in rvin_scaler_needed()
512 if (xs < p_set->xs_value) in rvin_set_coeff()
518 xs - p_prev_set->xs_value < p_set->xs_value - xs) in rvin_set_coeff()
522 rvin_write(vin, p_set->coeff_set[0], VNC1A_REG); in rvin_set_coeff()
523 rvin_write(vin, p_set->coeff_set[1], VNC1B_REG); in rvin_set_coeff()
524 rvin_write(vin, p_set->coeff_set[2], VNC1C_REG); in rvin_set_coeff()
526 rvin_write(vin, p_set->coeff_set[3], VNC2A_REG); in rvin_set_coeff()
527 rvin_write(vin, p_set->coeff_set[4], VNC2B_REG); in rvin_set_coeff()
528 rvin_write(vin, p_set->coeff_set[5], VNC2C_REG); in rvin_set_coeff()
530 rvin_write(vin, p_set->coeff_set[6], VNC3A_REG); in rvin_set_coeff()
531 rvin_write(vin, p_set->coeff_set[7], VNC3B_REG); in rvin_set_coeff()
532 rvin_write(vin, p_set->coeff_set[8], VNC3C_REG); in rvin_set_coeff()
534 rvin_write(vin, p_set->coeff_set[9], VNC4A_REG); in rvin_set_coeff()
535 rvin_write(vin, p_set->coeff_set[10], VNC4B_REG); in rvin_set_coeff()
536 rvin_write(vin, p_set->coeff_set[11], VNC4C_REG); in rvin_set_coeff()
538 rvin_write(vin, p_set->coeff_set[12], VNC5A_REG); in rvin_set_coeff()
539 rvin_write(vin, p_set->coeff_set[13], VNC5B_REG); in rvin_set_coeff()
540 rvin_write(vin, p_set->coeff_set[14], VNC5C_REG); in rvin_set_coeff()
542 rvin_write(vin, p_set->coeff_set[15], VNC6A_REG); in rvin_set_coeff()
543 rvin_write(vin, p_set->coeff_set[16], VNC6B_REG); in rvin_set_coeff()
544 rvin_write(vin, p_set->coeff_set[17], VNC6C_REG); in rvin_set_coeff()
546 rvin_write(vin, p_set->coeff_set[18], VNC7A_REG); in rvin_set_coeff()
547 rvin_write(vin, p_set->coeff_set[19], VNC7B_REG); in rvin_set_coeff()
548 rvin_write(vin, p_set->coeff_set[20], VNC7C_REG); in rvin_set_coeff()
550 rvin_write(vin, p_set->coeff_set[21], VNC8A_REG); in rvin_set_coeff()
551 rvin_write(vin, p_set->coeff_set[22], VNC8B_REG); in rvin_set_coeff()
552 rvin_write(vin, p_set->coeff_set[23], VNC8C_REG); in rvin_set_coeff()
561 crop_height = vin->crop.height; in rvin_scaler_gen2()
562 if (V4L2_FIELD_HAS_BOTH(vin->format.field)) in rvin_scaler_gen2()
566 if (crop_height != vin->compose.height) in rvin_scaler_gen2()
567 ys = (4096 * crop_height) / vin->compose.height; in rvin_scaler_gen2()
571 if (vin->crop.width != vin->compose.width) in rvin_scaler_gen2()
572 xs = (4096 * vin->crop.width) / vin->compose.width; in rvin_scaler_gen2()
586 /* Set Start/End Pixel/Line Post-Clip */ in rvin_scaler_gen2()
589 rvin_write(vin, vin->format.width - 1, VNEPPOC_REG); in rvin_scaler_gen2()
591 if (V4L2_FIELD_HAS_BOTH(vin->format.field)) in rvin_scaler_gen2()
592 rvin_write(vin, vin->format.height / 2 - 1, VNELPOC_REG); in rvin_scaler_gen2()
594 rvin_write(vin, vin->format.height - 1, VNELPOC_REG); in rvin_scaler_gen2()
597 "Pre-Clip: %ux%u@%u:%u YS: %d XS: %d Post-Clip: %ux%u@%u:%u\n", in rvin_scaler_gen2()
598 vin->crop.width, vin->crop.height, vin->crop.left, in rvin_scaler_gen2()
599 vin->crop.top, ys, xs, vin->format.width, vin->format.height, in rvin_scaler_gen2()
627 /* Disable scaler if not needed. */ in rvin_scaler_gen3()
633 ratio_h = rvin_uds_scale_ratio(vin->crop.width, vin->compose.width); in rvin_scaler_gen3()
636 ratio_v = rvin_uds_scale_ratio(vin->crop.height, vin->compose.height); in rvin_scaler_gen3()
639 clip_size = vin->compose.width << 16; in rvin_scaler_gen3()
641 switch (vin->format.field) { in rvin_scaler_gen3()
647 clip_size |= vin->compose.height / 2; in rvin_scaler_gen3()
650 clip_size |= vin->compose.height; in rvin_scaler_gen3()
660 vin_dbg(vin, "Pre-Clip: %ux%u@%u:%u Post-Clip: %ux%u@%u:%u\n", in rvin_scaler_gen3()
661 vin->crop.width, vin->crop.height, vin->crop.left, in rvin_scaler_gen3()
662 vin->crop.top, vin->compose.width, vin->compose.height, in rvin_scaler_gen3()
663 vin->compose.left, vin->compose.top); in rvin_scaler_gen3()
671 /* Set Start/End Pixel/Line Pre-Clip */ in rvin_crop_scale_comp()
672 rvin_write(vin, vin->crop.left, VNSPPRC_REG); in rvin_crop_scale_comp()
673 rvin_write(vin, vin->crop.left + vin->crop.width - 1, VNEPPRC_REG); in rvin_crop_scale_comp()
674 rvin_write(vin, vin->crop.top, VNSLPRC_REG); in rvin_crop_scale_comp()
675 rvin_write(vin, vin->crop.top + vin->crop.height - 1, VNELPRC_REG); in rvin_crop_scale_comp()
677 if (vin->scaler) in rvin_crop_scale_comp()
678 vin->scaler(vin); in rvin_crop_scale_comp()
680 fmt = rvin_format_from_pixel(vin, vin->format.pixelformat); in rvin_crop_scale_comp()
681 stride = vin->format.bytesperline / fmt->bpp; in rvin_crop_scale_comp()
686 switch (vin->format.pixelformat) { in rvin_crop_scale_comp()
701 /* -----------------------------------------------------------------------------
710 switch (vin->format.field) { in rvin_setup()
721 if (!vin->info->use_mc && vin->std & V4L2_STD_525_60) in rvin_setup()
745 switch (vin->mbus_code) { in rvin_setup()
747 if (vin->is_csi) in rvin_setup()
748 /* YCbCr422 8-bit */ in rvin_setup()
756 if (vin->is_csi) in rvin_setup()
757 /* YCbCr422 8-bit */ in rvin_setup()
767 if (!vin->is_csi && in rvin_setup()
768 vin->parallel.mbus_type == V4L2_MBUS_BT656) in rvin_setup()
780 if (!vin->is_csi && in rvin_setup()
781 vin->parallel.mbus_type == V4L2_MBUS_BT656) in rvin_setup()
806 if (vin->info->model == RCAR_GEN3) { in rvin_setup()
812 if (vin->is_csi) { in rvin_setup()
814 return -EINVAL; in rvin_setup()
818 if (!vin->is_csi) { in rvin_setup()
820 return -EINVAL; in rvin_setup()
829 if (vin->info->model == RCAR_GEN3) in rvin_setup()
834 if (!vin->is_csi) { in rvin_setup()
836 if (!(vin->parallel.bus.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)) in rvin_setup()
840 if (!(vin->parallel.bus.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)) in rvin_setup()
844 if (vin->parallel.bus.flags & V4L2_MBUS_DATA_ENABLE_LOW) in rvin_setup()
847 switch (vin->mbus_code) { in rvin_setup()
849 if (vin->parallel.bus.bus_width == 8 && in rvin_setup()
850 vin->parallel.bus.data_shift == 8) in rvin_setup()
861 switch (vin->format.pixelformat) { in rvin_setup()
865 ALIGN(vin->format.bytesperline * vin->format.height, in rvin_setup()
867 dmr = vin->format.pixelformat == V4L2_PIX_FMT_NV12 ? in rvin_setup()
890 dmr = (vin->alpha ? VNDMR_ABIT : 0) | VNDMR_DTMD_ARGB; in rvin_setup()
893 dmr = VNDMR_A8BIT(vin->alpha) | VNDMR_EXRGB | VNDMR_DTMD_ARGB; in rvin_setup()
917 vin->format.pixelformat); in rvin_setup()
918 return -EINVAL; in rvin_setup()
924 if (!vin->info->use_isp) { in rvin_setup()
929 if (vin->info->model == RCAR_GEN3) { in rvin_setup()
930 /* Select between CSI-2 and parallel input */ in rvin_setup()
931 if (vin->is_csi) in rvin_setup()
977 if (vin->format.field == V4L2_FIELD_ALTERNATE) { in rvin_get_active_field()
984 return vin->format.field; in rvin_get_active_field()
993 fmt = rvin_format_from_pixel(vin, vin->format.pixelformat); in rvin_set_slot_addr()
999 offsetx = vin->compose.left * fmt->bpp; in rvin_set_slot_addr()
1000 offsety = vin->compose.top * vin->format.bytesperline; in rvin_set_slot_addr()
1027 if (WARN_ON(vin->buf_hw[slot].buffer)) in rvin_fill_hw_slot()
1030 prev = (slot == 0 ? HW_BUFFER_NUM : slot) - 1; in rvin_fill_hw_slot()
1032 if (vin->buf_hw[prev].type == HALF_TOP) { in rvin_fill_hw_slot()
1033 vbuf = vin->buf_hw[prev].buffer; in rvin_fill_hw_slot()
1034 vin->buf_hw[slot].buffer = vbuf; in rvin_fill_hw_slot()
1035 vin->buf_hw[slot].type = HALF_BOTTOM; in rvin_fill_hw_slot()
1036 switch (vin->format.pixelformat) { in rvin_fill_hw_slot()
1039 phys_addr = vin->buf_hw[prev].phys + in rvin_fill_hw_slot()
1040 vin->format.sizeimage / 4; in rvin_fill_hw_slot()
1043 phys_addr = vin->buf_hw[prev].phys + in rvin_fill_hw_slot()
1044 vin->format.sizeimage / 2; in rvin_fill_hw_slot()
1047 } else if ((vin->state != STOPPED && vin->state != RUNNING) || in rvin_fill_hw_slot()
1048 list_empty(&vin->buf_list)) { in rvin_fill_hw_slot()
1049 vin->buf_hw[slot].buffer = NULL; in rvin_fill_hw_slot()
1050 vin->buf_hw[slot].type = FULL; in rvin_fill_hw_slot()
1051 phys_addr = vin->scratch_phys; in rvin_fill_hw_slot()
1054 buf = list_entry(vin->buf_list.next, struct rvin_buffer, list); in rvin_fill_hw_slot()
1055 vbuf = &buf->vb; in rvin_fill_hw_slot()
1057 vin->buf_hw[slot].buffer = vbuf; in rvin_fill_hw_slot()
1059 vin->buf_hw[slot].type = in rvin_fill_hw_slot()
1060 V4L2_FIELD_IS_SEQUENTIAL(vin->format.field) ? in rvin_fill_hw_slot()
1064 phys_addr = vb2_dma_contig_plane_dma_addr(&vbuf->vb2_buf, 0); in rvin_fill_hw_slot()
1068 slot, vin->buf_hw[slot].type, vin->buf_hw[slot].buffer); in rvin_fill_hw_slot()
1070 vin->buf_hw[slot].phys = phys_addr; in rvin_fill_hw_slot()
1079 vin->buf_hw[slot].buffer = NULL; in rvin_capture_start()
1080 vin->buf_hw[slot].type = FULL; in rvin_capture_start()
1097 vin->state = STARTING; in rvin_capture_start()
1111 /* -----------------------------------------------------------------------------
1126 spin_lock_irqsave(&vin->qlock, flags); in rvin_irq()
1140 if (vin->state == STOPPED) { in rvin_irq()
1153 if (vin->state == STARTING) { in rvin_irq()
1160 vin->state = RUNNING; in rvin_irq()
1164 if (vin->buf_hw[slot].buffer) { in rvin_irq()
1169 if (vin->buf_hw[slot].type == HALF_TOP) { in rvin_irq()
1170 vin->buf_hw[slot].buffer = NULL; in rvin_irq()
1175 vin->buf_hw[slot].buffer->field = in rvin_irq()
1177 vin->buf_hw[slot].buffer->sequence = vin->sequence; in rvin_irq()
1178 vin->buf_hw[slot].buffer->vb2_buf.timestamp = ktime_get_ns(); in rvin_irq()
1179 vb2_buffer_done(&vin->buf_hw[slot].buffer->vb2_buf, in rvin_irq()
1181 vin->buf_hw[slot].buffer = NULL; in rvin_irq()
1184 vin_dbg(vin, "Dropping frame %u\n", vin->sequence); in rvin_irq()
1187 vin->sequence++; in rvin_irq()
1192 spin_unlock_irqrestore(&vin->qlock, flags); in rvin_irq()
1203 spin_lock_irqsave(&vin->qlock, flags); in return_unused_buffers()
1205 list_for_each_entry_safe(buf, node, &vin->buf_list, list) { in return_unused_buffers()
1206 vb2_buffer_done(&buf->vb.vb2_buf, state); in return_unused_buffers()
1207 list_del(&buf->list); in return_unused_buffers()
1210 spin_unlock_irqrestore(&vin->qlock, flags); in return_unused_buffers()
1222 return sizes[0] < vin->format.sizeimage ? -EINVAL : 0; in rvin_queue_setup()
1225 sizes[0] = vin->format.sizeimage; in rvin_queue_setup()
1232 struct rvin_dev *vin = vb2_get_drv_priv(vb->vb2_queue); in rvin_buffer_prepare()
1233 unsigned long size = vin->format.sizeimage; in rvin_buffer_prepare()
1238 return -EINVAL; in rvin_buffer_prepare()
1249 struct rvin_dev *vin = vb2_get_drv_priv(vb->vb2_queue); in rvin_buffer_queue()
1252 spin_lock_irqsave(&vin->qlock, flags); in rvin_buffer_queue()
1254 list_add_tail(to_buf_list(vbuf), &vin->buf_list); in rvin_buffer_queue()
1256 spin_unlock_irqrestore(&vin->qlock, flags); in rvin_buffer_queue()
1266 fmt.pad = pad->index; in rvin_mc_validate_format()
1268 return -EPIPE; in rvin_mc_validate_format()
1278 if (vin->format.pixelformat != V4L2_PIX_FMT_SBGGR8) in rvin_mc_validate_format()
1279 return -EPIPE; in rvin_mc_validate_format()
1282 if (vin->format.pixelformat != V4L2_PIX_FMT_SGBRG8) in rvin_mc_validate_format()
1283 return -EPIPE; in rvin_mc_validate_format()
1286 if (vin->format.pixelformat != V4L2_PIX_FMT_SGRBG8) in rvin_mc_validate_format()
1287 return -EPIPE; in rvin_mc_validate_format()
1290 if (vin->format.pixelformat != V4L2_PIX_FMT_SRGGB8) in rvin_mc_validate_format()
1291 return -EPIPE; in rvin_mc_validate_format()
1294 if (vin->format.pixelformat != V4L2_PIX_FMT_GREY) in rvin_mc_validate_format()
1295 return -EPIPE; in rvin_mc_validate_format()
1298 if (vin->format.pixelformat != V4L2_PIX_FMT_SBGGR10) in rvin_mc_validate_format()
1299 return -EPIPE; in rvin_mc_validate_format()
1302 if (vin->format.pixelformat != V4L2_PIX_FMT_SGBRG10) in rvin_mc_validate_format()
1303 return -EPIPE; in rvin_mc_validate_format()
1306 if (vin->format.pixelformat != V4L2_PIX_FMT_SGRBG10) in rvin_mc_validate_format()
1307 return -EPIPE; in rvin_mc_validate_format()
1310 if (vin->format.pixelformat != V4L2_PIX_FMT_SRGGB10) in rvin_mc_validate_format()
1311 return -EPIPE; in rvin_mc_validate_format()
1314 return -EPIPE; in rvin_mc_validate_format()
1316 vin->mbus_code = fmt.format.code; in rvin_mc_validate_format()
1330 switch (vin->format.field) { in rvin_mc_validate_format()
1345 return -EPIPE; in rvin_mc_validate_format()
1349 return -EPIPE; in rvin_mc_validate_format()
1354 if (vin->info->model == RCAR_GEN3 && in rvin_mc_validate_format()
1355 vin->format.pixelformat == V4L2_PIX_FMT_NV12) in rvin_mc_validate_format()
1356 return -EPIPE; in rvin_mc_validate_format()
1358 if (!vin->scaler) in rvin_mc_validate_format()
1359 return -EPIPE; in rvin_mc_validate_format()
1361 if (vin->format.pixelformat == V4L2_PIX_FMT_NV12) { in rvin_mc_validate_format()
1362 if (ALIGN(fmt.format.width, 32) != vin->format.width || in rvin_mc_validate_format()
1363 ALIGN(fmt.format.height, 32) != vin->format.height) in rvin_mc_validate_format()
1364 return -EPIPE; in rvin_mc_validate_format()
1366 if (fmt.format.width != vin->format.width || in rvin_mc_validate_format()
1367 fmt.format.height != vin->format.height) in rvin_mc_validate_format()
1368 return -EPIPE; in rvin_mc_validate_format()
1372 if (fmt.format.code != vin->mbus_code) in rvin_mc_validate_format()
1373 return -EPIPE; in rvin_mc_validate_format()
1385 if (!vin->info->use_mc) { in rvin_set_stream()
1386 ret = v4l2_subdev_call(vin->parallel.subdev, video, s_stream, in rvin_set_stream()
1389 return ret == -ENOIOCTLCMD ? 0 : ret; in rvin_set_stream()
1392 pad = media_pad_remote_pad_first(&vin->pad); in rvin_set_stream()
1394 return -EPIPE; in rvin_set_stream()
1396 sd = media_entity_to_v4l2_subdev(pad->entity); in rvin_set_stream()
1399 video_device_pipeline_stop(&vin->vdev); in rvin_set_stream()
1407 ret = video_device_pipeline_alloc_start(&vin->vdev); in rvin_set_stream()
1412 if (ret == -ENOIOCTLCMD) in rvin_set_stream()
1415 video_device_pipeline_stop(&vin->vdev); in rvin_set_stream()
1429 spin_lock_irqsave(&vin->qlock, flags); in rvin_start_streaming()
1431 vin->sequence = 0; in rvin_start_streaming()
1437 spin_unlock_irqrestore(&vin->qlock, flags); in rvin_start_streaming()
1445 int ret = -ENOMEM; in rvin_start_streaming_vq()
1448 vin->scratch = dma_alloc_coherent(vin->dev, vin->format.sizeimage, in rvin_start_streaming_vq()
1449 &vin->scratch_phys, GFP_KERNEL); in rvin_start_streaming_vq()
1450 if (!vin->scratch) in rvin_start_streaming_vq()
1459 dma_free_coherent(vin->dev, vin->format.sizeimage, vin->scratch, in rvin_start_streaming_vq()
1460 vin->scratch_phys); in rvin_start_streaming_vq()
1473 spin_lock_irqsave(&vin->qlock, flags); in rvin_stop_streaming()
1475 if (vin->state == STOPPED) { in rvin_stop_streaming()
1476 spin_unlock_irqrestore(&vin->qlock, flags); in rvin_stop_streaming()
1480 vin->state = STOPPING; in rvin_stop_streaming()
1487 if (vin->buf_hw[i].buffer) in rvin_stop_streaming()
1493 spin_unlock_irqrestore(&vin->qlock, flags); in rvin_stop_streaming()
1495 spin_lock_irqsave(&vin->qlock, flags); in rvin_stop_streaming()
1506 vin->state = STOPPED; in rvin_stop_streaming()
1510 spin_unlock_irqrestore(&vin->qlock, flags); in rvin_stop_streaming()
1512 spin_lock_irqsave(&vin->qlock, flags); in rvin_stop_streaming()
1515 if (!buffersFreed || vin->state != STOPPED) { in rvin_stop_streaming()
1522 vin->state = STOPPED; in rvin_stop_streaming()
1525 spin_unlock_irqrestore(&vin->qlock, flags); in rvin_stop_streaming()
1531 if (vin->buf_hw[i].buffer) in rvin_stop_streaming()
1532 vb2_buffer_done(&vin->buf_hw[i].buffer->vb2_buf, in rvin_stop_streaming()
1550 dma_free_coherent(vin->dev, vin->format.sizeimage, vin->scratch, in rvin_stop_streaming_vq()
1551 vin->scratch_phys); in rvin_stop_streaming_vq()
1566 mutex_destroy(&vin->lock); in rvin_dma_unregister()
1568 v4l2_device_unregister(&vin->v4l2_dev); in rvin_dma_unregister()
1573 struct vb2_queue *q = &vin->queue; in rvin_dma_register()
1576 /* Initialize the top-level structure */ in rvin_dma_register()
1577 ret = v4l2_device_register(vin->dev, &vin->v4l2_dev); in rvin_dma_register()
1581 mutex_init(&vin->lock); in rvin_dma_register()
1582 INIT_LIST_HEAD(&vin->buf_list); in rvin_dma_register()
1584 spin_lock_init(&vin->qlock); in rvin_dma_register()
1586 vin->state = STOPPED; in rvin_dma_register()
1589 vin->buf_hw[i].buffer = NULL; in rvin_dma_register()
1592 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in rvin_dma_register()
1593 q->io_modes = VB2_MMAP | VB2_READ | VB2_DMABUF; in rvin_dma_register()
1594 q->lock = &vin->lock; in rvin_dma_register()
1595 q->drv_priv = vin; in rvin_dma_register()
1596 q->buf_struct_size = sizeof(struct rvin_buffer); in rvin_dma_register()
1597 q->ops = &rvin_qops; in rvin_dma_register()
1598 q->mem_ops = &vb2_dma_contig_memops; in rvin_dma_register()
1599 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in rvin_dma_register()
1600 q->min_queued_buffers = 4; in rvin_dma_register()
1601 q->dev = vin->dev; in rvin_dma_register()
1610 ret = devm_request_irq(vin->dev, irq, rvin_irq, IRQF_SHARED, in rvin_dma_register()
1624 /* -----------------------------------------------------------------------------
1640 ret = pm_runtime_resume_and_get(vin->dev); in rvin_set_channel_routing()
1654 for (route = vin->info->routes; route->chsel; route++) { in rvin_set_channel_routing()
1655 if (route->csi == RVIN_CSI20 || route->csi == RVIN_CSI21) in rvin_set_channel_routing()
1671 vin->chsel = chsel; in rvin_set_channel_routing()
1676 pm_runtime_put(vin->dev); in rvin_set_channel_routing()
1686 spin_lock_irqsave(&vin->qlock, flags); in rvin_set_alpha()
1688 vin->alpha = alpha; in rvin_set_alpha()
1690 if (vin->state == STOPPED) in rvin_set_alpha()
1693 switch (vin->format.pixelformat) { in rvin_set_alpha()
1696 if (vin->alpha) in rvin_set_alpha()
1701 dmr |= VNDMR_A8BIT(vin->alpha); in rvin_set_alpha()
1709 spin_unlock_irqrestore(&vin->qlock, flags); in rvin_set_alpha()