diff mbox

[2/6,v3] Updated Support for TVP7002 in dm365 board

Message ID 1251845599-18040-1-git-send-email-santiago.nunez@ridgerun.com (mailing list archive)
State Superseded
Headers show

Commit Message

santiago.nunez@ridgerun.com Sept. 1, 2009, 10:53 p.m. UTC
From: Santiago Nunez-Corrales <santiago.nunez@ridgerun.com>

This patch provides support for TVP7002 in architecture definitions
within DM365. Moved tvp7002 platform data here and cleaned up code.

Signed-off-by: Santiago Nunez-Corrales <santiago.nunez@ridgerun.com>
---
 arch/arm/mach-davinci/board-dm365-evm.c |   66 +++++++++++++++++++++++++++++-
 1 files changed, 63 insertions(+), 3 deletions(-)

Comments

Murali Karicheri Sept. 2, 2009, 7:16 p.m. UTC | #1
Murali Karicheri
Software Design Engineer
Texas Instruments Inc.
Germantown, MD 20874
new phone: 301-407-9583
Old Phone : 301-515-3736 (will be deprecated)
email: m-karicheri2@ti.com

>-----Original Message-----
>From: santiago.nunez@ridgerun.com [mailto:santiago.nunez@ridgerun.com]
>Sent: Tuesday, September 01, 2009 6:53 PM
>To: Karicheri, Muralidharan
>Cc: davinci-linux-open-source@linux.davincidsp.com;
>todd.fischer@ridgerun.com; diego.dompe@ridgerun.com;
>clark.becker@ridgerun.com; Narnakaje, Snehaprabha; Santiago Nunez-Corrales
>Subject: [PATCH 2/6 v3] Updated Support for TVP7002 in dm365 board
>
>From: Santiago Nunez-Corrales <santiago.nunez@ridgerun.com>
>
>This patch provides support for TVP7002 in architecture definitions
>within DM365. Moved tvp7002 platform data here and cleaned up code.
>
>Signed-off-by: Santiago Nunez-Corrales <santiago.nunez@ridgerun.com>
>---
> arch/arm/mach-davinci/board-dm365-evm.c |   66
>+++++++++++++++++++++++++++++-
> 1 files changed, 63 insertions(+), 3 deletions(-)
>
>diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-
>davinci/board-dm365-evm.c
>index 362ac62..4ebfbb9 100644
>--- a/arch/arm/mach-davinci/board-dm365-evm.c
>+++ b/arch/arm/mach-davinci/board-dm365-evm.c
>@@ -42,7 +42,9 @@
> #include <mach/mmc.h>
> #include <mach/nand.h>
> #include <linux/videodev2.h>
>+#include <media/davinci/videohd.h>
> #include <media/tvp514x.h>
>+#include <media/tvp7002.h>
>
>
> static inline int have_imager(void)
>@@ -53,14 +55,20 @@ static inline int have_imager(void)
>
> static inline int have_tvp7002(void)
> {
>-	/* REVISIT when it's supported, trigger via Kconfig */
>+#ifdef CONFIG_VIDEO_TVP7002
>+	return 1;
>+#else
> 	return 0;
>+#endif
> }
>
>
> #define DM365_ASYNC_EMIF_CONTROL_BASE	0x01d10000
> #define DM365_ASYNC_EMIF_DATA_CE0_BASE	0x02000000
> #define DM365_ASYNC_EMIF_DATA_CE1_BASE	0x04000000
>+#define DM365_ASYNC_EMIF_DATA_CE1_REG3	0x18
>+#define DM365_ASYNC_EMIF_VIDEO_MUX_MASK	(0x07070707)
>+#define DM365_ASYNC_EMIF_TVP7002_SEL	(0x01010101)
>
> #define DM365_EVM_PHY_MASK		(0x2)
> #define DM365_EVM_MDIO_FREQUENCY	(2200000) /* PHY bus frequency */
>@@ -109,6 +117,14 @@ static struct tvp514x_platform_data tvp5146_pdata = {
>        .vs_polarity = 1
> };
>
>+/* tvp7002 platform data, used during reset and probe operations */
>+static struct tvp7002_platform_data tvp7002_pdata = {
>+       .clk_polarity = 1,
>+       .hs_polarity = 1,
>+       .vs_polarity = 1,
>+       .fid_polarity = 1,
>+};
>+
[MK] This is what is sent to tvp7002 during probe as part of platform data.
So you need to read this and set it in hw. See my comment against tvp7002
patch
> /* NOTE:  this is geared for the standard config, with a socketed
>  * 2 GByte Micron NAND (MT29F16G08FAA) using 128KB sectors.  If you
>  * swap chips, maybe with a different block size, partitioning may
>@@ -243,6 +259,22 @@ static struct v4l2_input tvp5146_inputs[] = {
> 	},
> };
>
>+#define TVP7002_STD_ALL        (V4L2_STD_525P_60   | V4L2_STD_625P_50 	|\
>+				V4L2_STD_525I_60   | V4L2_STD_625I_50   |\
[MK] replace this with V4L2_STD_NTSC and V4L2_STD_PAL standards from videodev2.h
>+				V4L2_STD_720P_50   | V4L2_STD_720P_60 	|\
>+				V4L2_STD_1080I_50  | V4L2_STD_1080I_60 	|\
>+				V4L2_STD_1080P_50  | V4L2_STD_1080P_60)
>+
>+/* Inputs available at the TVP7002 */
>+static struct v4l2_input tvp7002_inputs[] = {
>+	{
>+		.index = 0,
>+		.name = "Component",
>+		.type = V4L2_INPUT_TYPE_CAMERA,
>+		.std = TVP7002_STD_ALL,
>+	},
>+};
>+
> /*
>  * this is the route info for connecting each input to decoder
>  * ouput that goes to vpfe. There is a one to one correspondence
>@@ -276,6 +308,22 @@ static struct vpfe_subdev_info vpfe_sub_devs[] = {
> 			I2C_BOARD_INFO("tvp5146", 0x5d),
> 			.platform_data = &tvp5146_pdata,
> 		},
>+	},
>+	{
>+		.module_name = "tvp7002",
>+		.grp_id = 0,
>+		.num_inputs = ARRAY_SIZE(tvp7002_inputs),
>+		.inputs = tvp7002_inputs,
>+		.can_route = 1,


[MK]remove this as we have only one input.

>+		.ccdc_if_params = {
>+			.if_type = VPFE_BT1120,
>+			.hdpol = VPFE_PINPOL_POSITIVE,
>+			.vdpol = VPFE_PINPOL_POSITIVE,
>+		},
>+		.board_info = {
>+			I2C_BOARD_INFO("tvp7002", 0x5c),
>+			.platform_data = &tvp7002_pdata,
>+		},
> 	}
> };
>
>@@ -439,6 +487,16 @@ static int __init cpld_leds_init(void)
> /* run after subsys_initcall() for LEDs */
> fs_initcall(cpld_leds_init);
>
>+/* Set the input mux for TVP7002 */
>+int tvp7002_set_input_mux(unsigned char channel)
[MK]You don't need channel as an argument in DM365 since we have only one channel.
>+{
>+	u32 val;
>+	val = __raw_readl(DM365_ASYNC_EMIF_DATA_CE1_REG3);
>+	val &= ~DM365_ASYNC_EMIF_VIDEO_MUX_MASK;
>+	val |= DM365_ASYNC_EMIF_TVP7002_SEL;
>+	__raw_writel(val, DM365_ASYNC_EMIF_DATA_CE1_REG3);
>+	return 0;
>+}
>
> static void __init evm_init_cpld(void)
> {
>@@ -519,6 +577,8 @@ fail:
> 			mux |= 2;
> 			resets &= ~BIT(2);
> 			label = "tvp7002 HD";
>+			/* Call the input setter */
>+			tvp7002_set_input_mux(0);
> 		} else {
> 			/* default to tvp5146 */
> 			mux |= 5;
>@@ -526,8 +586,8 @@ fail:
> 			label = "tvp5146 SD";
> 		}
> 	}
>-	__raw_writeb(mux, cpld + CPLD_MUX);
>-	__raw_writeb(resets, cpld + CPLD_RESETS);
>+	__raw_writel(mux, cpld + CPLD_MUX);
>+	__raw_writel(resets, cpld + CPLD_RESETS);
> 	pr_info("EVM: %s video input\n", label);
>
> 	/* REVISIT export switches: NTSC/PAL (SW5.6), EXTRA1 (SW5.2), etc */
>--
>1.6.0.4
>
diff mbox

