[PATCH v5 20/23] ASoC: qdsp6: q6asm: Add q6asm dai driver

2018-04-18 Thread srinivas . kandagatla
From: Srinivas Kandagatla 

This patch adds support to q6asm dai driver which configures Q6ASM streams
to pass pcm data.

Signed-off-by: Srinivas Kandagatla 
Reviewed-and-tested-by: Rohit kumar 
---
 sound/soc/qcom/Kconfig   |   4 +
 sound/soc/qcom/qdsp6/Makefile|   1 +
 sound/soc/qcom/qdsp6/q6asm-dai.c | 632 +++
 3 files changed, 637 insertions(+)
 create mode 100644 sound/soc/qcom/qdsp6/q6asm-dai.c

diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig
index 9b630686eb19..5bdf39f6003f 100644
--- a/sound/soc/qcom/Kconfig
+++ b/sound/soc/qcom/Kconfig
@@ -62,6 +62,9 @@ config SND_SOC_QDSP6_ROUTING
 config SND_SOC_QDSP6_ASM
tristate
 
+config SND_SOC_QDSP6_ASM_DAI
+   tristate
+
 config SND_SOC_QDSP6_CORE
tristate
 
@@ -74,6 +77,7 @@ config SND_SOC_QDSP6
select SND_SOC_QDSP6_ADM
select SND_SOC_QDSP6_ROUTING
select SND_SOC_QDSP6_ASM
+   select SND_SOC_QDSP6_ASM_DAI
select SND_SOC_QDSP6_CORE
help
 To add support for MSM QDSP6 Soc Audio.
diff --git a/sound/soc/qcom/qdsp6/Makefile b/sound/soc/qcom/qdsp6/Makefile
index 6a8ae698f22f..af44711eba24 100644
--- a/sound/soc/qcom/qdsp6/Makefile
+++ b/sound/soc/qcom/qdsp6/Makefile
@@ -4,4 +4,5 @@ obj-$(CONFIG_SND_SOC_QDSP6_AFE_DAI) += q6afe-dai.o
 obj-$(CONFIG_SND_SOC_QDSP6_ADM) += q6adm.o
 obj-$(CONFIG_SND_SOC_QDSP6_ROUTING) += q6routing.o
 obj-$(CONFIG_SND_SOC_QDSP6_ASM) += q6asm.o
+obj-$(CONFIG_SND_SOC_QDSP6_ASM_DAI) += q6asm-dai.o
 obj-$(CONFIG_SND_SOC_QDSP6_CORE) += q6core.o
diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c
new file mode 100644
index ..a7a4ac00b897
--- /dev/null
+++ b/sound/soc/qcom/qdsp6/q6asm-dai.c
@@ -0,0 +1,632 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2011-2016, The Linux Foundation
+// Copyright (c) 2017, Linaro Limited
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "q6asm.h"
+#include "q6routing.h"
+#include "q6dsp-errno.h"
+
+#define PLAYBACK_MIN_NUM_PERIODS2
+#define PLAYBACK_MAX_NUM_PERIODS   8
+#define PLAYBACK_MAX_PERIOD_SIZE65536
+#define PLAYBACK_MIN_PERIOD_SIZE128
+#define CAPTURE_MIN_NUM_PERIODS 2
+#define CAPTURE_MAX_NUM_PERIODS 8
+#define CAPTURE_MAX_PERIOD_SIZE 4096
+#define CAPTURE_MIN_PERIOD_SIZE 320
+#define SID_MASK_DEFAULT   0xF
+
+enum stream_state {
+   Q6ASM_STREAM_IDLE = 0,
+   Q6ASM_STREAM_STOPPED,
+   Q6ASM_STREAM_RUNNING,
+};
+
+struct q6asm_dai_rtd {
+   struct snd_pcm_substream *substream;
+   phys_addr_t phys;
+   unsigned int pcm_size;
+   unsigned int pcm_count;
+   unsigned int pcm_irq_pos;   /* IRQ position */
+   unsigned int periods;
+   uint16_t bits_per_sample;
+   uint16_t source; /* Encoding source bit mask */
+   struct audio_client *audio_client;
+   uint16_t session_id;
+   enum stream_state state;
+};
+
+struct q6asm_dai_data {
+   long long int sid;
+};
+
+static struct snd_pcm_hardware q6asm_dai_hardware_capture = {
+   .info = (SNDRV_PCM_INFO_MMAP |
+   SNDRV_PCM_INFO_BLOCK_TRANSFER |
+   SNDRV_PCM_INFO_MMAP_VALID |
+   SNDRV_PCM_INFO_INTERLEAVED |
+   SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME),
+   .formats =  (SNDRV_PCM_FMTBIT_S16_LE |
+   SNDRV_PCM_FMTBIT_S24_LE),
+   .rates =SNDRV_PCM_RATE_8000_48000,
+   .rate_min = 8000,
+   .rate_max = 48000,
+   .channels_min = 1,
+   .channels_max = 4,
+   .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS *
+   CAPTURE_MAX_PERIOD_SIZE,
+   .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
+   .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
+   .periods_min =  CAPTURE_MIN_NUM_PERIODS,
+   .periods_max =  CAPTURE_MAX_NUM_PERIODS,
+   .fifo_size =0,
+};
+
+static struct snd_pcm_hardware q6asm_dai_hardware_playback = {
+   .info = (SNDRV_PCM_INFO_MMAP |
+   SNDRV_PCM_INFO_BLOCK_TRANSFER |
+   SNDRV_PCM_INFO_MMAP_VALID |
+   SNDRV_PCM_INFO_INTERLEAVED |
+   SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME),
+   .formats =  (SNDRV_PCM_FMTBIT_S16_LE |
+   SNDRV_PCM_FMTBIT_S24_LE),
+   .rates =SNDRV_PCM_RATE_8000_192000,
+   .rate_min = 8000,
+   .rate_max = 192000,
+   .channels_min = 1,
+   .channels_max = 8,
+   

[PATCH v5 20/23] ASoC: qdsp6: q6asm: Add q6asm dai driver

2018-04-18 Thread srinivas . kandagatla
From: Srinivas Kandagatla 

This patch adds support to q6asm dai driver which configures Q6ASM streams
to pass pcm data.

Signed-off-by: Srinivas Kandagatla 
Reviewed-and-tested-by: Rohit kumar 
---
 sound/soc/qcom/Kconfig   |   4 +
 sound/soc/qcom/qdsp6/Makefile|   1 +
 sound/soc/qcom/qdsp6/q6asm-dai.c | 632 +++
 3 files changed, 637 insertions(+)
 create mode 100644 sound/soc/qcom/qdsp6/q6asm-dai.c

diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig
index 9b630686eb19..5bdf39f6003f 100644
--- a/sound/soc/qcom/Kconfig
+++ b/sound/soc/qcom/Kconfig
@@ -62,6 +62,9 @@ config SND_SOC_QDSP6_ROUTING
 config SND_SOC_QDSP6_ASM
tristate
 
+config SND_SOC_QDSP6_ASM_DAI
+   tristate
+
 config SND_SOC_QDSP6_CORE
tristate
 
@@ -74,6 +77,7 @@ config SND_SOC_QDSP6
select SND_SOC_QDSP6_ADM
select SND_SOC_QDSP6_ROUTING
select SND_SOC_QDSP6_ASM
+   select SND_SOC_QDSP6_ASM_DAI
select SND_SOC_QDSP6_CORE
help
 To add support for MSM QDSP6 Soc Audio.
diff --git a/sound/soc/qcom/qdsp6/Makefile b/sound/soc/qcom/qdsp6/Makefile
index 6a8ae698f22f..af44711eba24 100644
--- a/sound/soc/qcom/qdsp6/Makefile
+++ b/sound/soc/qcom/qdsp6/Makefile
@@ -4,4 +4,5 @@ obj-$(CONFIG_SND_SOC_QDSP6_AFE_DAI) += q6afe-dai.o
 obj-$(CONFIG_SND_SOC_QDSP6_ADM) += q6adm.o
 obj-$(CONFIG_SND_SOC_QDSP6_ROUTING) += q6routing.o
 obj-$(CONFIG_SND_SOC_QDSP6_ASM) += q6asm.o
+obj-$(CONFIG_SND_SOC_QDSP6_ASM_DAI) += q6asm-dai.o
 obj-$(CONFIG_SND_SOC_QDSP6_CORE) += q6core.o
diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c
new file mode 100644
index ..a7a4ac00b897
--- /dev/null
+++ b/sound/soc/qcom/qdsp6/q6asm-dai.c
@@ -0,0 +1,632 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (c) 2011-2016, The Linux Foundation
+// Copyright (c) 2017, Linaro Limited
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "q6asm.h"
+#include "q6routing.h"
+#include "q6dsp-errno.h"
+
+#define PLAYBACK_MIN_NUM_PERIODS2
+#define PLAYBACK_MAX_NUM_PERIODS   8
+#define PLAYBACK_MAX_PERIOD_SIZE65536
+#define PLAYBACK_MIN_PERIOD_SIZE128
+#define CAPTURE_MIN_NUM_PERIODS 2
+#define CAPTURE_MAX_NUM_PERIODS 8
+#define CAPTURE_MAX_PERIOD_SIZE 4096
+#define CAPTURE_MIN_PERIOD_SIZE 320
+#define SID_MASK_DEFAULT   0xF
+
+enum stream_state {
+   Q6ASM_STREAM_IDLE = 0,
+   Q6ASM_STREAM_STOPPED,
+   Q6ASM_STREAM_RUNNING,
+};
+
+struct q6asm_dai_rtd {
+   struct snd_pcm_substream *substream;
+   phys_addr_t phys;
+   unsigned int pcm_size;
+   unsigned int pcm_count;
+   unsigned int pcm_irq_pos;   /* IRQ position */
+   unsigned int periods;
+   uint16_t bits_per_sample;
+   uint16_t source; /* Encoding source bit mask */
+   struct audio_client *audio_client;
+   uint16_t session_id;
+   enum stream_state state;
+};
+
+struct q6asm_dai_data {
+   long long int sid;
+};
+
+static struct snd_pcm_hardware q6asm_dai_hardware_capture = {
+   .info = (SNDRV_PCM_INFO_MMAP |
+   SNDRV_PCM_INFO_BLOCK_TRANSFER |
+   SNDRV_PCM_INFO_MMAP_VALID |
+   SNDRV_PCM_INFO_INTERLEAVED |
+   SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME),
+   .formats =  (SNDRV_PCM_FMTBIT_S16_LE |
+   SNDRV_PCM_FMTBIT_S24_LE),
+   .rates =SNDRV_PCM_RATE_8000_48000,
+   .rate_min = 8000,
+   .rate_max = 48000,
+   .channels_min = 1,
+   .channels_max = 4,
+   .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS *
+   CAPTURE_MAX_PERIOD_SIZE,
+   .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
+   .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
+   .periods_min =  CAPTURE_MIN_NUM_PERIODS,
+   .periods_max =  CAPTURE_MAX_NUM_PERIODS,
+   .fifo_size =0,
+};
+
+static struct snd_pcm_hardware q6asm_dai_hardware_playback = {
+   .info = (SNDRV_PCM_INFO_MMAP |
+   SNDRV_PCM_INFO_BLOCK_TRANSFER |
+   SNDRV_PCM_INFO_MMAP_VALID |
+   SNDRV_PCM_INFO_INTERLEAVED |
+   SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME),
+   .formats =  (SNDRV_PCM_FMTBIT_S16_LE |
+   SNDRV_PCM_FMTBIT_S24_LE),
+   .rates =SNDRV_PCM_RATE_8000_192000,
+   .rate_min = 8000,
+   .rate_max = 192000,
+   .channels_min = 1,
+   .channels_max = 8,
+   .buffer_bytes_max = (PLAYBACK_MAX_NUM_PERIODS *
+