162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * linux/sound/arm/ep93xx-pcm.c - EP93xx ALSA PCM interface
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
662306a36Sopenharmony_ci * Copyright (C) 2006 Applied Data Systems
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Rewritten for the SoC audio subsystem (Based on PXA2xx code):
962306a36Sopenharmony_ci *   Copyright (c) 2008 Ryan Mallon
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/module.h>
1362306a36Sopenharmony_ci#include <linux/init.h>
1462306a36Sopenharmony_ci#include <linux/platform_device.h>
1562306a36Sopenharmony_ci#include <linux/dmaengine.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <sound/pcm.h>
1862306a36Sopenharmony_ci#include <sound/soc.h>
1962306a36Sopenharmony_ci#include <sound/dmaengine_pcm.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include <linux/platform_data/dma-ep93xx.h>
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#include "ep93xx-pcm.h"
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic const struct snd_pcm_hardware ep93xx_pcm_hardware = {
2662306a36Sopenharmony_ci	.info			= (SNDRV_PCM_INFO_MMAP		|
2762306a36Sopenharmony_ci				   SNDRV_PCM_INFO_MMAP_VALID	|
2862306a36Sopenharmony_ci				   SNDRV_PCM_INFO_INTERLEAVED	|
2962306a36Sopenharmony_ci				   SNDRV_PCM_INFO_BLOCK_TRANSFER),
3062306a36Sopenharmony_ci	.buffer_bytes_max	= 131072,
3162306a36Sopenharmony_ci	.period_bytes_min	= 32,
3262306a36Sopenharmony_ci	.period_bytes_max	= 32768,
3362306a36Sopenharmony_ci	.periods_min		= 1,
3462306a36Sopenharmony_ci	.periods_max		= 32,
3562306a36Sopenharmony_ci	.fifo_size		= 32,
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic bool ep93xx_pcm_dma_filter(struct dma_chan *chan, void *filter_param)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	struct ep93xx_dma_data *data = filter_param;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	if (data->direction == ep93xx_dma_chan_direction(chan)) {
4362306a36Sopenharmony_ci		chan->private = data;
4462306a36Sopenharmony_ci		return true;
4562306a36Sopenharmony_ci	}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	return false;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic const struct snd_dmaengine_pcm_config ep93xx_dmaengine_pcm_config = {
5162306a36Sopenharmony_ci	.pcm_hardware = &ep93xx_pcm_hardware,
5262306a36Sopenharmony_ci	.compat_filter_fn = ep93xx_pcm_dma_filter,
5362306a36Sopenharmony_ci	.prealloc_buffer_size = 131072,
5462306a36Sopenharmony_ci};
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ciint devm_ep93xx_pcm_platform_register(struct device *dev)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	return devm_snd_dmaengine_pcm_register(dev,
5962306a36Sopenharmony_ci		&ep93xx_dmaengine_pcm_config,
6062306a36Sopenharmony_ci		SND_DMAENGINE_PCM_FLAG_NO_DT |
6162306a36Sopenharmony_ci		SND_DMAENGINE_PCM_FLAG_COMPAT);
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_ep93xx_pcm_platform_register);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciMODULE_AUTHOR("Ryan Mallon");
6662306a36Sopenharmony_ciMODULE_DESCRIPTION("EP93xx ALSA PCM interface");
6762306a36Sopenharmony_ciMODULE_LICENSE("GPL");
68