[alsa-devel] [PATCH 1/1] ALSA: CA0132 - Ensure SCP packet is little-endian format
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);
At Wed, 26 Sep 2012 18:23:59 -0700, Ian Minett wrote:
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.
Then it's OK. I didn't check that the firmware loader gets called in the resume path in patch_ca0132.c.
Looking at the patch now...:
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);
if ((res >= 0) && (res != VENDOR_STATUS_DSPIO_BUSY)) return res; } while (--retry);res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, val);
I don't think this is the right place to fix the endianness. The value passed to this function should be already in a right order. The wrong endian value should be corrected at the place where you read the value.
thanks,
Takashi
participants (2)
-
Ian Minett
-
Takashi Iwai