Commit 2493a6d1 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Jaroslav Kysela

[ALSA] korg1212: add request_firmware()

Load the DSP code using request_firmware(), if possible, instead of
using the built-in blob.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
Signed-off-by: default avatarJaroslav Kysela <perex@suse.cz>
parent 226968c7
...@@ -576,6 +576,7 @@ config SND_INTEL8X0M ...@@ -576,6 +576,7 @@ config SND_INTEL8X0M
config SND_KORG1212 config SND_KORG1212
tristate "Korg 1212 IO" tristate "Korg 1212 IO"
depends on SND depends on SND
select FW_LOADER
select SND_PCM select SND_PCM
help help
Say Y here to include support for Korg 1212IO soundcards. Say Y here to include support for Korg 1212IO soundcards.
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/firmware.h>
#include <sound/core.h> #include <sound/core.h>
#include <sound/info.h> #include <sound/info.h>
...@@ -263,7 +264,15 @@ enum MonitorModeSelector { ...@@ -263,7 +264,15 @@ enum MonitorModeSelector {
#define COMMAND_ACK_DELAY 13 // number of RTC ticks to wait for an acknowledgement #define COMMAND_ACK_DELAY 13 // number of RTC ticks to wait for an acknowledgement
// from the card after sending a command. // from the card after sending a command.
#define FIRMWARE_IN_THE_KERNEL
#ifdef FIRMWARE_IN_THE_KERNEL
#include "korg1212-firmware.h" #include "korg1212-firmware.h"
static const struct firmware static_dsp_code = {
.data = (u8 *)dspCode,
.size = sizeof dspCode
};
#endif
enum ClockSourceIndex { enum ClockSourceIndex {
K1212_CLKIDX_AdatAt44_1K = 0, // selects source as ADAT at 44.1 kHz K1212_CLKIDX_AdatAt44_1K = 0, // selects source as ADAT at 44.1 kHz
...@@ -345,8 +354,6 @@ struct snd_korg1212 { ...@@ -345,8 +354,6 @@ struct snd_korg1212 {
struct snd_dma_buffer dma_rec; struct snd_dma_buffer dma_rec;
struct snd_dma_buffer dma_shared; struct snd_dma_buffer dma_shared;
u32 dspCodeSize;
u32 DataBufsSize; u32 DataBufsSize;
struct KorgAudioBuffer * playDataBufsPtr; struct KorgAudioBuffer * playDataBufsPtr;
...@@ -1223,8 +1230,6 @@ static int snd_korg1212_downloadDSPCode(struct snd_korg1212 *korg1212) ...@@ -1223,8 +1230,6 @@ static int snd_korg1212_downloadDSPCode(struct snd_korg1212 *korg1212)
snd_korg1212_setCardState(korg1212, K1212_STATE_DSP_IN_PROCESS); snd_korg1212_setCardState(korg1212, K1212_STATE_DSP_IN_PROCESS);
memcpy(korg1212->dma_dsp.area, dspCode, korg1212->dspCodeSize);
rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_StartDSPDownload, rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_StartDSPDownload,
UpperWordSwap(korg1212->dma_dsp.addr), UpperWordSwap(korg1212->dma_dsp.addr),
0, 0, 0); 0, 0, 0);
...@@ -2156,6 +2161,7 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev * ...@@ -2156,6 +2161,7 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev *
unsigned int i; unsigned int i;
unsigned ioport_size, iomem_size, iomem2_size; unsigned ioport_size, iomem_size, iomem2_size;
struct snd_korg1212 * korg1212; struct snd_korg1212 * korg1212;
const struct firmware *dsp_code;
static struct snd_device_ops ops = { static struct snd_device_ops ops = {
.dev_free = snd_korg1212_dev_free, .dev_free = snd_korg1212_dev_free,
...@@ -2329,8 +2335,6 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev * ...@@ -2329,8 +2335,6 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev *
#endif // K1212_LARGEALLOC #endif // K1212_LARGEALLOC
korg1212->dspCodeSize = sizeof (dspCode);
korg1212->VolumeTablePhy = korg1212->sharedBufferPhy + korg1212->VolumeTablePhy = korg1212->sharedBufferPhy +
offsetof(struct KorgSharedBuffer, volumeData); offsetof(struct KorgSharedBuffer, volumeData);
korg1212->RoutingTablePhy = korg1212->sharedBufferPhy + korg1212->RoutingTablePhy = korg1212->sharedBufferPhy +
...@@ -2338,17 +2342,40 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev * ...@@ -2338,17 +2342,40 @@ static int __devinit snd_korg1212_create(struct snd_card *card, struct pci_dev *
korg1212->AdatTimeCodePhy = korg1212->sharedBufferPhy + korg1212->AdatTimeCodePhy = korg1212->sharedBufferPhy +
offsetof(struct KorgSharedBuffer, AdatTimeCode); offsetof(struct KorgSharedBuffer, AdatTimeCode);
err = request_firmware(&dsp_code, "korg/k1212.dsp", &pci->dev);
if (err < 0) {
release_firmware(dsp_code);
#ifdef FIRMWARE_IN_THE_KERNEL
dsp_code = &static_dsp_code;
#else
snd_printk(KERN_ERR "firmware not available\n");
snd_korg1212_free(korg1212);
return err;
#endif
}
if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci), if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
korg1212->dspCodeSize, &korg1212->dma_dsp) < 0) { dsp_code->size, &korg1212->dma_dsp) < 0) {
snd_printk(KERN_ERR "korg1212: can not allocate dsp code memory (%d bytes)\n", korg1212->dspCodeSize); snd_printk(KERN_ERR "korg1212: can not allocate dsp code memory (%d bytes)\n", dsp_code->size);
snd_korg1212_free(korg1212); snd_korg1212_free(korg1212);
#ifdef FIRMWARE_IN_THE_KERNEL
if (dsp_code != &static_dsp_code)
#endif
release_firmware(dsp_code);
return -ENOMEM; return -ENOMEM;
} }
K1212_DEBUG_PRINTK("K1212_DEBUG: DSP Code area = 0x%p (0x%08x) %d bytes [%s]\n", K1212_DEBUG_PRINTK("K1212_DEBUG: DSP Code area = 0x%p (0x%08x) %d bytes [%s]\n",
korg1212->dma_dsp.area, korg1212->dma_dsp.addr, korg1212->dspCodeSize, korg1212->dma_dsp.area, korg1212->dma_dsp.addr, dsp_code->size,
stateName[korg1212->cardState]); stateName[korg1212->cardState]);
memcpy(korg1212->dma_dsp.area, dsp_code->data, dsp_code->size);
#ifdef FIRMWARE_IN_THE_KERNEL
if (dsp_code != &static_dsp_code)
#endif
release_firmware(dsp_code);
rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_RebootCard, 0, 0, 0, 0); rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_RebootCard, 0, 0, 0, 0);
if (rc) if (rc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment