18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * linux/sound/arm/ep93xx-pcm.c - EP93xx ALSA PCM interface
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
68c2ecf20Sopenharmony_ci * Copyright (C) 2006 Applied Data Systems
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Rewritten for the SoC audio subsystem (Based on PXA2xx code):
98c2ecf20Sopenharmony_ci *   Copyright (c) 2008 Ryan Mallon
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/module.h>
138c2ecf20Sopenharmony_ci#include <linux/init.h>
148c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
158c2ecf20Sopenharmony_ci#include <linux/dmaengine.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#include <sound/pcm.h>
188c2ecf20Sopenharmony_ci#include <sound/soc.h>
198c2ecf20Sopenharmony_ci#include <sound/dmaengine_pcm.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include <linux/platform_data/dma-ep93xx.h>
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#include "ep93xx-pcm.h"
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cistatic const struct snd_pcm_hardware ep93xx_pcm_hardware = {
268c2ecf20Sopenharmony_ci	.info			= (SNDRV_PCM_INFO_MMAP		|
278c2ecf20Sopenharmony_ci				   SNDRV_PCM_INFO_MMAP_VALID	|
288c2ecf20Sopenharmony_ci				   SNDRV_PCM_INFO_INTERLEAVED	|
298c2ecf20Sopenharmony_ci				   SNDRV_PCM_INFO_BLOCK_TRANSFER),
308c2ecf20Sopenharmony_ci	.buffer_bytes_max	= 131072,
318c2ecf20Sopenharmony_ci	.period_bytes_min	= 32,
328c2ecf20Sopenharmony_ci	.period_bytes_max	= 32768,
338c2ecf20Sopenharmony_ci	.periods_min		= 1,
348c2ecf20Sopenharmony_ci	.periods_max		= 32,
358c2ecf20Sopenharmony_ci	.fifo_size		= 32,
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic bool ep93xx_pcm_dma_filter(struct dma_chan *chan, void *filter_param)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	struct ep93xx_dma_data *data = filter_param;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	if (data->direction == ep93xx_dma_chan_direction(chan)) {
438c2ecf20Sopenharmony_ci		chan->private = data;
448c2ecf20Sopenharmony_ci		return true;
458c2ecf20Sopenharmony_ci	}
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	return false;
488c2ecf20Sopenharmony_ci}
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistatic const struct snd_dmaengine_pcm_config ep93xx_dmaengine_pcm_config = {
518c2ecf20Sopenharmony_ci	.pcm_hardware = &ep93xx_pcm_hardware,
528c2ecf20Sopenharmony_ci	.compat_filter_fn = ep93xx_pcm_dma_filter,
538c2ecf20Sopenharmony_ci	.prealloc_buffer_size = 131072,
548c2ecf20Sopenharmony_ci};
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ciint devm_ep93xx_pcm_platform_register(struct device *dev)
578c2ecf20Sopenharmony_ci{
588c2ecf20Sopenharmony_ci	return devm_snd_dmaengine_pcm_register(dev,
598c2ecf20Sopenharmony_ci		&ep93xx_dmaengine_pcm_config,
608c2ecf20Sopenharmony_ci		SND_DMAENGINE_PCM_FLAG_NO_DT |
618c2ecf20Sopenharmony_ci		SND_DMAENGINE_PCM_FLAG_COMPAT);
628c2ecf20Sopenharmony_ci}
638c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_ep93xx_pcm_platform_register);
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ciMODULE_AUTHOR("Ryan Mallon");
668c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("EP93xx ALSA PCM interface");
678c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
68