From: Johan Korsnes <johan.korsnes@gmail.com>
To: linux-media@vger.kernel.org
Cc: Johan Korsnes <johan.korsnes@gmail.com>
Subject: [PATCH v2 8/9] media: vivid: add CEC support to display present ctrl
Date: Sun, 16 Jun 2019 11:22:17 -0700 [thread overview]
Message-ID: <20190616182218.37726-9-johan.korsnes@gmail.com> (raw)
In-Reply-To: <20190616182218.37726-1-johan.korsnes@gmail.com>
Set/invalidate physical addresses based on the configuration of the
display present control. This is relevant not only when the display
present control is modified, but also when the Vivid instance EDID is
set/cleared.
Signed-off-by: Johan Korsnes <johan.korsnes@gmail.com>
---
drivers/media/platform/vivid/vivid-ctrls.c | 25 ++++++++++++++++---
drivers/media/platform/vivid/vivid-vid-cap.c | 17 +++++++++++--
.../media/platform/vivid/vivid-vid-common.c | 2 ++
3 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/drivers/media/platform/vivid/vivid-ctrls.c b/drivers/media/platform/vivid/vivid-ctrls.c
index ae3690fd1b52..807c9e92e051 100644
--- a/drivers/media/platform/vivid/vivid-ctrls.c
+++ b/drivers/media/platform/vivid/vivid-ctrls.c
@@ -18,6 +18,7 @@
#include "vivid-radio-common.h"
#include "vivid-osd.h"
#include "vivid-ctrls.h"
+#include "vivid-cec.h"
#define VIVID_CID_CUSTOM_BASE (V4L2_CID_USER_BASE | 0xf000)
#define VIVID_CID_BUTTON (VIVID_CID_CUSTOM_BASE + 0)
@@ -923,7 +924,7 @@ static int vivid_vid_out_s_ctrl(struct v4l2_ctrl *ctrl)
struct vivid_dev *dev = container_of(ctrl->handler, struct vivid_dev, ctrl_hdl_vid_out);
struct v4l2_bt_timings *bt = &dev->dv_timings_out.bt;
u32 display_present = 0;
- unsigned i, j;
+ unsigned i, j, bus_idx;
switch (ctrl->id) {
case VIVID_CID_HAS_CROP_OUT:
@@ -962,15 +963,31 @@ static int vivid_vid_out_s_ctrl(struct v4l2_ctrl *ctrl)
break;
dev->display_present[dev->output] = ctrl->val;
-
for (i = 0, j = 0; i < dev->num_outputs; i++)
if (dev->output_type[i] == HDMI)
display_present |=
dev->display_present[i] << j++;
- __v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, display_present);
__v4l2_ctrl_s_ctrl(dev->ctrl_tx_rxsense, display_present);
- __v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, display_present);
+
+ if (dev->edid_blocks) {
+ __v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present,
+ display_present);
+ __v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug,
+ display_present);
+ }
+
+ if (!dev->cec_tx_adap)
+ break;
+
+ bus_idx = dev->cec_output2bus_map[dev->output];
+ if (ctrl->val && dev->edid_blocks)
+ cec_s_phys_addr(dev->cec_tx_adap[bus_idx],
+ dev->cec_tx_adap[bus_idx]->phys_addr,
+ false);
+ else
+ cec_phys_addr_invalidate(dev->cec_tx_adap[bus_idx]);
+
break;
}
return 0;
diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c b/drivers/media/platform/vivid/vivid-vid-cap.c
index ca15c13abf6c..0d1ee9a221db 100644
--- a/drivers/media/platform/vivid/vivid-vid-cap.c
+++ b/drivers/media/platform/vivid/vivid-vid-cap.c
@@ -1750,7 +1750,8 @@ int vidioc_s_edid(struct file *file, void *_fh,
{
struct vivid_dev *dev = video_drvdata(file);
u16 phys_addr;
- unsigned int i;
+ u32 display_present = 0;
+ unsigned int i, j;
int ret;
memset(edid->reserved, 0, sizeof(edid->reserved));
@@ -1760,6 +1761,8 @@ int vidioc_s_edid(struct file *file, void *_fh,
return -EINVAL;
if (edid->blocks == 0) {
dev->edid_blocks = 0;
+ v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, 0);
+ v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, 0);
phys_addr = CEC_PHYS_ADDR_INVALID;
goto set_phys_addr;
}
@@ -1778,13 +1781,23 @@ int vidioc_s_edid(struct file *file, void *_fh,
dev->edid_blocks = edid->blocks;
memcpy(dev->edid, edid->edid, edid->blocks * 128);
+ for (i = 0, j = 0; i < dev->num_outputs; i++)
+ if (dev->output_type[i] == HDMI)
+ display_present |=
+ dev->display_present[i] << j++;
+
+ v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, display_present);
+ v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, display_present);
+
set_phys_addr:
/* TODO: a proper hotplug detect cycle should be emulated here */
cec_s_phys_addr(dev->cec_rx_adap, phys_addr, false);
for (i = 0; i < MAX_OUTPUTS && dev->cec_tx_adap[i]; i++)
cec_s_phys_addr(dev->cec_tx_adap[i],
- v4l2_phys_addr_for_input(phys_addr, i + 1),
+ dev->display_present[i] ?
+ v4l2_phys_addr_for_input(phys_addr, i + 1) :
+ CEC_PHYS_ADDR_INVALID,
false);
return 0;
}
diff --git a/drivers/media/platform/vivid/vivid-vid-common.c b/drivers/media/platform/vivid/vivid-vid-common.c
index 10a344c29a1a..1f33eb1a76b6 100644
--- a/drivers/media/platform/vivid/vivid-vid-common.c
+++ b/drivers/media/platform/vivid/vivid-vid-common.c
@@ -887,6 +887,8 @@ int vidioc_g_edid(struct file *file, void *_fh,
return -EINVAL;
if (dev->output_type[edid->pad] != HDMI)
return -EINVAL;
+ if (!dev->display_present[edid->pad])
+ return -ENODATA;
bus_idx = dev->cec_output2bus_map[edid->pad];
adap = dev->cec_tx_adap[bus_idx];
}
--
2.19.1
next prev parent reply other threads:[~2019-06-16 18:23 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-16 18:22 [PATCH v2 0/9] media: vivid: add HDMI (dis)connect emulation Johan Korsnes
2019-06-16 18:22 ` [PATCH v2 1/9] media: vivid: make input dv_timings per-input Johan Korsnes
2019-06-16 18:22 ` [PATCH v2 2/9] media: vivid: make input std_signal per-input Johan Korsnes
2019-06-17 9:59 ` Hans Verkuil
2019-06-16 18:22 ` [PATCH v2 3/9] media: vivid: add display present control Johan Korsnes
2019-06-16 18:22 ` [PATCH v2 4/9] media: vivid: add number of HDMI ports to device state Johan Korsnes
2019-06-16 18:22 ` [PATCH v2 5/9] media: vivid: add HDMI (dis)connect TX emulation Johan Korsnes
2019-06-16 18:22 ` [PATCH v2 6/9] media: vivid: add HDMI (dis)connect RX emulation Johan Korsnes
2019-06-16 18:22 ` [PATCH v2 7/9] media: vivid: reorder CEC allocation and control set-up Johan Korsnes
2019-06-17 9:57 ` Hans Verkuil
2019-06-16 18:22 ` Johan Korsnes [this message]
2019-06-17 9:59 ` [PATCH v2 8/9] media: vivid: add CEC support to display present ctrl Hans Verkuil
2019-06-16 18:22 ` [PATCH v2 9/9] media: vivid.rst: describe display present control Johan Korsnes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190616182218.37726-9-johan.korsnes@gmail.com \
--to=johan.korsnes@gmail.com \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.