summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-tegra/tegra_i2s_audio.c20
-rw-r--r--include/linux/tegra_audio.h8
2 files changed, 28 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/tegra_i2s_audio.c b/arch/arm/mach-tegra/tegra_i2s_audio.c
index 40653570f87a..47626e103e8d 100644
--- a/arch/arm/mach-tegra/tegra_i2s_audio.c
+++ b/arch/arm/mach-tegra/tegra_i2s_audio.c
@@ -1262,6 +1262,26 @@ static long tegra_audio_out_ioctl(struct file *file,
if (!rc)
aos->errors = 0;
break;
+ case TEGRA_AUDIO_OUT_PRELOAD_FIFO: {
+ struct tegra_audio_out_preload preload;
+ if (copy_from_user(&preload, (void __user *)arg,
+ sizeof(preload))) {
+ rc = -EFAULT;
+ break;
+ }
+ rc = kfifo_from_user(&ads->out.fifo,
+ (void __user *)preload.data, preload.len,
+ &preload.len_written);
+ if (rc < 0) {
+ pr_err("%s: error copying from user\n", __func__);
+ break;
+ }
+ if (copy_to_user((void __user *)arg, &preload, sizeof(preload)))
+ rc = -EFAULT;
+ pr_info("%s: preloaded output fifo with %d bytes\n", __func__,
+ preload.len_written);
+ }
+ break;
default:
rc = -EINVAL;
}
diff --git a/include/linux/tegra_audio.h b/include/linux/tegra_audio.h
index 48590daa06a5..15139cc31d84 100644
--- a/include/linux/tegra_audio.h
+++ b/include/linux/tegra_audio.h
@@ -58,5 +58,13 @@ struct tegra_audio_buf_config {
#define TEGRA_AUDIO_OUT_GET_ERROR_COUNT _IOR(TEGRA_AUDIO_MAGIC, 9, \
unsigned *)
+struct tegra_audio_out_preload {
+ void *data;
+ size_t len;
+ size_t len_written;
+};
+
+#define TEGRA_AUDIO_OUT_PRELOAD_FIFO _IOWR(TEGRA_AUDIO_MAGIC, 10, \
+ struct tegra_audio_out_preload *)
#endif/*_CPCAP_AUDIO_H*/