aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/dsp56k.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/dsp56k.c')
-rw-r--r--drivers/char/dsp56k.c84
1 files changed, 33 insertions, 51 deletions
diff --git a/drivers/char/dsp56k.c b/drivers/char/dsp56k.c
index a69c65283260..d716c78f0ff4 100644
--- a/drivers/char/dsp56k.c
+++ b/drivers/char/dsp56k.c
@@ -33,6 +33,8 @@
33#include <linux/mm.h> 33#include <linux/mm.h>
34#include <linux/init.h> 34#include <linux/init.h>
35#include <linux/device.h> 35#include <linux/device.h>
36#include <linux/firmware.h>
37#include <linux/platform_device.h>
36 38
37#include <asm/atarihw.h> 39#include <asm/atarihw.h>
38#include <asm/traps.h> 40#include <asm/traps.h>
@@ -92,49 +94,6 @@
92 } \ 94 } \
93} 95}
94 96
95/* DSP56001 bootstrap code */
96static char bootstrap[] = {
97 0x0c, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x60, 0xf4, 0x00, 0x00, 0x00, 0x4f, 0x61, 0xf4,
117 0x00, 0x00, 0x7e, 0xa9, 0x06, 0x2e, 0x80, 0x00, 0x00, 0x47,
118 0x07, 0xd8, 0x84, 0x07, 0x59, 0x84, 0x08, 0xf4, 0xa8, 0x00,
119 0x00, 0x04, 0x08, 0xf4, 0xbf, 0x00, 0x0c, 0x00, 0x00, 0xfe,
120 0xb8, 0x0a, 0xf0, 0x80, 0x00, 0x7e, 0xa9, 0x08, 0xf4, 0xa0,
121 0x00, 0x00, 0x01, 0x08, 0xf4, 0xbe, 0x00, 0x00, 0x00, 0x0a,
122 0xa9, 0x80, 0x00, 0x7e, 0xad, 0x08, 0x4e, 0x2b, 0x44, 0xf4,
123 0x00, 0x00, 0x00, 0x03, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x01,
124 0x0e, 0xa0, 0x00, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb5, 0x08,
125 0x50, 0x2b, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb8, 0x08, 0x46,
126 0x2b, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x02, 0x0a, 0xf0, 0xaa,
127 0x00, 0x7e, 0xc9, 0x20, 0x00, 0x45, 0x0a, 0xf0, 0xaa, 0x00,
128 0x7e, 0xd0, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xc6, 0x0a, 0xa9,
129 0x80, 0x00, 0x7e, 0xc4, 0x08, 0x58, 0x6b, 0x0a, 0xf0, 0x80,
130 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xcd, 0x0a,
131 0xa9, 0x80, 0x00, 0x7e, 0xcb, 0x08, 0x58, 0xab, 0x0a, 0xf0,
132 0x80, 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xd4,
133 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xd2, 0x08, 0x58, 0xeb, 0x0a,
134 0xf0, 0x80, 0x00, 0x7e, 0xad};
135static int sizeof_bootstrap = 375;
136
137
138static struct dsp56k_device { 97static struct dsp56k_device {
139 unsigned long in_use; 98 unsigned long in_use;
140 long maxio, timeout; 99 long maxio, timeout;
@@ -164,18 +123,40 @@ static int dsp56k_reset(void)
164 123
165static int dsp56k_upload(u_char __user *bin, int len) 124static int dsp56k_upload(u_char __user *bin, int len)
166{ 125{
126 struct platform_device *pdev;
127 const struct firmware *fw;
128 const char fw_name[] = "dsp56k/bootstrap.bin";
129 int err;
167 int i; 130 int i;
168 u_char *p; 131
169
170 dsp56k_reset(); 132 dsp56k_reset();
171 133
172 p = bootstrap; 134 pdev = platform_device_register_simple("dsp56k", 0, NULL, 0);
173 for (i = 0; i < sizeof_bootstrap/3; i++) { 135 if (IS_ERR(pdev)) {
136 printk(KERN_ERR "Failed to register device for \"%s\"\n",
137 fw_name);
138 return -EINVAL;
139 }
140 err = request_firmware(&fw, fw_name, &pdev->dev);
141 platform_device_unregister(pdev);
142 if (err) {
143 printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
144 fw_name, err);
145 return err;
146 }
147 if (fw->size % 3) {
148 printk(KERN_ERR "Bogus length %d in image \"%s\"\n",
149 fw->size, fw_name);
150 release_firmware(fw);
151 return -EINVAL;
152 }
153 for (i = 0; i < fw->size; i = i + 3) {
174 /* tx_wait(10); */ 154 /* tx_wait(10); */
175 dsp56k_host_interface.data.b[1] = *p++; 155 dsp56k_host_interface.data.b[1] = fw->data[i];
176 dsp56k_host_interface.data.b[2] = *p++; 156 dsp56k_host_interface.data.b[2] = fw->data[i + 1];
177 dsp56k_host_interface.data.b[3] = *p++; 157 dsp56k_host_interface.data.b[3] = fw->data[i + 2];
178 } 158 }
159 release_firmware(fw);
179 for (; i < 512; i++) { 160 for (; i < 512; i++) {
180 /* tx_wait(10); */ 161 /* tx_wait(10); */
181 dsp56k_host_interface.data.b[1] = 0; 162 dsp56k_host_interface.data.b[1] = 0;
@@ -534,3 +515,4 @@ static void __exit dsp56k_cleanup_driver(void)
534module_exit(dsp56k_cleanup_driver); 515module_exit(dsp56k_cleanup_driver);
535 516
536MODULE_LICENSE("GPL"); 517MODULE_LICENSE("GPL");
518MODULE_FIRMWARE("dsp56k/bootstrap.bin");