From: Manjunath Hadli <[email protected]>

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 <[email protected]>
Signed-off-by: Lad, Prabhakar <[email protected]>
---
 drivers/media/video/davinci/vpif_display.c |   42 ++++++++++++++++++++++++++--
 drivers/media/video/davinci/vpif_display.h |    1 +
 2 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/drivers/media/video/davinci/vpif_display.c 
b/drivers/media/video/davinci/vpif_display.c
index 1d0c18a..e0070cd 100644
--- a/drivers/media/video/davinci/vpif_display.c
+++ b/drivers/media/video/davinci/vpif_display.c
@@ -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 */
diff --git a/drivers/media/video/davinci/vpif_display.h 
b/drivers/media/video/davinci/vpif_display.h
index dd4887c..8a311f1 100644
--- a/drivers/media/video/davinci/vpif_display.h
+++ b/drivers/media/video/davinci/vpif_display.h
@@ -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;
 };
 
-- 
1.7.4.1

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to