summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSandor Yu <R01008@freescale.com>2015-02-11 16:06:03 +0800
committerSandor Yu <R01008@freescale.com>2015-02-12 10:26:38 +0800
commit2362ae7927e8b9cb38bd932c5c76a172a22802d4 (patch)
tree8fccca93d8e1a8e756b08e7ca104084ced943860
parentc7edc917d4115e9f51a68b9d36016d2a396b6758 (diff)
MLK-10249: vadc: improve vadc video mode detected
After enable dispmix function, vadc driver 50% failed to detect video mode. Add video signal state check before read the result of video mode detect, vadc driver detected correct video mode increase to 95%. Signed-off-by: Sandor Yu <R01008@freescale.com> (cherry picked from commit b95957f4bc258c86683501d60f70371366ce3bd3)
-rw-r--r--drivers/media/platform/mxc/subdev/mxc_vadc.c25
-rw-r--r--drivers/media/platform/mxc/subdev/mxc_vadc.h5
2 files changed, 19 insertions, 11 deletions
diff --git a/drivers/media/platform/mxc/subdev/mxc_vadc.c b/drivers/media/platform/mxc/subdev/mxc_vadc.c
index f77044f895b7..d3bd54981b6f 100644
--- a/drivers/media/platform/mxc/subdev/mxc_vadc.c
+++ b/drivers/media/platform/mxc/subdev/mxc_vadc.c
@@ -463,19 +463,24 @@ static int vadc_g_std(struct v4l2_subdev *sd, v4l2_std_id *std)
static int vadc_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
{
struct vadc_state *state = to_state(sd);
- int tmp;
+ int mod;
int idx;
+ int i;
/* Read auto mode detected result */
- printk(KERN_INFO"wait vadc auto detect video mode....");
- msleep(500);
- do {
- tmp = reg32_read(VDEC_VIDMOD);
- } while (tmp == 0);
-
- tmp &= (VDEC_VIDMOD_PAL_MASK | VDEC_VIDMOD_M625_MASK);
+ printk(KERN_INFO"wait vadc auto detect video mode....\n");
+ for (i = 0; i < 10; i++) {
+ msleep(200);
+ mod = reg32_read(VDEC_VIDMOD);
+ /* Check video signal states */
+ if ((mod & VDEC_VIDMOD_SIGNAL_MASK)
+ == VDEC_VIDMOD_SIGNAL_DETECT)
+ break;
+ }
+ if (i == 10)
+ printk(KERN_INFO"Timeout detect video signal mod=0x%x\n", mod);
- if (tmp)
+ if ((mod & VDEC_VIDMOD_PAL_MASK) || (mod & VDEC_VIDMOD_M625_MASK))
idx = VADC_PAL;
else
idx = VADC_NTSC;
@@ -483,7 +488,7 @@ static int vadc_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
*std = video_fmts[idx].v4l2_std;
state->fmt = &video_fmts[idx];
- pr_debug("std=%s\n", video_fmts[idx].name);
+ printk(KERN_INFO"video mode %s\n", video_fmts[idx].name);
return 0;
}
diff --git a/drivers/media/platform/mxc/subdev/mxc_vadc.h b/drivers/media/platform/mxc/subdev/mxc_vadc.h
index 6ed5eeb982d0..d5c1389cbc58 100644
--- a/drivers/media/platform/mxc/subdev/mxc_vadc.h
+++ b/drivers/media/platform/mxc/subdev/mxc_vadc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2014 Freescale Semiconductor, Inc.
+ * Copyright (C) 2011-2015 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -226,6 +226,9 @@
#define VDEC_NCHTH (VDEC_BASE + VDEC_NCHTH_OFFSET)
#define VDEC_TH1F (VDEC_BASE + VDEC_TH1F_OFFSET)
+#define VDEC_VIDMOD_SIGNAL_MASK 0x0F
+#define VDEC_VIDMOD_SIGNAL_DETECT 0x0F
+
#define VDEC_VIDMOD_M625_SHIFT 4
#define VDEC_VIDMOD_M625_MASK (1 << VDEC_VIDMOD_M625_SHIFT)