2 * Copyright (C) 2005-2006 Micronas USA Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License (Version 2) as
6 * published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software Foundation,
15 * Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
19 * This file contains code to generate a firmware image for the GO7007SB
20 * encoder. Much of the firmware is read verbatim from a file, but some of
21 * it concerning bitrate control and other things that can be configured at
22 * run-time are generated dynamically. Note that the format headers
23 * generated here do not affect the functioning of the encoder; they are
24 * merely parroted back to the host at the start of each frame.
27 #include <linux/module.h>
28 #include <linux/time.h>
30 #include <linux/device.h>
31 #include <linux/i2c.h>
32 #include <linux/firmware.h>
33 #include <linux/slab.h>
34 #include <asm/byteorder.h>
36 #include "go7007-priv.h"
38 #define GO7007_FW_NAME "go7007/go7007tv.bin"
40 /* Constants used in the source firmware image to describe code segments */
42 #define FLAG_MODE_MJPEG (1)
43 #define FLAG_MODE_MPEG1 (1<<1)
44 #define FLAG_MODE_MPEG2 (1<<2)
45 #define FLAG_MODE_MPEG4 (1<<3)
46 #define FLAG_MODE_H263 (1<<4)
47 #define FLAG_MODE_ALL (FLAG_MODE_MJPEG | FLAG_MODE_MPEG1 | \
48 FLAG_MODE_MPEG2 | FLAG_MODE_MPEG4 | \
50 #define FLAG_SPECIAL (1<<8)
52 #define SPECIAL_FRM_HEAD 0
53 #define SPECIAL_BRC_CTRL 1
54 #define SPECIAL_CONFIG 2
55 #define SPECIAL_SEQHEAD 3
56 #define SPECIAL_AV_SYNC 4
57 #define SPECIAL_FINAL 5
58 #define SPECIAL_AUDIO 6
59 #define SPECIAL_MODET 7
61 /* Little data class for creating MPEG headers bit-by-bit */
64 unsigned char *p; /* destination */
65 u32 a; /* collects bits at the top of the variable */
66 int b; /* bit position of most recently-written bit */
67 int len; /* written out so far */
70 #define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
72 #define CODE_ADD(name, val, length) do { \
74 name.a |= (val) << name.b; \
75 while (name.b <= 24) { \
76 *name.p = name.a >> 24; \
84 #define CODE_LENGTH(name) (name.len + (32 - name.b))
86 /* Tables for creating the bitrate control data */
88 static const s16 converge_speed_ip[101] = {
89 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
90 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
91 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
92 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
93 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
94 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
95 5, 5, 5, 6, 6, 6, 7, 7, 8, 8,
96 9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
97 19, 20, 22, 23, 25, 27, 30, 32, 35, 38,
98 41, 45, 49, 53, 58, 63, 69, 76, 83, 91,
102 static const s16 converge_speed_ipb[101] = {
103 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
104 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
105 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
106 4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
107 6, 6, 6, 7, 7, 7, 7, 8, 8, 9,
108 9, 9, 10, 10, 11, 12, 12, 13, 14, 14,
109 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
110 28, 30, 32, 34, 37, 40, 42, 46, 49, 53,
111 57, 61, 66, 71, 77, 83, 90, 97, 106, 115,
112 125, 135, 147, 161, 175, 191, 209, 228, 249, 273,
116 static const s16 LAMBDA_table[4][101] = {
117 { 16, 16, 16, 16, 17, 17, 17, 18, 18, 18,
118 19, 19, 19, 20, 20, 20, 21, 21, 22, 22,
119 22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
120 27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
121 32, 33, 33, 34, 35, 35, 36, 37, 37, 38,
122 39, 39, 40, 41, 42, 42, 43, 44, 45, 46,
123 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
124 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
125 67, 68, 69, 70, 72, 73, 74, 76, 77, 78,
126 80, 81, 83, 84, 86, 87, 89, 90, 92, 94,
130 20, 20, 20, 21, 21, 21, 22, 22, 23, 23,
131 23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
132 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
133 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
134 40, 41, 42, 43, 43, 44, 45, 46, 47, 48,
135 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
136 58, 59, 60, 61, 62, 64, 65, 66, 67, 68,
137 70, 71, 72, 73, 75, 76, 78, 79, 80, 82,
138 83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
139 100, 102, 103, 105, 107, 109, 111, 113, 115, 117,
143 24, 24, 24, 25, 25, 26, 26, 27, 27, 28,
144 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
145 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
146 41, 41, 42, 43, 44, 44, 45, 46, 47, 48,
147 49, 50, 50, 51, 52, 53, 54, 55, 56, 57,
148 58, 59, 60, 62, 63, 64, 65, 66, 67, 69,
149 70, 71, 72, 74, 75, 76, 78, 79, 81, 82,
150 84, 85, 87, 88, 90, 92, 93, 95, 97, 98,
151 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
152 120, 122, 124, 127, 129, 131, 134, 136, 138, 141,
156 32, 32, 33, 33, 34, 34, 35, 36, 36, 37,
157 38, 38, 39, 40, 41, 41, 42, 43, 44, 44,
158 45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
159 54, 55, 56, 57, 58, 59, 60, 62, 63, 64,
160 65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
161 78, 79, 81, 82, 84, 85, 87, 88, 90, 92,
162 93, 95, 97, 98, 100, 102, 104, 106, 108, 110,
163 112, 114, 116, 118, 120, 122, 124, 127, 129, 131,
164 134, 136, 139, 141, 144, 146, 149, 152, 154, 157,
165 160, 163, 166, 169, 172, 175, 178, 181, 185, 188,
170 /* MPEG blank frame generation tables */
172 enum mpeg_frame_type {
180 static const u32 addrinctab[33][2] = {
181 { 0x01, 1 }, { 0x03, 3 }, { 0x02, 3 }, { 0x03, 4 },
182 { 0x02, 4 }, { 0x03, 5 }, { 0x02, 5 }, { 0x07, 7 },
183 { 0x06, 7 }, { 0x0b, 8 }, { 0x0a, 8 }, { 0x09, 8 },
184 { 0x08, 8 }, { 0x07, 8 }, { 0x06, 8 }, { 0x17, 10 },
185 { 0x16, 10 }, { 0x15, 10 }, { 0x14, 10 }, { 0x13, 10 },
186 { 0x12, 10 }, { 0x23, 11 }, { 0x22, 11 }, { 0x21, 11 },
187 { 0x20, 11 }, { 0x1f, 11 }, { 0x1e, 11 }, { 0x1d, 11 },
188 { 0x1c, 11 }, { 0x1b, 11 }, { 0x1a, 11 }, { 0x19, 11 },
192 /* Standard JPEG tables */
194 static const u8 default_intra_quant_table[] = {
195 8, 16, 19, 22, 26, 27, 29, 34,
196 16, 16, 22, 24, 27, 29, 34, 37,
197 19, 22, 26, 27, 29, 34, 34, 38,
198 22, 22, 26, 27, 29, 34, 37, 40,
199 22, 26, 27, 29, 32, 35, 40, 48,
200 26, 27, 29, 32, 35, 40, 48, 58,
201 26, 27, 29, 34, 38, 46, 56, 69,
202 27, 29, 35, 38, 46, 56, 69, 83
205 static const u8 bits_dc_luminance[] = {
206 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
209 static const u8 val_dc_luminance[] = {
210 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
213 static const u8 bits_dc_chrominance[] = {
214 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
217 static const u8 val_dc_chrominance[] = {
218 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
221 static const u8 bits_ac_luminance[] = {
222 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
225 static const u8 val_ac_luminance[] = {
226 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
227 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
228 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
229 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
230 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
231 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
232 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
233 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
234 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
235 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
236 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
237 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
238 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
239 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
240 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
241 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
242 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
243 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
244 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
245 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
249 static const u8 bits_ac_chrominance[] = {
250 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
253 static const u8 val_ac_chrominance[] = {
254 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
255 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
256 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
257 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
258 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
259 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
260 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
261 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
262 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
263 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
264 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
265 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
266 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
267 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
268 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
269 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
270 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
271 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
272 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
273 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
277 /* Zig-zag mapping for quant table
279 * OK, let's do this mapping on the actual table above so it doesn't have
280 * to be done on the fly.
282 static const int zz[64] = {
283 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
284 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
285 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
286 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
289 static int copy_packages(__le16 *dest, u16 *src, int pkg_cnt, int space)
291 int i, cnt = pkg_cnt * 32;
296 for (i = 0; i < cnt; ++i)
297 dest[i] = cpu_to_le16p(src + i);
302 static int mjpeg_frame_header(struct go7007 *go, unsigned char *buf, int q)
313 buf[p++] = default_intra_quant_table[0];
314 for (i = 1; i < 64; ++i)
315 /* buf[p++] = (default_intra_quant_table[i] * q) >> 3; */
316 buf[p++] = (default_intra_quant_table[zz[i]] * q) >> 3;
322 buf[p++] = go->height >> 8;
323 buf[p++] = go->height & 0xff;
324 buf[p++] = go->width >> 8;
325 buf[p++] = go->width & 0xff;
339 buf[p++] = 418 & 0xff;
341 memcpy(buf + p, bits_dc_luminance + 1, 16);
343 memcpy(buf + p, val_dc_luminance, sizeof(val_dc_luminance));
344 p += sizeof(val_dc_luminance);
346 memcpy(buf + p, bits_dc_chrominance + 1, 16);
348 memcpy(buf + p, val_dc_chrominance, sizeof(val_dc_chrominance));
349 p += sizeof(val_dc_chrominance);
351 memcpy(buf + p, bits_ac_luminance + 1, 16);
353 memcpy(buf + p, val_ac_luminance, sizeof(val_ac_luminance));
354 p += sizeof(val_ac_luminance);
356 memcpy(buf + p, bits_ac_chrominance + 1, 16);
358 memcpy(buf + p, val_ac_chrominance, sizeof(val_ac_chrominance));
359 p += sizeof(val_ac_chrominance);
377 static int gen_mjpeghdr_to_package(struct go7007 *go, __le16 *code, int space)
381 unsigned int addr = 0x19;
382 int size = 0, i, off = 0, chunk;
384 buf = kzalloc(4096, GFP_KERNEL);
388 for (i = 1; i < 32; ++i) {
389 mjpeg_frame_header(go, buf + size, i);
392 chunk = mjpeg_frame_header(go, buf + size, 1);
393 memmove(buf + size, buf + size + 80, chunk - 80);
396 for (i = 0; i < size; i += chunk * 2) {
397 if (space - off < 32) {
402 code[off + 1] = __cpu_to_le16(0x8000 | mem);
405 if (mem + chunk > 0x4000)
406 chunk = 0x4000 - mem;
407 if (i + 2 * chunk > size)
408 chunk = (size - i) / 2;
411 code[off] = __cpu_to_le16(0x4000 | chunk);
412 code[off + 31] = __cpu_to_le16(addr++);
415 code[off] = __cpu_to_le16(0x1000 | 28);
420 memcpy(&code[off + 2], buf + i, chunk * 2);
428 static int mpeg1_frame_header(struct go7007 *go, unsigned char *buf,
429 int modulo, int pict_struct, enum mpeg_frame_type frame)
431 int i, j, mb_code, mb_len;
432 int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
433 CODE_GEN(c, buf + 6);
452 default: /* keep the compiler happy */
453 mb_code = mb_len = 0;
457 CODE_ADD(c, frame == PFRAME ? 0x2 : 0x3, 13);
458 CODE_ADD(c, 0xffff, 16);
459 CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
461 CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
463 CODE_ADD(c, 0, 4); /* Is this supposed to be here?? */
464 CODE_ADD(c, 0, 3); /* What is this?? */
465 /* Byte-align with zeros */
466 j = 8 - (CODE_LENGTH(c) % 8);
470 if (go->format == V4L2_PIX_FMT_MPEG2) {
471 CODE_ADD(c, 0x1, 24);
472 CODE_ADD(c, 0xb5, 8);
473 CODE_ADD(c, 0x844, 12);
474 CODE_ADD(c, frame == PFRAME ? 0xff : 0x44, 8);
475 if (go->interlace_coding) {
476 CODE_ADD(c, pict_struct, 4);
478 CODE_ADD(c, 0x000, 11);
480 CODE_ADD(c, 0x200, 11);
483 CODE_ADD(c, 0x20c, 11);
485 /* Byte-align with zeros */
486 j = 8 - (CODE_LENGTH(c) % 8);
491 for (i = 0; i < rows; ++i) {
493 CODE_ADD(c, i + 1, 8);
496 CODE_ADD(c, mb_code, mb_len);
497 if (go->interlace_coding) {
499 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
501 if (frame == BFRAME_BIDIR) {
503 if (go->interlace_coding)
504 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
507 for (j = (go->width >> 4) - 2; j >= 33; j -= 33)
508 CODE_ADD(c, 0x8, 11);
509 CODE_ADD(c, addrinctab[j][0], addrinctab[j][1]);
510 CODE_ADD(c, mb_code, mb_len);
511 if (go->interlace_coding) {
513 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
515 if (frame == BFRAME_BIDIR) {
517 if (go->interlace_coding)
518 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
522 /* Byte-align with zeros */
523 j = 8 - (CODE_LENGTH(c) % 8);
528 i = CODE_LENGTH(c) + 4 * 8;
536 static int mpeg1_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
538 int i, aspect_ratio, picture_rate;
539 CODE_GEN(c, buf + 6);
541 if (go->format == V4L2_PIX_FMT_MPEG1) {
542 switch (go->aspect_ratio) {
543 case GO7007_RATIO_4_3:
544 aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
546 case GO7007_RATIO_16_9:
547 aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
554 switch (go->aspect_ratio) {
555 case GO7007_RATIO_4_3:
558 case GO7007_RATIO_16_9:
566 switch (go->sensor_framerate) {
574 picture_rate = go->interlace_coding ? 6 : 3;
577 picture_rate = go->interlace_coding ? 7 : 4;
580 picture_rate = go->interlace_coding ? 8 : 5;
583 picture_rate = 5; /* 30 fps seems like a reasonable default */
587 CODE_ADD(c, go->width, 12);
588 CODE_ADD(c, go->height, 12);
589 CODE_ADD(c, aspect_ratio, 4);
590 CODE_ADD(c, picture_rate, 4);
591 CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 20000 : 0x3ffff, 18);
593 CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 112 : 20, 10);
596 /* Byte-align with zeros */
597 i = 8 - (CODE_LENGTH(c) % 8);
601 if (go->format == V4L2_PIX_FMT_MPEG2) {
602 CODE_ADD(c, 0x1, 24);
603 CODE_ADD(c, 0xb5, 8);
604 CODE_ADD(c, 0x148, 12);
605 if (go->interlace_coding)
606 CODE_ADD(c, 0x20001, 20);
608 CODE_ADD(c, 0xa0001, 20);
611 /* Byte-align with zeros */
612 i = 8 - (CODE_LENGTH(c) % 8);
617 CODE_ADD(c, 0x1, 24);
618 CODE_ADD(c, 0xb52, 12);
619 CODE_ADD(c, go->standard == GO7007_STD_NTSC ? 2 : 1, 3);
620 CODE_ADD(c, 0x105, 9);
621 CODE_ADD(c, 0x505, 16);
622 CODE_ADD(c, go->width, 14);
624 CODE_ADD(c, go->height, 14);
626 /* Byte-align with zeros */
627 i = 8 - (CODE_LENGTH(c) % 8);
633 i = CODE_LENGTH(c) + 4 * 8;
643 static int gen_mpeg1hdr_to_package(struct go7007 *go,
644 __le16 *code, int space, int *framelen)
648 unsigned int addr = 0x19;
649 int i, off = 0, chunk;
651 buf = kzalloc(5120, GFP_KERNEL);
655 framelen[0] = mpeg1_frame_header(go, buf, 0, 1, PFRAME);
656 if (go->interlace_coding)
657 framelen[0] += mpeg1_frame_header(go, buf + framelen[0] / 8,
659 buf[0] = framelen[0] & 0xff;
660 buf[1] = framelen[0] >> 8;
662 framelen[1] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_PRE);
663 if (go->interlace_coding)
664 framelen[1] += mpeg1_frame_header(go, buf + i + framelen[1] / 8,
666 buf[i] = framelen[1] & 0xff;
667 buf[i + 1] = framelen[1] >> 8;
669 framelen[2] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_POST);
670 if (go->interlace_coding)
671 framelen[2] += mpeg1_frame_header(go, buf + i + framelen[2] / 8,
673 buf[i] = framelen[2] & 0xff;
674 buf[i + 1] = framelen[2] >> 8;
676 framelen[3] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_BIDIR);
677 if (go->interlace_coding)
678 framelen[3] += mpeg1_frame_header(go, buf + i + framelen[3] / 8,
680 buf[i] = framelen[3] & 0xff;
681 buf[i + 1] = framelen[3] >> 8;
683 mpeg1_sequence_header(go, buf + i, 0);
685 for (i = 0; i < 5120; i += chunk * 2) {
686 if (space - off < 32) {
691 code[off + 1] = __cpu_to_le16(0x8000 | mem);
694 if (mem + chunk > 0x4000)
695 chunk = 0x4000 - mem;
696 if (i + 2 * chunk > 5120)
697 chunk = (5120 - i) / 2;
700 code[off] = __cpu_to_le16(0x4000 | chunk);
701 code[off + 31] = __cpu_to_le16(addr);
702 if (mem + chunk == 0x4000) {
707 code[off] = __cpu_to_le16(0x1000 | 28);
712 memcpy(&code[off + 2], buf + i, chunk * 2);
720 static int vti_bitlen(struct go7007 *go)
722 unsigned int i, max_time_incr = go->sensor_framerate / go->fps_scale;
724 for (i = 31; (max_time_incr & ((1 << i) - 1)) == max_time_incr; --i)
729 static int mpeg4_frame_header(struct go7007 *go, unsigned char *buf,
730 int modulo, enum mpeg_frame_type frame)
733 CODE_GEN(c, buf + 6);
734 int mb_count = (go->width >> 4) * (go->height >> 4);
736 CODE_ADD(c, frame == PFRAME ? 0x1 : 0x2, 2);
740 CODE_ADD(c, 0, vti_bitlen(go));
744 CODE_ADD(c, 0xc, 11);
747 if (frame != BFRAME_EMPTY) {
748 for (i = 0; i < mb_count; ++i) {
754 CODE_ADD(c, 0x47, 8);
757 CODE_ADD(c, 0x27, 7);
760 CODE_ADD(c, 0x5f, 8);
762 case BFRAME_EMPTY: /* keep compiler quiet */
768 /* Byte-align with a zero followed by ones */
769 i = 8 - (CODE_LENGTH(c) % 8);
771 CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
773 i = CODE_LENGTH(c) + 4 * 8;
783 static int mpeg4_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
785 const unsigned char head[] = { 0x00, 0x00, 0x01, 0xb0, go->pali,
786 0x00, 0x00, 0x01, 0xb5, 0x09,
787 0x00, 0x00, 0x01, 0x00,
788 0x00, 0x00, 0x01, 0x20, };
790 int fps = go->sensor_framerate / go->fps_scale;
791 CODE_GEN(c, buf + 2 + sizeof(head));
793 switch (go->aspect_ratio) {
794 case GO7007_RATIO_4_3:
795 aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
797 case GO7007_RATIO_16_9:
798 aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
805 memcpy(buf + 2, head, sizeof(head));
806 CODE_ADD(c, 0x191, 17);
807 CODE_ADD(c, aspect_ratio, 4);
809 CODE_ADD(c, fps, 16);
811 CODE_ADD(c, 1001, vti_bitlen(go));
813 CODE_ADD(c, go->width, 13);
815 CODE_ADD(c, go->height, 13);
816 CODE_ADD(c, 0x2830, 14);
819 i = 8 - (CODE_LENGTH(c) % 8);
821 CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
823 i = CODE_LENGTH(c) + sizeof(head) * 8;
829 static int gen_mpeg4hdr_to_package(struct go7007 *go,
830 __le16 *code, int space, int *framelen)
834 unsigned int addr = 0x19;
835 int i, off = 0, chunk;
837 buf = kzalloc(5120, GFP_KERNEL);
841 framelen[0] = mpeg4_frame_header(go, buf, 0, PFRAME);
843 framelen[1] = mpeg4_frame_header(go, buf + i, 0, BFRAME_PRE);
845 framelen[2] = mpeg4_frame_header(go, buf + i, 0, BFRAME_POST);
847 framelen[3] = mpeg4_frame_header(go, buf + i, 0, BFRAME_BIDIR);
849 mpeg4_frame_header(go, buf + i, 0, BFRAME_EMPTY);
851 mpeg4_sequence_header(go, buf + i, 0);
853 for (i = 0; i < 5120; i += chunk * 2) {
854 if (space - off < 32) {
859 code[off + 1] = __cpu_to_le16(0x8000 | mem);
862 if (mem + chunk > 0x4000)
863 chunk = 0x4000 - mem;
864 if (i + 2 * chunk > 5120)
865 chunk = (5120 - i) / 2;
868 code[off] = __cpu_to_le16(0x4000 | chunk);
869 code[off + 31] = __cpu_to_le16(addr);
870 if (mem + chunk == 0x4000) {
875 code[off] = __cpu_to_le16(0x1000 | 28);
880 memcpy(&code[off + 2], buf + i, chunk * 2);
884 addr = go->ipb ? 0x14f9 : 0x0af9;
885 memset(buf, 0, 5120);
886 framelen[4] = mpeg4_frame_header(go, buf, 1, PFRAME);
888 framelen[5] = mpeg4_frame_header(go, buf + i, 1, BFRAME_PRE);
890 framelen[6] = mpeg4_frame_header(go, buf + i, 1, BFRAME_POST);
892 framelen[7] = mpeg4_frame_header(go, buf + i, 1, BFRAME_BIDIR);
894 mpeg4_frame_header(go, buf + i, 1, BFRAME_EMPTY);
896 for (i = 0; i < 5120; i += chunk * 2) {
897 if (space - off < 32) {
902 code[off + 1] = __cpu_to_le16(0x8000 | mem);
905 if (mem + chunk > 0x4000)
906 chunk = 0x4000 - mem;
907 if (i + 2 * chunk > 5120)
908 chunk = (5120 - i) / 2;
911 code[off] = __cpu_to_le16(0x4000 | chunk);
912 code[off + 31] = __cpu_to_le16(addr);
913 if (mem + chunk == 0x4000) {
918 code[off] = __cpu_to_le16(0x1000 | 28);
923 memcpy(&code[off + 2], buf + i, chunk * 2);
931 static int brctrl_to_package(struct go7007 *go,
932 __le16 *code, int space, int *framelen)
934 int converge_speed = 0;
935 int lambda = (go->format == V4L2_PIX_FMT_MJPEG || go->dvd_mode) ?
937 int peak_rate = 6 * go->bitrate / 5;
938 int vbv_buffer = go->format == V4L2_PIX_FMT_MJPEG ?
940 (go->dvd_mode ? 900000 : peak_rate);
941 int fps = go->sensor_framerate / go->fps_scale;
943 /* Bizarre math below depends on rounding errors in division */
944 u32 sgop_expt_addr = go->bitrate / 32 * (go->ipb ? 3 : 1) * 1001 / fps;
945 u32 sgop_peak_addr = peak_rate / 32 * 1001 / fps;
946 u32 total_expt_addr = go->bitrate / 32 * 1000 / fps * (fps / 1000);
947 u32 vbv_alert_addr = vbv_buffer * 3 / (4 * 32);
949 q > 0 ? sgop_expt_addr * q :
950 2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
951 q > 0 ? sgop_expt_addr * q :
952 2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
953 q > 0 ? sgop_expt_addr * q :
954 2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
955 q > 0 ? sgop_expt_addr * q :
956 2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
958 u32 calc_q = q > 0 ? q : cplx[0] / sgop_expt_addr;
961 0xBF20, go->ipb ? converge_speed_ipb[converge_speed]
962 : converge_speed_ip[converge_speed],
963 0xBF21, go->ipb ? 2 : 0,
964 0xBF22, go->ipb ? LAMBDA_table[0][lambda / 2 + 50]
966 0xBF23, go->ipb ? LAMBDA_table[1][lambda] : 32767,
968 0xBF25, lambda > 99 ? 32767 : LAMBDA_table[3][lambda],
969 0xBF26, sgop_expt_addr & 0x0000FFFF,
970 0xBF27, sgop_expt_addr >> 16,
971 0xBF28, sgop_peak_addr & 0x0000FFFF,
972 0xBF29, sgop_peak_addr >> 16,
973 0xBF2A, vbv_alert_addr & 0x0000FFFF,
974 0xBF2B, vbv_alert_addr >> 16,
980 0xBF2E, vbv_alert_addr & 0x0000FFFF,
981 0xBF2F, vbv_alert_addr >> 16,
982 0xBF30, cplx[0] & 0x0000FFFF,
983 0xBF31, cplx[0] >> 16,
984 0xBF32, cplx[1] & 0x0000FFFF,
985 0xBF33, cplx[1] >> 16,
986 0xBF34, cplx[2] & 0x0000FFFF,
987 0xBF35, cplx[2] >> 16,
988 0xBF36, cplx[3] & 0x0000FFFF,
989 0xBF37, cplx[3] >> 16,
992 0xBF3A, total_expt_addr & 0x0000FFFF,
993 0xBF3B, total_expt_addr >> 16,
997 0xBF3C, total_expt_addr & 0x0000FFFF,
998 0xBF3D, total_expt_addr >> 16,
1003 0xBF4A, calc_q < 4 ? 4 : (calc_q > 124 ? 124 : calc_q),
1014 0xBF40, sgop_expt_addr & 0x0000FFFF,
1015 0xBF41, sgop_expt_addr >> 16,
1020 0xBF46, (go->width >> 4) * (go->height >> 4),
1024 0xBF18, framelen[4],
1025 0xBF19, framelen[5],
1026 0xBF1A, framelen[6],
1027 0xBF1B, framelen[7],
1031 /* Remove once we don't care about matching */
1078 0xBF52, framelen[0],
1079 0xBF53, framelen[1],
1080 0xBF54, framelen[2],
1081 0xBF55, framelen[3],
1085 return copy_packages(code, pack, 6, space);
1088 static int config_package(struct go7007 *go, __le16 *code, int space)
1090 int fps = go->sensor_framerate / go->fps_scale / 1000;
1091 int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1092 int brc_window_size = fps;
1093 int q_min = 2, q_max = 31;
1094 int THACCoeffSet0 = 0;
1101 0xc6c3, go->format == V4L2_PIX_FMT_MPEG4 ? 0 :
1102 (go->format == V4L2_PIX_FMT_H263 ? 0 : 1),
1103 0xc680, go->format == V4L2_PIX_FMT_MPEG4 ? 0xf1 :
1104 (go->format == V4L2_PIX_FMT_H263 ? 0x61 :
1119 0xd472, (go->board_info->sensor_flags &
1120 GO7007_SENSOR_TV) &&
1121 (!go->interlace_coding) ?
1123 0xd475, (go->board_info->sensor_flags &
1124 GO7007_SENSOR_TV) &&
1125 (!go->interlace_coding) ?
1127 0xc404, go->interlace_coding ? 0x44 :
1128 (go->format == V4L2_PIX_FMT_MPEG4 ? 0x11 :
1129 (go->format == V4L2_PIX_FMT_MPEG1 ? 0x02 :
1130 (go->format == V4L2_PIX_FMT_MPEG2 ? 0x04 :
1131 (go->format == V4L2_PIX_FMT_H263 ? 0x08 :
1133 0xbf0a, (go->format == V4L2_PIX_FMT_MPEG4 ? 8 :
1134 (go->format == V4L2_PIX_FMT_MPEG1 ? 1 :
1135 (go->format == V4L2_PIX_FMT_MPEG2 ? 2 :
1136 (go->format == V4L2_PIX_FMT_H263 ? 4 : 16)))) |
1137 ((go->repeat_seqhead ? 1 : 0) << 6) |
1138 ((go->dvd_mode ? 1 : 0) << 9) |
1139 ((go->gop_header_enable ? 1 : 0) << 10),
1141 0xdd5a, go->ipb ? 0x14 : 0x0a,
1144 0xc683, THACCoeffSet0,
1145 0xc40a, (go->width << 4) | rows,
1146 0xe01a, go->board_info->hpi_buffer_cap,
1168 0xbf66, brc_window_size,
1175 0xbfe3, go->ipb ? 3 : 1,
1176 0xc031, go->board_info->sensor_flags &
1177 GO7007_SENSOR_VBI ? 1 : 0,
1181 0xdd88, go->ipb ? 0x1401 : 0x0a01,
1182 0xdd90, go->ipb ? 0x1401 : 0x0a01,
1194 0xbfec, (go->interlace_coding ? 1 << 15 : 0) |
1195 (go->modet_enable ? 0xa : 0) |
1196 (go->board_info->sensor_flags &
1197 GO7007_SENSOR_VBI ? 1 : 0),
1201 0xbff0, go->board_info->sensor_flags &
1202 GO7007_SENSOR_TV ? 0xf060 : 0xb060,
1207 return copy_packages(code, pack, 5, space);
1210 static int seqhead_to_package(struct go7007 *go, __le16 *code, int space,
1211 int (*sequence_header_func)(struct go7007 *go,
1212 unsigned char *buf, int ext))
1214 int vop_time_increment_bitlength = vti_bitlen(go);
1215 int fps = go->sensor_framerate / go->fps_scale *
1216 (go->interlace_coding ? 2 : 1);
1217 unsigned char buf[40] = { };
1218 int len = sequence_header_func(go, buf, 1);
1223 0xbff2, vop_time_increment_bitlength,
1224 0xbff3, (1 << vop_time_increment_bitlength) - 1,
1226 0xbfe7, (fps / 1000) << 8,
1238 0xc800, buf[2] << 8 | buf[3],
1239 0xc801, buf[4] << 8 | buf[5],
1240 0xc802, buf[6] << 8 | buf[7],
1241 0xc803, buf[8] << 8 | buf[9],
1255 0xc808, buf[10] << 8 | buf[11],
1256 0xc809, buf[12] << 8 | buf[13],
1257 0xc80a, buf[14] << 8 | buf[15],
1258 0xc80b, buf[16] << 8 | buf[17],
1259 0xc80c, buf[18] << 8 | buf[19],
1260 0xc80d, buf[20] << 8 | buf[21],
1261 0xc80e, buf[22] << 8 | buf[23],
1262 0xc80f, buf[24] << 8 | buf[25],
1263 0xc810, buf[26] << 8 | buf[27],
1264 0xc811, buf[28] << 8 | buf[29],
1265 0xc812, buf[30] << 8 | buf[31],
1266 0xc813, buf[32] << 8 | buf[33],
1267 0xc814, buf[34] << 8 | buf[35],
1268 0xc815, buf[36] << 8 | buf[37],
1274 return copy_packages(code, pack, 3, space);
1277 static int relative_prime(int big, int little)
1281 while (little != 0) {
1282 remainder = big % little;
1289 static int avsync_to_package(struct go7007 *go, __le16 *code, int space)
1291 int arate = go->board_info->audio_rate * 1001 * go->fps_scale;
1292 int ratio = arate / go->sensor_framerate;
1293 int adjratio = ratio * 215 / 100;
1294 int rprime = relative_prime(go->sensor_framerate,
1295 arate % go->sensor_framerate);
1296 int f1 = (arate % go->sensor_framerate) / rprime;
1297 int f2 = (go->sensor_framerate - arate % go->sensor_framerate) / rprime;
1300 0xbf98, (u16)((-adjratio) & 0xffff),
1301 0xbf99, (u16)((-adjratio) >> 16),
1304 0xbff4, f1 > f2 ? f1 : f2,
1305 0xbff5, f1 < f2 ? f1 : f2,
1306 0xbff6, f1 < f2 ? ratio : ratio + 1,
1307 0xbff7, f1 > f2 ? ratio : ratio + 1,
1310 0xbffa, adjratio & 0xffff,
1311 0xbffb, adjratio >> 16,
1317 return copy_packages(code, pack, 1, space);
1320 static int final_package(struct go7007 *go, __le16 *code, int space)
1322 int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1332 ((go->board_info->sensor_flags & GO7007_SENSOR_TV) &&
1333 (!go->interlace_coding) ?
1334 (1 << 14) | (1 << 9) : 0) |
1335 ((go->encoder_subsample ? 1 : 0) << 8) |
1336 (go->board_info->sensor_flags &
1337 GO7007_SENSOR_CONFIG_MASK),
1338 ((go->encoder_v_halve ? 1 : 0) << 14) |
1339 (go->encoder_v_halve ? rows << 9 : rows << 8) |
1340 (go->encoder_h_halve ? 1 << 6 : 0) |
1341 (go->encoder_h_halve ? go->width >> 3 : go->width >> 4),
1342 (1 << 15) | (go->encoder_v_offset << 6) |
1343 (1 << 7) | (go->encoder_h_offset >> 2),
1347 ((go->fps_scale - 1) << 8) |
1348 (go->board_info->sensor_flags & GO7007_SENSOR_TV ?
1351 go->ipb ? 0xd4c : 0x36b,
1352 (rows << 8) | (go->width >> 4),
1353 go->format == V4L2_PIX_FMT_MPEG4 ? 0x0404 : 0,
1354 (1 << 15) | ((go->interlace_coding ? 1 : 0) << 13) |
1355 ((go->closed_gop ? 1 : 0) << 12) |
1356 ((go->format == V4L2_PIX_FMT_MPEG4 ? 1 : 0) << 11) |
1358 ((go->ipb ? 3 : 0) << 7) |
1359 ((go->modet_enable ? 1 : 0) << 2) |
1360 ((go->dvd_mode ? 1 : 0) << 1) | 1,
1361 (go->format == V4L2_PIX_FMT_MPEG1 ? 0x89a0 :
1362 (go->format == V4L2_PIX_FMT_MPEG2 ? 0x89a0 :
1363 (go->format == V4L2_PIX_FMT_MJPEG ? 0x89a0 :
1364 (go->format == V4L2_PIX_FMT_MPEG4 ? 0x8920 :
1365 (go->format == V4L2_PIX_FMT_H263 ? 0x8920 : 0))))),
1366 go->ipb ? 0x1f15 : 0x1f0b,
1367 go->ipb ? 0x0015 : 0x000b,
1368 go->ipb ? 0xa800 : 0x5800,
1370 0x0020 + 0x034b * 0,
1371 0x0020 + 0x034b * 1,
1372 0x0020 + 0x034b * 2,
1373 0x0020 + 0x034b * 3,
1374 0x0020 + 0x034b * 4,
1375 0x0020 + 0x034b * 5,
1376 go->ipb ? (go->gop_size / 3) : go->gop_size,
1377 (go->height >> 4) * (go->width >> 4) * 110 / 100,
1380 return copy_packages(code, pack, 1, space);
1383 static int audio_to_package(struct go7007 *go, __le16 *code, int space)
1385 int clock_config = ((go->board_info->audio_flags &
1386 GO7007_AUDIO_I2S_MASTER ? 1 : 0) << 11) |
1387 ((go->board_info->audio_flags &
1388 GO7007_AUDIO_OKI_MODE ? 1 : 0) << 8) |
1389 (((go->board_info->audio_bclk_div / 4) - 1) << 4) |
1390 (go->board_info->audio_main_div - 1);
1403 0x9000, clock_config,
1404 0x9001, (go->board_info->audio_flags & 0xffff) |
1406 0x9000, ((go->board_info->audio_flags &
1407 GO7007_AUDIO_I2S_MASTER ?
1430 return copy_packages(code, pack, 2, space);
1433 static int modet_to_package(struct go7007 *go, __le16 *code, int space)
1435 int ret, mb, i, addr, cnt = 0;
1437 u16 thresholds[] = {
1439 0xbf82, go->modet[0].pixel_threshold,
1440 0xbf83, go->modet[1].pixel_threshold,
1441 0xbf84, go->modet[2].pixel_threshold,
1442 0xbf85, go->modet[3].pixel_threshold,
1443 0xbf86, go->modet[0].motion_threshold,
1444 0xbf87, go->modet[1].motion_threshold,
1445 0xbf88, go->modet[2].motion_threshold,
1446 0xbf89, go->modet[3].motion_threshold,
1447 0xbf8a, go->modet[0].mb_threshold,
1448 0xbf8b, go->modet[1].mb_threshold,
1449 0xbf8c, go->modet[2].mb_threshold,
1450 0xbf8d, go->modet[3].mb_threshold,
1456 ret = copy_packages(code, thresholds, 1, space);
1462 memset(pack, 0, 64);
1464 for (mb = 0; mb < 1624; ++mb) {
1465 pack[i * 2 + 3] <<= 2;
1466 pack[i * 2 + 3] |= go->modet_map[mb];
1469 pack[i * 2 + 2] = addr++;
1471 if (i == 10 || mb == 1623) {
1472 pack[0] = 0x2000 | i;
1473 ret = copy_packages(code + cnt, pack, 1, space - cnt);
1478 memset(pack, 0, 64);
1480 pack[i * 2 + 3] = 0;
1483 memset(pack, 0, 64);
1485 for (addr = 0xbb90; addr < 0xbbfa; ++addr) {
1486 pack[i * 2 + 2] = addr;
1487 pack[i * 2 + 3] = 0;
1489 if (i == 10 || addr == 0xbbf9) {
1490 pack[0] = 0x2000 | i;
1491 ret = copy_packages(code + cnt, pack, 1, space - cnt);
1496 memset(pack, 0, 64);
1502 static int do_special(struct go7007 *go, u16 type, __le16 *code, int space,
1506 case SPECIAL_FRM_HEAD:
1507 switch (go->format) {
1508 case V4L2_PIX_FMT_MJPEG:
1509 return gen_mjpeghdr_to_package(go, code, space);
1510 case V4L2_PIX_FMT_MPEG1:
1511 case V4L2_PIX_FMT_MPEG2:
1512 return gen_mpeg1hdr_to_package(go, code, space,
1514 case V4L2_PIX_FMT_MPEG4:
1515 return gen_mpeg4hdr_to_package(go, code, space,
1518 case SPECIAL_BRC_CTRL:
1519 return brctrl_to_package(go, code, space, framelen);
1520 case SPECIAL_CONFIG:
1521 return config_package(go, code, space);
1522 case SPECIAL_SEQHEAD:
1523 switch (go->format) {
1524 case V4L2_PIX_FMT_MPEG1:
1525 case V4L2_PIX_FMT_MPEG2:
1526 return seqhead_to_package(go, code, space,
1527 mpeg1_sequence_header);
1528 case V4L2_PIX_FMT_MPEG4:
1529 return seqhead_to_package(go, code, space,
1530 mpeg4_sequence_header);
1534 case SPECIAL_AV_SYNC:
1535 return avsync_to_package(go, code, space);
1537 return final_package(go, code, space);
1539 return audio_to_package(go, code, space);
1541 return modet_to_package(go, code, space);
1544 "firmware file contains unsupported feature %04x\n", type);
1548 int go7007_construct_fw_image(struct go7007 *go, u8 **fw, int *fwlen)
1550 const struct firmware *fw_entry;
1552 int framelen[8] = { }; /* holds the lengths of empty frame templates */
1553 int codespace = 64 * 1024, i = 0, srclen, chunk_len, chunk_flags;
1557 switch (go->format) {
1558 case V4L2_PIX_FMT_MJPEG:
1559 mode_flag = FLAG_MODE_MJPEG;
1561 case V4L2_PIX_FMT_MPEG1:
1562 mode_flag = FLAG_MODE_MPEG1;
1564 case V4L2_PIX_FMT_MPEG2:
1565 mode_flag = FLAG_MODE_MPEG2;
1567 case V4L2_PIX_FMT_MPEG4:
1568 mode_flag = FLAG_MODE_MPEG4;
1573 if (request_firmware(&fw_entry, GO7007_FW_NAME, go->dev)) {
1575 "unable to load firmware from file \"%s\"\n",
1579 code = kzalloc(codespace * 2, GFP_KERNEL);
1583 src = (__le16 *)fw_entry->data;
1584 srclen = fw_entry->size / 2;
1585 while (srclen >= 2) {
1586 chunk_flags = __le16_to_cpu(src[0]);
1587 chunk_len = __le16_to_cpu(src[1]);
1588 if (chunk_len + 2 > srclen) {
1590 "firmware file \"%s\" appears to be corrupted\n",
1594 if (chunk_flags & mode_flag) {
1595 if (chunk_flags & FLAG_SPECIAL) {
1596 ret = do_special(go, __le16_to_cpu(src[2]),
1597 &code[i], codespace - i, framelen);
1600 "insufficient memory for firmware construction\n");
1605 if (codespace - i < chunk_len) {
1607 "insufficient memory for firmware construction\n");
1610 memcpy(&code[i], &src[2], chunk_len * 2);
1614 srclen -= chunk_len + 2;
1615 src += chunk_len + 2;
1617 release_firmware(fw_entry);
1624 release_firmware(fw_entry);
1628 MODULE_FIRMWARE(GO7007_FW_NAME);