ASoC: qdsp6: q6common: Add qdsp6 helper functions
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Wed, 9 May 2018 12:56:18 +0000 (13:56 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 11 May 2018 03:13:31 +0000 (12:13 +0900)
This patch adds some common helper functions like translating dsp error
to linux error codes and channel mappings etc.

These functions are used in all the following qdsp6 drivers.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Reviewed-and-tested-by: Rohit kumar <rohitkr@codeaurora.org>
Reviewed-by: Banajit Goswami <bgoswami@codeaurora.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/qcom/Kconfig
sound/soc/qcom/Makefile
sound/soc/qcom/qdsp6/Makefile [new file with mode: 0644]
sound/soc/qcom/qdsp6/q6dsp-common.c [new file with mode: 0644]
sound/soc/qcom/qdsp6/q6dsp-common.h [new file with mode: 0644]
sound/soc/qcom/qdsp6/q6dsp-errno.h [new file with mode: 0644]

index 3cc252e..b44a9fc 100644 (file)
@@ -40,3 +40,16 @@ config SND_SOC_APQ8016_SBC
           Support for Qualcomm Technologies LPASS audio block in
           APQ8016 SOC-based systems.
           Say Y if you want to use audio devices on MI2S.
+
+config SND_SOC_QDSP6_COMMON
+       tristate
+
+config SND_SOC_QDSP6
+       tristate "SoC ALSA audio driver for QDSP6"
+       depends on QCOM_APR && HAS_DMA
+       select SND_SOC_QDSP6_COMMON
+       help
+        To add support for MSM QDSP6 Soc Audio.
+        This will enable sound soc platform specific
+        audio drivers. This includes q6asm, q6adm,
+        q6afe interfaces to DSP using apr.
index d528035..0276717 100644 (file)
@@ -16,3 +16,6 @@ snd-soc-apq8016-sbc-objs := apq8016_sbc.o
 
 obj-$(CONFIG_SND_SOC_STORM) += snd-soc-storm.o
 obj-$(CONFIG_SND_SOC_APQ8016_SBC) += snd-soc-apq8016-sbc.o
+
+#DSP lib
+obj-$(CONFIG_SND_SOC_QDSP6) += qdsp6/
diff --git a/sound/soc/qcom/qdsp6/Makefile b/sound/soc/qcom/qdsp6/Makefile
new file mode 100644 (file)
index 0000000..accebdb
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_SND_SOC_QDSP6_COMMON) += q6dsp-common.o
diff --git a/sound/soc/qcom/qdsp6/q6dsp-common.c b/sound/soc/qcom/qdsp6/q6dsp-common.c
new file mode 100644 (file)
index 0000000..d393003
--- /dev/null
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
+// Copyright (c) 2018, Linaro Limited
+
+#include "q6dsp-common.h"
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+
+int q6dsp_map_channels(u8 ch_map[PCM_MAX_NUM_CHANNEL], int ch)
+{
+       memset(ch_map, 0, PCM_MAX_NUM_CHANNEL);
+
+       switch (ch) {
+       case 1:
+               ch_map[0] = PCM_CHANNEL_FC;
+               break;
+       case 2:
+               ch_map[0] = PCM_CHANNEL_FL;
+               ch_map[1] = PCM_CHANNEL_FR;
+               break;
+       case 3:
+               ch_map[0] = PCM_CHANNEL_FL;
+               ch_map[1] = PCM_CHANNEL_FR;
+               ch_map[2] = PCM_CHANNEL_FC;
+               break;
+       case 4:
+               ch_map[0] = PCM_CHANNEL_FL;
+               ch_map[1] = PCM_CHANNEL_FR;
+               ch_map[2] = PCM_CHANNEL_LS;
+               ch_map[3] = PCM_CHANNEL_RS;
+               break;
+       case 5:
+               ch_map[0] = PCM_CHANNEL_FL;
+               ch_map[1] = PCM_CHANNEL_FR;
+               ch_map[2] = PCM_CHANNEL_FC;
+               ch_map[3] = PCM_CHANNEL_LS;
+               ch_map[4] = PCM_CHANNEL_RS;
+               break;
+       case 6:
+               ch_map[0] = PCM_CHANNEL_FL;
+               ch_map[1] = PCM_CHANNEL_FR;
+               ch_map[2] = PCM_CHANNEL_LFE;
+               ch_map[3] = PCM_CHANNEL_FC;
+               ch_map[4] = PCM_CHANNEL_LS;
+               ch_map[5] = PCM_CHANNEL_RS;
+               break;
+       case 8:
+               ch_map[0] = PCM_CHANNEL_FL;
+               ch_map[1] = PCM_CHANNEL_FR;
+               ch_map[2] = PCM_CHANNEL_LFE;
+               ch_map[3] = PCM_CHANNEL_FC;
+               ch_map[4] = PCM_CHANNEL_LS;
+               ch_map[5] = PCM_CHANNEL_RS;
+               ch_map[6] = PCM_CHANNEL_LB;
+               ch_map[7] = PCM_CHANNEL_RB;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(q6dsp_map_channels);
+MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/qcom/qdsp6/q6dsp-common.h b/sound/soc/qcom/qdsp6/q6dsp-common.h
new file mode 100644 (file)
index 0000000..01094d1
--- /dev/null
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __Q6DSP_COMMON_H__
+#define __Q6DSP_COMMON_H__
+
+#include <linux/kernel.h>
+
+#define PCM_MAX_NUM_CHANNEL  8
+#define PCM_CHANNEL_NULL 0
+
+#define PCM_CHANNEL_FL    1    /* Front left channel. */
+#define PCM_CHANNEL_FR    2    /* Front right channel. */
+#define PCM_CHANNEL_FC    3    /* Front center channel. */
+#define PCM_CHANNEL_LS   4     /* Left surround channel. */
+#define PCM_CHANNEL_RS   5     /* Right surround channel. */
+#define PCM_CHANNEL_LFE  6     /* Low frequency effect channel. */
+#define PCM_CHANNEL_CS   7     /* Center surround channel; Rear center ch */
+#define PCM_CHANNEL_LB   8     /* Left back channel; Rear left channel. */
+#define PCM_CHANNEL_RB   9     /* Right back channel; Rear right channel. */
+#define PCM_CHANNELS   10      /* Top surround channel. */
+
+int q6dsp_map_channels(u8 ch_map[PCM_MAX_NUM_CHANNEL], int ch);
+
+#endif /* __Q6DSP_COMMON_H__ */
diff --git a/sound/soc/qcom/qdsp6/q6dsp-errno.h b/sound/soc/qcom/qdsp6/q6dsp-errno.h
new file mode 100644 (file)
index 0000000..1ec00ff
--- /dev/null
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __Q6DSP_ERR_NO_H__
+#define __Q6DSP_ERR_NO_H__
+#include <linux/kernel.h>
+
+/* Success. The operation completed with no errors. */
+#define ADSP_EOK          0x00000000
+/* General failure. */
+#define ADSP_EFAILED      0x00000001
+/* Bad operation parameter. */
+#define ADSP_EBADPARAM    0x00000002
+/* Unsupported routine or operation. */
+#define ADSP_EUNSUPPORTED 0x00000003
+/* Unsupported version. */
+#define ADSP_EVERSION     0x00000004
+/* Unexpected problem encountered. */
+#define ADSP_EUNEXPECTED  0x00000005
+/* Unhandled problem occurred. */
+#define ADSP_EPANIC       0x00000006
+/* Unable to allocate resource. */
+#define ADSP_ENORESOURCE  0x00000007
+/* Invalid handle. */
+#define ADSP_EHANDLE      0x00000008
+/* Operation is already processed. */
+#define ADSP_EALREADY     0x00000009
+/* Operation is not ready to be processed. */
+#define ADSP_ENOTREADY    0x0000000A
+/* Operation is pending completion. */
+#define ADSP_EPENDING     0x0000000B
+/* Operation could not be accepted or processed. */
+#define ADSP_EBUSY        0x0000000C
+/* Operation aborted due to an error. */
+#define ADSP_EABORTED     0x0000000D
+/* Operation preempted by a higher priority. */
+#define ADSP_EPREEMPTED   0x0000000E
+/* Operation requests intervention to complete. */
+#define ADSP_ECONTINUE    0x0000000F
+/* Operation requests immediate intervention to complete. */
+#define ADSP_EIMMEDIATE   0x00000010
+/* Operation is not implemented. */
+#define ADSP_ENOTIMPL     0x00000011
+/* Operation needs more data or resources. */
+#define ADSP_ENEEDMORE    0x00000012
+/* Operation does not have memory. */
+#define ADSP_ENOMEMORY    0x00000014
+/* Item does not exist. */
+#define ADSP_ENOTEXIST    0x00000015
+/* Max count for adsp error code sent to HLOS*/
+
+#endif /*__Q6DSP_ERR_NO_H__ */