[alsa-devel] [PATCH 1/1] ALSA: CA0132 - Handle endianness of SCP buffer data
Takashi Iwai
tiwai at suse.de
Wed Nov 28 08:11:11 CET 2012
At Tue, 27 Nov 2012 19:04:47 -0800,
Ian Minett wrote:
>
> From: Ian Minett <ian_minett at creativelabs.com>
>
> Handle endianness of the SCP buffer being sent to or from the
> DSP chip on big-endian host architectures.
> The SCP buffer is prepared in dspio_scp(), and bytes are swapped
> before being transferred by the codec in dspio_send().
> Based on branch origin/topic/hda-ca0132-dsp.
>
> We would appreciate any feedback you may have.
It's more straightforward to use cpu_to_le32() and le32_to_cpu()
than unaligned access.
Could you resend the patch with this rewrite?
thanks,
Takashi
> Thanks very much,
> - Ian
>
> Signed-off-by: Ian Minett <ian_minett at creativelabs.com>
>
> diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c
> index 2fd3121..8386a11 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,11 +702,16 @@ 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;
> + res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, val);
> + put_unaligned_le32(res, &val);
> + if ((val >= 0) && (val != VENDOR_STATUS_DSPIO_BUSY))
> + return val;
> } while (--retry);
>
> return -EIO;
> @@ -719,11 +725,15 @@ static void dspio_write_wait(struct hda_codec *codec)
> int status;
> unsigned long timeout = jiffies + msecs_to_jiffies(1000);
>
> + /* Handling for Big Endian machine */
> + unsigned int val;
> +
> do {
> status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
> VENDOR_DSPIO_STATUS, 0);
> - if ((status == VENDOR_STATUS_DSPIO_OK) ||
> - (status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY))
> + put_unaligned_le32(status, &val);
> + if ((val == VENDOR_STATUS_DSPIO_OK) ||
> + (val == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY))
> break;
> msleep(1);
> } while (time_before(jiffies, timeout));
> @@ -736,6 +746,8 @@ static int dspio_write(struct hda_codec *codec, unsigned int scp_data)
> {
> struct ca0132_spec *spec = codec->spec;
> int status;
> + /* Handling for Big Endian machine */
> + unsigned int val = 0;
>
> dspio_write_wait(codec);
>
> @@ -751,8 +763,10 @@ static int dspio_write(struct hda_codec *codec, unsigned int scp_data)
> goto error;
>
> /* OK, now check if the write itself has executed*/
> - status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
> + val = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
> VENDOR_DSPIO_STATUS, 0);
> + put_unaligned_le32(val, &status);
> +
> error:
> mutex_unlock(&spec->chipio_mutex);
>
> --
> 1.7.4.1
>
More information about the Alsa-devel
mailing list