diff options
Diffstat (limited to 'recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch')
-rw-r--r-- | recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch | 515 |
1 files changed, 515 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch b/recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch new file mode 100644 index 0000000..8de8c21 --- /dev/null +++ b/recipes-kernel/linux/linux-yocto-3.14/h1940/0017-ASoC-samsung-drop-support-for-legacy-S3C24XX-DMA-API.patch @@ -0,0 +1,515 @@ +From b63f4747fb0f17d970b643bd648794d60fc15838 Mon Sep 17 00:00:00 2001 +From: Vasily Khoruzhick <anarsoul@gmail.com> +Date: Mon, 19 May 2014 14:40:57 +0300 +Subject: [PATCH 17/17] ASoC: samsung: drop support for legacy S3C24XX DMA API + +Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com> +--- + sound/soc/samsung/Kconfig | 3 - + sound/soc/samsung/Makefile | 2 - + sound/soc/samsung/dma.c | 460 --------------------------------------------- + 3 files changed, 465 deletions(-) + delete mode 100644 sound/soc/samsung/dma.c + +diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig +index 022c7a4..bf4bb7b 100644 +--- a/sound/soc/samsung/Kconfig ++++ b/sound/soc/samsung/Kconfig +@@ -13,9 +13,6 @@ config SND_SOC_SAMSUNG + config SND_S3C_DMA + tristate + +-config SND_S3C_DMA_LEGACY +- tristate +- + config SND_S3C24XX_I2S + tristate + +diff --git a/sound/soc/samsung/Makefile b/sound/soc/samsung/Makefile +index 86715d8..bc02da0 100644 +--- a/sound/soc/samsung/Makefile ++++ b/sound/soc/samsung/Makefile +@@ -1,6 +1,5 @@ + # S3c24XX Platform Support + snd-soc-s3c-dma-objs := dmaengine.o +-snd-soc-s3c-dma-legacy-objs := dma.o + snd-soc-idma-objs := idma.o + snd-soc-s3c24xx-i2s-objs := s3c24xx-i2s.o + snd-soc-s3c2412-i2s-objs := s3c2412-i2s.o +@@ -11,7 +10,6 @@ snd-soc-pcm-objs := pcm.o + snd-soc-i2s-objs := i2s.o + + obj-$(CONFIG_SND_S3C_DMA) += snd-soc-s3c-dma.o +-obj-$(CONFIG_SND_S3C_DMA_LEGACY) += snd-soc-s3c-dma-legacy.o + obj-$(CONFIG_SND_S3C24XX_I2S) += snd-soc-s3c24xx-i2s.o + obj-$(CONFIG_SND_SAMSUNG_AC97) += snd-soc-ac97.o + obj-$(CONFIG_SND_S3C2412_SOC_I2S) += snd-soc-s3c2412-i2s.o +diff --git a/sound/soc/samsung/dma.c b/sound/soc/samsung/dma.c +deleted file mode 100644 +index dc09b71..0000000 +--- a/sound/soc/samsung/dma.c ++++ /dev/null +@@ -1,460 +0,0 @@ +-/* +- * dma.c -- ALSA Soc Audio Layer +- * +- * (c) 2006 Wolfson Microelectronics PLC. +- * Graeme Gregory graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com +- * +- * Copyright 2004-2005 Simtec Electronics +- * http://armlinux.simtec.co.uk/ +- * Ben Dooks <ben@simtec.co.uk> +- * +- * This program is free software; you can redistribute it and/or modify it +- * under the terms of the GNU General Public License as published by the +- * Free Software Foundation; either version 2 of the License, or (at your +- * option) any later version. +- */ +- +-#include <linux/slab.h> +-#include <linux/dma-mapping.h> +-#include <linux/module.h> +- +-#include <sound/soc.h> +-#include <sound/pcm_params.h> +- +-#include <asm/dma.h> +-#include <mach/hardware.h> +-#include <mach/dma.h> +- +-#include "dma.h" +- +-#define ST_RUNNING (1<<0) +-#define ST_OPENED (1<<1) +- +-static const struct snd_pcm_hardware dma_hardware = { +- .info = SNDRV_PCM_INFO_INTERLEAVED | +- SNDRV_PCM_INFO_BLOCK_TRANSFER | +- SNDRV_PCM_INFO_MMAP | +- SNDRV_PCM_INFO_MMAP_VALID, +- .buffer_bytes_max = 128*1024, +- .period_bytes_min = PAGE_SIZE, +- .period_bytes_max = PAGE_SIZE*2, +- .periods_min = 2, +- .periods_max = 128, +- .fifo_size = 32, +-}; +- +-struct runtime_data { +- spinlock_t lock; +- int state; +- unsigned int dma_loaded; +- unsigned int dma_period; +- dma_addr_t dma_start; +- dma_addr_t dma_pos; +- dma_addr_t dma_end; +- struct s3c_dma_params *params; +-}; +- +-static void audio_buffdone(void *data); +- +-/* dma_enqueue +- * +- * place a dma buffer onto the queue for the dma system +- * to handle. +- */ +-static void dma_enqueue(struct snd_pcm_substream *substream) +-{ +- struct runtime_data *prtd = substream->runtime->private_data; +- dma_addr_t pos = prtd->dma_pos; +- unsigned int limit; +- struct samsung_dma_prep dma_info; +- +- pr_debug("Entered %s\n", __func__); +- +- limit = (prtd->dma_end - prtd->dma_start) / prtd->dma_period; +- +- pr_debug("%s: loaded %d, limit %d\n", +- __func__, prtd->dma_loaded, limit); +- +- dma_info.cap = (samsung_dma_has_circular() ? DMA_CYCLIC : DMA_SLAVE); +- dma_info.direction = +- (substream->stream == SNDRV_PCM_STREAM_PLAYBACK +- ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM); +- dma_info.fp = audio_buffdone; +- dma_info.fp_param = substream; +- dma_info.period = prtd->dma_period; +- dma_info.len = prtd->dma_period*limit; +- +- if (dma_info.cap == DMA_CYCLIC) { +- dma_info.buf = pos; +- prtd->params->ops->prepare(prtd->params->ch, &dma_info); +- prtd->dma_loaded += limit; +- return; +- } +- +- while (prtd->dma_loaded < limit) { +- pr_debug("dma_loaded: %d\n", prtd->dma_loaded); +- +- if ((pos + dma_info.period) > prtd->dma_end) { +- dma_info.period = prtd->dma_end - pos; +- pr_debug("%s: corrected dma len %ld\n", +- __func__, dma_info.period); +- } +- +- dma_info.buf = pos; +- prtd->params->ops->prepare(prtd->params->ch, &dma_info); +- +- prtd->dma_loaded++; +- pos += prtd->dma_period; +- if (pos >= prtd->dma_end) +- pos = prtd->dma_start; +- } +- +- prtd->dma_pos = pos; +-} +- +-static void audio_buffdone(void *data) +-{ +- struct snd_pcm_substream *substream = data; +- struct runtime_data *prtd = substream->runtime->private_data; +- +- pr_debug("Entered %s\n", __func__); +- +- if (prtd->state & ST_RUNNING) { +- prtd->dma_pos += prtd->dma_period; +- if (prtd->dma_pos >= prtd->dma_end) +- prtd->dma_pos = prtd->dma_start; +- +- if (substream) +- snd_pcm_period_elapsed(substream); +- +- spin_lock(&prtd->lock); +- if (!samsung_dma_has_circular()) { +- prtd->dma_loaded--; +- dma_enqueue(substream); +- } +- spin_unlock(&prtd->lock); +- } +-} +- +-static int dma_hw_params(struct snd_pcm_substream *substream, +- struct snd_pcm_hw_params *params) +-{ +- struct snd_pcm_runtime *runtime = substream->runtime; +- struct runtime_data *prtd = runtime->private_data; +- struct snd_soc_pcm_runtime *rtd = substream->private_data; +- unsigned long totbytes = params_buffer_bytes(params); +- struct s3c_dma_params *dma = +- snd_soc_dai_get_dma_data(rtd->cpu_dai, substream); +- struct samsung_dma_req req; +- struct samsung_dma_config config; +- +- pr_debug("Entered %s\n", __func__); +- +- /* return if this is a bufferless transfer e.g. +- * codec <--> BT codec or GSM modem -- lg FIXME */ +- if (!dma) +- return 0; +- +- /* this may get called several times by oss emulation +- * with different params -HW */ +- if (prtd->params == NULL) { +- /* prepare DMA */ +- prtd->params = dma; +- +- pr_debug("params %p, client %p, channel %d\n", prtd->params, +- prtd->params->client, prtd->params->channel); +- +- prtd->params->ops = samsung_dma_get_ops(); +- +- req.cap = (samsung_dma_has_circular() ? +- DMA_CYCLIC : DMA_SLAVE); +- req.client = prtd->params->client; +- config.direction = +- (substream->stream == SNDRV_PCM_STREAM_PLAYBACK +- ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM); +- config.width = prtd->params->dma_size; +- config.fifo = prtd->params->dma_addr; +- prtd->params->ch = prtd->params->ops->request( +- prtd->params->channel, &req, rtd->cpu_dai->dev, +- prtd->params->ch_name); +- if (!prtd->params->ch) { +- pr_err("Failed to allocate DMA channel\n"); +- return -ENXIO; +- } +- prtd->params->ops->config(prtd->params->ch, &config); +- } +- +- snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); +- +- runtime->dma_bytes = totbytes; +- +- spin_lock_irq(&prtd->lock); +- prtd->dma_loaded = 0; +- prtd->dma_period = params_period_bytes(params); +- prtd->dma_start = runtime->dma_addr; +- prtd->dma_pos = prtd->dma_start; +- prtd->dma_end = prtd->dma_start + totbytes; +- spin_unlock_irq(&prtd->lock); +- +- return 0; +-} +- +-static int dma_hw_free(struct snd_pcm_substream *substream) +-{ +- struct runtime_data *prtd = substream->runtime->private_data; +- +- pr_debug("Entered %s\n", __func__); +- +- snd_pcm_set_runtime_buffer(substream, NULL); +- +- if (prtd->params) { +- prtd->params->ops->flush(prtd->params->ch); +- prtd->params->ops->release(prtd->params->ch, +- prtd->params->client); +- prtd->params = NULL; +- } +- +- return 0; +-} +- +-static int dma_prepare(struct snd_pcm_substream *substream) +-{ +- struct runtime_data *prtd = substream->runtime->private_data; +- int ret = 0; +- +- pr_debug("Entered %s\n", __func__); +- +- /* return if this is a bufferless transfer e.g. +- * codec <--> BT codec or GSM modem -- lg FIXME */ +- if (!prtd->params) +- return 0; +- +- /* flush the DMA channel */ +- prtd->params->ops->flush(prtd->params->ch); +- +- prtd->dma_loaded = 0; +- prtd->dma_pos = prtd->dma_start; +- +- /* enqueue dma buffers */ +- dma_enqueue(substream); +- +- return ret; +-} +- +-static int dma_trigger(struct snd_pcm_substream *substream, int cmd) +-{ +- struct runtime_data *prtd = substream->runtime->private_data; +- int ret = 0; +- +- pr_debug("Entered %s\n", __func__); +- +- spin_lock(&prtd->lock); +- +- switch (cmd) { +- case SNDRV_PCM_TRIGGER_START: +- prtd->state |= ST_RUNNING; +- prtd->params->ops->trigger(prtd->params->ch); +- break; +- +- case SNDRV_PCM_TRIGGER_STOP: +- prtd->state &= ~ST_RUNNING; +- prtd->params->ops->stop(prtd->params->ch); +- break; +- +- default: +- ret = -EINVAL; +- break; +- } +- +- spin_unlock(&prtd->lock); +- +- return ret; +-} +- +-static snd_pcm_uframes_t +-dma_pointer(struct snd_pcm_substream *substream) +-{ +- struct snd_pcm_runtime *runtime = substream->runtime; +- struct runtime_data *prtd = runtime->private_data; +- unsigned long res; +- +- pr_debug("Entered %s\n", __func__); +- +- res = prtd->dma_pos - prtd->dma_start; +- +- pr_debug("Pointer offset: %lu\n", res); +- +- /* we seem to be getting the odd error from the pcm library due +- * to out-of-bounds pointers. this is maybe due to the dma engine +- * not having loaded the new values for the channel before being +- * called... (todo - fix ) +- */ +- +- if (res >= snd_pcm_lib_buffer_bytes(substream)) { +- if (res == snd_pcm_lib_buffer_bytes(substream)) +- res = 0; +- } +- +- return bytes_to_frames(substream->runtime, res); +-} +- +-static int dma_open(struct snd_pcm_substream *substream) +-{ +- struct snd_pcm_runtime *runtime = substream->runtime; +- struct runtime_data *prtd; +- +- pr_debug("Entered %s\n", __func__); +- +- snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); +- snd_soc_set_runtime_hwparams(substream, &dma_hardware); +- +- prtd = kzalloc(sizeof(struct runtime_data), GFP_KERNEL); +- if (prtd == NULL) +- return -ENOMEM; +- +- spin_lock_init(&prtd->lock); +- +- runtime->private_data = prtd; +- return 0; +-} +- +-static int dma_close(struct snd_pcm_substream *substream) +-{ +- struct snd_pcm_runtime *runtime = substream->runtime; +- struct runtime_data *prtd = runtime->private_data; +- +- pr_debug("Entered %s\n", __func__); +- +- if (!prtd) +- pr_debug("dma_close called with prtd == NULL\n"); +- +- kfree(prtd); +- +- return 0; +-} +- +-static int dma_mmap(struct snd_pcm_substream *substream, +- struct vm_area_struct *vma) +-{ +- struct snd_pcm_runtime *runtime = substream->runtime; +- +- pr_debug("Entered %s\n", __func__); +- +- return dma_mmap_writecombine(substream->pcm->card->dev, vma, +- runtime->dma_area, +- runtime->dma_addr, +- runtime->dma_bytes); +-} +- +-static struct snd_pcm_ops dma_ops = { +- .open = dma_open, +- .close = dma_close, +- .ioctl = snd_pcm_lib_ioctl, +- .hw_params = dma_hw_params, +- .hw_free = dma_hw_free, +- .prepare = dma_prepare, +- .trigger = dma_trigger, +- .pointer = dma_pointer, +- .mmap = dma_mmap, +-}; +- +-static int preallocate_dma_buffer(struct snd_pcm *pcm, int stream) +-{ +- struct snd_pcm_substream *substream = pcm->streams[stream].substream; +- struct snd_dma_buffer *buf = &substream->dma_buffer; +- size_t size = dma_hardware.buffer_bytes_max; +- +- pr_debug("Entered %s\n", __func__); +- +- buf->dev.type = SNDRV_DMA_TYPE_DEV; +- buf->dev.dev = pcm->card->dev; +- buf->private_data = NULL; +- buf->area = dma_alloc_writecombine(pcm->card->dev, size, +- &buf->addr, GFP_KERNEL); +- if (!buf->area) +- return -ENOMEM; +- buf->bytes = size; +- return 0; +-} +- +-static void dma_free_dma_buffers(struct snd_pcm *pcm) +-{ +- struct snd_pcm_substream *substream; +- struct snd_dma_buffer *buf; +- int stream; +- +- pr_debug("Entered %s\n", __func__); +- +- for (stream = 0; stream < 2; stream++) { +- substream = pcm->streams[stream].substream; +- if (!substream) +- continue; +- +- buf = &substream->dma_buffer; +- if (!buf->area) +- continue; +- +- dma_free_writecombine(pcm->card->dev, buf->bytes, +- buf->area, buf->addr); +- buf->area = NULL; +- } +-} +- +-static int dma_new(struct snd_soc_pcm_runtime *rtd) +-{ +- struct snd_card *card = rtd->card->snd_card; +- struct snd_pcm *pcm = rtd->pcm; +- int ret; +- +- pr_debug("Entered %s\n", __func__); +- +- ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); +- if (ret) +- return ret; +- +- if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { +- ret = preallocate_dma_buffer(pcm, +- SNDRV_PCM_STREAM_PLAYBACK); +- if (ret) +- goto out; +- } +- +- if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream) { +- ret = preallocate_dma_buffer(pcm, +- SNDRV_PCM_STREAM_CAPTURE); +- if (ret) +- goto out; +- } +-out: +- return ret; +-} +- +-static struct snd_soc_platform_driver samsung_asoc_platform = { +- .ops = &dma_ops, +- .pcm_new = dma_new, +- .pcm_free = dma_free_dma_buffers, +-}; +- +-void samsung_asoc_init_dma_data(struct snd_soc_dai *dai, +- struct s3c_dma_params *playback, +- struct s3c_dma_params *capture) +-{ +- snd_soc_dai_init_dma_data(dai, playback, capture); +-} +-EXPORT_SYMBOL_GPL(samsung_asoc_init_dma_data); +- +-int samsung_asoc_dma_platform_register(struct device *dev) +-{ +- return snd_soc_register_platform(dev, &samsung_asoc_platform); +-} +-EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_register); +- +-void samsung_asoc_dma_platform_unregister(struct device *dev) +-{ +- snd_soc_unregister_platform(dev); +-} +-EXPORT_SYMBOL_GPL(samsung_asoc_dma_platform_unregister); +- +-MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>"); +-MODULE_DESCRIPTION("Samsung ASoC DMA Driver"); +-MODULE_LICENSE("GPL"); +-- +1.9.3 + |