Lines Matching +full:fpd +full:- +full:link
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2021-2023 Digiteq Automotive
26 voutdev = vindev->mgbdev->vout[i]; in loopin_cnt()
30 config = mgb4_read_reg(&voutdev->mgbdev->video, in loopin_cnt()
31 voutdev->config->regs.config); in loopin_cnt()
32 if ((config & 0xc) >> 2 == vindev->config->id) in loopin_cnt()
43 mutex_lock(dev->lock); in is_busy()
44 ret = vb2_is_busy(dev->queue); in is_busy()
45 mutex_unlock(dev->lock); in is_busy()
58 return sprintf(buf, "%d\n", voutdev->config->id); in output_id_show()
66 u32 config = mgb4_read_reg(&voutdev->mgbdev->video, in video_source_show()
67 voutdev->config->regs.config); in video_source_show()
77 * As we do not want to lock all the video devices at the same time, a two-stage
90 struct mgb4_dev *mgbdev = voutdev->mgbdev; in video_source_store()
101 return -EINVAL; in video_source_store()
103 if (test_and_set_bit(0, &mgbdev->io_reconfig)) in video_source_store()
104 return -EBUSY; in video_source_store()
106 ret = -EBUSY; in video_source_store()
108 if (mgbdev->vin[i] && is_busy(&mgbdev->vin[i]->vdev)) in video_source_store()
111 if (mgbdev->vout[i] && is_busy(&mgbdev->vout[i]->vdev)) in video_source_store()
114 config = mgb4_read_reg(&mgbdev->video, voutdev->config->regs.config); in video_source_store()
117 loopin_old = mgbdev->vin[(config & 0xc) >> 2]; in video_source_store()
120 loopin_new = mgbdev->vin[val]; in video_source_store()
123 mgb4_mask_reg(&mgbdev->video, loopin_old->config->regs.config, in video_source_store()
126 mgb4_mask_reg(&mgbdev->video, loopin_new->config->regs.config, in video_source_store()
129 if (val == voutdev->config->id + MGB4_VIN_DEVICES) in video_source_store()
130 mgb4_write_reg(&mgbdev->video, voutdev->config->regs.config, in video_source_store()
133 mgb4_write_reg(&mgbdev->video, voutdev->config->regs.config, in video_source_store()
136 mgb4_mask_reg(&mgbdev->video, voutdev->config->regs.config, 0xc, in video_source_store()
141 clear_bit(0, &mgbdev->io_reconfig); in video_source_store()
151 u32 config = mgb4_read_reg(&voutdev->mgbdev->video, in display_width_show()
152 voutdev->config->regs.resolution); in display_width_show()
170 return -EINVAL; in display_width_store()
172 mutex_lock(voutdev->vdev.lock); in display_width_store()
173 if (vb2_is_busy(voutdev->vdev.queue)) { in display_width_store()
174 mutex_unlock(voutdev->vdev.lock); in display_width_store()
175 return -EBUSY; in display_width_store()
178 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.resolution, in display_width_store()
181 mutex_unlock(voutdev->vdev.lock); in display_width_store()
191 u32 config = mgb4_read_reg(&voutdev->mgbdev->video, in display_height_show()
192 voutdev->config->regs.resolution); in display_height_show()
210 return -EINVAL; in display_height_store()
212 mutex_lock(voutdev->vdev.lock); in display_height_store()
213 if (vb2_is_busy(voutdev->vdev.queue)) { in display_height_store()
214 mutex_unlock(voutdev->vdev.lock); in display_height_store()
215 return -EBUSY; in display_height_store()
218 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.resolution, in display_height_store()
221 mutex_unlock(voutdev->vdev.lock); in display_height_store()
231 u32 period = mgb4_read_reg(&voutdev->mgbdev->video, in frame_rate_show()
232 voutdev->config->regs.frame_period); in frame_rate_show()
254 mgb4_write_reg(&voutdev->mgbdev->video, in frame_rate_store()
255 voutdev->config->regs.frame_period, 125000000 / val); in frame_rate_store()
265 u32 sig = mgb4_read_reg(&voutdev->mgbdev->video, in hsync_width_show()
266 voutdev->config->regs.hsync); in hsync_width_show()
288 return -EINVAL; in hsync_width_store()
290 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.hsync, in hsync_width_store()
301 u32 sig = mgb4_read_reg(&voutdev->mgbdev->video, in vsync_width_show()
302 voutdev->config->regs.vsync); in vsync_width_show()
324 return -EINVAL; in vsync_width_store()
326 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.vsync, in vsync_width_store()
337 u32 sig = mgb4_read_reg(&voutdev->mgbdev->video, in hback_porch_show()
338 voutdev->config->regs.hsync); in hback_porch_show()
360 return -EINVAL; in hback_porch_store()
362 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.hsync, in hback_porch_store()
373 u32 sig = mgb4_read_reg(&voutdev->mgbdev->video, in vback_porch_show()
374 voutdev->config->regs.vsync); in vback_porch_show()
396 return -EINVAL; in vback_porch_store()
398 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.vsync, in vback_porch_store()
409 u32 sig = mgb4_read_reg(&voutdev->mgbdev->video, in hfront_porch_show()
410 voutdev->config->regs.hsync); in hfront_porch_show()
432 return -EINVAL; in hfront_porch_store()
434 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.hsync, in hfront_porch_store()
445 u32 sig = mgb4_read_reg(&voutdev->mgbdev->video, in vfront_porch_show()
446 voutdev->config->regs.vsync); in vfront_porch_show()
468 return -EINVAL; in vfront_porch_store()
470 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.vsync, in vfront_porch_store()
483 u32 config = mgb4_read_reg(&voutdev->mgbdev->video, in hsync_polarity_show()
484 voutdev->config->regs.hsync); in hsync_polarity_show()
506 return -EINVAL; in hsync_polarity_store()
508 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.hsync, in hsync_polarity_store()
519 u32 config = mgb4_read_reg(&voutdev->mgbdev->video, in vsync_polarity_show()
520 voutdev->config->regs.vsync); in vsync_polarity_show()
542 return -EINVAL; in vsync_polarity_store()
544 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.vsync, in vsync_polarity_store()
555 u32 config = mgb4_read_reg(&voutdev->mgbdev->video, in de_polarity_show()
556 voutdev->config->regs.vsync); in de_polarity_show()
578 return -EINVAL; in de_polarity_store()
580 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.vsync, in de_polarity_store()
593 mutex_lock(&voutdev->mgbdev->i2c_lock); in fpdl3_output_width_show()
594 ret = mgb4_i2c_read_byte(&voutdev->ser, 0x5B); in fpdl3_output_width_show()
595 mutex_unlock(&voutdev->mgbdev->i2c_lock); in fpdl3_output_width_show()
597 return -EIO; in fpdl3_output_width_show()
607 return -EINVAL; in fpdl3_output_width_show()
612 * FPD-Link width change is expected to be called on live streams. Video device
640 return -EINVAL; in fpdl3_output_width_store()
643 mutex_lock(&voutdev->mgbdev->i2c_lock); in fpdl3_output_width_store()
644 ret = mgb4_i2c_mask_byte(&voutdev->ser, 0x5B, 0x03, i2c_data); in fpdl3_output_width_store()
645 mutex_unlock(&voutdev->mgbdev->i2c_lock); in fpdl3_output_width_store()
647 return -EIO; in fpdl3_output_width_store()
658 return sprintf(buf, "%u\n", voutdev->freq); in pclk_frequency_show()
675 mutex_lock(voutdev->vdev.lock); in pclk_frequency_store()
676 if (vb2_is_busy(voutdev->vdev.queue)) { in pclk_frequency_store()
677 mutex_unlock(voutdev->vdev.lock); in pclk_frequency_store()
678 return -EBUSY; in pclk_frequency_store()
682 voutdev->freq = mgb4_cmt_set_vout_freq(voutdev, val >> dp) << dp; in pclk_frequency_store()
684 mgb4_mask_reg(&voutdev->mgbdev->video, voutdev->config->regs.config, in pclk_frequency_store()
686 mutex_lock(&voutdev->mgbdev->i2c_lock); in pclk_frequency_store()
687 ret = mgb4_i2c_mask_byte(&voutdev->ser, 0x4F, 1 << 6, ((~dp) & 1) << 6); in pclk_frequency_store()
688 mutex_unlock(&voutdev->mgbdev->i2c_lock); in pclk_frequency_store()
690 mutex_unlock(voutdev->vdev.lock); in pclk_frequency_store()
692 return (ret < 0) ? -EIO : count; in pclk_frequency_store()