Patch

diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c
index 362ac62..4ebfbb9 100644
--- a/arch/arm/mach-davinci/board-dm365-evm.c
+++ b/arch/arm/mach-davinci/board-dm365-evm.c
@@ -42,7 +42,9 @@ 
 #include <mach/mmc.h>
 #include <mach/nand.h>
 #include <linux/videodev2.h>
+#include <media/davinci/videohd.h>
 #include <media/tvp514x.h>
+#include <media/tvp7002.h>
 
 
 static inline int have_imager(void)
@@ -53,14 +55,20 @@  static inline int have_imager(void)
 
 static inline int have_tvp7002(void)
 {
-	/* REVISIT when it's supported, trigger via Kconfig */
+#ifdef CONFIG_VIDEO_TVP7002
+	return 1;
+#else
 	return 0;
+#endif
 }
 
 
 #define DM365_ASYNC_EMIF_CONTROL_BASE	0x01d10000
 #define DM365_ASYNC_EMIF_DATA_CE0_BASE	0x02000000
 #define DM365_ASYNC_EMIF_DATA_CE1_BASE	0x04000000
+#define DM365_ASYNC_EMIF_DATA_CE1_REG3	0x18
+#define DM365_ASYNC_EMIF_VIDEO_MUX_MASK	(0x07070707)
+#define DM365_ASYNC_EMIF_TVP7002_SEL	(0x01010101)
 
 #define DM365_EVM_PHY_MASK		(0x2)
 #define DM365_EVM_MDIO_FREQUENCY	(2200000) /* PHY bus frequency */
