[media] davinci: vpif display: size up the memory for the buffers from the buffer...
authorManjunath Hadli <manjunath.hadli@ti.com>
Fri, 13 Apr 2012 07:49:10 +0000 (04:49 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Jul 2012 22:03:53 +0000 (19:03 -0300)
Size up the memory for the buffers from the buffer pool allocated in board
file.  Then adjust the reqbuf count depending the available memory.

Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com>
Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/davinci/vpif_display.c
drivers/media/video/davinci/vpif_display.h

index 1d0c18a..e0070cd 100644 (file)
@@ -187,6 +187,24 @@ static int vpif_buffer_setup(struct videobuf_queue *q, unsigned int *count,
                return 0;
 
        *size = config_params.channel_bufsize[ch->channel_id];
+
+       /*
+        * Checking if the buffer size exceeds the available buffer
+        * ycmux_mode = 0 means 1 channel mode HD and
+        * ycmux_mode = 1 means 2 channels mode SD
+        */
+       if (ch->vpifparams.std_info.ycmux_mode == 0) {
+               if (config_params.video_limit[ch->channel_id])
+                       while (*size * *count > (config_params.video_limit[0]
+                                       + config_params.video_limit[1]))
+                               (*count)--;
+       } else {
+               if (config_params.video_limit[ch->channel_id])
+                       while (*size * *count >
+                               config_params.video_limit[ch->channel_id])
+                               (*count)--;
+       }
+
        if (*count < config_params.min_numbuffers)
                *count = config_params.min_numbuffers;
 
@@ -828,7 +846,7 @@ static int vpif_reqbufs(struct file *file, void *priv,
 
        common = &ch->common[index];
 
-       if (common->fmt.type != reqbuf->type)
+       if (common->fmt.type != reqbuf->type || !vpif_dev)
                return -EINVAL;
 
        if (0 != common->io_usrs)
@@ -845,7 +863,7 @@ static int vpif_reqbufs(struct file *file, void *priv,
 
        /* Initialize videobuf queue as per the buffer type */
        videobuf_queue_dma_contig_init(&common->buffer_queue,
-                                           &video_qops, NULL,
+                                           &video_qops, vpif_dev,
                                            &common->irqlock,
                                            reqbuf->type, field,
                                            sizeof(struct videobuf_buffer), fh,
@@ -1690,9 +1708,9 @@ static __init int vpif_probe(struct platform_device *pdev)
        struct video_device *vfd;
        struct resource *res;
        int subdev_count;
+       size_t size;
 
        vpif_dev = &pdev->dev;
-
        err = initialize_vpif();
 
        if (err) {
@@ -1747,6 +1765,24 @@ static __init int vpif_probe(struct platform_device *pdev)
                ch->video_dev = vfd;
        }
 
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (res) {
+               size = resource_size(res);
+               /* The resources are divided into two equal memory and when
+                * we have HD output we can add them together
+                */
+               for (j = 0; j < VPIF_DISPLAY_MAX_DEVICES; j++) {
+                       ch = vpif_obj.dev[j];
+                       ch->channel_id = j;
+
+                       /* only enabled if second resource exists */
+                       config_params.video_limit[ch->channel_id] = 0;
+                       if (size)
+                               config_params.video_limit[ch->channel_id] =
+                                                                       size/2;
+               }
+       }
+
        for (j = 0; j < VPIF_DISPLAY_MAX_DEVICES; j++) {
                ch = vpif_obj.dev[j];
                /* Initialize field of the channel objects */
index dd4887c..8a311f1 100644 (file)
@@ -158,6 +158,7 @@ struct vpif_config_params {
        u32 min_bufsize[VPIF_DISPLAY_NUM_CHANNELS];
        u32 channel_bufsize[VPIF_DISPLAY_NUM_CHANNELS];
        u8 numbuffers[VPIF_DISPLAY_NUM_CHANNELS];
+       u32 video_limit[VPIF_DISPLAY_NUM_CHANNELS];
        u8 min_numbuffers;
 };