|
@@ -33,6 +33,8 @@
|
|
|
#include <linux/mm.h>
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/device.h>
|
|
|
+#include <linux/firmware.h>
|
|
|
+#include <linux/platform_device.h>
|
|
|
|
|
|
#include <asm/atarihw.h>
|
|
|
#include <asm/traps.h>
|
|
@@ -92,49 +94,6 @@
|
|
|
} \
|
|
|
}
|
|
|
|
|
|
-/* DSP56001 bootstrap code */
|
|
|
-static char bootstrap[] = {
|
|
|
- 0x0c, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x60, 0xf4, 0x00, 0x00, 0x00, 0x4f, 0x61, 0xf4,
|
|
|
- 0x00, 0x00, 0x7e, 0xa9, 0x06, 0x2e, 0x80, 0x00, 0x00, 0x47,
|
|
|
- 0x07, 0xd8, 0x84, 0x07, 0x59, 0x84, 0x08, 0xf4, 0xa8, 0x00,
|
|
|
- 0x00, 0x04, 0x08, 0xf4, 0xbf, 0x00, 0x0c, 0x00, 0x00, 0xfe,
|
|
|
- 0xb8, 0x0a, 0xf0, 0x80, 0x00, 0x7e, 0xa9, 0x08, 0xf4, 0xa0,
|
|
|
- 0x00, 0x00, 0x01, 0x08, 0xf4, 0xbe, 0x00, 0x00, 0x00, 0x0a,
|
|
|
- 0xa9, 0x80, 0x00, 0x7e, 0xad, 0x08, 0x4e, 0x2b, 0x44, 0xf4,
|
|
|
- 0x00, 0x00, 0x00, 0x03, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x01,
|
|
|
- 0x0e, 0xa0, 0x00, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb5, 0x08,
|
|
|
- 0x50, 0x2b, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb8, 0x08, 0x46,
|
|
|
- 0x2b, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x02, 0x0a, 0xf0, 0xaa,
|
|
|
- 0x00, 0x7e, 0xc9, 0x20, 0x00, 0x45, 0x0a, 0xf0, 0xaa, 0x00,
|
|
|
- 0x7e, 0xd0, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xc6, 0x0a, 0xa9,
|
|
|
- 0x80, 0x00, 0x7e, 0xc4, 0x08, 0x58, 0x6b, 0x0a, 0xf0, 0x80,
|
|
|
- 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xcd, 0x0a,
|
|
|
- 0xa9, 0x80, 0x00, 0x7e, 0xcb, 0x08, 0x58, 0xab, 0x0a, 0xf0,
|
|
|
- 0x80, 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xd4,
|
|
|
- 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xd2, 0x08, 0x58, 0xeb, 0x0a,
|
|
|
- 0xf0, 0x80, 0x00, 0x7e, 0xad};
|
|
|
-static int sizeof_bootstrap = 375;
|
|
|
-
|
|
|
-
|
|
|
static struct dsp56k_device {
|
|
|
unsigned long in_use;
|
|
|
long maxio, timeout;
|
|
@@ -164,18 +123,40 @@ static int dsp56k_reset(void)
|
|
|
|
|
|
static int dsp56k_upload(u_char __user *bin, int len)
|
|
|
{
|
|
|
+ struct platform_device *pdev;
|
|
|
+ const struct firmware *fw;
|
|
|
+ const char fw_name[] = "dsp56k/bootstrap.bin";
|
|
|
+ int err;
|
|
|
int i;
|
|
|
- u_char *p;
|
|
|
-
|
|
|
+
|
|
|
dsp56k_reset();
|
|
|
-
|
|
|
- p = bootstrap;
|
|
|
- for (i = 0; i < sizeof_bootstrap/3; i++) {
|
|
|
+
|
|
|
+ pdev = platform_device_register_simple("dsp56k", 0, NULL, 0);
|
|
|
+ if (IS_ERR(pdev)) {
|
|
|
+ printk(KERN_ERR "Failed to register device for \"%s\"\n",
|
|
|
+ fw_name);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ err = request_firmware(&fw, fw_name, &pdev->dev);
|
|
|
+ platform_device_unregister(pdev);
|
|
|
+ if (err) {
|
|
|
+ printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
|
|
|
+ fw_name, err);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+ if (fw->size % 3) {
|
|
|
+ printk(KERN_ERR "Bogus length %d in image \"%s\"\n",
|
|
|
+ fw->size, fw_name);
|
|
|
+ release_firmware(fw);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ for (i = 0; i < fw->size; i = i + 3) {
|
|
|
/* tx_wait(10); */
|
|
|
- dsp56k_host_interface.data.b[1] = *p++;
|
|
|
- dsp56k_host_interface.data.b[2] = *p++;
|
|
|
- dsp56k_host_interface.data.b[3] = *p++;
|
|
|
+ dsp56k_host_interface.data.b[1] = fw->data[i];
|
|
|
+ dsp56k_host_interface.data.b[2] = fw->data[i + 1];
|
|
|
+ dsp56k_host_interface.data.b[3] = fw->data[i + 2];
|
|
|
}
|
|
|
+ release_firmware(fw);
|
|
|
for (; i < 512; i++) {
|
|
|
/* tx_wait(10); */
|
|
|
dsp56k_host_interface.data.b[1] = 0;
|
|
@@ -534,3 +515,4 @@ static void __exit dsp56k_cleanup_driver(void)
|
|
|
module_exit(dsp56k_cleanup_driver);
|
|
|
|
|
|
MODULE_LICENSE("GPL");
|
|
|
+MODULE_FIRMWARE("dsp56k/bootstrap.bin");
|