diff options
-rw-r--r-- | arch/arm/mach-tegra/tegra_i2s_audio.c | 20 | ||||
-rw-r--r-- | include/linux/tegra_audio.h | 8 |
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*/ |