From: Ian Minett ian_minett@creativelabs.com
Hi Takashi, Great - good to hear the previous DSP loader patches are now living in the hda-ca0132-dsp branch. This patch is based on that branch, and addresses the SCP packet endianness.
The firmware does need to be reloaded when the chip loses power, so it doesn't survive S3.
OK, we need suspend/resume hooks, too.
Do we need to do anything specific to handle this? The firmware is already restored upon S3 by the current caching code.
Thanks, - Ian
---
The DSP firmware expects the SCP data to be in little-endian format regardless of the host architecture.
Signed-off-by: Ian Minett ian_minett@creativelabs.com
--- diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 2fd3121..4d7cda4 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c @@ -28,6 +28,7 @@ #include <linux/mutex.h> #include <linux/module.h> #include <linux/firmware.h> +#include <asm/unaligned.h> #include <sound/core.h> #include "hda_codec.h" #include "hda_local.h" @@ -701,9 +702,13 @@ static int dspio_send(struct hda_codec *codec, unsigned int reg, unsigned int res; int retry = 50;
+ /* Handling for Big Endian machine */ + unsigned int val; + put_unaligned_le32(data, &val); + /* send bits of data specified by reg to dsp */ do { - res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, data); + res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, val); if ((res >= 0) && (res != VENDOR_STATUS_DSPIO_BUSY)) return res; } while (--retry);