1 /*
2  * Copyright (C) 2005-2006 Micronas USA Inc.
3  *
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.
7  *
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.
12  *
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.
16  */
17 
18 /*
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.
25  */
26 
27 #include <linux/module.h>
28 #include <linux/init.h>
29 #include <linux/time.h>
30 #include <linux/mm.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>
36 
37 #include "go7007-priv.h"
38 
39 /* Constants used in the source firmware image to describe code segments */
40 
41 #define	FLAG_MODE_MJPEG		(1)
42 #define	FLAG_MODE_MPEG1		(1<<1)
43 #define	FLAG_MODE_MPEG2		(1<<2)
44 #define	FLAG_MODE_MPEG4		(1<<3)
45 #define	FLAG_MODE_H263		(1<<4)
46 #define FLAG_MODE_ALL		(FLAG_MODE_MJPEG | FLAG_MODE_MPEG1 | \
47 					FLAG_MODE_MPEG2 | FLAG_MODE_MPEG4 | \
48 					FLAG_MODE_H263)
49 #define FLAG_SPECIAL		(1<<8)
50 
51 #define SPECIAL_FRM_HEAD	0
52 #define SPECIAL_BRC_CTRL	1
53 #define SPECIAL_CONFIG		2
54 #define SPECIAL_SEQHEAD		3
55 #define SPECIAL_AV_SYNC		4
56 #define SPECIAL_FINAL		5
57 #define SPECIAL_AUDIO		6
58 #define SPECIAL_MODET		7
59 
60 /* Little data class for creating MPEG headers bit-by-bit */
61 
62 struct code_gen {
63 	unsigned char *p; /* destination */
64 	u32 a; /* collects bits at the top of the variable */
65 	int b; /* bit position of most recently-written bit */
66 	int len; /* written out so far */
67 };
68 
69 #define CODE_GEN(name, dest) struct code_gen name = { dest, 0, 32, 0 }
70 
71 #define CODE_ADD(name, val, length) do { \
72 	name.b -= (length); \
73 	name.a |= (val) << name.b; \
74 	while (name.b <= 24) { \
75 		*name.p = name.a >> 24; \
76 		++name.p; \
77 		name.a <<= 8; \
78 		name.b += 8; \
79 		name.len += 8; \
80 	} \
81 } while (0)
82 
83 #define CODE_LENGTH(name) (name.len + (32 - name.b))
84 
85 /* Tables for creating the bitrate control data */
86 
87 static const s16 converge_speed_ip[101] = {
88 	1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
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, 2,
92 	2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
93 	3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
94 	5, 5, 5, 6, 6, 6, 7, 7, 8, 8,
95 	9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
96 	19, 20, 22, 23, 25, 27, 30, 32, 35, 38,
97 	41, 45, 49, 53, 58, 63, 69, 76, 83, 91,
98 	100
99 };
100 
101 static const s16 converge_speed_ipb[101] = {
102 	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
103 	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
104 	3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
105 	4, 4, 4, 4, 5, 5, 5, 5, 5, 6,
106 	6, 6, 6, 7, 7, 7, 7, 8, 8, 9,
107 	9, 9, 10, 10, 11, 12, 12, 13, 14, 14,
108 	15, 16, 17, 18, 19, 20, 22, 23, 25, 26,
109 	28, 30, 32, 34, 37, 40, 42, 46, 49, 53,
110 	57, 61, 66, 71, 77, 83, 90, 97, 106, 115,
111 	125, 135, 147, 161, 175, 191, 209, 228, 249, 273,
112 	300
113 };
114 
115 static const s16 LAMBDA_table[4][101] = {
116 	{	16, 16, 16, 16, 17, 17, 17, 18, 18, 18,
117 		19, 19, 19, 20, 20, 20, 21, 21, 22, 22,
118 		22, 23, 23, 24, 24, 25, 25, 25, 26, 26,
119 		27, 27, 28, 28, 29, 29, 30, 31, 31, 32,
120 		32, 33, 33, 34, 35, 35, 36, 37, 37, 38,
121 		39, 39, 40, 41, 42, 42, 43, 44, 45, 46,
122 		46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
123 		56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
124 		67, 68, 69, 70, 72, 73, 74, 76, 77, 78,
125 		80, 81, 83, 84, 86, 87, 89, 90, 92, 94,
126 		96
127 	},
128 	{
129 		20, 20, 20, 21, 21, 21, 22, 22, 23, 23,
130 		23, 24, 24, 25, 25, 26, 26, 27, 27, 28,
131 		28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
132 		34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
133 		40, 41, 42, 43, 43, 44, 45, 46, 47, 48,
134 		48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
135 		58, 59, 60, 61, 62, 64, 65, 66, 67, 68,
136 		70, 71, 72, 73, 75, 76, 78, 79, 80, 82,
137 		83, 85, 86, 88, 90, 91, 93, 95, 96, 98,
138 		100, 102, 103, 105, 107, 109, 111, 113, 115, 117,
139 		120
140 	},
141 	{
142 		24, 24, 24, 25, 25, 26, 26, 27, 27, 28,
143 		28, 29, 29, 30, 30, 31, 31, 32, 33, 33,
144 		34, 34, 35, 36, 36, 37, 38, 38, 39, 40,
145 		41, 41, 42, 43, 44, 44, 45, 46, 47, 48,
146 		49, 50, 50, 51, 52, 53, 54, 55, 56, 57,
147 		58, 59, 60, 62, 63, 64, 65, 66, 67, 69,
148 		70, 71, 72, 74, 75, 76, 78, 79, 81, 82,
149 		84, 85, 87, 88, 90, 92, 93, 95, 97, 98,
150 		100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
151 		120, 122, 124, 127, 129, 131, 134, 136, 138, 141,
152 		144
153 	},
154 	{
155 		32, 32, 33, 33, 34, 34, 35, 36, 36, 37,
156 		38, 38, 39, 40, 41, 41, 42, 43, 44, 44,
157 		45, 46, 47, 48, 49, 50, 50, 51, 52, 53,
158 		54, 55, 56, 57, 58, 59, 60, 62, 63, 64,
159 		65, 66, 67, 69, 70, 71, 72, 74, 75, 76,
160 		78, 79, 81, 82, 84, 85, 87, 88, 90, 92,
161 		93, 95, 97, 98, 100, 102, 104, 106, 108, 110,
162 		112, 114, 116, 118, 120, 122, 124, 127, 129, 131,
163 		134, 136, 139, 141, 144, 146, 149, 152, 154, 157,
164 		160, 163, 166, 169, 172, 175, 178, 181, 185, 188,
165 		192
166 	}
167 };
168 
169 /* MPEG blank frame generation tables */
170 
171 enum mpeg_frame_type {
172 	PFRAME,
173 	BFRAME_PRE,
174 	BFRAME_POST,
175 	BFRAME_BIDIR,
176 	BFRAME_EMPTY
177 };
178 
179 static const u32 addrinctab[33][2] = {
180 	{ 0x01, 1 },	{ 0x03, 3 },	{ 0x02, 3 },	{ 0x03, 4 },
181 	{ 0x02, 4 },	{ 0x03, 5 },	{ 0x02, 5 },	{ 0x07, 7 },
182 	{ 0x06, 7 },	{ 0x0b, 8 },	{ 0x0a, 8 },	{ 0x09, 8 },
183 	{ 0x08, 8 },	{ 0x07, 8 },	{ 0x06, 8 },	{ 0x17, 10 },
184 	{ 0x16, 10 },	{ 0x15, 10 },	{ 0x14, 10 },	{ 0x13, 10 },
185 	{ 0x12, 10 },	{ 0x23, 11 },	{ 0x22, 11 },	{ 0x21, 11 },
186 	{ 0x20, 11 },	{ 0x1f, 11 },	{ 0x1e, 11 },	{ 0x1d, 11 },
187 	{ 0x1c, 11 },	{ 0x1b, 11 },	{ 0x1a, 11 },	{ 0x19, 11 },
188 	{ 0x18, 11 }
189 };
190 
191 /* Standard JPEG tables */
192 
193 static const u8 default_intra_quant_table[] = {
194 	 8, 16, 19, 22, 26, 27, 29, 34,
195 	16, 16, 22, 24, 27, 29, 34, 37,
196 	19, 22, 26, 27, 29, 34, 34, 38,
197 	22, 22, 26, 27, 29, 34, 37, 40,
198 	22, 26, 27, 29, 32, 35, 40, 48,
199 	26, 27, 29, 32, 35, 40, 48, 58,
200 	26, 27, 29, 34, 38, 46, 56, 69,
201 	27, 29, 35, 38, 46, 56, 69, 83
202 };
203 
204 static const u8 bits_dc_luminance[] = {
205 	0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0
206 };
207 
208 static const u8 val_dc_luminance[] = {
209 	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
210 };
211 
212 static const u8 bits_dc_chrominance[] = {
213 	0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
214 };
215 
216 static const u8 val_dc_chrominance[] = {
217 	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
218 };
219 
220 static const u8 bits_ac_luminance[] = {
221 	0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d
222 };
223 
224 static const u8 val_ac_luminance[] = {
225 	0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
226 	0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
227 	0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
228 	0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
229 	0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
230 	0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
231 	0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
232 	0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
233 	0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
234 	0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
235 	0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
236 	0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
237 	0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
238 	0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
239 	0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
240 	0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
241 	0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
242 	0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
243 	0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
244 	0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
245 	0xf9, 0xfa
246 };
247 
248 static const u8 bits_ac_chrominance[] = {
249 	0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77
250 };
251 
252 static const u8 val_ac_chrominance[] = {
253 	0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
254 	0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
255 	0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
256 	0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
257 	0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
258 	0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
259 	0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
260 	0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
261 	0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
262 	0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
263 	0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
264 	0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
265 	0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
266 	0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
267 	0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
268 	0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
269 	0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
270 	0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
271 	0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
272 	0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
273 	0xf9, 0xfa
274 };
275 
276 /* Zig-zag mapping for quant table
277  *
278  * OK, let's do this mapping on the actual table above so it doesn't have
279  * to be done on the fly.
280  */
281 static const int zz[64] = {
282 	0,   1,  8, 16,  9,  2,  3, 10, 17, 24, 32, 25, 18, 11,  4,  5,
283 	12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13,  6,  7, 14, 21, 28,
284 	35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
285 	58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
286 };
287 
copy_packages(__le16 * dest,u16 * src,int pkg_cnt,int space)288 static int copy_packages(__le16 *dest, u16 *src, int pkg_cnt, int space)
289 {
290 	int i, cnt = pkg_cnt * 32;
291 
292 	if (space < cnt)
293 		return -1;
294 
295 	for (i = 0; i < cnt; ++i)
296 		dest[i] = cpu_to_le16p(src + i);
297 
298 	return cnt;
299 }
300 
mjpeg_frame_header(struct go7007 * go,unsigned char * buf,int q)301 static int mjpeg_frame_header(struct go7007 *go, unsigned char *buf, int q)
302 {
303 	int i, p = 0;
304 
305 	buf[p++] = 0xff;
306 	buf[p++] = 0xd8;
307 	buf[p++] = 0xff;
308 	buf[p++] = 0xdb;
309 	buf[p++] = 0;
310 	buf[p++] = 2 + 65;
311 	buf[p++] = 0;
312 	buf[p++] = default_intra_quant_table[0];
313 	for (i = 1; i < 64; ++i)
314 		/* buf[p++] = (default_intra_quant_table[i] * q) >> 3; */
315 		buf[p++] = (default_intra_quant_table[zz[i]] * q) >> 3;
316 	buf[p++] = 0xff;
317 	buf[p++] = 0xc0;
318 	buf[p++] = 0;
319 	buf[p++] = 17;
320 	buf[p++] = 8;
321 	buf[p++] = go->height >> 8;
322 	buf[p++] = go->height & 0xff;
323 	buf[p++] = go->width >> 8;
324 	buf[p++] = go->width & 0xff;
325 	buf[p++] = 3;
326 	buf[p++] = 1;
327 	buf[p++] = 0x22;
328 	buf[p++] = 0;
329 	buf[p++] = 2;
330 	buf[p++] = 0x11;
331 	buf[p++] = 0;
332 	buf[p++] = 3;
333 	buf[p++] = 0x11;
334 	buf[p++] = 0;
335 	buf[p++] = 0xff;
336 	buf[p++] = 0xc4;
337 	buf[p++] = 418 >> 8;
338 	buf[p++] = 418 & 0xff;
339 	buf[p++] = 0x00;
340 	memcpy(buf + p, bits_dc_luminance + 1, 16);
341 	p += 16;
342 	memcpy(buf + p, val_dc_luminance, sizeof(val_dc_luminance));
343 	p += sizeof(val_dc_luminance);
344 	buf[p++] = 0x01;
345 	memcpy(buf + p, bits_dc_chrominance + 1, 16);
346 	p += 16;
347 	memcpy(buf + p, val_dc_chrominance, sizeof(val_dc_chrominance));
348 	p += sizeof(val_dc_chrominance);
349 	buf[p++] = 0x10;
350 	memcpy(buf + p, bits_ac_luminance + 1, 16);
351 	p += 16;
352 	memcpy(buf + p, val_ac_luminance, sizeof(val_ac_luminance));
353 	p += sizeof(val_ac_luminance);
354 	buf[p++] = 0x11;
355 	memcpy(buf + p, bits_ac_chrominance + 1, 16);
356 	p += 16;
357 	memcpy(buf + p, val_ac_chrominance, sizeof(val_ac_chrominance));
358 	p += sizeof(val_ac_chrominance);
359 	buf[p++] = 0xff;
360 	buf[p++] = 0xda;
361 	buf[p++] = 0;
362 	buf[p++] = 12;
363 	buf[p++] = 3;
364 	buf[p++] = 1;
365 	buf[p++] = 0x00;
366 	buf[p++] = 2;
367 	buf[p++] = 0x11;
368 	buf[p++] = 3;
369 	buf[p++] = 0x11;
370 	buf[p++] = 0;
371 	buf[p++] = 63;
372 	buf[p++] = 0;
373 	return p;
374 }
375 
gen_mjpeghdr_to_package(struct go7007 * go,__le16 * code,int space)376 static int gen_mjpeghdr_to_package(struct go7007 *go, __le16 *code, int space)
377 {
378 	u8 *buf;
379 	u16 mem = 0x3e00;
380 	unsigned int addr = 0x19;
381 	int size = 0, i, off = 0, chunk;
382 
383 	buf = kzalloc(4096, GFP_KERNEL);
384 	if (buf == NULL) {
385 		printk(KERN_ERR "go7007: unable to allocate 4096 bytes for "
386 				"firmware construction\n");
387 		return -1;
388 	}
389 
390 	for (i = 1; i < 32; ++i) {
391 		mjpeg_frame_header(go, buf + size, i);
392 		size += 80;
393 	}
394 	chunk = mjpeg_frame_header(go, buf + size, 1);
395 	memmove(buf + size, buf + size + 80, chunk - 80);
396 	size += chunk - 80;
397 
398 	for (i = 0; i < size; i += chunk * 2) {
399 		if (space - off < 32) {
400 			off = -1;
401 			goto done;
402 		}
403 
404 		code[off + 1] = __cpu_to_le16(0x8000 | mem);
405 
406 		chunk = 28;
407 		if (mem + chunk > 0x4000)
408 			chunk = 0x4000 - mem;
409 		if (i + 2 * chunk > size)
410 			chunk = (size - i) / 2;
411 
412 		if (chunk < 28) {
413 			code[off] = __cpu_to_le16(0x4000 | chunk);
414 			code[off + 31] = __cpu_to_le16(addr++);
415 			mem = 0x3e00;
416 		} else {
417 			code[off] = __cpu_to_le16(0x1000 | 28);
418 			code[off + 31] = 0;
419 			mem += 28;
420 		}
421 
422 		memcpy(&code[off + 2], buf + i, chunk * 2);
423 		off += 32;
424 	}
425 done:
426 	kfree(buf);
427 	return off;
428 }
429 
mpeg1_frame_header(struct go7007 * go,unsigned char * buf,int modulo,int pict_struct,enum mpeg_frame_type frame)430 static int mpeg1_frame_header(struct go7007 *go, unsigned char *buf,
431 		int modulo, int pict_struct, enum mpeg_frame_type frame)
432 {
433 	int i, j, mb_code, mb_len;
434 	int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
435 	CODE_GEN(c, buf + 6);
436 
437 	switch (frame) {
438 	case PFRAME:
439 		mb_code = 0x1;
440 		mb_len = 3;
441 		break;
442 	case BFRAME_PRE:
443 		mb_code = 0x2;
444 		mb_len = 4;
445 		break;
446 	case BFRAME_POST:
447 		mb_code = 0x2;
448 		mb_len = 3;
449 		break;
450 	case BFRAME_BIDIR:
451 		mb_code = 0x2;
452 		mb_len = 2;
453 		break;
454 	default: /* keep the compiler happy */
455 		mb_code = mb_len = 0;
456 		break;
457 	}
458 
459 	CODE_ADD(c, frame == PFRAME ? 0x2 : 0x3, 13);
460 	CODE_ADD(c, 0xffff, 16);
461 	CODE_ADD(c, go->format == GO7007_FORMAT_MPEG2 ? 0x7 : 0x4, 4);
462 	if (frame != PFRAME)
463 		CODE_ADD(c, go->format == GO7007_FORMAT_MPEG2 ? 0x7 : 0x4, 4);
464 	else
465 		CODE_ADD(c, 0, 4); /* Is this supposed to be here?? */
466 	CODE_ADD(c, 0, 3); /* What is this?? */
467 	/* Byte-align with zeros */
468 	j = 8 - (CODE_LENGTH(c) % 8);
469 	if (j != 8)
470 		CODE_ADD(c, 0, j);
471 
472 	if (go->format == GO7007_FORMAT_MPEG2) {
473 		CODE_ADD(c, 0x1, 24);
474 		CODE_ADD(c, 0xb5, 8);
475 		CODE_ADD(c, 0x844, 12);
476 		CODE_ADD(c, frame == PFRAME ? 0xff : 0x44, 8);
477 		if (go->interlace_coding) {
478 			CODE_ADD(c, pict_struct, 4);
479 			if (go->dvd_mode)
480 				CODE_ADD(c, 0x000, 11);
481 			else
482 				CODE_ADD(c, 0x200, 11);
483 		} else {
484 			CODE_ADD(c, 0x3, 4);
485 			CODE_ADD(c, 0x20c, 11);
486 		}
487 		/* Byte-align with zeros */
488 		j = 8 - (CODE_LENGTH(c) % 8);
489 		if (j != 8)
490 			CODE_ADD(c, 0, j);
491 	}
492 
493 	for (i = 0; i < rows; ++i) {
494 		CODE_ADD(c, 1, 24);
495 		CODE_ADD(c, i + 1, 8);
496 		CODE_ADD(c, 0x2, 6);
497 		CODE_ADD(c, 0x1, 1);
498 		CODE_ADD(c, mb_code, mb_len);
499 		if (go->interlace_coding) {
500 			CODE_ADD(c, 0x1, 2);
501 			CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
502 		}
503 		if (frame == BFRAME_BIDIR) {
504 			CODE_ADD(c, 0x3, 2);
505 			if (go->interlace_coding)
506 				CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
507 		}
508 		CODE_ADD(c, 0x3, 2);
509 		for (j = (go->width >> 4) - 2; j >= 33; j -= 33)
510 			CODE_ADD(c, 0x8, 11);
511 		CODE_ADD(c, addrinctab[j][0], addrinctab[j][1]);
512 		CODE_ADD(c, mb_code, mb_len);
513 		if (go->interlace_coding) {
514 			CODE_ADD(c, 0x1, 2);
515 			CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
516 		}
517 		if (frame == BFRAME_BIDIR) {
518 			CODE_ADD(c, 0x3, 2);
519 			if (go->interlace_coding)
520 				CODE_ADD(c, pict_struct == 1 ? 0x0 : 0x1, 1);
521 		}
522 		CODE_ADD(c, 0x3, 2);
523 
524 		/* Byte-align with zeros */
525 		j = 8 - (CODE_LENGTH(c) % 8);
526 		if (j != 8)
527 			CODE_ADD(c, 0, j);
528 	}
529 
530 	i = CODE_LENGTH(c) + 4 * 8;
531 	buf[2] = 0x00;
532 	buf[3] = 0x00;
533 	buf[4] = 0x01;
534 	buf[5] = 0x00;
535 	return i;
536 }
537 
mpeg1_sequence_header(struct go7007 * go,unsigned char * buf,int ext)538 static int mpeg1_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
539 {
540 	int i, aspect_ratio, picture_rate;
541 	CODE_GEN(c, buf + 6);
542 
543 	if (go->format == GO7007_FORMAT_MPEG1) {
544 		switch (go->aspect_ratio) {
545 		case GO7007_RATIO_4_3:
546 			aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
547 			break;
548 		case GO7007_RATIO_16_9:
549 			aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
550 			break;
551 		default:
552 			aspect_ratio = 1;
553 			break;
554 		}
555 	} else {
556 		switch (go->aspect_ratio) {
557 		case GO7007_RATIO_4_3:
558 			aspect_ratio = 2;
559 			break;
560 		case GO7007_RATIO_16_9:
561 			aspect_ratio = 3;
562 			break;
563 		default:
564 			aspect_ratio = 1;
565 			break;
566 		}
567 	}
568 	switch (go->sensor_framerate) {
569 	case 24000:
570 		picture_rate = 1;
571 		break;
572 	case 24024:
573 		picture_rate = 2;
574 		break;
575 	case 25025:
576 		picture_rate = go->interlace_coding ? 6 : 3;
577 		break;
578 	case 30000:
579 		picture_rate = go->interlace_coding ? 7 : 4;
580 		break;
581 	case 30030:
582 		picture_rate = go->interlace_coding ? 8 : 5;
583 		break;
584 	default:
585 		picture_rate = 5; /* 30 fps seems like a reasonable default */
586 		break;
587 	}
588 
589 	CODE_ADD(c, go->width, 12);
590 	CODE_ADD(c, go->height, 12);
591 	CODE_ADD(c, aspect_ratio, 4);
592 	CODE_ADD(c, picture_rate, 4);
593 	CODE_ADD(c, go->format == GO7007_FORMAT_MPEG2 ? 20000 : 0x3ffff, 18);
594 	CODE_ADD(c, 1, 1);
595 	CODE_ADD(c, go->format == GO7007_FORMAT_MPEG2 ? 112 : 20, 10);
596 	CODE_ADD(c, 0, 3);
597 
598 	/* Byte-align with zeros */
599 	i = 8 - (CODE_LENGTH(c) % 8);
600 	if (i != 8)
601 		CODE_ADD(c, 0, i);
602 
603 	if (go->format == GO7007_FORMAT_MPEG2) {
604 		CODE_ADD(c, 0x1, 24);
605 		CODE_ADD(c, 0xb5, 8);
606 		CODE_ADD(c, 0x148, 12);
607 		if (go->interlace_coding)
608 			CODE_ADD(c, 0x20001, 20);
609 		else
610 			CODE_ADD(c, 0xa0001, 20);
611 		CODE_ADD(c, 0, 16);
612 
613 		/* Byte-align with zeros */
614 		i = 8 - (CODE_LENGTH(c) % 8);
615 		if (i != 8)
616 			CODE_ADD(c, 0, i);
617 
618 		if (ext) {
619 			CODE_ADD(c, 0x1, 24);
620 			CODE_ADD(c, 0xb52, 12);
621 			CODE_ADD(c, go->standard == GO7007_STD_NTSC ? 2 : 1, 3);
622 			CODE_ADD(c, 0x105, 9);
623 			CODE_ADD(c, 0x505, 16);
624 			CODE_ADD(c, go->width, 14);
625 			CODE_ADD(c, 1, 1);
626 			CODE_ADD(c, go->height, 14);
627 
628 			/* Byte-align with zeros */
629 			i = 8 - (CODE_LENGTH(c) % 8);
630 			if (i != 8)
631 				CODE_ADD(c, 0, i);
632 		}
633 	}
634 
635 	i = CODE_LENGTH(c) + 4 * 8;
636 	buf[0] = i & 0xff;
637 	buf[1] = i >> 8;
638 	buf[2] = 0x00;
639 	buf[3] = 0x00;
640 	buf[4] = 0x01;
641 	buf[5] = 0xb3;
642 	return i;
643 }
644 
gen_mpeg1hdr_to_package(struct go7007 * go,__le16 * code,int space,int * framelen)645 static int gen_mpeg1hdr_to_package(struct go7007 *go,
646 					__le16 *code, int space, int *framelen)
647 {
648 	u8 *buf;
649 	u16 mem = 0x3e00;
650 	unsigned int addr = 0x19;
651 	int i, off = 0, chunk;
652 
653 	buf = kzalloc(5120, GFP_KERNEL);
654 	if (buf == NULL) {
655 		printk(KERN_ERR "go7007: unable to allocate 5120 bytes for "
656 				"firmware construction\n");
657 		return -1;
658 	}
659 	framelen[0] = mpeg1_frame_header(go, buf, 0, 1, PFRAME);
660 	if (go->interlace_coding)
661 		framelen[0] += mpeg1_frame_header(go, buf + framelen[0] / 8,
662 							0, 2, PFRAME);
663 	buf[0] = framelen[0] & 0xff;
664 	buf[1] = framelen[0] >> 8;
665 	i = 368;
666 	framelen[1] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_PRE);
667 	if (go->interlace_coding)
668 		framelen[1] += mpeg1_frame_header(go, buf + i + framelen[1] / 8,
669 							0, 2, BFRAME_PRE);
670 	buf[i] = framelen[1] & 0xff;
671 	buf[i + 1] = framelen[1] >> 8;
672 	i += 1632;
673 	framelen[2] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_POST);
674 	if (go->interlace_coding)
675 		framelen[2] += mpeg1_frame_header(go, buf + i + framelen[2] / 8,
676 							0, 2, BFRAME_POST);
677 	buf[i] = framelen[2] & 0xff;
678 	buf[i + 1] = framelen[2] >> 8;
679 	i += 1432;
680 	framelen[3] = mpeg1_frame_header(go, buf + i, 0, 1, BFRAME_BIDIR);
681 	if (go->interlace_coding)
682 		framelen[3] += mpeg1_frame_header(go, buf + i + framelen[3] / 8,
683 							0, 2, BFRAME_BIDIR);
684 	buf[i] = framelen[3] & 0xff;
685 	buf[i + 1] = framelen[3] >> 8;
686 	i += 1632 + 16;
687 	mpeg1_sequence_header(go, buf + i, 0);
688 	i += 40;
689 	for (i = 0; i < 5120; i += chunk * 2) {
690 		if (space - off < 32) {
691 			off = -1;
692 			goto done;
693 		}
694 
695 		code[off + 1] = __cpu_to_le16(0x8000 | mem);
696 
697 		chunk = 28;
698 		if (mem + chunk > 0x4000)
699 			chunk = 0x4000 - mem;
700 		if (i + 2 * chunk > 5120)
701 			chunk = (5120 - i) / 2;
702 
703 		if (chunk < 28) {
704 			code[off] = __cpu_to_le16(0x4000 | chunk);
705 			code[off + 31] = __cpu_to_le16(addr);
706 			if (mem + chunk == 0x4000) {
707 				mem = 0x3e00;
708 				++addr;
709 			}
710 		} else {
711 			code[off] = __cpu_to_le16(0x1000 | 28);
712 			code[off + 31] = 0;
713 			mem += 28;
714 		}
715 
716 		memcpy(&code[off + 2], buf + i, chunk * 2);
717 		off += 32;
718 	}
719 done:
720 	kfree(buf);
721 	return off;
722 }
723 
vti_bitlen(struct go7007 * go)724 static int vti_bitlen(struct go7007 *go)
725 {
726 	unsigned int i, max_time_incr = go->sensor_framerate / go->fps_scale;
727 
728 	for (i = 31; (max_time_incr & ((1 << i) - 1)) == max_time_incr; --i);
729 	return i + 1;
730 }
731 
mpeg4_frame_header(struct go7007 * go,unsigned char * buf,int modulo,enum mpeg_frame_type frame)732 static int mpeg4_frame_header(struct go7007 *go, unsigned char *buf,
733 		int modulo, enum mpeg_frame_type frame)
734 {
735 	int i;
736 	CODE_GEN(c, buf + 6);
737 	int mb_count = (go->width >> 4) * (go->height >> 4);
738 
739 	CODE_ADD(c, frame == PFRAME ? 0x1 : 0x2, 2);
740 	if (modulo)
741 		CODE_ADD(c, 0x1, 1);
742 	CODE_ADD(c, 0x1, 2);
743 	CODE_ADD(c, 0, vti_bitlen(go));
744 	CODE_ADD(c, 0x3, 2);
745 	if (frame == PFRAME)
746 		CODE_ADD(c, 0, 1);
747 	CODE_ADD(c, 0xc, 11);
748 	if (frame != PFRAME)
749 		CODE_ADD(c, 0x4, 3);
750 	if (frame != BFRAME_EMPTY) {
751 		for (i = 0; i < mb_count; ++i) {
752 			switch (frame) {
753 			case PFRAME:
754 				CODE_ADD(c, 0x1, 1);
755 				break;
756 			case BFRAME_PRE:
757 				CODE_ADD(c, 0x47, 8);
758 				break;
759 			case BFRAME_POST:
760 				CODE_ADD(c, 0x27, 7);
761 				break;
762 			case BFRAME_BIDIR:
763 				CODE_ADD(c, 0x5f, 8);
764 				break;
765 			case BFRAME_EMPTY: /* keep compiler quiet */
766 				break;
767 			}
768 		}
769 	}
770 
771 	/* Byte-align with a zero followed by ones */
772 	i = 8 - (CODE_LENGTH(c) % 8);
773 	CODE_ADD(c, 0, 1);
774 	CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
775 
776 	i = CODE_LENGTH(c) + 4 * 8;
777 	buf[0] = i & 0xff;
778 	buf[1] = i >> 8;
779 	buf[2] = 0x00;
780 	buf[3] = 0x00;
781 	buf[4] = 0x01;
782 	buf[5] = 0xb6;
783 	return i;
784 }
785 
mpeg4_sequence_header(struct go7007 * go,unsigned char * buf,int ext)786 static int mpeg4_sequence_header(struct go7007 *go, unsigned char *buf, int ext)
787 {
788 	const unsigned char head[] = { 0x00, 0x00, 0x01, 0xb0, go->pali,
789 		0x00, 0x00, 0x01, 0xb5, 0x09,
790 		0x00, 0x00, 0x01, 0x00,
791 		0x00, 0x00, 0x01, 0x20, };
792 	int i, aspect_ratio;
793 	int fps = go->sensor_framerate / go->fps_scale;
794 	CODE_GEN(c, buf + 2 + sizeof(head));
795 
796 	switch (go->aspect_ratio) {
797 	case GO7007_RATIO_4_3:
798 		aspect_ratio = go->standard == GO7007_STD_NTSC ? 3 : 2;
799 		break;
800 	case GO7007_RATIO_16_9:
801 		aspect_ratio = go->standard == GO7007_STD_NTSC ? 5 : 4;
802 		break;
803 	default:
804 		aspect_ratio = 1;
805 		break;
806 	}
807 
808 	memcpy(buf + 2, head, sizeof(head));
809 	CODE_ADD(c, 0x191, 17);
810 	CODE_ADD(c, aspect_ratio, 4);
811 	CODE_ADD(c, 0x1, 4);
812 	CODE_ADD(c, fps, 16);
813 	CODE_ADD(c, 0x3, 2);
814 	CODE_ADD(c, 1001, vti_bitlen(go));
815 	CODE_ADD(c, 1, 1);
816 	CODE_ADD(c, go->width, 13);
817 	CODE_ADD(c, 1, 1);
818 	CODE_ADD(c, go->height, 13);
819 	CODE_ADD(c, 0x2830, 14);
820 
821 	/* Byte-align */
822 	i = 8 - (CODE_LENGTH(c) % 8);
823 	CODE_ADD(c, 0, 1);
824 	CODE_ADD(c, (1 << (i - 1)) - 1, i - 1);
825 
826 	i = CODE_LENGTH(c) + sizeof(head) * 8;
827 	buf[0] = i & 0xff;
828 	buf[1] = i >> 8;
829 	return i;
830 }
831 
gen_mpeg4hdr_to_package(struct go7007 * go,__le16 * code,int space,int * framelen)832 static int gen_mpeg4hdr_to_package(struct go7007 *go,
833 					__le16 *code, int space, int *framelen)
834 {
835 	u8 *buf;
836 	u16 mem = 0x3e00;
837 	unsigned int addr = 0x19;
838 	int i, off = 0, chunk;
839 
840 	buf = kzalloc(5120, GFP_KERNEL);
841 	if (buf == NULL) {
842 		printk(KERN_ERR "go7007: unable to allocate 5120 bytes for "
843 				"firmware construction\n");
844 		return -1;
845 	}
846 	framelen[0] = mpeg4_frame_header(go, buf, 0, PFRAME);
847 	i = 368;
848 	framelen[1] = mpeg4_frame_header(go, buf + i, 0, BFRAME_PRE);
849 	i += 1632;
850 	framelen[2] = mpeg4_frame_header(go, buf + i, 0, BFRAME_POST);
851 	i += 1432;
852 	framelen[3] = mpeg4_frame_header(go, buf + i, 0, BFRAME_BIDIR);
853 	i += 1632;
854 	mpeg4_frame_header(go, buf + i, 0, BFRAME_EMPTY);
855 	i += 16;
856 	mpeg4_sequence_header(go, buf + i, 0);
857 	i += 40;
858 	for (i = 0; i < 5120; i += chunk * 2) {
859 		if (space - off < 32) {
860 			off = -1;
861 			goto done;
862 		}
863 
864 		code[off + 1] = __cpu_to_le16(0x8000 | mem);
865 
866 		chunk = 28;
867 		if (mem + chunk > 0x4000)
868 			chunk = 0x4000 - mem;
869 		if (i + 2 * chunk > 5120)
870 			chunk = (5120 - i) / 2;
871 
872 		if (chunk < 28) {
873 			code[off] = __cpu_to_le16(0x4000 | chunk);
874 			code[off + 31] = __cpu_to_le16(addr);
875 			if (mem + chunk == 0x4000) {
876 				mem = 0x3e00;
877 				++addr;
878 			}
879 		} else {
880 			code[off] = __cpu_to_le16(0x1000 | 28);
881 			code[off + 31] = 0;
882 			mem += 28;
883 		}
884 
885 		memcpy(&code[off + 2], buf + i, chunk * 2);
886 		off += 32;
887 	}
888 	mem = 0x3e00;
889 	addr = go->ipb ? 0x14f9 : 0x0af9;
890 	memset(buf, 0, 5120);
891 	framelen[4] = mpeg4_frame_header(go, buf, 1, PFRAME);
892 	i = 368;
893 	framelen[5] = mpeg4_frame_header(go, buf + i, 1, BFRAME_PRE);
894 	i += 1632;
895 	framelen[6] = mpeg4_frame_header(go, buf + i, 1, BFRAME_POST);
896 	i += 1432;
897 	framelen[7] = mpeg4_frame_header(go, buf + i, 1, BFRAME_BIDIR);
898 	i += 1632;
899 	mpeg4_frame_header(go, buf + i, 1, BFRAME_EMPTY);
900 	i += 16;
901 	for (i = 0; i < 5120; i += chunk * 2) {
902 		if (space - off < 32) {
903 			off = -1;
904 			goto done;
905 		}
906 
907 		code[off + 1] = __cpu_to_le16(0x8000 | mem);
908 
909 		chunk = 28;
910 		if (mem + chunk > 0x4000)
911 			chunk = 0x4000 - mem;
912 		if (i + 2 * chunk > 5120)
913 			chunk = (5120 - i) / 2;
914 
915 		if (chunk < 28) {
916 			code[off] = __cpu_to_le16(0x4000 | chunk);
917 			code[off + 31] = __cpu_to_le16(addr);
918 			if (mem + chunk == 0x4000) {
919 				mem = 0x3e00;
920 				++addr;
921 			}
922 		} else {
923 			code[off] = __cpu_to_le16(0x1000 | 28);
924 			code[off + 31] = 0;
925 			mem += 28;
926 		}
927 
928 		memcpy(&code[off + 2], buf + i, chunk * 2);
929 		off += 32;
930 	}
931 done:
932 	kfree(buf);
933 	return off;
934 }
935 
brctrl_to_package(struct go7007 * go,__le16 * code,int space,int * framelen)936 static int brctrl_to_package(struct go7007 *go,
937 					__le16 *code, int space, int *framelen)
938 {
939 	int converge_speed = 0;
940 	int lambda = (go->format == GO7007_FORMAT_MJPEG || go->dvd_mode) ?
941 				100 : 0;
942 	int peak_rate = 6 * go->bitrate / 5;
943 	int vbv_buffer = go->format == GO7007_FORMAT_MJPEG ?
944 				go->bitrate :
945 				(go->dvd_mode ? 900000 : peak_rate);
946 	int fps = go->sensor_framerate / go->fps_scale;
947 	int q = 0;
948 	/* Bizarre math below depends on rounding errors in division */
949 	u32 sgop_expt_addr = go->bitrate / 32 * (go->ipb ? 3 : 1) * 1001 / fps;
950 	u32 sgop_peak_addr = peak_rate / 32 * 1001 / fps;
951 	u32 total_expt_addr = go->bitrate / 32 * 1000 / fps * (fps / 1000);
952 	u32 vbv_alert_addr = vbv_buffer * 3 / (4 * 32);
953 	u32 cplx[] = {
954 		q > 0 ? sgop_expt_addr * q :
955 			2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
956 		q > 0 ? sgop_expt_addr * q :
957 			2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
958 		q > 0 ? sgop_expt_addr * q :
959 			2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
960 		q > 0 ? sgop_expt_addr * q :
961 			2 * go->width * go->height * (go->ipb ? 6 : 4) / 32,
962 	};
963 	u32 calc_q = q > 0 ? q : cplx[0] / sgop_expt_addr;
964 	u16 pack[] = {
965 		0x200e,		0x0000,
966 		0xBF20,		go->ipb ? converge_speed_ipb[converge_speed]
967 					: converge_speed_ip[converge_speed],
968 		0xBF21,		go->ipb ? 2 : 0,
969 		0xBF22,		go->ipb ? LAMBDA_table[0][lambda / 2 + 50]
970 					: 32767,
971 		0xBF23,		go->ipb ? LAMBDA_table[1][lambda] : 32767,
972 		0xBF24,		32767,
973 		0xBF25,		lambda > 99 ? 32767 : LAMBDA_table[3][lambda],
974 		0xBF26,		sgop_expt_addr & 0x0000FFFF,
975 		0xBF27,		sgop_expt_addr >> 16,
976 		0xBF28,		sgop_peak_addr & 0x0000FFFF,
977 		0xBF29,		sgop_peak_addr >> 16,
978 		0xBF2A,		vbv_alert_addr & 0x0000FFFF,
979 		0xBF2B,		vbv_alert_addr >> 16,
980 		0xBF2C,		0,
981 		0xBF2D,		0,
982 		0,		0,
983 
984 		0x200e,		0x0000,
985 		0xBF2E,		vbv_alert_addr & 0x0000FFFF,
986 		0xBF2F,		vbv_alert_addr >> 16,
987 		0xBF30,		cplx[0] & 0x0000FFFF,
988 		0xBF31,		cplx[0] >> 16,
989 		0xBF32,		cplx[1] & 0x0000FFFF,
990 		0xBF33,		cplx[1] >> 16,
991 		0xBF34,		cplx[2] & 0x0000FFFF,
992 		0xBF35,		cplx[2] >> 16,
993 		0xBF36,		cplx[3] & 0x0000FFFF,
994 		0xBF37,		cplx[3] >> 16,
995 		0xBF38,		0,
996 		0xBF39,		0,
997 		0xBF3A,		total_expt_addr & 0x0000FFFF,
998 		0xBF3B,		total_expt_addr >> 16,
999 		0,		0,
1000 
1001 		0x200e,		0x0000,
1002 		0xBF3C,		total_expt_addr & 0x0000FFFF,
1003 		0xBF3D,		total_expt_addr >> 16,
1004 		0xBF3E,		0,
1005 		0xBF3F,		0,
1006 		0xBF48,		0,
1007 		0xBF49,		0,
1008 		0xBF4A,		calc_q < 4 ? 4 : (calc_q > 124 ? 124 : calc_q),
1009 		0xBF4B,		4,
1010 		0xBF4C,		0,
1011 		0xBF4D,		0,
1012 		0xBF4E,		0,
1013 		0xBF4F,		0,
1014 		0xBF50,		0,
1015 		0xBF51,		0,
1016 		0,		0,
1017 
1018 		0x200e,		0x0000,
1019 		0xBF40,		sgop_expt_addr & 0x0000FFFF,
1020 		0xBF41,		sgop_expt_addr >> 16,
1021 		0xBF42,		0,
1022 		0xBF43,		0,
1023 		0xBF44,		0,
1024 		0xBF45,		0,
1025 		0xBF46,		(go->width >> 4) * (go->height >> 4),
1026 		0xBF47,		0,
1027 		0xBF64,		0,
1028 		0xBF65,		0,
1029 		0xBF18,		framelen[4],
1030 		0xBF19,		framelen[5],
1031 		0xBF1A,		framelen[6],
1032 		0xBF1B,		framelen[7],
1033 		0,		0,
1034 
1035 #if 0
1036 		/* Remove once we don't care about matching */
1037 		0x200e,		0x0000,
1038 		0xBF56,		4,
1039 		0xBF57,		0,
1040 		0xBF58,		5,
1041 		0xBF59,		0,
1042 		0xBF5A,		6,
1043 		0xBF5B,		0,
1044 		0xBF5C,		8,
1045 		0xBF5D,		0,
1046 		0xBF5E,		1,
1047 		0xBF5F,		0,
1048 		0xBF60,		1,
1049 		0xBF61,		0,
1050 		0xBF62,		0,
1051 		0xBF63,		0,
1052 		0,		0,
1053 #else
1054 		0x2008,		0x0000,
1055 		0xBF56,		4,
1056 		0xBF57,		0,
1057 		0xBF58,		5,
1058 		0xBF59,		0,
1059 		0xBF5A,		6,
1060 		0xBF5B,		0,
1061 		0xBF5C,		8,
1062 		0xBF5D,		0,
1063 		0,		0,
1064 		0,		0,
1065 		0,		0,
1066 		0,		0,
1067 		0,		0,
1068 		0,		0,
1069 		0,		0,
1070 #endif
1071 
1072 		0x200e,		0x0000,
1073 		0xBF10,		0,
1074 		0xBF11,		0,
1075 		0xBF12,		0,
1076 		0xBF13,		0,
1077 		0xBF14,		0,
1078 		0xBF15,		0,
1079 		0xBF16,		0,
1080 		0xBF17,		0,
1081 		0xBF7E,		0,
1082 		0xBF7F,		1,
1083 		0xBF52,		framelen[0],
1084 		0xBF53,		framelen[1],
1085 		0xBF54,		framelen[2],
1086 		0xBF55,		framelen[3],
1087 		0,		0,
1088 	};
1089 
1090 	return copy_packages(code, pack, 6, space);
1091 }
1092 
config_package(struct go7007 * go,__le16 * code,int space)1093 static int config_package(struct go7007 *go, __le16 *code, int space)
1094 {
1095 	int fps = go->sensor_framerate / go->fps_scale / 1000;
1096 	int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1097 	int brc_window_size = fps;
1098 	int q_min = 2, q_max = 31;
1099 	int THACCoeffSet0 = 0;
1100 	u16 pack[] = {
1101 		0x200e,		0x0000,
1102 		0xc002,		0x14b4,
1103 		0xc003,		0x28b4,
1104 		0xc004,		0x3c5a,
1105 		0xdc05,		0x2a77,
1106 		0xc6c3,		go->format == GO7007_FORMAT_MPEG4 ? 0 :
1107 				(go->format == GO7007_FORMAT_H263 ? 0 : 1),
1108 		0xc680,		go->format == GO7007_FORMAT_MPEG4 ? 0xf1 :
1109 				(go->format == GO7007_FORMAT_H263 ? 0x61 :
1110 									0xd3),
1111 		0xc780,		0x0140,
1112 		0xe009,		0x0001,
1113 		0xc60f,		0x0008,
1114 		0xd4ff,		0x0002,
1115 		0xe403,		2340,
1116 		0xe406,		75,
1117 		0xd411,		0x0001,
1118 		0xd410,		0xa1d6,
1119 		0x0001,		0x2801,
1120 
1121 		0x200d,		0x0000,
1122 		0xe402,		0x018b,
1123 		0xe401,		0x8b01,
1124 		0xd472,		(go->board_info->sensor_flags &
1125 							GO7007_SENSOR_TV) &&
1126 						(!go->interlace_coding) ?
1127 					0x01b0 : 0x0170,
1128 		0xd475,		(go->board_info->sensor_flags &
1129 							GO7007_SENSOR_TV) &&
1130 						(!go->interlace_coding) ?
1131 					0x0008 : 0x0009,
1132 		0xc404,		go->interlace_coding ? 0x44 :
1133 				(go->format == GO7007_FORMAT_MPEG4 ? 0x11 :
1134 				(go->format == GO7007_FORMAT_MPEG1 ? 0x02 :
1135 				(go->format == GO7007_FORMAT_MPEG2 ? 0x04 :
1136 				(go->format == GO7007_FORMAT_H263  ? 0x08 :
1137 								     0x20)))),
1138 		0xbf0a,		(go->format == GO7007_FORMAT_MPEG4 ? 8 :
1139 				(go->format == GO7007_FORMAT_MPEG1 ? 1 :
1140 				(go->format == GO7007_FORMAT_MPEG2 ? 2 :
1141 				(go->format == GO7007_FORMAT_H263 ? 4 : 16)))) |
1142 				((go->repeat_seqhead ? 1 : 0) << 6) |
1143 				((go->dvd_mode ? 1 : 0) << 9) |
1144 				((go->gop_header_enable ? 1 : 0) << 10),
1145 		0xbf0b,		0,
1146 		0xdd5a,		go->ipb ? 0x14 : 0x0a,
1147 		0xbf0c,		0,
1148 		0xbf0d,		0,
1149 		0xc683,		THACCoeffSet0,
1150 		0xc40a,		(go->width << 4) | rows,
1151 		0xe01a,		go->board_info->hpi_buffer_cap,
1152 		0,		0,
1153 		0,		0,
1154 
1155 		0x2008,		0,
1156 		0xe402,		0x88,
1157 		0xe401,		0x8f01,
1158 		0xbf6a,		0,
1159 		0xbf6b,		0,
1160 		0xbf6c,		0,
1161 		0xbf6d,		0,
1162 		0xbf6e,		0,
1163 		0xbf6f,		0,
1164 		0,		0,
1165 		0,		0,
1166 		0,		0,
1167 		0,		0,
1168 		0,		0,
1169 		0,		0,
1170 		0,		0,
1171 
1172 		0x200e,		0,
1173 		0xbf66,		brc_window_size,
1174 		0xbf67,		0,
1175 		0xbf68,		q_min,
1176 		0xbf69,		q_max,
1177 		0xbfe0,		0,
1178 		0xbfe1,		0,
1179 		0xbfe2,		0,
1180 		0xbfe3,		go->ipb ? 3 : 1,
1181 		0xc031,		go->board_info->sensor_flags &
1182 					GO7007_SENSOR_VBI ? 1 : 0,
1183 		0xc01c,		0x1f,
1184 		0xdd8c,		0x15,
1185 		0xdd94,		0x15,
1186 		0xdd88,		go->ipb ? 0x1401 : 0x0a01,
1187 		0xdd90,		go->ipb ? 0x1401 : 0x0a01,
1188 		0,		0,
1189 
1190 		0x200e,		0,
1191 		0xbfe4,		0,
1192 		0xbfe5,		0,
1193 		0xbfe6,		0,
1194 		0xbfe7,		fps << 8,
1195 		0xbfe8,		0x3a00,
1196 		0xbfe9,		0,
1197 		0xbfea,		0,
1198 		0xbfeb,		0,
1199 		0xbfec,		(go->interlace_coding ? 1 << 15 : 0) |
1200 					(go->modet_enable ? 0xa : 0) |
1201 					(go->board_info->sensor_flags &
1202 						GO7007_SENSOR_VBI ? 1 : 0),
1203 		0xbfed,		0,
1204 		0xbfee,		0,
1205 		0xbfef,		0,
1206 		0xbff0,		go->board_info->sensor_flags &
1207 					GO7007_SENSOR_TV ? 0xf060 : 0xb060,
1208 		0xbff1,		0,
1209 		0,		0,
1210 	};
1211 
1212 	return copy_packages(code, pack, 5, space);
1213 }
1214 
seqhead_to_package(struct go7007 * go,__le16 * code,int space,int (* sequence_header_func)(struct go7007 * go,unsigned char * buf,int ext))1215 static int seqhead_to_package(struct go7007 *go, __le16 *code, int space,
1216 	int (*sequence_header_func)(struct go7007 *go,
1217 		unsigned char *buf, int ext))
1218 {
1219 	int vop_time_increment_bitlength = vti_bitlen(go);
1220 	int fps = go->sensor_framerate / go->fps_scale *
1221 					(go->interlace_coding ? 2 : 1);
1222 	unsigned char buf[40] = { };
1223 	int len = sequence_header_func(go, buf, 1);
1224 	u16 pack[] = {
1225 		0x2006,		0,
1226 		0xbf08,		fps,
1227 		0xbf09,		0,
1228 		0xbff2,		vop_time_increment_bitlength,
1229 		0xbff3,		(1 << vop_time_increment_bitlength) - 1,
1230 		0xbfe6,		0,
1231 		0xbfe7,		(fps / 1000) << 8,
1232 		0,		0,
1233 		0,		0,
1234 		0,		0,
1235 		0,		0,
1236 		0,		0,
1237 		0,		0,
1238 		0,		0,
1239 		0,		0,
1240 		0,		0,
1241 
1242 		0x2007,		0,
1243 		0xc800,		buf[2] << 8 | buf[3],
1244 		0xc801,		buf[4] << 8 | buf[5],
1245 		0xc802,		buf[6] << 8 | buf[7],
1246 		0xc803,		buf[8] << 8 | buf[9],
1247 		0xc406,		64,
1248 		0xc407,		len - 64,
1249 		0xc61b,		1,
1250 		0,		0,
1251 		0,		0,
1252 		0,		0,
1253 		0,		0,
1254 		0,		0,
1255 		0,		0,
1256 		0,		0,
1257 		0,		0,
1258 
1259 		0x200e,		0,
1260 		0xc808,		buf[10] << 8 | buf[11],
1261 		0xc809,		buf[12] << 8 | buf[13],
1262 		0xc80a,		buf[14] << 8 | buf[15],
1263 		0xc80b,		buf[16] << 8 | buf[17],
1264 		0xc80c,		buf[18] << 8 | buf[19],
1265 		0xc80d,		buf[20] << 8 | buf[21],
1266 		0xc80e,		buf[22] << 8 | buf[23],
1267 		0xc80f,		buf[24] << 8 | buf[25],
1268 		0xc810,		buf[26] << 8 | buf[27],
1269 		0xc811,		buf[28] << 8 | buf[29],
1270 		0xc812,		buf[30] << 8 | buf[31],
1271 		0xc813,		buf[32] << 8 | buf[33],
1272 		0xc814,		buf[34] << 8 | buf[35],
1273 		0xc815,		buf[36] << 8 | buf[37],
1274 		0,		0,
1275 		0,		0,
1276 		0,		0,
1277 	};
1278 
1279 	return copy_packages(code, pack, 3, space);
1280 }
1281 
relative_prime(int big,int little)1282 static int relative_prime(int big, int little)
1283 {
1284 	int remainder;
1285 
1286 	while (little != 0) {
1287 		remainder = big % little;
1288 		big = little;
1289 		little = remainder;
1290 	}
1291 	return big;
1292 }
1293 
avsync_to_package(struct go7007 * go,__le16 * code,int space)1294 static int avsync_to_package(struct go7007 *go, __le16 *code, int space)
1295 {
1296 	int arate = go->board_info->audio_rate * 1001 * go->fps_scale;
1297 	int ratio = arate / go->sensor_framerate;
1298 	int adjratio = ratio * 215 / 100;
1299 	int rprime = relative_prime(go->sensor_framerate,
1300 					arate % go->sensor_framerate);
1301 	int f1 = (arate % go->sensor_framerate) / rprime;
1302 	int f2 = (go->sensor_framerate - arate % go->sensor_framerate) / rprime;
1303 	u16 pack[] = {
1304 		0x200e,		0,
1305 		0xbf98,		(u16)((-adjratio) & 0xffff),
1306 		0xbf99,		(u16)((-adjratio) >> 16),
1307 		0xbf92,		0,
1308 		0xbf93,		0,
1309 		0xbff4,		f1 > f2 ? f1 : f2,
1310 		0xbff5,		f1 < f2 ? f1 : f2,
1311 		0xbff6,		f1 < f2 ? ratio : ratio + 1,
1312 		0xbff7,		f1 > f2 ? ratio : ratio + 1,
1313 		0xbff8,		0,
1314 		0xbff9,		0,
1315 		0xbffa,		adjratio & 0xffff,
1316 		0xbffb,		adjratio >> 16,
1317 		0xbf94,		0,
1318 		0xbf95,		0,
1319 		0,		0,
1320 	};
1321 
1322 	return copy_packages(code, pack, 1, space);
1323 }
1324 
final_package(struct go7007 * go,__le16 * code,int space)1325 static int final_package(struct go7007 *go, __le16 *code, int space)
1326 {
1327 	int rows = go->interlace_coding ? go->height / 32 : go->height / 16;
1328 	u16 pack[] = {
1329 		0x8000,
1330 		0,
1331 		0,
1332 		0,
1333 		0,
1334 		0,
1335 		0,
1336 		2,
1337 		((go->board_info->sensor_flags & GO7007_SENSOR_TV) &&
1338 						(!go->interlace_coding) ?
1339 					(1 << 14) | (1 << 9) : 0) |
1340 			((go->encoder_subsample ? 1 : 0) << 8) |
1341 			(go->board_info->sensor_flags &
1342 				GO7007_SENSOR_CONFIG_MASK),
1343 		((go->encoder_v_halve ? 1 : 0) << 14) |
1344 			(go->encoder_v_halve ? rows << 9 : rows << 8) |
1345 			(go->encoder_h_halve ? 1 << 6 : 0) |
1346 			(go->encoder_h_halve ? go->width >> 3 : go->width >> 4),
1347 		(1 << 15) | (go->encoder_v_offset << 6) |
1348 			(1 << 7) | (go->encoder_h_offset >> 2),
1349 		(1 << 6),
1350 		0,
1351 		0,
1352 		((go->fps_scale - 1) << 8) |
1353 			(go->board_info->sensor_flags & GO7007_SENSOR_TV ?
1354 						(1 << 7) : 0) |
1355 			0x41,
1356 		go->ipb ? 0xd4c : 0x36b,
1357 		(rows << 8) | (go->width >> 4),
1358 		go->format == GO7007_FORMAT_MPEG4 ? 0x0404 : 0,
1359 		(1 << 15) | ((go->interlace_coding ? 1 : 0) << 13) |
1360 			((go->closed_gop ? 1 : 0) << 12) |
1361 			((go->format == GO7007_FORMAT_MPEG4 ? 1 : 0) << 11) |
1362 		/*	(1 << 9) |   */
1363 			((go->ipb ? 3 : 0) << 7) |
1364 			((go->modet_enable ? 1 : 0) << 2) |
1365 			((go->dvd_mode ? 1 : 0) << 1) | 1,
1366 		(go->format == GO7007_FORMAT_MPEG1 ? 0x89a0 :
1367 			(go->format == GO7007_FORMAT_MPEG2 ? 0x89a0 :
1368 			(go->format == GO7007_FORMAT_MJPEG ? 0x89a0 :
1369 			(go->format == GO7007_FORMAT_MPEG4 ? 0x8920 :
1370 			(go->format == GO7007_FORMAT_H263 ? 0x8920 : 0))))),
1371 		go->ipb ? 0x1f15 : 0x1f0b,
1372 		go->ipb ? 0x0015 : 0x000b,
1373 		go->ipb ? 0xa800 : 0x5800,
1374 		0xffff,
1375 		0x0020 + 0x034b * 0,
1376 		0x0020 + 0x034b * 1,
1377 		0x0020 + 0x034b * 2,
1378 		0x0020 + 0x034b * 3,
1379 		0x0020 + 0x034b * 4,
1380 		0x0020 + 0x034b * 5,
1381 		go->ipb ? (go->gop_size / 3) : go->gop_size,
1382 		(go->height >> 4) * (go->width >> 4) * 110 / 100,
1383 	};
1384 
1385 	return copy_packages(code, pack, 1, space);
1386 }
1387 
audio_to_package(struct go7007 * go,__le16 * code,int space)1388 static int audio_to_package(struct go7007 *go, __le16 *code, int space)
1389 {
1390 	int clock_config = ((go->board_info->audio_flags &
1391 				GO7007_AUDIO_I2S_MASTER ? 1 : 0) << 11) |
1392 			((go->board_info->audio_flags &
1393 				GO7007_AUDIO_OKI_MODE ? 1 : 0) << 8) |
1394 			(((go->board_info->audio_bclk_div / 4) - 1) << 4) |
1395 			(go->board_info->audio_main_div - 1);
1396 	u16 pack[] = {
1397 		0x200d,		0,
1398 		0x9002,		0,
1399 		0x9002,		0,
1400 		0x9031,		0,
1401 		0x9032,		0,
1402 		0x9033,		0,
1403 		0x9034,		0,
1404 		0x9035,		0,
1405 		0x9036,		0,
1406 		0x9037,		0,
1407 		0x9040,		0,
1408 		0x9000,		clock_config,
1409 		0x9001,		(go->board_info->audio_flags & 0xffff) |
1410 					(1 << 9),
1411 		0x9000,		((go->board_info->audio_flags &
1412 						GO7007_AUDIO_I2S_MASTER ?
1413 						1 : 0) << 10) |
1414 					clock_config,
1415 		0,		0,
1416 		0,		0,
1417 		0x2005,		0,
1418 		0x9041,		0,
1419 		0x9042,		256,
1420 		0x9043,		0,
1421 		0x9044,		16,
1422 		0x9045,		16,
1423 		0,		0,
1424 		0,		0,
1425 		0,		0,
1426 		0,		0,
1427 		0,		0,
1428 		0,		0,
1429 		0,		0,
1430 		0,		0,
1431 		0,		0,
1432 		0,		0,
1433 	};
1434 
1435 	return copy_packages(code, pack, 2, space);
1436 }
1437 
modet_to_package(struct go7007 * go,__le16 * code,int space)1438 static int modet_to_package(struct go7007 *go, __le16 *code, int space)
1439 {
1440 	int ret, mb, i, addr, cnt = 0;
1441 	u16 pack[32];
1442 	u16 thresholds[] = {
1443 		0x200e,		0,
1444 		0xbf82,		go->modet[0].pixel_threshold,
1445 		0xbf83,		go->modet[1].pixel_threshold,
1446 		0xbf84,		go->modet[2].pixel_threshold,
1447 		0xbf85,		go->modet[3].pixel_threshold,
1448 		0xbf86,		go->modet[0].motion_threshold,
1449 		0xbf87,		go->modet[1].motion_threshold,
1450 		0xbf88,		go->modet[2].motion_threshold,
1451 		0xbf89,		go->modet[3].motion_threshold,
1452 		0xbf8a,		go->modet[0].mb_threshold,
1453 		0xbf8b,		go->modet[1].mb_threshold,
1454 		0xbf8c,		go->modet[2].mb_threshold,
1455 		0xbf8d,		go->modet[3].mb_threshold,
1456 		0xbf8e,		0,
1457 		0xbf8f,		0,
1458 		0,		0,
1459 	};
1460 
1461 	ret = copy_packages(code, thresholds, 1, space);
1462 	if (ret < 0)
1463 		return -1;
1464 	cnt += ret;
1465 
1466 	addr = 0xbac0;
1467 	memset(pack, 0, 64);
1468 	i = 0;
1469 	for (mb = 0; mb < 1624; ++mb) {
1470 		pack[i * 2 + 3] <<= 2;
1471 		pack[i * 2 + 3] |= go->modet_map[mb];
1472 		if (mb % 8 != 7)
1473 			continue;
1474 		pack[i * 2 + 2] = addr++;
1475 		++i;
1476 		if (i == 10 || mb == 1623) {
1477 			pack[0] = 0x2000 | i;
1478 			ret = copy_packages(code + cnt, pack, 1, space - cnt);
1479 			if (ret < 0)
1480 				return -1;
1481 			cnt += ret;
1482 			i = 0;
1483 			memset(pack, 0, 64);
1484 		}
1485 		pack[i * 2 + 3] = 0;
1486 	}
1487 
1488 	memset(pack, 0, 64);
1489 	i = 0;
1490 	for (addr = 0xbb90; addr < 0xbbfa; ++addr) {
1491 		pack[i * 2 + 2] = addr;
1492 		pack[i * 2 + 3] = 0;
1493 		++i;
1494 		if (i == 10 || addr == 0xbbf9) {
1495 			pack[0] = 0x2000 | i;
1496 			ret = copy_packages(code + cnt, pack, 1, space - cnt);
1497 			if (ret < 0)
1498 				return -1;
1499 			cnt += ret;
1500 			i = 0;
1501 			memset(pack, 0, 64);
1502 		}
1503 	}
1504 	return cnt;
1505 }
1506 
do_special(struct go7007 * go,u16 type,__le16 * code,int space,int * framelen)1507 static int do_special(struct go7007 *go, u16 type, __le16 *code, int space,
1508 			int *framelen)
1509 {
1510 	switch (type) {
1511 	case SPECIAL_FRM_HEAD:
1512 		switch (go->format) {
1513 		case GO7007_FORMAT_MJPEG:
1514 			return gen_mjpeghdr_to_package(go, code, space);
1515 		case GO7007_FORMAT_MPEG1:
1516 		case GO7007_FORMAT_MPEG2:
1517 			return gen_mpeg1hdr_to_package(go, code, space,
1518 								framelen);
1519 		case GO7007_FORMAT_MPEG4:
1520 			return gen_mpeg4hdr_to_package(go, code, space,
1521 								framelen);
1522 		}
1523 	case SPECIAL_BRC_CTRL:
1524 		return brctrl_to_package(go, code, space, framelen);
1525 	case SPECIAL_CONFIG:
1526 		return config_package(go, code, space);
1527 	case SPECIAL_SEQHEAD:
1528 		switch (go->format) {
1529 		case GO7007_FORMAT_MPEG1:
1530 		case GO7007_FORMAT_MPEG2:
1531 			return seqhead_to_package(go, code, space,
1532 					mpeg1_sequence_header);
1533 		case GO7007_FORMAT_MPEG4:
1534 			return seqhead_to_package(go, code, space,
1535 					mpeg4_sequence_header);
1536 		default:
1537 			return 0;
1538 		}
1539 	case SPECIAL_AV_SYNC:
1540 		return avsync_to_package(go, code, space);
1541 	case SPECIAL_FINAL:
1542 		return final_package(go, code, space);
1543 	case SPECIAL_AUDIO:
1544 		return audio_to_package(go, code, space);
1545 	case SPECIAL_MODET:
1546 		return modet_to_package(go, code, space);
1547 	}
1548 	printk(KERN_ERR
1549 		"go7007: firmware file contains unsupported feature %04x\n",
1550 		type);
1551 	return -1;
1552 }
1553 
go7007_construct_fw_image(struct go7007 * go,u8 ** fw,int * fwlen)1554 int go7007_construct_fw_image(struct go7007 *go, u8 **fw, int *fwlen)
1555 {
1556 	const struct firmware *fw_entry;
1557 	__le16 *code, *src;
1558 	int framelen[8] = { }; /* holds the lengths of empty frame templates */
1559 	int codespace = 64 * 1024, i = 0, srclen, chunk_len, chunk_flags;
1560 	int mode_flag;
1561 	int ret;
1562 
1563 	switch (go->format) {
1564 	case GO7007_FORMAT_MJPEG:
1565 		mode_flag = FLAG_MODE_MJPEG;
1566 		break;
1567 	case GO7007_FORMAT_MPEG1:
1568 		mode_flag = FLAG_MODE_MPEG1;
1569 		break;
1570 	case GO7007_FORMAT_MPEG2:
1571 		mode_flag = FLAG_MODE_MPEG2;
1572 		break;
1573 	case GO7007_FORMAT_MPEG4:
1574 		mode_flag = FLAG_MODE_MPEG4;
1575 		break;
1576 	default:
1577 		return -1;
1578 	}
1579 	if (request_firmware(&fw_entry, go->board_info->firmware, go->dev)) {
1580 		printk(KERN_ERR
1581 			"go7007: unable to load firmware from file \"%s\"\n",
1582 			go->board_info->firmware);
1583 		return -1;
1584 	}
1585 	code = kzalloc(codespace * 2, GFP_KERNEL);
1586 	if (code == NULL) {
1587 		printk(KERN_ERR "go7007: unable to allocate %d bytes for "
1588 				"firmware construction\n", codespace * 2);
1589 		goto fw_failed;
1590 	}
1591 	src = (__le16 *)fw_entry->data;
1592 	srclen = fw_entry->size / 2;
1593 	while (srclen >= 2) {
1594 		chunk_flags = __le16_to_cpu(src[0]);
1595 		chunk_len = __le16_to_cpu(src[1]);
1596 		if (chunk_len + 2 > srclen) {
1597 			printk(KERN_ERR "go7007: firmware file \"%s\" "
1598 					"appears to be corrupted\n",
1599 					go->board_info->firmware);
1600 			goto fw_failed;
1601 		}
1602 		if (chunk_flags & mode_flag) {
1603 			if (chunk_flags & FLAG_SPECIAL) {
1604 				ret = do_special(go, __le16_to_cpu(src[2]),
1605 					&code[i], codespace - i, framelen);
1606 				if (ret < 0) {
1607 					printk(KERN_ERR "go7007: insufficient "
1608 							"memory for firmware "
1609 							"construction\n");
1610 					goto fw_failed;
1611 				}
1612 				i += ret;
1613 			} else {
1614 				if (codespace - i < chunk_len) {
1615 					printk(KERN_ERR "go7007: insufficient "
1616 							"memory for firmware "
1617 							"construction\n");
1618 					goto fw_failed;
1619 				}
1620 				memcpy(&code[i], &src[2], chunk_len * 2);
1621 				i += chunk_len;
1622 			}
1623 		}
1624 		srclen -= chunk_len + 2;
1625 		src += chunk_len + 2;
1626 	}
1627 	release_firmware(fw_entry);
1628 	*fw = (u8 *)code;
1629 	*fwlen = i * 2;
1630 	return 0;
1631 
1632 fw_failed:
1633 	kfree(code);
1634 	release_firmware(fw_entry);
1635 	return -1;
1636 }
1637