* [PATCH v3 0/4] Correct timing report
@ 2022-01-24 9:33 Jammy Huang
2022-01-24 9:33 ` [PATCH v3 1/4] media: aspeed: Correct value for h-total-pixels Jammy Huang
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Jammy Huang @ 2022-01-24 9:33 UTC (permalink / raw)
To: eajames, mchehab, joel, andrew, linux-media, openbmc,
linux-arm-kernel, linux-aspeed, linux-kernel
This series will correct the value of timing detected.
Changes in v3:
- Add API, aspeed_video_get_timings(), for the calculation of timings
- Use active rather than 'total/2' as critera for sync polarity workaround
Changes in v2:
- code refined to improve readability
Jammy Huang (4):
media: aspeed: Correct value for h-total-pixels
media: aspeed: Use FIELD_GET to improve readability
media: aspeed: Correct values for detected timing
media: aspeed: Fix timing polarity incorrect
drivers/media/platform/aspeed-video.c | 139 ++++++++++++++++++++------
1 file changed, 111 insertions(+), 28 deletions(-)
--
2.25.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/4] media: aspeed: Correct value for h-total-pixels
2022-01-24 9:33 [PATCH v3 0/4] Correct timing report Jammy Huang
@ 2022-01-24 9:33 ` Jammy Huang
2022-01-24 9:33 ` [PATCH v3 2/4] media: aspeed: Use FIELD_GET to improve readability Jammy Huang
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Jammy Huang @ 2022-01-24 9:33 UTC (permalink / raw)
To: eajames, mchehab, joel, andrew, linux-media, openbmc,
linux-arm-kernel, linux-aspeed, linux-kernel
Previous reg-field, 0x98[11:0], stands for the period of the detected
hsync signal.
Use the correct reg, 0xa0, to get h-total in pixels.
Fixes: d2b4387f3bdf ("media: platform: Add Aspeed Video Engine driver")
Signed-off-by: Jammy Huang <jammy_huang@aspeedtech.com>
Reviewed-by: Joel Stanley <joel@jms.id.au>
---
v3:
- no update
v2:
- no update
---
drivers/media/platform/aspeed-video.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c
index b388bc56ce81..d5f77b205175 100644
--- a/drivers/media/platform/aspeed-video.c
+++ b/drivers/media/platform/aspeed-video.c
@@ -166,7 +166,7 @@
#define VE_SRC_TB_EDGE_DET_BOT GENMASK(28, VE_SRC_TB_EDGE_DET_BOT_SHF)
#define VE_MODE_DETECT_STATUS 0x098
-#define VE_MODE_DETECT_H_PIXELS GENMASK(11, 0)
+#define VE_MODE_DETECT_H_PERIOD GENMASK(11, 0)
#define VE_MODE_DETECT_V_LINES_SHF 16
#define VE_MODE_DETECT_V_LINES GENMASK(27, VE_MODE_DETECT_V_LINES_SHF)
#define VE_MODE_DETECT_STATUS_VSYNC BIT(28)
@@ -177,6 +177,8 @@
#define VE_SYNC_STATUS_VSYNC_SHF 16
#define VE_SYNC_STATUS_VSYNC GENMASK(27, VE_SYNC_STATUS_VSYNC_SHF)
+#define VE_H_TOTAL_PIXELS 0x0A0
+
#define VE_INTERRUPT_CTRL 0x304
#define VE_INTERRUPT_STATUS 0x308
#define VE_INTERRUPT_MODE_DETECT_WD BIT(0)
@@ -938,6 +940,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video)
u32 src_lr_edge;
u32 src_tb_edge;
u32 sync;
+ u32 htotal;
struct v4l2_bt_timings *det = &video->detected_timings;
det->width = MIN_WIDTH;
@@ -983,6 +986,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video)
src_tb_edge = aspeed_video_read(video, VE_SRC_TB_EDGE_DET);
mds = aspeed_video_read(video, VE_MODE_DETECT_STATUS);
sync = aspeed_video_read(video, VE_SYNC_STATUS);
+ htotal = aspeed_video_read(video, VE_H_TOTAL_PIXELS);
video->frame_bottom = (src_tb_edge & VE_SRC_TB_EDGE_DET_BOT) >>
VE_SRC_TB_EDGE_DET_BOT_SHF;
@@ -999,8 +1003,7 @@ static void aspeed_video_get_resolution(struct aspeed_video *video)
VE_SRC_LR_EDGE_DET_RT_SHF;
video->frame_left = src_lr_edge & VE_SRC_LR_EDGE_DET_LEFT;
det->hfrontporch = video->frame_left;
- det->hbackporch = (mds & VE_MODE_DETECT_H_PIXELS) -
- video->frame_right;
+ det->hbackporch = htotal - video->frame_right;
det->hsync = sync & VE_SYNC_STATUS_HSYNC;
if (video->frame_left > video->frame_right)
continue;
--
2.25.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/4] media: aspeed: Use FIELD_GET to improve readability
2022-01-24 9:33 [PATCH v3 0/4] Correct timing report Jammy Huang
2022-01-24 9:33 ` [PATCH v3 1/4] media: aspeed: Correct value for h-total-pixels Jammy Huang
@ 2022-01-24 9:33 ` Jammy Huang
2022-01-24 9:33 ` [PATCH v3 3/4] media: aspeed: Correct values for detected timing Jammy Huang
2022-01-24 9:33 ` [PATCH v3 4/4] media: aspeed: Fix timing polarity incorrect Jammy Huang
3 siblings, 0 replies; 5+ messages in thread
From: Jammy Huang @ 2022-01-24 9:33 UTC (permalink / raw)
To: eajames, mchehab, joel, andrew, linux-media, openbmc,
linux-arm-kernel, linux-aspeed, linux-kernel
Use the bitfield macro FIELD_GET, and GENMASK to do the shift and mask in
one go for reg values.
Signed-off-by: Jammy Huang <jammy_huang@aspeedtech.com>
Reviewed-by: Joel Stanley <joel@jms.id.au>
---
v3:
- no update
v2:
- Put some codes on one line
---
drivers/media/platform/aspeed-video.c | 31 +++++++++++----------------
1 file changed, 12 insertions(+), 19 deletions(-)
diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c
index d5f77b205175..c241038ee27c 100644
--- a/drivers/media/platform/aspeed-video.c
+++ b/drivers/media/platform/aspeed-video.c
@@ -156,26 +156,22 @@
#define VE_SRC_LR_EDGE_DET_NO_H BIT(13)
#define VE_SRC_LR_EDGE_DET_NO_DISP BIT(14)
#define VE_SRC_LR_EDGE_DET_NO_CLK BIT(15)
-#define VE_SRC_LR_EDGE_DET_RT_SHF 16
-#define VE_SRC_LR_EDGE_DET_RT GENMASK(27, VE_SRC_LR_EDGE_DET_RT_SHF)
+#define VE_SRC_LR_EDGE_DET_RT GENMASK(27, 16)
#define VE_SRC_LR_EDGE_DET_INTERLACE BIT(31)
#define VE_SRC_TB_EDGE_DET 0x094
#define VE_SRC_TB_EDGE_DET_TOP GENMASK(12, 0)
-#define VE_SRC_TB_EDGE_DET_BOT_SHF 16
-#define VE_SRC_TB_EDGE_DET_BOT GENMASK(28, VE_SRC_TB_EDGE_DET_BOT_SHF)
+#define VE_SRC_TB_EDGE_DET_BOT GENMASK(28, 16)
#define VE_MODE_DETECT_STATUS 0x098
#define VE_MODE_DETECT_H_PERIOD GENMASK(11, 0)
-#define VE_MODE_DETECT_V_LINES_SHF 16
-#define VE_MODE_DETECT_V_LINES GENMASK(27, VE_MODE_DETECT_V_LINES_SHF)
+#define VE_MODE_DETECT_V_LINES GENMASK(27, 16)
#define VE_MODE_DETECT_STATUS_VSYNC BIT(28)
#define VE_MODE_DETECT_STATUS_HSYNC BIT(29)
#define VE_SYNC_STATUS 0x09c
#define VE_SYNC_STATUS_HSYNC GENMASK(11, 0)
-#define VE_SYNC_STATUS_VSYNC_SHF 16
-#define VE_SYNC_STATUS_VSYNC GENMASK(27, VE_SYNC_STATUS_VSYNC_SHF)
+#define VE_SYNC_STATUS_VSYNC GENMASK(27, 16)
#define VE_H_TOTAL_PIXELS 0x0A0
@@ -988,23 +984,20 @@ static void aspeed_video_get_resolution(struct aspeed_video *video)
sync = aspeed_video_read(video, VE_SYNC_STATUS);
htotal = aspeed_video_read(video, VE_H_TOTAL_PIXELS);
- video->frame_bottom = (src_tb_edge & VE_SRC_TB_EDGE_DET_BOT) >>
- VE_SRC_TB_EDGE_DET_BOT_SHF;
- video->frame_top = src_tb_edge & VE_SRC_TB_EDGE_DET_TOP;
+ video->frame_bottom = FIELD_GET(VE_SRC_TB_EDGE_DET_BOT, src_tb_edge);
+ video->frame_top = FIELD_GET(VE_SRC_TB_EDGE_DET_TOP, src_tb_edge);
det->vfrontporch = video->frame_top;
- det->vbackporch = ((mds & VE_MODE_DETECT_V_LINES) >>
- VE_MODE_DETECT_V_LINES_SHF) - video->frame_bottom;
- det->vsync = (sync & VE_SYNC_STATUS_VSYNC) >>
- VE_SYNC_STATUS_VSYNC_SHF;
+ det->vbackporch = FIELD_GET(VE_MODE_DETECT_V_LINES, mds) -
+ video->frame_bottom;
+ det->vsync = FIELD_GET(VE_SYNC_STATUS_VSYNC, sync);
if (video->frame_top > video->frame_bottom)
continue;
- video->frame_right = (src_lr_edge & VE_SRC_LR_EDGE_DET_RT) >>
- VE_SRC_LR_EDGE_DET_RT_SHF;
- video->frame_left = src_lr_edge & VE_SRC_LR_EDGE_DET_LEFT;
+ video->frame_right = FIELD_GET(VE_SRC_LR_EDGE_DET_RT, src_lr_edge);
+ video->frame_left = FIELD_GET(VE_SRC_LR_EDGE_DET_LEFT, src_lr_edge);
det->hfrontporch = video->frame_left;
det->hbackporch = htotal - video->frame_right;
- det->hsync = sync & VE_SYNC_STATUS_HSYNC;
+ det->hsync = FIELD_GET(VE_SYNC_STATUS_HSYNC, sync);
if (video->frame_left > video->frame_right)
continue;
--
2.25.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 3/4] media: aspeed: Correct values for detected timing
2022-01-24 9:33 [PATCH v3 0/4] Correct timing report Jammy Huang
2022-01-24 9:33 ` [PATCH v3 1/4] media: aspeed: Correct value for h-total-pixels Jammy Huang
2022-01-24 9:33 ` [PATCH v3 2/4] media: aspeed: Use FIELD_GET to improve readability Jammy Huang
@ 2022-01-24 9:33 ` Jammy Huang
2022-01-24 9:33 ` [PATCH v3 4/4] media: aspeed: Fix timing polarity incorrect Jammy Huang
3 siblings, 0 replies; 5+ messages in thread
From: Jammy Huang @ 2022-01-24 9:33 UTC (permalink / raw)
To: eajames, mchehab, joel, andrew, linux-media, openbmc,
linux-arm-kernel, linux-aspeed, linux-kernel
Correct timing's fp/sync/bp value based on the information below.
It should be noticed that the calculation formula should be changed
per sync polarity.
The sequence of signal: sync - backporch - video data - frontporch
The following registers start counting from sync's rising edge:
1. VR090: frame edge's left and right
2. VR094: frame edge's top and bottom
3. VR09C: counting from sync's rising edge to falling edge
[Vertical timing]
+--+ +-------------------+ +--+
| | | v i d e o | | |
+--+ +-----+ +-----+ +---+
vsync+--+
frame_top+--------+
frame_bottom+----------------------------+
+-------------------+
| v i d e o |
+--+ +-----+ +-----+ +---+
| | | |
+--+ +--+
vsync+-------------------------------+
frame_top+-----+
frame_bottom+-------------------------+
[Horizontal timing]
+--+ +-------------------+ +--+
| | | v i d e o | | |
+--+ +-----+ +-----+ +---+
hsync+--+
frame_left+--------+
frame_right+----------------------------+
+-------------------+
| v i d e o |
+--+ +-----+ +-----+ +---+
| | | |
+--+ +--+
hsync+-------------------------------+
frame_left+-----+
frame_right+-------------------------+
Signed-off-by: Jammy Huang <jammy_huang@aspeedtech.com>
---
v3:
- Add API, aspeed_video_get_timings(), to handle the calculation of timings.
v2:
- Code refined per Joel's suggestion
- Update commit message to have name matching variable
---
drivers/media/platform/aspeed-video.c | 30 ++++++++++++++++++++-------
1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c
index c241038ee27c..7e988cd05161 100644
--- a/drivers/media/platform/aspeed-video.c
+++ b/drivers/media/platform/aspeed-video.c
@@ -925,6 +925,87 @@ static void aspeed_video_calc_compressed_size(struct aspeed_video *video,
video->max_compressed_size);
}
+/*
+ * Update v4l2_bt_timings per current status.
+ * frame_top/frame_bottom/frame_left/frame_right need to be ready.
+ *
+ * The following registers start counting from sync's rising edge:
+ * 1. VR090: frame edge's left and right
+ * 2. VR094: frame edge's top and bottom
+ * 3. VR09C: counting from sync's rising edge to falling edge
+ *
+ * [Vertical timing]
+ * +--+ +-------------------+ +--+
+ * | | | v i d e o | | |
+ * +--+ +-----+ +-----+ +---+
+ * vsync+--+
+ * frame_top+--------+
+ * frame_bottom+----------------------------+
+ *
+ * +-------------------+
+ * | v i d e o |
+ * +--+ +-----+ +-----+ +---+
+ * | | | |
+ * +--+ +--+
+ * vsync+-------------------------------+
+ * frame_top+-----+
+ * frame_bottom+-------------------------+
+ *
+ * [Horizontal timing]
+ * +--+ +-------------------+ +--+
+ * | | | v i d e o | | |
+ * +--+ +-----+ +-----+ +---+
+ * hsync+--+
+ * frame_left+--------+
+ * frame_right+----------------------------+
+ *
+ * +-------------------+
+ * | v i d e o |
+ * +--+ +-----+ +-----+ +---+
+ * | | | |
+ * +--+ +--+
+ * hsync+-------------------------------+
+ * frame_left+-----+
+ * frame_right+-------------------------+
+ *
+ * @v: the struct of aspeed_video
+ * @det: v4l2_bt_timings to be updated.
+ */
+static void aspeed_video_get_timings(struct aspeed_video *v,
+ struct v4l2_bt_timings *det)
+{
+ u32 mds, sync, htotal, vtotal, vsync, hsync;
+
+ mds = aspeed_video_read(v, VE_MODE_DETECT_STATUS);
+ sync = aspeed_video_read(v, VE_SYNC_STATUS);
+ htotal = aspeed_video_read(v, VE_H_TOTAL_PIXELS);
+ vtotal = FIELD_GET(VE_MODE_DETECT_V_LINES, mds);
+ vsync = FIELD_GET(VE_SYNC_STATUS_VSYNC, sync);
+ hsync = FIELD_GET(VE_SYNC_STATUS_HSYNC, sync);
+
+ if (det->polarities & V4L2_DV_VSYNC_POS_POL) {
+ det->vbackporch = v->frame_top - vsync;
+ det->vfrontporch = vtotal - v->frame_bottom;
+ det->vsync = vsync;
+ } else {
+ det->vbackporch = v->frame_top;
+ det->vfrontporch = vsync - v->frame_bottom;
+ det->vsync = vtotal - vsync;
+ }
+
+ if (det->polarities & V4L2_DV_HSYNC_POS_POL) {
+ det->hbackporch = v->frame_left - hsync;
+ det->hfrontporch = htotal - v->frame_right;
+ det->hsync = hsync;
+ } else {
+ det->hbackporch = v->frame_left;
+ det->hfrontporch = hsync - v->frame_right;
+ det->hsync = htotal - hsync;
+ }
+}
+
#define res_check(v) test_and_clear_bit(VIDEO_MODE_DETECT_DONE, &(v)->flags)
static void aspeed_video_get_resolution(struct aspeed_video *video)
@@ -935,8 +1016,6 @@ static void aspeed_video_get_resolution(struct aspeed_video *video)
u32 mds;
u32 src_lr_edge;
u32 src_tb_edge;
- u32 sync;
- u32 htotal;
struct v4l2_bt_timings *det = &video->detected_timings;
det->width = MIN_WIDTH;
@@ -980,24 +1059,16 @@ static void aspeed_video_get_resolution(struct aspeed_video *video)
src_lr_edge = aspeed_video_read(video, VE_SRC_LR_EDGE_DET);
src_tb_edge = aspeed_video_read(video, VE_SRC_TB_EDGE_DET);
- mds = aspeed_video_read(video, VE_MODE_DETECT_STATUS);
- sync = aspeed_video_read(video, VE_SYNC_STATUS);
- htotal = aspeed_video_read(video, VE_H_TOTAL_PIXELS);
video->frame_bottom = FIELD_GET(VE_SRC_TB_EDGE_DET_BOT, src_tb_edge);
video->frame_top = FIELD_GET(VE_SRC_TB_EDGE_DET_TOP, src_tb_edge);
- det->vfrontporch = video->frame_top;
- det->vbackporch = FIELD_GET(VE_MODE_DETECT_V_LINES, mds) -
- video->frame_bottom;
- det->vsync = FIELD_GET(VE_SYNC_STATUS_VSYNC, sync);
+
if (video->frame_top > video->frame_bottom)
continue;
video->frame_right = FIELD_GET(VE_SRC_LR_EDGE_DET_RT, src_lr_edge);
video->frame_left = FIELD_GET(VE_SRC_LR_EDGE_DET_LEFT, src_lr_edge);
- det->hfrontporch = video->frame_left;
- det->hbackporch = htotal - video->frame_right;
- det->hsync = FIELD_GET(VE_SYNC_STATUS_HSYNC, sync);
+
if (video->frame_left > video->frame_right)
continue;
@@ -1013,6 +1084,8 @@ static void aspeed_video_get_resolution(struct aspeed_video *video)
det->width = (video->frame_right - video->frame_left) + 1;
video->v4l2_input_status = 0;
+ aspeed_video_get_timings(video, det);
+
/*
* Enable mode-detect watchdog, resolution-change watchdog and
* automatic compression after frame capture.
--
2.25.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 4/4] media: aspeed: Fix timing polarity incorrect
2022-01-24 9:33 [PATCH v3 0/4] Correct timing report Jammy Huang
` (2 preceding siblings ...)
2022-01-24 9:33 ` [PATCH v3 3/4] media: aspeed: Correct values for detected timing Jammy Huang
@ 2022-01-24 9:33 ` Jammy Huang
3 siblings, 0 replies; 5+ messages in thread
From: Jammy Huang @ 2022-01-24 9:33 UTC (permalink / raw)
To: eajames, mchehab, joel, andrew, linux-media, openbmc,
linux-arm-kernel, linux-aspeed, linux-kernel
This is a workaround for polarity detection unstable.
Because h/v sync polarity got from VR098 could be wrong, we try to use
ast SoC's characteristic to confirm sync polarity.
In ast SoC's design, sync value got by VR09C counts from sync's rising
edge, which means sync value = bp + active + fp if negative polarity.
Thus, sync value would be larger than de if negative.
Ex. 1920x1200@60
VR098: c4d3efff, VR09C: 04cc001f
v-total = 0x4D3 (VR098[27:16]) = 1235
v-sync = 0x4CC (VR09C[27:16]) = 1228
Signed-off-by: Jammy Huang <jammy_huang@aspeedtech.com>
---
v3:
- Use active rather than 'total/2' as critera for workaround
v2:
- Use 'total/2' rather than 'total<<1'
- Update comment
---
drivers/media/platform/aspeed-video.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c
index 7e988cd05161..a135a31b4234 100644
--- a/drivers/media/platform/aspeed-video.c
+++ b/drivers/media/platform/aspeed-video.c
@@ -985,6 +985,20 @@ static void aspeed_video_get_timings(struct aspeed_video *v,
vsync = FIELD_GET(VE_SYNC_STATUS_VSYNC, sync);
hsync = FIELD_GET(VE_SYNC_STATUS_HSYNC, sync);
+ /*
+ * This is a workaround for polarity detection.
+ * Because ast-soc counts sync from sync's rising edge, the reg value
+ * of sync would be larger than video's active area if negative.
+ */
+ if (vsync > det->height)
+ det->polarities &= ~V4L2_DV_VSYNC_POS_POL;
+ else
+ det->polarities |= V4L2_DV_VSYNC_POS_POL;
+ if (hsync > det->width)
+ det->polarities &= ~V4L2_DV_HSYNC_POS_POL;
+ else
+ det->polarities |= V4L2_DV_HSYNC_POS_POL;
+
if (det->polarities & V4L2_DV_VSYNC_POS_POL) {
det->vbackporch = v->frame_top - vsync;
det->vfrontporch = vtotal - v->frame_bottom;
--
2.25.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-01-24 9:36 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-24 9:33 [PATCH v3 0/4] Correct timing report Jammy Huang
2022-01-24 9:33 ` [PATCH v3 1/4] media: aspeed: Correct value for h-total-pixels Jammy Huang
2022-01-24 9:33 ` [PATCH v3 2/4] media: aspeed: Use FIELD_GET to improve readability Jammy Huang
2022-01-24 9:33 ` [PATCH v3 3/4] media: aspeed: Correct values for detected timing Jammy Huang
2022-01-24 9:33 ` [PATCH v3 4/4] media: aspeed: Fix timing polarity incorrect Jammy Huang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).