aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaswinder Singh <jaswinder@infradead.org>2009-04-06 17:34:12 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2009-04-06 17:34:12 -0400
commit9137f05f7e72517d44b6b0c15b11b419ecb5d201 (patch)
tree63e1589e6dcf0a83d45e95420fd942c8821a7ae8
parent4528e429009325790d94cd4f816b386bea8e8291 (diff)
firmware: convert av7110 driver to request_firmware()
Signed-off-by: Jaswinder Singh <jaswinder@infradead.org> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r--drivers/media/dvb/ttpci/av7110_hw.c35
-rw-r--r--drivers/media/dvb/ttpci/av7110_hw.h3
-rw-r--r--firmware/Makefile1
-rw-r--r--firmware/WHENCE10
-rw-r--r--firmware/av7110/Boot.S109
-rw-r--r--firmware/av7110/bootcode.bin.ihex15
6 files changed, 149 insertions, 24 deletions
diff --git a/drivers/media/dvb/ttpci/av7110_hw.c b/drivers/media/dvb/ttpci/av7110_hw.c
index 3a3f5279e927..5e3f88911a1d 100644
--- a/drivers/media/dvb/ttpci/av7110_hw.c
+++ b/drivers/media/dvb/ttpci/av7110_hw.c
@@ -198,29 +198,10 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len)
198 198
199/* we cannot write av7110 DRAM directly, so load a bootloader into 199/* we cannot write av7110 DRAM directly, so load a bootloader into
200 * the DPRAM which implements a simple boot protocol */ 200 * the DPRAM which implements a simple boot protocol */
201static u8 bootcode[] = {
202 0xea, 0x00, 0x00, 0x0e, 0xe1, 0xb0, 0xf0, 0x0e, 0xe2, 0x5e, 0xf0, 0x04,
203 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x08, 0xe2, 0x5e, 0xf0, 0x04,
204 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04, 0x2c, 0x00, 0x00, 0x24,
205 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x34,
206 0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0x5a, 0x5a, 0x00, 0x1f, 0x15, 0x55,
207 0x00, 0x00, 0x00, 0x09, 0xe5, 0x9f, 0xd0, 0x7c, 0xe5, 0x9f, 0x40, 0x74,
208 0xe3, 0xa0, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x04,
209 0xe5, 0x9f, 0x10, 0x70, 0xe5, 0x9f, 0x20, 0x70, 0xe5, 0x9f, 0x30, 0x64,
210 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, 0xe1, 0x51, 0x00, 0x02,
211 0xda, 0xff, 0xff, 0xfb, 0xe5, 0x9f, 0xf0, 0x50, 0xe1, 0xd4, 0x10, 0xb0,
212 0xe3, 0x51, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xfc, 0xe1, 0xa0, 0x10, 0x0d,
213 0xe5, 0x94, 0x30, 0x04, 0xe1, 0xd4, 0x20, 0xb2, 0xe2, 0x82, 0x20, 0x3f,
214 0xe1, 0xb0, 0x23, 0x22, 0x03, 0xa0, 0x00, 0x02, 0xe1, 0xc4, 0x00, 0xb0,
215 0x0a, 0xff, 0xff, 0xf4, 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0,
216 0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, 0xe2, 0x52, 0x20, 0x01,
217 0x1a, 0xff, 0xff, 0xf9, 0xe2, 0x2d, 0xdb, 0x05, 0xea, 0xff, 0xff, 0xec,
218 0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00, 0x9e, 0x00, 0x08, 0x00,
219 0x2c, 0x00, 0x00, 0x74, 0x2c, 0x00, 0x00, 0xc0
220};
221
222int av7110_bootarm(struct av7110 *av7110) 201int av7110_bootarm(struct av7110 *av7110)
223{ 202{
203 const struct firmware *fw;
204 const char *fw_name = "av7110/bootcode.bin";
224 struct saa7146_dev *dev = av7110->dev; 205 struct saa7146_dev *dev = av7110->dev;
225 u32 ret; 206 u32 ret;
226 int i; 207 int i;
@@ -261,7 +242,15 @@ int av7110_bootarm(struct av7110 *av7110)
261 //saa7146_setgpio(dev, DEBI_DONE_LINE, SAA7146_GPIO_INPUT); 242 //saa7146_setgpio(dev, DEBI_DONE_LINE, SAA7146_GPIO_INPUT);
262 //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT); 243 //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT);
263 244
264 mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode)); 245 ret = request_firmware(&fw, fw_name, &dev->pci->dev);
246 if (ret) {
247 printk(KERN_ERR "dvb-ttpci: Failed to load firmware \"%s\"\n",
248 fw_name);
249 return ret;
250 }
251
252 mwdebi(av7110, DEBISWAB, DPRAM_BASE, fw->data, fw->size);
253 release_firmware(fw);
265 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); 254 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
266 255
267 if (saa7146_wait_for_debi_done(av7110->dev, 1)) { 256 if (saa7146_wait_for_debi_done(av7110->dev, 1)) {
@@ -302,7 +291,7 @@ int av7110_bootarm(struct av7110 *av7110)
302 av7110->arm_ready = 1; 291 av7110->arm_ready = 1;
303 return 0; 292 return 0;
304} 293}
305 294MODULE_FIRMWARE("av7110/bootcode.bin");
306 295
307/**************************************************************************** 296/****************************************************************************
308 * DEBI command polling 297 * DEBI command polling
diff --git a/drivers/media/dvb/ttpci/av7110_hw.h b/drivers/media/dvb/ttpci/av7110_hw.h
index ca99e5c1fc8a..1634aba5cb84 100644
--- a/drivers/media/dvb/ttpci/av7110_hw.h
+++ b/drivers/media/dvb/ttpci/av7110_hw.h
@@ -390,7 +390,8 @@ static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val,
390} 390}
391 391
392/* buffer writes */ 392/* buffer writes */
393static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, u8 *val, int count) 393static inline void mwdebi(struct av7110 *av7110, u32 config, int addr,
394 const u8 *val, int count)
394{ 395{
395 memcpy(av7110->debi_virt, val, count); 396 memcpy(av7110->debi_virt, val, count);
396 av7110_debiwrite(av7110, config, addr, 0, count); 397 av7110_debiwrite(av7110, config, addr, 0, count);
diff --git a/firmware/Makefile b/firmware/Makefile
index 95fb42c2285a..4267f68164b5 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -37,6 +37,7 @@ fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin
37fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \ 37fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \
38 cxgb3/t3c_psram-1.1.0.bin \ 38 cxgb3/t3c_psram-1.1.0.bin \
39 cxgb3/t3fw-7.1.0.bin 39 cxgb3/t3fw-7.1.0.bin
40fw-shipped-$(CONFIG_DVB_AV7110) += av7110/bootcode.bin
40fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin 41fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin
41fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \ 42fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \
42 e100/d102e_ucode.bin 43 e100/d102e_ucode.bin
diff --git a/firmware/WHENCE b/firmware/WHENCE
index c006af85a1aa..c0a7c8f20c0e 100644
--- a/firmware/WHENCE
+++ b/firmware/WHENCE
@@ -632,3 +632,13 @@ Licence: Unknown
632Found in hex form in kernel source. 632Found in hex form in kernel source.
633 633
634-------------------------------------------------------------------------- 634--------------------------------------------------------------------------
635
636Driver: DVB AV7110 -- AV7110 cards
637
638File: av7110/bootcode.bin
639
640Licence: GPLv2 or later
641
642ARM assembly source code available at http://www.linuxtv.org/downloads/firmware/Boot.S
643
644--------------------------------------------------------------------------
diff --git a/firmware/av7110/Boot.S b/firmware/av7110/Boot.S
new file mode 100644
index 000000000000..d562fdc2908f
--- /dev/null
+++ b/firmware/av7110/Boot.S
@@ -0,0 +1,109 @@
1/*
2 Boot.S: boot loader for Siemens DVB-S card
3
4 Copyright (C) 2001 Convergence integrated media GmbH
5 Written by Ralph Metzler
6 <rjkm@convergence.de>
7 Copyright (C) 2006 Matthieu CASTET <castet.mattheiu@free.fr>
8
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2
12 of the License, or (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
22
23*/
24
25/*
26 check AV711x_3_1.pdf for some hardware infos
27 build it with :
28 $ cc -mbig-endian -c Boot.S
29 $ ld -Ttext 0x2c000000 -EB -o Boot Boot.o
30 $ objcopy -Obinary Boot
31*/
32
33 .text
34 .align
35 .globl _start
36_start:
37 b reset // reset vector
38 movs pc, r14 // undefined
39 subs pc, r14, #4 // SWI
40 subs pc, r14, #4 // prefetch abort
41 subs pc, r14, #8 // data abort
42 subs pc, r14, #4 // reserved
43 subs pc, r14, #4 // IRQ
44 subs pc, r14, #4 // FIQ
45
46 .word tbl // table needed by firmware ROM
47tbl: .word (endtbl - tbl)
48 .word 0
49 .word conf
50endtbl: .word 0
51conf: .word 0xa5a55a5a
52 .word 0x001f1555
53 .word 0x00000009
54
55reset: ldr r13, buffer
56 ldr r4, flag
57 mov r0, #0
58 str r0, [r4]
59 str r0, [r4, #4]
60
61 ldr r1, wait_address
62 ldr r2, flag_address
63 ldr r3, sram
64
65copycode: // copy the code HW Sram
66 ldmia r1!, {r5-r12}
67 stmia r3!, {r5-r12}
68 cmp r1, r2
69 ble copycode
70 ldr pc, sram // jump to the copied code
71
72wait: ldrh r1, [r4] // wait for flag!=0
73 cmp r1, #0
74 beq wait
75
76 mov r1, r13 // buffer address
77 ldr r3, [r4,#4] // destaddr
78
79 ldrh r2, [r4,#2] // get segment length
80 add r2, r2, #63 // round length to next 64 bytes
81 movs r2, r2, lsr #6 // and divide by 64
82 moveq r0, #2 // if 0, set flag to 2, else signal
83 strh r0, [r4] // that buffer is accepted by setting to 0
84 beq wait
85
86copyloop:
87 ldmia r1!, {r5-r12}
88 stmia r3!, {r5-r12}
89 ldmia r1!, {r5-r12}
90 stmia r3!, {r5-r12}
91 subs r2, r2, #1
92 bne copyloop
93
94 eor r13, r13, #0x1400 // switch to other buffer
95 b wait
96
97// flag is stored at 0x2c0003f8, length at 0x2c0003fa,
98// destaddr at 0x2c0003fc
99
100flag: .word 0x2c0003f8
101
102
103// buffer 1 is at 0x2c000400, buffer 2 at 0x2c001000
104
105buffer: .word 0x2c000400
106
107sram: .word 0x9e000800
108wait_address: .word wait
109flag_address: .word flag
diff --git a/firmware/av7110/bootcode.bin.ihex b/firmware/av7110/bootcode.bin.ihex
new file mode 100644
index 000000000000..26a2993e0723
--- /dev/null
+++ b/firmware/av7110/bootcode.bin.ihex
@@ -0,0 +1,15 @@
1:10000000EA00000EE1B0F00EE25EF004E25EF00401
2:10001000E25EF008E25EF004E25EF004E25EF0040C
3:100020002C0000240000000C000000002C00003414
4:1000300000000000A5A55A5A001F15550000000930
5:10004000E59FD07CE59F4074E3A00000E5840000BC
6:10005000E5840004E59F1070E59F2070E59F306403
7:10006000E8B11FE0E8A31FE0E1510002DAFFFFFB67
8:10007000E59FF050E1D410B0E35100000AFFFFFC0F
9:10008000E1A0100DE5943004E1D420B2E282203FDB
10:10009000E1B0232203A00002E1C400B00AFFFFF494
11:1000A000E8B11FE0E8A31FE0E8B11FE0E8A31FE00C
12:1000B000E25220011AFFFFF9E22DDB05EAFFFFEC17
13:1000C0002C0003F82C0004009E0008002C00007493
14:0400D0002C0000C040
15:00000001FF