summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIliyan Malchev <malchev@google.com>2010-08-20 15:11:48 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:35:14 -0800
commitec130443e6e6e6a66b45ccdbc6aea4c2c7f9e06d (patch)
tree5b84d26eef3063d8926c3c81f6c1f8360ef1e979
parent1bb235b3119e31d8cefa745de84957f7ee3a3846 (diff)
[ARM] tegra: tegra_i2s_audio: allow preloading of the tx fifo with data
Add an ioctl to allow the TX fifo to be loaded with data before playback starts. Playback can then be started by calling write() on the FIFO, even with a length of 0. This will cause the pending data to be played out. Signed-off-by: Iliyan Malchev <malchev@google.com>
-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*/