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/init.h>
29 #include <linux/time.h>
31 #include <linux/device.h>
32 #include <linux/i2c.h>
33 #include <linux/firmware.h>
34 #include <linux/slab.h>
35 #include <asm/byteorder.h>
37 #include "go7007-priv.h"
39 #define GO7007_FW_NAME "go7007/go7007tv.bin"
41 /* Constants used in the source firmware image to describe code segments */
43 #define FLAG_MODE_MJPEG (1)
44 #define FLAG_MODE_MPEG1 (1<<1)
45 #define FLAG_MODE_MPEG2 (1<<2)
46 #define FLAG_MODE_MPEG4 (1<<3)
47 #define FLAG_MODE_H263 (1<<4)
48 #define FLAG_MODE_ALL (FLAG_MODE_MJPEG | FLAG_MODE_MPEG1 | \
49 FLAG_MODE_MPEG2 | FLAG_MODE_MPEG4 | \
51 #define FLAG_SPECIAL (1<<8)
53 #define SPECIAL_FRM_HEAD 0
54 #define SPECIAL_BRC_CTRL 1
55 #define SPECIAL_CONFIG 2
56 #define SPECIAL_SEQHEAD 3
57 #define SPECIAL_AV_SYNC 4
58 #define SPECIAL_FINAL 5
59 #define SPECIAL_AUDIO 6
60 #define SPECIAL_MODET 7
62 /* Little data class for creating MPEG headers bit-by-bit */
65 unsigned char *p; /* destination */
66 u32 a; /* collects bits at the top of the variable */
67 int b; /* bit position of most recently-written bit */
68 int len; /* written out so far */
71 #define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
73 #define CODE_ADD(name, val, length) do { \
75 name.a |= (val) << name.b; \
76 while (name.b <= 24) { \
77 *name.p = name.a >> 24; \
85 #define CODE_LENGTH(name) (name.len + (32 - name.b))
87 /* Tables for creating the bitrate control data */
89 static const s16 converge_speed_ip[101] = {
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, 1,
93 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
94 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
95 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
96 5, 5, 5, 6, 6, 6, 7, 7, 8, 8,
97 9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
98 19, 20, 22, 23, 25, 27, 30, 32, 35, 38,
99 41, 45, 49, 53, 58, 63, 69, 76, 83, 91,
103 static const s16 converge_speed_ipb[101] = {
104 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
105 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
106 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
107 4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
108 6, 6, 6, 7, 7, 7, 7, 8, 8, 9,
109 9, 9, 10, 10, 11, 12, 12, 13, 14, 14,
110 15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
111 28, 30, 32, 34, 37, 40, 42, 46, 49, 53,
112 57, 61, 66, 71, 77, 83, 90, 97, 106, 115,
113 125, 135, 147, 161, 175, 191, 209, 228, 249, 273,
117 static const s16 LAMBDA_table[4][101] = {
118 { 16, 16, 16, 16, 17, 17, 17, 18, 18, 18,
119 19, 19, 19, 20, 20, 20, 21, 21, 22, 22,
120 22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
121 27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
122 32, 33, 33, 34, 35, 35, 36, 37, 37, 38,
123 39, 39, 40, 41, 42, 42, 43, 44, 45, 46,
124 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
125 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
126 67, 68, 69, 70, 72, 73, 74, 76, 77, 78,
127 80, 81, 83, 84, 86, 87, 89, 90, 92, 94,
131 20, 20, 20, 21, 21, 21, 22, 22, 23, 23,
132 23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
133 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
134 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
135 40, 41, 42, 43, 43, 44, 45, 46, 47, 48,
136 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
137 58, 59, 60, 61, 62, 64, 65, 66, 67, 68,
138 70, 71, 72, 73, 75, 76, 78, 79, 80, 82,
139 83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
140 100, 102, 103, 105, 107, 109, 111, 113, 115, 117,
144 24, 24, 24, 25, 25, 26, 26, 27, 27, 28,
145 28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
146 34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
147 41, 41, 42, 43, 44, 44, 45, 46, 47, 48,
148 49, 50, 50, 51, 52, 53, 54, 55, 56, 57,
149 58, 59, 60, 62, 63, 64, 65, 66, 67, 69,
150 70, 71, 72, 74, 75, 76, 78, 79, 81, 82,
151 84, 85, 87, 88, 90, 92, 93, 95, 97, 98,
152 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
153 120, 122, 124, 127, 129, 131, 134, 136, 138, 141,
157 32, 32, 33, 33, 34, 34, 35, 36, 36, 37,
158 38, 38, 39, 40, 41, 41, 42, 43, 44, 44,
159 45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
160 54, 55, 56, 57, 58, 59, 60, 62, 63, 64,
161 65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
162 78, 79, 81, 82, 84, 85, 87, 88, 90, 92,
163 93, 95, 97, 98, 100, 102, 104, 106, 108, 110,
164 112, 114, 116, 118, 120, 122, 124, 127, 129, 131,
165 134, 136, 139, 141, 144, 146, 149, 152, 154, 157,
166 160, 163, 166, 169, 172, 175, 178, 181, 185, 188,
171 /* MPEG blank frame generation tables */
173 enum mpeg_frame_type {
181 static const u32 addrinctab[33][2] = {
182 { 0x01, 1 }, { 0x03, 3 }, { 0x02, 3 }, { 0x03, 4 },
183 { 0x02, 4 }, { 0x03, 5 }, { 0x02, 5 }, { 0x07, 7 },
184 { 0x06, 7 }, { 0x0b, 8 }, { 0x0a, 8 }, { 0x09, 8 },
185 { 0x08, 8 }, { 0x07, 8 }, { 0x06, 8 }, { 0x17, 10 },
186 { 0x16, 10 }, { 0x15, 10 }, { 0x14, 10 }, { 0x13, 10 },
187 { 0x12, 10 }, { 0x23, 11 }, { 0x22, 11 }, { 0x21, 11 },
188 { 0x20, 11 }, { 0x1f, 11 }, { 0x1e, 11 }, { 0x1d, 11 },
189 { 0x1c, 11 }, { 0x1b, 11 }, { 0x1a, 11 }, { 0x19, 11 },
193 /* Standard JPEG tables */
195 static const u8 default_intra_quant_table[] = {
196 8, 16, 19, 22, 26, 27, 29, 34,
197 16, 16, 22, 24, 27, 29, 34, 37,
198 19, 22, 26, 27, 29, 34, 34, 38,
199 22, 22, 26, 27, 29, 34, 37, 40,
200 22, 26, 27, 29, 32, 35, 40, 48,
201 26, 27, 29, 32, 35, 40, 48, 58,
202 26, 27, 29, 34, 38, 46, 56, 69,
203 27, 29, 35, 38, 46, 56, 69, 83
206 static const u8 bits_dc_luminance[] = {
207 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
210 static const u8 val_dc_luminance[] = {
211 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
214 static const u8 bits_dc_chrominance[] = {
215 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
218 static const u8 val_dc_chrominance[] = {
219 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
222 static const u8 bits_ac_luminance[] = {
223 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
226 static const u8 val_ac_luminance[] = {
227 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
228 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
229 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
230 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
231 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
232 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
233 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
234 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
235 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
236 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
237 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
238 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
239 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
240 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
241 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
242 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
243 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
244 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
245 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
246 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
250 static const u8 bits_ac_chrominance[] = {
251 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
254 static const u8 val_ac_chrominance[] = {
255 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
256 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
257 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
258 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
259 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
260 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
261 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
262 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
263 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
264 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
265 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
266 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
267 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
268 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
269 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
270 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
271 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
272 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
273 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
274 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
278 /* Zig-zag mapping for quant table
280 * OK, let's do this mapping on the actual table above so it doesn't have
281 * to be done on the fly.
283 static const int zz[64] = {
284 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
285 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
286 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
287 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
290 static int copy_packages(__le16 *dest, u16 *src, int pkg_cnt, int space)
292 int i, cnt = pkg_cnt * 32;
297 for (i = 0; i < cnt; ++i)
298 dest[i] = cpu_to_le16p(src + i);
303 static int mjpeg_frame_header(struct go7007 *go, unsigned char *buf, int q)
314 buf[p++] = default_intra_quant_table[0];
315 for (i = 1; i < 64; ++i)
316 /* buf[p++] = (default_intra_quant_table[i] * q) >> 3; */
317 buf[p++] = (default_intra_quant_table[zz[i]] * q) >> 3;
323 buf[p++] = go->height >> 8;
324 buf[p++] = go->height & 0xff;
325 buf[p++] = go->width >> 8;
326 buf[p++] = go->width & 0xff;
340 buf[p++] = 418 & 0xff;
342 memcpy(buf + p, bits_dc_luminance + 1, 16);
344 memcpy(buf + p, val_dc_luminance, sizeof(val_dc_luminance));
345 p += sizeof(val_dc_luminance);
347 memcpy(buf + p, bits_dc_chrominance + 1, 16);
349 memcpy(buf + p, val_dc_chrominance, sizeof(val_dc_chrominance));
350 p += sizeof(val_dc_chrominance);
352 memcpy(buf + p, bits_ac_luminance + 1, 16);
354 memcpy(buf + p, val_ac_luminance, sizeof(val_ac_luminance));
355 p += sizeof(val_ac_luminance);
357 memcpy(buf + p, bits_ac_chrominance + 1, 16);
359 memcpy(buf + p, val_ac_chrominance, sizeof(val_ac_chrominance));
360 p += sizeof(val_ac_chrominance);
378 static int gen_mjpeghdr_to_package(struct go7007 *go, __le16 *code, int space)
382 unsigned int addr = 0x19;
383 int size = 0, i, off = 0, chunk;
385 buf = kzalloc(4096, GFP_KERNEL);
389 for (i = 1; i < 32; ++i) {
390 mjpeg_frame_header(go, buf + size, i);
393 chunk = mjpeg_frame_header(go, buf + size, 1);
394 memmove(buf + size, buf + size + 80, chunk - 80);
397 for (i = 0; i < size; i += chunk * 2) {
398 if (space - off < 32) {
403 code[off + 1] = __cpu_to_le16(0x8000 | mem);
406 if (mem + chunk > 0x4000)
407 chunk = 0x4000 - mem;
408 if (i + 2 * chunk > size)
409 chunk = (size - i) / 2;
412 code[off] = __cpu_to_le16(0x4000 | chunk);
413 code[off + 31] = __cpu_to_le16(addr++);
416 code[off] = __cpu_to_le16(0x1000 | 28);
421 memcpy(&code[off + 2], buf + i, chunk * 2);
429 static int mpeg1_frame_header(struct go7007 *go, unsigned char *buf,
430 int modulo, int pict_struct, enum mpeg_frame_type frame)
432 int i, j, mb_code, mb_len;
433 int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
434 CODE_GEN(c, buf + 6);
453 default: /* keep the compiler happy */
454 mb_code = mb_len = 0;
458 CODE_ADD(c, frame == PFRAME ? 0x2 : 0x3, 13);
459 CODE_ADD(c, 0xffff, 16);
460 CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
462 CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 0x7 : 0x4, 4);
464 CODE_ADD(c, 0, 4); /* Is this supposed to be here?? */
465 CODE_ADD(c, 0, 3); /* What is this?? */
466 /* Byte-align with zeros */
467 j = 8 - (CODE_LENGTH(c) % 8);
471 if (go->format == V4L2_PIX_FMT_MPEG2) {
472 CODE_ADD(c, 0x1, 24);
473 CODE_ADD(c, 0xb5, 8);
474 CODE_ADD(c, 0x844, 12);
475 CODE_ADD(c, frame == PFRAME ? 0xff : 0x44, 8);
476 if (go->interlace_coding) {
477 CODE_ADD(c, pict_struct, 4);
479 CODE_ADD(c, 0x000, 11);
481 CODE_ADD(c, 0x200, 11);
484 CODE_ADD(c, 0x20c, 11);
486 /* Byte-align with zeros */
487 j = 8 - (CODE_LENGTH(c) % 8);
492 for (i = 0; i < rows; ++i) {
494 CODE_ADD(c, i + 1, 8);
497 CODE_ADD(c, mb_code, mb_len);
498 if (go->interlace_coding) {
500 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
502 if (frame == BFRAME_BIDIR) {
504 if (go->interlace_coding)
505 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
508 for (j = (go->width >> 4) - 2; j >= 33; j -= 33)
509 CODE_ADD(c, 0x8, 11);
510 CODE_ADD(c, addrinctab[j][0], addrinctab[j][1]);
511 CODE_ADD(c, mb_code, mb_len);
512 if (go->interlace_coding) {
514 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
516 if (frame == BFRAME_BIDIR) {
518 if (go->interlace_coding)
519 CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
523 /* Byte-align with zeros */
524 j = 8 - (CODE_LENGTH(c) % 8);
529 i = CODE_LENGTH(c) + 4 * 8;
537 static int mpeg1_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
539 int i, aspect_ratio, picture_rate;
540 CODE_GEN(c, buf + 6);
542 if (go->format == V4L2_PIX_FMT_MPEG1) {
543 switch (go->aspect_ratio) {
544 case GO7007_RATIO_4_3:
545 aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
547 case GO7007_RATIO_16_9:
548 aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
555 switch (go->aspect_ratio) {
556 case GO7007_RATIO_4_3:
559 case GO7007_RATIO_16_9:
567 switch (go->sensor_framerate) {
575 picture_rate = go->interlace_coding ? 6 : 3;
578 picture_rate = go->interlace_coding ? 7 : 4;
581 picture_rate = go->interlace_coding ? 8 : 5;
584 picture_rate = 5; /* 30 fps seems like a reasonable default */
588 CODE_ADD(c, go->width, 12);
589 CODE_ADD(c, go->height, 12);
590 CODE_ADD(c, aspect_ratio, 4);
591 CODE_ADD(c, picture_rate, 4);
592 CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 20000 : 0x3ffff, 18);
594 CODE_ADD(c, go->format == V4L2_PIX_FMT_MPEG2 ? 112 : 20, 10);
597 /* Byte-align with zeros */
598 i = 8 - (CODE_LENGTH(c) % 8);
602 if (go->format == V4L2_PIX_FMT_MPEG2) {
603 CODE_ADD(c, 0x1, 24);
604 CODE_ADD(c, 0xb5, 8);
605 CODE_ADD(c, 0x148, 12);
606 if (go->interlace_coding)
607 CODE_ADD(c, 0x20001, 20);
609 CODE_ADD(c, 0xa0001, 20);
612 /* Byte-align with zeros */
613 i = 8 - (CODE_LENGTH(c) % 8);
618 CODE_ADD(c, 0x1, 24);
619 CODE_ADD(c, 0xb52, 12);
620 CODE_ADD(c, go->standard == GO7007_STD_NTSC ? 2 : 1, 3);
621 CODE_ADD(c, 0x105, 9);
622 CODE_ADD(c, 0x505, 16);
623 CODE_ADD(c, go->width, 14);
625 CODE_ADD(c, go->height, 14);
627 /* Byte-align with zeros */
628 i = 8 - (CODE_LENGTH(c) % 8);
634 i = CODE_LENGTH(c) + 4 * 8;
644 static int gen_mpeg1hdr_to_package(struct go7007 *go,
645 __le16 *code, int space, int *framelen)
649 unsigned int addr = 0x19;
650 int i, off = 0, chunk;
652 buf = kzalloc(5120, GFP_KERNEL);
656 framelen[0] = mpeg1_frame_header(go, buf, 0, 1, PFRAME);
657 if (go->interlace_coding)
658 framelen[0] += mpeg1_frame_header(go, buf + framelen[0] / 8,
660 buf[0] = framelen[0] & 0xff;
661 buf[1] = framelen[0] >> 8;
663 framelen[1] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_PRE);
664 if (go->interlace_coding)
665 framelen[1] += mpeg1_frame_header(go, buf + i + framelen[1] / 8,
667 buf[i] = framelen[1] & 0xff;
668 buf[i + 1] = framelen[1] >> 8;
670 framelen[2] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_POST);
671 if (go->interlace_coding)
672 framelen[2] += mpeg1_frame_header(go, buf + i + framelen[2] / 8,
674 buf[i] = framelen[2] & 0xff;
675 buf[i + 1] = framelen[2] >> 8;
677 framelen[3] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_BIDIR);
678 if (go->interlace_coding)
679 framelen[3] += mpeg1_frame_header(go, buf + i + framelen[3] / 8,
681 buf[i] = framelen[3] & 0xff;
682 buf[i + 1] = framelen[3] >> 8;
684 mpeg1_sequence_header(go, buf + i, 0);
686 for (i = 0; i < 5120; i += chunk * 2) {
687 if (space - off < 32) {
692 code[off + 1] = __cpu_to_le16(0x8000 | mem);
695 if (mem + chunk > 0x4000)
696 chunk = 0x4000 - mem;
697 if (i + 2 * chunk > 5120)
698 chunk = (5120 - i) / 2;
701 code[off] = __cpu_to_le16(0x4000 | chunk);
702 code[off + 31] = __cpu_to_le16(addr);
703 if (mem + chunk == 0x4000) {
708 code[off] = __cpu_to_le16(0x1000 | 28);
713 memcpy(&code[off + 2], buf + i, chunk * 2);
721 static int vti_bitlen(struct go7007 *go)
723 unsigned int i, max_time_incr = go->sensor_framerate / go->fps_scale;
725 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);