diff mbox

[PULL] http://www.linuxtv.org/hg/~hverkuil/v4l-dvb-dm646x

Message ID 200906262101.51422.hverkuil@xs4all.nl (mailing list archive)
State Changes Requested
Delegated to: Mauro Carvalho Chehab
Headers show

Commit Message

Hans Verkuil June 26, 2009, 7:01 p.m. UTC
Hi Mauro,

Please pull from http://www.linuxtv.org/hg/~hverkuil/v4l-dvb-dm646x for the following:

- ARM: DaVinci: DM646x Video: VPIF driver
- ARM: DaVinci: DM646x Video: Add VPIF display driver
- ARM: DaVinci: DM646x Video: Makefile and config files modifications for Display
- ARM: DaVinci: DM646x Video: Fix compile time warnings for mutex locking

Note that these four patches depend on the attached platform patch that
should be applied to the git tree first.

If possible, it would be great if this (like the vpfe capture driver) can be
merged for 2.6.31.

Thanks,

        Hans

diffstat:
 b/linux/drivers/media/video/davinci/Makefile       |    9
 b/linux/drivers/media/video/davinci/vpif.c         |  234 ++
 b/linux/drivers/media/video/davinci/vpif.h         |  632 +++++++
 b/linux/drivers/media/video/davinci/vpif_display.c | 1664 +++++++++++++++++++++
 b/linux/drivers/media/video/davinci/vpif_display.h |  175 ++
 linux/drivers/media/video/Kconfig                  |   22
 linux/drivers/media/video/Makefile                 |    2
 linux/drivers/media/video/davinci/vpif_display.c   |   31
 8 files changed, 2761 insertions(+), 8 deletions(-)

Comments

Hans Verkuil June 26, 2009, 7:05 p.m. UTC | #1
On Friday 26 June 2009 21:01:50 Hans Verkuil wrote:
> Hi Mauro,
> 
> Please pull from http://www.linuxtv.org/hg/~hverkuil/v4l-dvb-dm646x for the following:
> 
> - ARM: DaVinci: DM646x Video: VPIF driver
> - ARM: DaVinci: DM646x Video: Add VPIF display driver
> - ARM: DaVinci: DM646x Video: Makefile and config files modifications for Display
> - ARM: DaVinci: DM646x Video: Fix compile time warnings for mutex locking

Minor update: by request from Kevin I've removed the 'ARM: ' prefix in the
patch subject lines.

Regards,

	Hans
Mauro Carvalho Chehab July 5, 2009, 12:33 p.m. UTC | #2
Em Fri, 26 Jun 2009 21:01:50 +0200
Hans Verkuil <hverkuil@xs4all.nl> escreveu:

> Hi Mauro,
> 
> Please pull from http://www.linuxtv.org/hg/~hverkuil/v4l-dvb-dm646x for the following:
> 
> - ARM: DaVinci: DM646x Video: VPIF driver
> - ARM: DaVinci: DM646x Video: Add VPIF display driver
> - ARM: DaVinci: DM646x Video: Makefile and config files modifications for Display
> - ARM: DaVinci: DM646x Video: Fix compile time warnings for mutex locking
> 
> Note that these four patches depend on the attached platform patch that
> should be applied to the git tree first.
> 
> If possible, it would be great if this (like the vpfe capture driver) can be
> merged for 2.6.31.

One note about your changesets: Please, don't use both Reviewed-by and
Signed-off-by. The first tag is meant for patches that you reviewed, but
you are not part of the submission chain, while the second one means that you
reviewed and you're submitting to a maintainer.

I'm fixing this at the -git patches.



Cheers,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mauro Carvalho Chehab July 5, 2009, 12:34 p.m. UTC | #3
Em Fri, 26 Jun 2009 21:01:50 +0200
Hans Verkuil <hverkuil@xs4all.nl> escreveu:

> Hi Mauro,
> 
> Please pull from http://www.linuxtv.org/hg/~hverkuil/v4l-dvb-dm646x for the following:
> 
> - ARM: DaVinci: DM646x Video: VPIF driver
> - ARM: DaVinci: DM646x Video: Add VPIF display driver

Hmm...

+static const struct vpif_channel_config_params ch_params[] = {
+       {
+               "NTSC", 720, 480, 30, 0, 1, 268, 1440, 1, 23, 263, 266,
+               286, 525, 525, 0, 1, 0, V4L2_STD_525_60,
+       },
+       {
+               "PAL", 720, 576, 25, 0, 1, 280, 1440, 1, 23, 311, 313,
+               336, 624, 625, 0, 1, 0, V4L2_STD_625_50,
+       },
+};

