Just want to add one more point. Probably it is a good idea to keep this function in venc. Why this function has to be platform specific? On Sat, Nov 27, 2010 at 10:22 AM, Muralidharan Karicheri <mkaricheri@xxxxxxxxx> wrote: >> +static int dm644x_set_if_config(enum v4l2_mbus_pixelcode pixcode) >> +{ >> + unsigned int val = 0; >> + int ret = 0; >> + >> + switch (pixcode) { >> + case V4L2_MBUS_FMT_FIXED: >> + /* Analog out.do nothing */ >> + break; >> + case V4L2_MBUS_FMT_YUYV8_2X8: >> + /* BT656 */ >> + val = (1<<12); >> + /*set VDMD in VMOD */ >> + dm644x_reg_modify(venc_vmod_reg, val, (7 << 12)); >> + /* Set YCCTL */ >> + dm644x_reg_modify(venc_ycctl_reg, 1, 1); >> + break; >> + case V4L2_MBUS_FMT_YUYV10_1X20: >> + /* This was VPBE_DIGITAL_IF_YCC16.BT656.Replace the enum accordingly >> + * when the right one gets into open source */ >> + val = 0 << 12; >> + dm644x_reg_modify(venc_vmod_reg, val, (7 << 12)); >> + dm644x_reg_modify(venc_ycctl_reg, 1, 1); >> + break; >> + case V4L2_MBUS_FMT_SGRBG8_1X8: >> + /* This was VPBE_DIGITAL_IF_PRGB/SRGB.Replace the enum accordingly >> + * when the right one gets into open source */ >> + val = 2 << 12; >> + dm644x_reg_modify(venc_vmod_reg, val, (7 << 12)); >> + break; >> + default: >> + ret = -EINVAL; >> + break; >> + } >> + return ret; >> +} > > The media bus format was added to sub device interface sometime back > to configure the media data format (8 bit, 16 bit etc) and there is > also a set of APIs to set the pad configuration (done by Laurent) > which is being reviewed. In the context of that, I believe the venc > VMOD configuration can be handled by implementing s_mbus_fmt() sub > device API at venc. Currently OSD sub device has set_layer_config() > which consists of setting the pixel format, frame format and > sub-frame(crop). I think this can be replaced by s_mbus_fmt(). So on a > board file, we could define the pad configuration which will include > the mbus code such as V4L2_MBUS_FMT_YUYV8_2X8 + addition pad > configurations such as embedded sync enabled etc. So once sub device > is selected, vpbe controller will set the pad configuration (obtained > from board file for each of the ?). The pad in this case is the link > between venc lcd port to external encoder. When S_FMT/S_CROP is called > on the video node, the controller calls s_mbus_fmt() on the osd and > venc sub device to set the mbus formats. > > Since the external encoder support is a TBD, I am okay if you > implement this after this patch series is merged to the tree. > > Murali >> + >> +static u64 vpbe_display_dma_mask = DMA_BIT_MASK(32); >> + >> +static struct resource dm644x_v4l2_disp_resources[] = { >> + { >> + .start = IRQ_VENCINT, >> + .end = IRQ_VENCINT, >> + .flags = IORESOURCE_IRQ, >> + }, >> + { >> + .start = 0x01C72400, >> + .end = 0x01C72400 + 0x180, >> + .flags = IORESOURCE_MEM, >> + }, >> + >> +}; >> +static struct platform_device vpbe_v4l2_display = { >> + .name = "vpbe-v4l2", >> + .id = -1, >> + .num_resources = ARRAY_SIZE(dm644x_v4l2_disp_resources), >> + .resource = dm644x_v4l2_disp_resources, >> + .dev = { >> + .dma_mask = &vpbe_display_dma_mask, >> + .coherent_dma_mask = DMA_BIT_MASK(32), >> + }, >> +}; >> +struct venc_platform_data dm644x_venc_pdata = { >> + .venc_type = DM644X_VPBE, >> + .setup_pinmux = dm644x_vpbe_setup_pinmux, >> + .setup_clock = dm644x_venc_setup_clock, >> + .setup_if_config = dm644x_set_if_config, >> +}; >> + >> +static struct platform_device dm644x_venc_dev = { >> + .name = VPBE_VENC_SUBDEV_NAME, >> + .id = -1, >> + .num_resources = ARRAY_SIZE(dm644x_venc_resources), >> + .resource = dm644x_venc_resources, >> + .dev = { >> + .dma_mask = &dm644x_venc_dma_mask, >> + .coherent_dma_mask = DMA_BIT_MASK(32), >> + .platform_data = (void *)&dm644x_venc_pdata, >> + }, >> +}; >> + >> +static u64 dm644x_vpbe_dma_mask = DMA_BIT_MASK(32); >> + >> +static struct platform_device dm644x_vpbe_dev = { >> + .name = "vpbe_controller", >> + .id = -1, >> + .dev = { >> + .dma_mask = &dm644x_vpbe_dma_mask, >> + .coherent_dma_mask = DMA_BIT_MASK(32), >> + }, >> +}; >> + >> +void dm644x_set_vpbe_display_config(struct vpbe_display_config *cfg) >> +{ >> + dm644x_vpbe_dev.dev.platform_data = cfg; >> +} >> + >> /*----------------------------------------------------------------------*/ >> >> static struct map_desc dm644x_io_desc[] = { >> @@ -767,20 +977,36 @@ void __init dm644x_init(void) >> davinci_common_init(&davinci_soc_info_dm644x); >> } >> >> +static struct platform_device *dm644x_video_devices[] __initdata = { >> + &dm644x_vpss_device, >> + &dm644x_ccdc_dev, >> + &vpfe_capture_dev, >> + &dm644x_osd_dev, >> + &dm644x_venc_dev, >> + &dm644x_vpbe_dev, >> + &vpbe_v4l2_display, >> +}; >> + >> +static int __init dm644x_init_video(void) >> +{ >> + /* Add ccdc clock aliases */ >> + clk_add_alias("master", dm644x_ccdc_dev.name, "vpss_master", NULL); >> + clk_add_alias("slave", dm644x_ccdc_dev.name, "vpss_slave", NULL); >> + vpss_clkctl_reg = ioremap_nocache(VPSS_CLKCTL, 4); >> + platform_add_devices(dm644x_video_devices, >> + ARRAY_SIZE(dm644x_video_devices)); >> + return 0; >> +} >> + >> static int __init dm644x_init_devices(void) >> { >> if (!cpu_is_davinci_dm644x()) >> return 0; >> >> /* Add ccdc clock aliases */ >> - clk_add_alias("master", dm644x_ccdc_dev.name, "vpss_master", NULL); >> - clk_add_alias("slave", dm644x_ccdc_dev.name, "vpss_slave", NULL); >> platform_device_register(&dm644x_edma_device); >> platform_device_register(&dm644x_emac_device); >> - platform_device_register(&dm644x_vpss_device); >> - platform_device_register(&dm644x_ccdc_dev); >> - platform_device_register(&vpfe_capture_dev); >> - >> + dm644x_init_video(); >> return 0; >> } >> postcore_initcall(dm644x_init_devices); >> diff --git a/arch/arm/mach-davinci/include/mach/dm644x.h b/arch/arm/mach-davinci/include/mach/dm644x.h >> index 6fca568..bf7adcd 100644 >> --- a/arch/arm/mach-davinci/include/mach/dm644x.h >> +++ b/arch/arm/mach-davinci/include/mach/dm644x.h >> @@ -26,6 +26,9 @@ >> #include <mach/hardware.h> >> #include <mach/asp.h> >> #include <media/davinci/vpfe_capture.h> >> +#include <media/davinci/vpbe_types.h> >> +#include <media/davinci/vpbe.h> >> +#include <media/davinci/vpss.h> >> >> #define DM644X_EMAC_BASE (0x01C80000) >> #define DM644X_EMAC_CNTRL_OFFSET (0x0000) >> @@ -43,5 +46,6 @@ >> void __init dm644x_init(void); >> void __init dm644x_init_asp(struct snd_platform_data *pdata); >> void dm644x_set_vpfe_config(struct vpfe_config *cfg); >> +void dm644x_set_vpbe_display_config(struct vpbe_display_config *cfg); >> >> #endif /* __ASM_ARCH_DM644X_H */ >> -- >> 1.6.2.4 >> >> -- >> 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 >> > > > > -- > Murali Karicheri > mkaricheri@xxxxxxxxx > -- Murali Karicheri mkaricheri@xxxxxxxxx -- 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