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
<mkarich...@gmail.com> 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 majord...@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>
>
>
> --
> Murali Karicheri
> mkarich...@gmail.com
>



-- 
Murali Karicheri
mkarich...@gmail.com
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to