On Thursday 11 June 2009 19:00:46 m-karicheri2@xxxxxx wrote: > From: Muralidharan Karicheri <a0868495@xxxxxxxxxxxxxxxxxxxxxxxxxx> > > DM355 platform and board setup > > This has platform and board setup changes to support vpfe capture > driver for DM355 EVMs. > > Added registration of vpss platform driver based on last review > > Reviewed By "Hans Verkuil". > Reviewed By "Laurent Pinchart". > > Signed-off-by: Muralidharan Karicheri <m-karicheri2@xxxxxx> > --- > Applies to Davinci GIT Tree > > arch/arm/mach-davinci/board-dm355-evm.c | 72 +++++++++++++++++++++++- > arch/arm/mach-davinci/dm355.c | 83 ++++++++++++++++++++++++++++ > arch/arm/mach-davinci/include/mach/dm355.h | 2 + > arch/arm/mach-davinci/include/mach/mux.h | 9 +++ > 4 files changed, 163 insertions(+), 3 deletions(-) > > diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c > index 5ac2f56..cf87e21 100644 > --- a/arch/arm/mach-davinci/board-dm355-evm.c > +++ b/arch/arm/mach-davinci/board-dm355-evm.c > @@ -20,6 +20,8 @@ > #include <linux/io.h> > #include <linux/gpio.h> > #include <linux/clk.h> > +#include <linux/videodev2.h> > +#include <media/tvp514x.h> > #include <linux/spi/spi.h> > #include <linux/spi/eeprom.h> > > @@ -134,12 +136,23 @@ static void dm355evm_mmcsd_gpios(unsigned gpio) > dm355evm_mmc_gpios = gpio; > } > > +#define TVP5146_I2C_ADDR 0x5D > +static struct tvp514x_platform_data tvp5146_pdata = { > + .clk_polarity = 0, > + .hs_polarity = 1, > + .vs_polarity = 1 > +}; > + > static struct i2c_board_info dm355evm_i2c_info[] = { > - { I2C_BOARD_INFO("dm355evm_msp", 0x25), > + { I2C_BOARD_INFO("dm355evm_msp", 0x25), > .platform_data = dm355evm_mmcsd_gpios, > - /* plus irq */ }, > + }, > + { > + I2C_BOARD_INFO("tvp5146", TVP5146_I2C_ADDR), > + .platform_data = &tvp5146_pdata, > + }, > + /* { plus irq }, */ > /* { I2C_BOARD_INFO("tlv320aic3x", 0x1b), }, */ Huh? What's this? I only know the tlv320aic23b and that's an audio driver. > - /* { I2C_BOARD_INFO("tvp5146", 0x5d), }, */ > }; > > static void __init evm_init_i2c(void) > @@ -178,6 +191,57 @@ static struct platform_device dm355evm_dm9000 = { > .num_resources = ARRAY_SIZE(dm355evm_dm9000_rsrc), > }; > > +#define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL) > +/* Inputs available at the TVP5146 */ > +static struct v4l2_input tvp5146_inputs[] = { > + { > + .index = 0, > + .name = "COMPOSITE", Please, don't use all-caps. Just use "Composite" and "S-Video". > + .type = V4L2_INPUT_TYPE_CAMERA, > + .std = TVP514X_STD_ALL, > + }, > + { > + .index = 1, > + .name = "SVIDEO", > + .type = V4L2_INPUT_TYPE_CAMERA, > + .std = TVP514X_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 > + * with tvp5146_inputs > + */ > +static struct v4l2_routing tvp5146_routes[] = { As mentioned elsewhere: v4l2_routing will disappear, so please don't use it. > + { > + .input = INPUT_CVBS_VI2B, > + .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, > + }, > + { > + .input = INPUT_SVIDEO_VI2C_VI1C, > + .output = OUTPUT_10BIT_422_EMBEDDED_SYNC, > + }, > +}; > + > +static struct vpfe_subdev_info vpfe_sub_devs[] = { > + { > + .name = "tvp5146", > + .grp_id = 0, > + .num_inputs = ARRAY_SIZE(tvp5146_inputs), > + .inputs = tvp5146_inputs, > + .routes = tvp5146_routes, > + .can_route = 1, > + } > +}; A general remark: currently you link your inputs directly to a subdev. This approach has two disadvantages: 1) It doesn't work if there are no subdevs at all (e.g. because everything goes through an fpga). 2) It fixes the reported order of the inputs to the order of the subdevs. I think it is better to have a separate array of input descriptions that refer to a subdev when an input is associated with that subdev. It's more flexible that way, and I actually think that the vpfe driver will be simplified as well. > + > +static struct vpfe_config vpfe_cfg = { > + .num_subdevs = ARRAY_SIZE(vpfe_sub_devs), > + .sub_devs = vpfe_sub_devs, > + .card_name = "DM355 EVM", > + .ccdc = "DM355 CCDC", > +}; > + > static struct platform_device *davinci_evm_devices[] __initdata = { > &dm355evm_dm9000, > &davinci_nand_device, > @@ -189,6 +253,8 @@ static struct davinci_uart_config uart_config __initdata = { > > static void __init dm355_evm_map_io(void) > { > + /* setup input configuration for VPFE input devices */ > + dm355_set_vpfe_config(&vpfe_cfg); > dm355_init(); > } > > diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c > index 9baeed3..3263af8 100644 > --- a/arch/arm/mach-davinci/dm355.c > +++ b/arch/arm/mach-davinci/dm355.c > @@ -481,6 +481,14 @@ INT_CFG(DM355, INT_EDMA_TC1_ERR, 4, 1, 1, false) > EVT_CFG(DM355, EVT8_ASP1_TX, 0, 1, 0, false) > EVT_CFG(DM355, EVT9_ASP1_RX, 1, 1, 0, false) > EVT_CFG(DM355, EVT26_MMC0_RX, 2, 1, 0, false) > + > +MUX_CFG(DM355, VIN_PCLK, 0, 14, 1, 1, false) > +MUX_CFG(DM355, VIN_CAM_WEN, 0, 13, 1, 1, false) > +MUX_CFG(DM355, VIN_CAM_VD, 0, 12, 1, 1, false) > +MUX_CFG(DM355, VIN_CAM_HD, 0, 11, 1, 1, false) > +MUX_CFG(DM355, VIN_YIN_EN, 0, 10, 1, 1, false) > +MUX_CFG(DM355, VIN_CINL_EN, 0, 0, 0xff, 0x55, false) > +MUX_CFG(DM355, VIN_CINH_EN, 0, 8, 3, 3, false) > #endif > }; > > @@ -623,6 +631,67 @@ static struct platform_device dm355_edma_device = { > .resource = edma_resources, > }; > > +static struct resource dm355_vpss_resources[] = { > + { > + /* VPSS BL Base address */ > + .name = "vpss", > + .start = 0x01c70800, > + .end = 0x01c70800 + 0xff, > + .flags = IORESOURCE_MEM, > + }, > + { > + /* VPSS CLK Base address */ > + .name = "vpss", > + .start = 0x01c70000, > + .end = 0x01c70000 + 0xf, > + .flags = IORESOURCE_MEM, > + }, > +}; > + > +static struct platform_device dm355_vpss_device = { > + .name = "vpss", > + .id = -1, > + .dev.platform_data = "dm355_vpss", > + .num_resources = ARRAY_SIZE(dm355_vpss_resources), > + .resource = dm355_vpss_resources, > +}; > + > +static struct resource vpfe_resources[] = { > + { > + .start = IRQ_VDINT0, > + .end = IRQ_VDINT0, > + .flags = IORESOURCE_IRQ, > + }, > + { > + .start = IRQ_VDINT1, > + .end = IRQ_VDINT1, > + .flags = IORESOURCE_IRQ, > + }, > + /* CCDC Base address */ > + { > + .flags = IORESOURCE_MEM, > + .start = 0x01c70600, > + .end = 0x01c70600 + 0x1ff, > + }, > +}; > + > +static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32); > +static struct platform_device vpfe_capture_dev = { > + .name = CAPTURE_DRV_NAME, > + .id = -1, > + .num_resources = ARRAY_SIZE(vpfe_resources), > + .resource = vpfe_resources, > + .dev = { > + .dma_mask = &vpfe_capture_dma_mask, > + .coherent_dma_mask = DMA_BIT_MASK(32), > + }, > +}; > + > +void dm355_set_vpfe_config(struct vpfe_config *cfg) > +{ > + vpfe_capture_dev.dev.platform_data = cfg; > +} > + > /*----------------------------------------------------------------------*/ > > static struct map_desc dm355_io_desc[] = { > @@ -744,6 +813,20 @@ static int __init dm355_init_devices(void) > > davinci_cfg_reg(DM355_INT_EDMA_CC); > platform_device_register(&dm355_edma_device); > + platform_device_register(&dm355_vpss_device); > + /* > + * setup Mux configuration for vpfe input and register > + * vpfe capture platform device > + */ > + davinci_cfg_reg(DM355_VIN_PCLK); > + davinci_cfg_reg(DM355_VIN_CAM_WEN); > + davinci_cfg_reg(DM355_VIN_CAM_VD); > + davinci_cfg_reg(DM355_VIN_CAM_HD); > + davinci_cfg_reg(DM355_VIN_YIN_EN); > + davinci_cfg_reg(DM355_VIN_CINL_EN); > + davinci_cfg_reg(DM355_VIN_CINH_EN); > + platform_device_register(&vpfe_capture_dev); > + > return 0; > } > postcore_initcall(dm355_init_devices); > diff --git a/arch/arm/mach-davinci/include/mach/dm355.h b/arch/arm/mach-davinci/include/mach/dm355.h > index 54903b7..e28713c 100644 > --- a/arch/arm/mach-davinci/include/mach/dm355.h > +++ b/arch/arm/mach-davinci/include/mach/dm355.h > @@ -12,11 +12,13 @@ > #define __ASM_ARCH_DM355_H > > #include <mach/hardware.h> > +#include <media/davinci/vpfe_capture.h> > > struct spi_board_info; > > void __init dm355_init(void); > void dm355_init_spi0(unsigned chipselect_mask, > struct spi_board_info *info, unsigned len); > +void dm355_set_vpfe_config(struct vpfe_config *cfg); > > #endif /* __ASM_ARCH_DM355_H */ > diff --git a/arch/arm/mach-davinci/include/mach/mux.h b/arch/arm/mach-davinci/include/mach/mux.h > index 2737845..f288063 100644 > --- a/arch/arm/mach-davinci/include/mach/mux.h > +++ b/arch/arm/mach-davinci/include/mach/mux.h > @@ -154,6 +154,15 @@ enum davinci_dm355_index { > DM355_EVT8_ASP1_TX, > DM355_EVT9_ASP1_RX, > DM355_EVT26_MMC0_RX, > + > + /* Video In Pin Mux */ > + DM355_VIN_PCLK, > + DM355_VIN_CAM_WEN, > + DM355_VIN_CAM_VD, > + DM355_VIN_CAM_HD, > + DM355_VIN_YIN_EN, > + DM355_VIN_CINL_EN, > + DM355_VIN_CINH_EN, > }; > > #ifdef CONFIG_DAVINCI_MUX Regards, Hans -- Hans Verkuil - video4linux developer - sponsored by TANDBERG Telecom -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html