@@ -109,6 +117,14 @@  static struct tvp514x_platform_data tvp5146_pdata = {
        .vs_polarity = 1
 };
 
+/* tvp7002 platform data, used during reset and probe operations */
+static struct tvp7002_platform_data tvp7002_pdata = {
+       .clk_polarity = 1,
+       .hs_polarity = 1,
+       .vs_polarity = 1,
+       .fid_polarity = 1,
+};
+
 /* NOTE:  this is geared for the standard config, with a socketed
  * 2 GByte Micron NAND (MT29F16G08FAA) using 128KB sectors.  If you
  * swap chips, maybe with a different block size, partitioning may
@@ -243,6 +259,22 @@  static struct v4l2_input tvp5146_inputs[] = {
 	},
 };
 
+#define TVP7002_STD_ALL        (V4L2_STD_525P_60   | V4L2_STD_625P_50 	|\
+				V4L2_STD_525I_60   | V4L2_STD_625I_50   |\
+				V4L2_STD_720P_50   | V4L2_STD_720P_60 	|\
+				V4L2_STD_1080I_50  | V4L2_STD_1080I_60 	|\
+				V4L2_STD_1080P_50  | V4L2_STD_1080P_60)
+
+/* Inputs available at the TVP7002 */
+static struct v4l2_input tvp7002_inputs[] = {
+	{
+		.index = 0,
+		.name = "Component",
+		.type = V4L2_INPUT_TYPE_CAMERA,
+		.std = TVP7002_STD_ALL,
+	},
+};
+
 /*
  * this is the route info for connecting each input to decoder
  * ouput that goes to vpfe. There is a one to one correspondence
@@ -276,6 +308,22 @@  static struct vpfe_subdev_info vpfe_sub_devs[] = {
 			I2C_BOARD_INFO("tvp5146", 0x5d),
 			.platform_data = &tvp5146_pdata,
 		},
+	},
+	{
+		.module_name = "tvp7002",
+		.grp_id = 0,
+		.num_inputs = ARRAY_SIZE(tvp7002_inputs),
+		.inputs = tvp7002_inputs,
+		.can_route = 1,
+		.ccdc_if_params = {
+			.if_type = VPFE_BT1120,
+			.hdpol = VPFE_PINPOL_POSITIVE,
+			.vdpol = VPFE_PINPOL_POSITIVE,
+		},
+		.board_info = {
+			I2C_BOARD_INFO("tvp7002", 0x5c),
+			.platform_data = &tvp7002_pdata,
+		},
 	}
 };
 
@@ -439,6 +487,16 @@  static int __init cpld_leds_init(void)
 /* run after subsys_initcall() for LEDs */
 fs_initcall(cpld_leds_init);
 
+/* Set the input mux for TVP7002 */
+int tvp7002_set_input_mux(unsigned char channel)
+{
+	u32 val;
+	val = __raw_readl(DM365_ASYNC_EMIF_DATA_CE1_REG3);
+	val &= ~DM365_ASYNC_EMIF_VIDEO_MUX_MASK;
+	val |= DM365_ASYNC_EMIF_TVP7002_SEL;
+	__raw_writel(val, DM365_ASYNC_EMIF_DATA_CE1_REG3);
+	return 0;
+}
 
 static void __init evm_init_cpld(void)
 {
@@ -519,6 +577,8 @@  fail:
 			mux |= 2;
 			resets &= ~BIT(2);
 			label = "tvp7002 HD";
+			/* Call the input setter */
+			tvp7002_set_input_mux(0);
 		} else {
 			/* default to tvp5146 */
 			mux |= 5;
@@ -526,8 +586,8 @@  fail:
 			label = "tvp5146 SD";
 		}
 	}
-	__raw_writeb(mux, cpld + CPLD_MUX);
-	__raw_writeb(resets, cpld + CPLD_RESETS);
+	__raw_writel(mux, cpld + CPLD_MUX);
+	__raw_writel(resets, cpld + CPLD_RESETS);
 	pr_info("EVM: %s video input\n", label);
 
 	/* REVISIT export switches: NTSC/PAL (SW5.6), EXTRA1 (SW5.2), etc */