*size = fh->fmt->depth*fh->width*fh->height >> 3;
        if (0 == *count)
                *count = gbuffers;
-       while (*size * *count > gbuffers * gbufsize)
-               (*count)--;
+       if (*size * *count > gbuffers * gbufsize)
+               *count = (gbuffers * gbufsize) / *size;
        return 0;
 }
 
 
        *size = fh->fmt->depth*fh->width*fh->height >> 3;
        if (0 == *count)
                *count = 32;
-       while (*size * *count > vid_limit * 1024 * 1024)
-               (*count)--;
+       if (*size * *count > vid_limit * 1024 * 1024)
+               *count = (vid_limit * 1024 * 1024) / *size;
        return 0;
 }
 
 
        *size = fh->fmt->depth*fh->width*fh->height >> 3;
        if (0 == *count)
                *count = 32;
-       while (*size * *count > vid_limit * 1024 * 1024)
-               (*count)--;
+       if (*size * *count > vid_limit * 1024 * 1024)
+               *count = (vid_limit * 1024 * 1024) / *size;
        return 0;
 }
 
 
        if (!*count)
                *count = 32;
 
-       while (*size * *count > MAX_VIDEO_MEM * 1024 * 1024)
-               (*count)--;
+       if (*size * *count > MAX_VIDEO_MEM * 1024 * 1024)
+               *count = (MAX_VIDEO_MEM * 1024 * 1024) / *size;
 
        dev_dbg(icd->dev.parent, "count=%d, size=%d\n", *count, *size);
 
 
        *size = fh->pix.sizeimage;
 
        /* accessing fh->cam->capture_mem is ok, it's constant */
-       while (*size * *cnt > fh->cam->capture_mem)
-               (*cnt)--;
+       if (*size * *cnt > fh->cam->capture_mem)
+               *cnt = fh->cam->capture_mem / *size;
 
        return 0;
 }
 
 
        if (0 == *count)
                *count = 32;
-       while (*size * *count > vid_limit * 1024 * 1024)
-               (*count)--;
+       if (*size * *count > vid_limit * 1024 * 1024)
+               *count = (vid_limit * 1024 * 1024) / *size;
 
        return 0;
 }
 
        if (0 == *count)
                *count = S2255_DEF_BUFS;
 
-       while (*size * (*count) > vid_limit * 1024 * 1024)
-               (*count)--;
+       if (*size * *count > vid_limit * 1024 * 1024)
+               *count = (vid_limit * 1024 * 1024) / *size;
 
        return 0;
 }
 
                *count = 2;
 
        if (pcdev->video_limit) {
-               while (PAGE_ALIGN(*size) * *count > pcdev->video_limit)
-                       (*count)--;
+               if (PAGE_ALIGN(*size) * *count > pcdev->video_limit)
+                       *count = pcdev->video_limit / PAGE_ALIGN(*size);
        }
 
        dev_dbg(icd->dev.parent, "count=%d, size=%d\n", *count, *size);
 
        if (0 == *count)
                *count = 32;
 
-       while (*size * *count > vid_limit * 1024 * 1024)
-               (*count)--;
+       if (*size * *count > vid_limit * 1024 * 1024)
+               *count = (vid_limit * 1024 * 1024) / *size;
 
        dprintk(dev, 1, "%s, count=%d, size=%d\n", __func__,
                *count, *size);
 
        if (*count == 0)
                *count = ZR364XX_DEF_BUFS;
 
-       while (*size * (*count) > ZR364XX_DEF_BUFS * 1024 * 1024)
-               (*count)--;
+       if (*size * *count > ZR364XX_DEF_BUFS * 1024 * 1024)
+               *count = (ZR364XX_DEF_BUFS * 1024 * 1024) / *size;
 
        return 0;
 }
 
        if (0 == *count)
                *count = 32;
 
-       while (*size * *count > vid_limit * 1024 * 1024)
-               (*count)--;
+       if (*size * *count > vid_limit * 1024 * 1024)
+               *count = (vid_limit * 1024 * 1024) / *size;
 
        return 0;
 }