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 7bf7485377e6..b9a30c30e2b8 100644
--- a/drivers/char/dsp56k.c
+++ b/drivers/char/dsp56k.c
@@ -34,6 +34,8 @@
34#include <linux/init.h> 34#include <linux/init.h>
35#include <linux/device.h> 35#include <linux/device.h>
36#include <linux/smp_lock.h> 36#include <linux/smp_lock.h>
37#include <linux/firmware.h>
38#include <linux/platform_device.h>
37 39
38#include <asm/atarihw.h> 40#include <asm/atarihw.h>
39#include <asm/traps.h> 41#include <asm/traps.h>
@@ -93,49 +95,6 @@
93 } \ 95 } \
94} 96}
95 97
96/* DSP56001 bootstrap code */
97static char bootstrap[] = {
98 0x0c, 0x00, 0x40, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117 0x00, 0x00, 0x60, 0xf4, 0x00, 0x00, 0x00, 0x4f, 0x61, 0xf4,
118 0x00, 0x00, 0x7e, 0xa9, 0x06, 0x2e, 0x80, 0x00, 0x00, 0x47,
119 0x07, 0xd8, 0x84, 0x07, 0x59, 0x84, 0x08, 0xf4, 0xa8, 0x00,
120 0x00, 0x04, 0x08, 0xf4, 0xbf, 0x00, 0x0c, 0x00, 0x00, 0xfe,
121 0xb8, 0x0a, 0xf0, 0x80, 0x00, 0x7e, 0xa9, 0x08, 0xf4, 0xa0,
122 0x00, 0x00, 0x01, 0x08, 0xf4, 0xbe, 0x00, 0x00, 0x00, 0x0a,
123 0xa9, 0x80, 0x00, 0x7e, 0xad, 0x08, 0x4e, 0x2b, 0x44, 0xf4,
124 0x00, 0x00, 0x00, 0x03, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x01,
125 0x0e, 0xa0, 0x00, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb5, 0x08,
126 0x50, 0x2b, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb8, 0x08, 0x46,
127 0x2b, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x02, 0x0a, 0xf0, 0xaa,
128 0x00, 0x7e, 0xc9, 0x20, 0x00, 0x45, 0x0a, 0xf0, 0xaa, 0x00,
129 0x7e, 0xd0, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xc6, 0x0a, 0xa9,
130 0x80, 0x00, 0x7e, 0xc4, 0x08, 0x58, 0x6b, 0x0a, 0xf0, 0x80,
131 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xcd, 0x0a,
132 0xa9, 0x80, 0x00, 0x7e, 0xcb, 0x08, 0x58, 0xab, 0x0a, 0xf0,
133 0x80, 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xd4,
134 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xd2, 0x08, 0x58, 0xeb, 0x0a,
135 0xf0, 0x80, 0x00, 0x7e, 0xad};
136static int sizeof_bootstrap = 375;
137
138
139static struct dsp56k_device { 98static struct dsp56k_device {
140 unsigned long in_use; 99 unsigned long in_use;
141 long maxio, timeout; 100 long maxio, timeout;
@@ -165,18 +124,40 @@ static int dsp56k_reset(void)
165 124
166static int dsp56k_upload(u_char __user *bin, int len) 125static int dsp56k_upload(u_char __user *bin, int len)
167{ 126{
127 struct platform_device *pdev;
128 const struct firmware *fw;
129 const char fw_name[] = "dsp56k/bootstrap.bin";
130 int err;
168 int i; 131 int i;
169 u_char *p; 132
170
171 dsp56k_reset(); 133 dsp56k_reset();
172 134
173 p = bootstrap; 135 pdev = platform_device_register_simple("dsp56k", 0, NULL, 0);
174 for (i = 0; i < sizeof_bootstrap/3; i++) { 136 if (IS_ERR(pdev)) {
137 printk(KERN_ERR "Failed to register device for \"%s\"\n",
138 fw_name);
139 return -EINVAL;
140 }
141 err = request_firmware(&fw, fw_name, &pdev->dev);
142 platform_device_unregister(pdev);
143 if (err) {
144 printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
145 fw_name, err);
146 return err;
147 }
148 if (fw->size % 3) {
149 printk(KERN_ERR "Bogus length %d in image \"%s\"\n",
150 fw->size, fw_name);
151 release_firmware(fw);
152 return -EINVAL;
153 }
154 for (i = 0; i < fw->size; i = i + 3) {
175 /* tx_wait(10); */ 155 /* tx_wait(10); */
176 dsp56k_host_interface.data.b[1] = *p++; 156 dsp56k_host_interface.data.b[1] = fw->data[i];
177 dsp56k_host_interface.data.b[2] = *p++; 157 dsp56k_host_interface.data.b[2] = fw->data[i + 1];
178 dsp56k_host_interface.data.b[3] = *p++; 158 dsp56k_host_interface.data.b[3] = fw->data[i + 2];
179 } 159 }
160 release_firmware(fw);
180 for (; i < 512; i++) { 161 for (; i < 512; i++) {
181 /* tx_wait(10); */ 162 /* tx_wait(10); */
182 dsp56k_host_interface.data.b[1] = 0; 163 dsp56k_host_interface.data.b[1] = 0;
@@ -540,3 +521,4 @@ static void __exit dsp56k_cleanup_driver(void)
540module_exit(dsp56k_cleanup_driver); 521module_exit(dsp56k_cleanup_driver);
541 522
542MODULE_LICENSE("GPL"); 523MODULE_LICENSE("GPL");
524MODULE_FIRMWARE("dsp56k/bootstrap.bin");