This is a minor trouble, but the names for the standards above are wrong, since
the output format has nothing to to with the way Chroma is encoded, but,
instead, to the monochromatic standard.

So, instead of NTSC, it should be STD/M (the name of the monochromatic
standard used by the countries that has 60Hz line frequency, as defined at
ITU-R recomendation BT.601 [1]). The STD/M standard is used by both PAL and NTSC
color encodings. 

Also, instead of PAL, countries that has 50Hz line frequency use one of the
non-STD/M monochromatic standards: STD/BDGHIKLN. Also, they can encode colors
with either PAL or SECAM.

[1] http://www.itu.int/rec/R-REC-BT.601/en

+static int vpif_s_std(struct file *file, void *priv, v4l2_std_id *std_id)

There's a small problem here: the userspace app could eventually send a request
that could potentially match both a 50Hz and a 60Hz (for example, use
V4L2_STD_ALL). In this case, you should be returning back the video standard by
updating *std_id after selecting the standard:

	*std_id = <selected std id>;

+       for (j = 0; j < VPIF_DISPLAY_MAX_DEVICES; j++) {
+               ch = vpif_obj.dev[j];
+               /* Initialize field of the channel objects */
+               atomic_set(&ch->usrs, 0);
+               for (k = 0; k < VPIF_NUMOBJECTS; k++) {
+                       ch->common[k].numbuffers = 0;
+                       common = &ch->common[k];
+                       common->io_usrs = 0;
+                       common->started = 0;
+                       spin_lock_init(&common->irqlock);
+                       mutex_init(&common->lock);
+                       common->numbuffers = 0;
+                       common->set_addr = NULL;
+                       common->ytop_off = common->ybtm_off = 0;
+                       common->ctop_off = common->cbtm_off = 0;
+                       common->cur_frm = common->next_frm = NULL;
+                       memset(&common->fmt, 0, sizeof(common->fmt));
+                       common->numbuffers = config_params.numbuffers[k];
+
+               }
+               ch->initialized = 0;


Hmm... why are you needing to zero all those data structs?

+       /* Allocate memory for six channel objects */
+       for (i = 0; i < VPIF_DISPLAY_MAX_DEVICES; i++) {
+               vpif_obj.dev[i] =
+                   kmalloc(sizeof(struct channel_obj), GFP_KERNEL);

Ah, that's the reason: you are using kmalloc, instead of kzalloc.

Please, use kzalloc instead or use memset(&common, 0, sizeof(common)) instead.
The code will be cleaner and probably faster.

+#include <linux/version.h>

Please move this from the .h to the .c file, since this is needed only at the
places you have VIDIOC_QUERYCAP.


> - ARM: DaVinci: DM646x Video: Makefile and config files modifications for Display
> - ARM: DaVinci: DM646x Video: Fix compile time warnings for mutex locking

The other patches are OK.

Since all the above are minor adjustments, I'll pull from it and add at my
-git. Please fix the above.

[1] http://www.itu.int/rec/R-REC-BT.601/en



Cheers,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

[PATCH] ARM: DaVinci: DM646x Video: Platform and board specific setup
From: Chaithrika U S <chaithrika@ti.com>

Platform specific display device setup for DM646x EVM

Add platform device and resource structures. Also define a platform specific
clock setup function that can be accessed by the driver to configure the clock
and CPLD.

Signed-off-by: Chaithrika U S <chaithrika@ti.com>
Signed-off-by: Manjunath Hadli <mrh@ti.com>
Signed-off-by: Brijesh Jadav <brijesh.j@ti.com>
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>

 arch/arm/mach-davinci/board-dm646x-evm.c    |  122 +++++++++++++++++++++++++++
 arch/arm/mach-davinci/dm646x.c              |   62 ++++++++++++++
 arch/arm/mach-davinci/include/mach/dm646x.h |   24 +++++
 3 files changed, 208 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c
index e17de63..eb4bd01 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -52,6 +52,19 @@ 
 #define DM646X_EVM_PHY_MASK		(0x2)
 #define DM646X_EVM_MDIO_FREQUENCY	(2200000) /* PHY bus frequency */
 
+#define VIDCLKCTL_OFFSET	(0x38)
+#define VSCLKDIS_OFFSET		(0x6c)
+
+#define VCH2CLK_MASK		(BIT_MASK(10) | BIT_MASK(9) | BIT_MASK(8))
+#define VCH2CLK_SYSCLK8		(BIT(9))
+#define VCH2CLK_AUXCLK		(BIT(9) | BIT(8))
+#define VCH3CLK_MASK		(BIT_MASK(14) | BIT_MASK(13) | BIT_MASK(12))
+#define VCH3CLK_SYSCLK8		(BIT(13))
+#define VCH3CLK_AUXCLK		(BIT(14) | BIT(13))
+
+#define VIDCH2CLK		(BIT(10))
+#define VIDCH3CLK		(BIT(11))
+
 static struct davinci_uart_config uart_config __initdata = {
 	.enabled_uarts = (1 << 0),
 };
@@ -207,6 +220,40 @@  static struct at24_platform_data eeprom_info = {
 	.context	= (void *)0x7f00,
 };
 
+static struct i2c_client *cpld_client;
+
+static int cpld_video_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
+{
+	cpld_client = client;
+	return 0;
+}
+
+static int __devexit cpld_video_remove(struct i2c_client *client)
+{
+	cpld_client = NULL;
+	return 0;
+}
+
+static const struct i2c_device_id cpld_video_id[] = {
+	{ "cpld_video", 0 },
+	{ }
+};
+
+static struct i2c_driver cpld_video_driver = {
+	.driver = {
+		.name	= "cpld_video",
+	},
+	.probe		= cpld_video_probe,
+	.remove		= cpld_video_remove,
+	.id_table	= cpld_video_id,
+};
+
+static void evm_init_cpld(void)
+{
+	i2c_add_driver(&cpld_video_driver);
+}
+
 static struct i2c_board_info __initdata i2c_info[] =  {
 	{
 		I2C_BOARD_INFO("24c256", 0x50),
@@ -216,6 +263,9 @@  static struct i2c_board_info __initdata i2c_info[] =  {
 		I2C_BOARD_INFO("pcf8574a", 0x38),
 		.platform_data	= &pcf_data,
 	},
+	{
+		I2C_BOARD_INFO("cpld_video", 0x3B),
+	},
 };
 
 static struct davinci_i2c_platform_data i2c_pdata = {
@@ -223,10 +273,81 @@  static struct davinci_i2c_platform_data i2c_pdata = {
 	.bus_delay      = 0 /* usec */,
 };
 
+static int set_vpif_clock(int mux_mode, int hd)
+{
+	int val = 0;
+	int err = 0;
+	unsigned int value;
+	void __iomem *base = IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE);
+
+	/* disable the clock */
+	value = __raw_readl(base + VSCLKDIS_OFFSET);
+	value |= (VIDCH3CLK | VIDCH2CLK);
+	__raw_writel(value, base + VSCLKDIS_OFFSET);
+
+	val = i2c_smbus_read_byte(cpld_client);
+	if (val < 0)
+		return val;
+
+	if (mux_mode == 1)
+		val &= ~0x40;
+	else
+		val |= 0x40;
+
+	err = i2c_smbus_write_byte(cpld_client, val);
+	if (err)
+		return err;
+
+	value = __raw_readl(base + VIDCLKCTL_OFFSET);
+	value &= ~(VCH2CLK_MASK);
+	value &= ~(VCH3CLK_MASK);
+
+	if (hd >= 1)
+		value |= (VCH2CLK_SYSCLK8 | VCH3CLK_SYSCLK8);
+	else
+		value |= (VCH2CLK_AUXCLK | VCH3CLK_AUXCLK);
+
+	__raw_writel(value, base + VIDCLKCTL_OFFSET);
+
+	/* enable the clock */
+	value = __raw_readl(base + VSCLKDIS_OFFSET);
+	value &= ~(VIDCH3CLK | VIDCH2CLK);
+	__raw_writel(value, base + VSCLKDIS_OFFSET);
+
+	return 0;
+}
+
+static const struct subdev_info dm646x_vpif_subdev[] = {
+	{
+		.addr	= 0x2A,
+		.name	= "adv7343",
+	},
+	{
+		.addr	= 0x2C,
+		.name	= "ths7303",
+	},
+};
+
+static const char *output[] = {
+	"Composite",
+	"Component",
+	"S-Video",
+};
+
+static struct vpif_config dm646x_vpif_config = {
+	.set_clock	= set_vpif_clock,
+	.subdevinfo	= dm646x_vpif_subdev,
+	.subdev_count	= ARRAY_SIZE(dm646x_vpif_subdev),
+	.output		= output,
+	.output_count	= ARRAY_SIZE(output),
+	.card_name	= "DM646x EVM",
+};
+
 static void __init evm_init_i2c(void)
 {
 	davinci_init_i2c(&i2c_pdata);
 	i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
+	evm_init_cpld();
 }
 
 static void __init davinci_map_io(void)
@@ -243,6 +364,7 @@  static __init void evm_init(void)
 
 	soc_info->emac_pdata->phy_mask = DM646X_EVM_PHY_MASK;
 	soc_info->emac_pdata->mdio_max_freq = DM646X_EVM_MDIO_FREQUENCY;
+	dm646x_setup_vpif(&dm646x_vpif_config);
 }
 
 static __init void davinci_dm646x_evm_irq_init(void)
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
index 64a291f..50dba53 100644
--- a/arch/arm/mach-davinci/dm646x.c
+++ b/arch/arm/mach-davinci/dm646x.c
@@ -31,6 +31,15 @@ 
 #include "clock.h"
 #include "mux.h"
 
+#define DAVINCI_VPIF_BASE       (0x01C12000)
+#define VDD3P3V_PWDN_OFFSET	(0x48)
+#define VSCLKDIS_OFFSET		(0x6C)
+
+#define VDD3P3V_VID_MASK	(BIT_MASK(7) | BIT_MASK(6) | BIT_MASK(5) |\
+					BIT_MASK(4))
+#define VSCLKDIS_MASK		(BIT_MASK(11) | BIT_MASK(10) | BIT_MASK(9) |\
+					BIT_MASK(8))
+
 /*
  * Device specific clocks
  */
