V4L/DVB (13902): cx18: Update MPEG Index stream buffers module option processing
[pandora-kernel.git] / drivers / media / video / cx18 / cx18-driver.c
index 7f65a47..458f5f0 100644 (file)
@@ -91,7 +91,7 @@ static int enc_pcm_bufsize = CX18_DEFAULT_ENC_PCM_BUFSIZE;
 
 static int enc_ts_bufs = -1;
 static int enc_mpg_bufs = -1;
-static int enc_idx_bufs = -1;
+static int enc_idx_bufs = CX18_MAX_FW_MDLS_PER_STREAM;
 static int enc_yuv_bufs = -1;
 static int enc_vbi_bufs = -1;
 static int enc_pcm_bufs = -1;
@@ -196,14 +196,17 @@ MODULE_PARM_DESC(enc_mpg_bufs,
                 "Number of encoder MPG buffers\n"
                 "\t\t\tDefault is computed from other enc_mpg_* parameters");
 MODULE_PARM_DESC(enc_idx_buffers,
-                "Encoder IDX buffer memory (MB). (enc_idx_bufs can override)\n"
-                "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_IDX_BUFFERS));
+                "(Deprecated) Encoder IDX buffer memory (MB)\n"
+                "\t\t\tIgnored, except 0 disables IDX buffer allocations\n"
+                "\t\t\tDefault: 1 [Enabled]");
 MODULE_PARM_DESC(enc_idx_bufsize,
                 "Size of an encoder IDX buffer (kB)\n"
-                "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_IDX_BUFSIZE));
+                "\t\t\tAllowed values are multiples of 1.5 kB rounded up\n"
+                "\t\t\t(multiples of size required for 64 index entries)\n"
+                "\t\t\tDefault: 2");
 MODULE_PARM_DESC(enc_idx_bufs,
                 "Number of encoder IDX buffers\n"
-                "\t\t\tDefault is computed from other enc_idx_* parameters");
+                "\t\t\tDefault: " __stringify(CX18_MAX_FW_MDLS_PER_STREAM));
 MODULE_PARM_DESC(enc_yuv_buffers,
                 "Encoder YUV buffer memory (MB). (enc_yuv_bufs can override)\n"
                 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_YUV_BUFFERS));
@@ -501,7 +504,12 @@ static void cx18_process_options(struct cx18 *cx)
                /*
                 * YUV is a special case where the stream_buf_size needs to be
                 * an integral multiple of 33.75 kB (storage for 32 screens
-                * lines to maintain alignment in case of lost buffers
+                * lines to maintain alignment in case of lost buffers).
+                *
+                * IDX is a special case where the stream_buf_size should be
+                * an integral multiple of 1.5 kB (storage for 64 index entries
+                * to maintain alignment in case of lost buffers).
+                *
                 */
                if (i == CX18_ENC_STREAM_TYPE_YUV) {
                        cx->stream_buf_size[i] *= 1024;
@@ -511,15 +519,24 @@ static void cx18_process_options(struct cx18 *cx)
                        if (cx->stream_buf_size[i] < CX18_UNIT_ENC_YUV_BUFSIZE)
                                cx->stream_buf_size[i] =
                                                CX18_UNIT_ENC_YUV_BUFSIZE;
+               } else if (i == CX18_ENC_STREAM_TYPE_IDX) {
+                       cx->stream_buf_size[i] *= 1024;
+                       cx->stream_buf_size[i] -=
+                          (cx->stream_buf_size[i] % CX18_UNIT_ENC_IDX_BUFSIZE);
+
+                       if (cx->stream_buf_size[i] < CX18_UNIT_ENC_IDX_BUFSIZE)
+                               cx->stream_buf_size[i] =
+                                               CX18_UNIT_ENC_IDX_BUFSIZE;
                }
                /*
-                * YUV is a special case where the stream_buf_size is
+                * YUV and IDX are special cases where the stream_buf_size is
                 * now in bytes.
                 * VBI is a special case where the stream_buf_size is fixed
                 * and already in bytes
                 */
                if (i == CX18_ENC_STREAM_TYPE_VBI ||
-                   i == CX18_ENC_STREAM_TYPE_YUV) {
+                   i == CX18_ENC_STREAM_TYPE_YUV ||
+                   i == CX18_ENC_STREAM_TYPE_IDX) {
                        if (cx->stream_buffers[i] < 0) {
                                cx->stream_buffers[i] =
                                        cx->options.megabytes[i] * 1024 * 1024