@@ -587,6 +596,37 @@  static struct platform_device dm646x_edma_device = {
 	.resource		= edma_resources,
 };
 
+static u64 vpif_dma_mask = DMA_BIT_MASK(32);
+
+static struct resource vpif_resource[] = {
+	{
+		.start	= DAVINCI_VPIF_BASE,
+		.end	= DAVINCI_VPIF_BASE + 0x03fff,
+		.flags	= IORESOURCE_MEM,
+	},
+	{
+		.start = IRQ_DM646X_VP_VERTINT2,
+		.end   = IRQ_DM646X_VP_VERTINT2,
+		.flags = IORESOURCE_IRQ,
+	},
+	{
+		.start = IRQ_DM646X_VP_VERTINT3,
+		.end   = IRQ_DM646X_VP_VERTINT3,
+		.flags = IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device vpif_display_dev = {
+	.name		= "vpif_display",
+	.id		= -1,
+	.dev		= {
+			.dma_mask 		= &vpif_dma_mask,
+			.coherent_dma_mask	= DMA_32BIT_MASK,
+	},
+	.resource	= vpif_resource,
+	.num_resources	= ARRAY_SIZE(vpif_resource),
+};
+
 /*----------------------------------------------------------------------*/
 
 static struct map_desc dm646x_io_desc[] = {
@@ -696,6 +736,28 @@  static struct davinci_soc_info davinci_soc_info_dm646x = {
 	.sram_len		= SZ_32K,
 };
 
+void dm646x_setup_vpif(struct vpif_config *config)
+{
+	unsigned int value;
+	void __iomem *base = IO_ADDRESS(DAVINCI_SYSTEM_MODULE_BASE);
+
+	value = __raw_readl(base + VSCLKDIS_OFFSET);
+	value &= ~VSCLKDIS_MASK;
+	__raw_writel(value, base + VSCLKDIS_OFFSET);
+
+	value = __raw_readl(base + VDD3P3V_PWDN_OFFSET);
+	value &= ~VDD3P3V_VID_MASK;
+	__raw_writel(value, base + VDD3P3V_PWDN_OFFSET);
+
+	davinci_cfg_reg(DM646X_STSOMUX_DISABLE);
+	davinci_cfg_reg(DM646X_STSIMUX_DISABLE);
+	davinci_cfg_reg(DM646X_PTSOMUX_DISABLE);
+	davinci_cfg_reg(DM646X_PTSIMUX_DISABLE);
+
+	vpif_display_dev.dev.platform_data = config;
+	platform_device_register(&vpif_display_dev);
+}
+
 void __init dm646x_init(void)
 {
 	davinci_common_init(&davinci_soc_info_dm646x);
diff --git a/arch/arm/mach-davinci/include/mach/dm646x.h b/arch/arm/mach-davinci/include/mach/dm646x.h
index 1fc764c..7409b6d 100644
--- a/arch/arm/mach-davinci/include/mach/dm646x.h
+++ b/arch/arm/mach-davinci/include/mach/dm646x.h
@@ -23,4 +23,28 @@ 
 
 void __init dm646x_init(void);
 
+void dm646x_video_init(void);
+
+struct vpif_output {
+	u16 id;
+	const char *name;
+};
+
+struct subdev_info {
+	unsigned short addr;
+	const char *name;
+};
+
+struct vpif_config {
+	int (*set_clock)(int, int);
+	const struct subdev_info *subdevinfo;
+	int subdev_count;
+	const char **output;
+	int output_count;
+	const char *card_name;
+};
+
+
+void dm646x_setup_vpif(struct vpif_config *config);
+
 #endif /* __ASM_ARCH_DM646X_H */
-- 
1.5.6