summaryrefslogtreecommitdiff
path: root/snd-alpx/core/generic/4.19
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2024-05-10 18:52:23 (GMT)
committerChristian Pointner <equinox@helsinki.at>2024-05-10 18:52:23 (GMT)
commita641800acf13b5fb1463d4280c3ee7fc267143fb (patch)
tree248b647a682f71d9eb90d14d24081368ea905a42 /snd-alpx/core/generic/4.19
parentcc4badffe0e02d159c21eb90ea080a6a2f90cb4b (diff)
import whole driver package
Diffstat (limited to 'snd-alpx/core/generic/4.19')
-rwxr-xr-xsnd-alpx/core/generic/4.19/dmaengine_pcm.h163
-rw-r--r--snd-alpx/core/generic/4.19/internal.h297
-rwxr-xr-xsnd-alpx/core/generic/4.19/pcm_dmaengine.c383
-rw-r--r--snd-alpx/core/generic/4.19/regmap-mmio.c399
4 files changed, 0 insertions, 1242 deletions
diff --git a/snd-alpx/core/generic/4.19/dmaengine_pcm.h b/snd-alpx/core/generic/4.19/dmaengine_pcm.h
deleted file mode 100755
index 2c4cfaa..0000000
--- a/snd-alpx/core/generic/4.19/dmaengine_pcm.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+
- *
- * Copyright (C) 2012, Analog Devices Inc.
- * Author: Lars-Peter Clausen <lars@metafoo.de>
- */
-
-#ifndef __SOUND_DMAENGINE_PCM_H__
-#define __SOUND_DMAENGINE_PCM_H__
-
-#include <sound/pcm.h>
-#include <sound/soc.h>
-#include <linux/dmaengine.h>
-
-/**
- * snd_pcm_substream_to_dma_direction - Get dma_transfer_direction for a PCM
- * substream
- * @substream: PCM substream
- */
-static inline enum dma_transfer_direction
-snd_pcm_substream_to_dma_direction(const struct snd_pcm_substream *substream)
-{
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
- return DMA_MEM_TO_DEV;
- else
- return DMA_DEV_TO_MEM;
-}
-
-int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream,
- const struct snd_pcm_hw_params *params, struct dma_slave_config *slave_config);
-int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd);
-snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream);
-snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream *substream);
-
-int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
- struct dma_chan *chan);
-int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream);
-
-int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
- dma_filter_fn filter_fn, void *filter_data);
-int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream);
-
-struct dma_chan *snd_dmaengine_pcm_request_channel(dma_filter_fn filter_fn,
- void *filter_data);
-struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream);
-
-/*
- * The DAI supports packed transfers, eg 2 16-bit samples in a 32-bit word.
- * If this flag is set the dmaengine driver won't put any restriction on
- * the supported sample formats and set the DMA transfer size to undefined.
- * The DAI driver is responsible to disable any unsupported formats in it's
- * configuration and catch corner cases that are not already handled in
- * the ALSA core.
- */
-#define SND_DMAENGINE_PCM_DAI_FLAG_PACK BIT(0)
-
-/**
- * struct snd_dmaengine_dai_dma_data - DAI DMA configuration data
- * @addr: Address of the DAI data source or destination register.
- * @addr_width: Width of the DAI data source or destination register.
- * @maxburst: Maximum number of words(note: words, as in units of the
- * src_addr_width member, not bytes) that can be send to or received from the
- * DAI in one burst.
- * @slave_id: Slave requester id for the DMA channel.
- * @filter_data: Custom DMA channel filter data, this will usually be used when
- * requesting the DMA channel.
- * @chan_name: Custom channel name to use when requesting DMA channel.
- * @fifo_size: FIFO size of the DAI controller in bytes
- * @flags: PCM_DAI flags, only SND_DMAENGINE_PCM_DAI_FLAG_PACK for now
- */
-struct snd_dmaengine_dai_dma_data {
- dma_addr_t addr;
- enum dma_slave_buswidth addr_width;
- u32 maxburst;
- unsigned int slave_id;
- void *filter_data;
- const char *chan_name;
- unsigned int fifo_size;
- unsigned int flags;
-};
-
-void snd_dmaengine_pcm_set_config_from_dai_data(
- const struct snd_pcm_substream *substream,
- const struct snd_dmaengine_dai_dma_data *dma_data,
- struct dma_slave_config *config);
-
-
-/*
- * Try to request the DMA channel using compat_request_channel or
- * compat_filter_fn if it couldn't be requested through devicetree.
- */
-#define SND_DMAENGINE_PCM_FLAG_COMPAT BIT(0)
-/*
- * Don't try to request the DMA channels through devicetree. This flag only
- * makes sense if SND_DMAENGINE_PCM_FLAG_COMPAT is set as well.
- */
-#define SND_DMAENGINE_PCM_FLAG_NO_DT BIT(1)
-/*
- * The PCM is half duplex and the DMA channel is shared between capture and
- * playback.
- */
-#define SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX BIT(3)
-/*
- * The PCM streams have custom channel names specified.
- */
-#define SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME BIT(4)
-
-/**
- * struct snd_dmaengine_pcm_config - Configuration data for dmaengine based PCM
- * @prepare_slave_config: Callback used to fill in the DMA slave_config for a
- * PCM substream. Will be called from the PCM drivers hwparams callback.
- * @compat_request_channel: Callback to request a DMA channel for platforms
- * which do not use devicetree.
- * @process: Callback used to apply processing on samples transferred from/to
- * user space.
- * @compat_filter_fn: Will be used as the filter function when requesting a
- * channel for platforms which do not use devicetree. The filter parameter
- * will be the DAI's DMA data.
- * @dma_dev: If set, request DMA channel on this device rather than the DAI
- * device.
- * @chan_names: If set, these custom DMA channel names will be requested at
- * registration time.
- * @pcm_hardware: snd_pcm_hardware struct to be used for the PCM.
- * @prealloc_buffer_size: Size of the preallocated audio buffer.
- *
- * Note: If both compat_request_channel and compat_filter_fn are set
- * compat_request_channel will be used to request the channel and
- * compat_filter_fn will be ignored. Otherwise the channel will be requested
- * using dma_request_channel with compat_filter_fn as the filter function.
- */
-struct snd_dmaengine_pcm_config {
- int (*prepare_slave_config)(struct snd_pcm_substream *substream,
- struct snd_pcm_hw_params *params,
- struct dma_slave_config *slave_config);
- struct dma_chan *(*compat_request_channel)(
- struct snd_soc_pcm_runtime *rtd,
- struct snd_pcm_substream *substream);
- int (*process)(struct snd_pcm_substream *substream,
- int channel, unsigned long hwoff,
- void *buf, unsigned long bytes);
- dma_filter_fn compat_filter_fn;
- struct device *dma_dev;
- const char *chan_names[SNDRV_PCM_STREAM_LAST + 1];
-
- const struct snd_pcm_hardware *pcm_hardware;
- unsigned int prealloc_buffer_size;
-};
-
-int snd_dmaengine_pcm_register(struct device *dev,
- const struct snd_dmaengine_pcm_config *config,
- unsigned int flags);
-void snd_dmaengine_pcm_unregister(struct device *dev);
-
-int devm_snd_dmaengine_pcm_register(struct device *dev,
- const struct snd_dmaengine_pcm_config *config,
- unsigned int flags);
-
-int snd_dmaengine_pcm_prepare_slave_config(struct snd_pcm_substream *substream,
- struct snd_pcm_hw_params *params,
- struct dma_slave_config *slave_config);
-
-#define SND_DMAENGINE_PCM_DRV_NAME "snd_dmaengine_pcm"
-
-#endif
diff --git a/snd-alpx/core/generic/4.19/internal.h b/snd-alpx/core/generic/4.19/internal.h
deleted file mode 100644
index a6bf34d..0000000
--- a/snd-alpx/core/generic/4.19/internal.h
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Register map access API internal header
- *
- * Copyright 2011 Wolfson Microelectronics plc
- *
- * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef _REGMAP_INTERNAL_H
-#define _REGMAP_INTERNAL_H
-
-#include <linux/device.h>
-#include <linux/regmap.h>
-#include <linux/fs.h>
-#include <linux/list.h>
-#include <linux/wait.h>
-
-struct regmap;
-struct regcache_ops;
-
-struct regmap_debugfs_off_cache {
- struct list_head list;
- off_t min;
- off_t max;
- unsigned int base_reg;
- unsigned int max_reg;
-};
-
-struct regmap_format {
- size_t buf_size;
- size_t reg_bytes;
- size_t pad_bytes;
- size_t val_bytes;
- void (*format_write)(struct regmap *map,
- unsigned int reg, unsigned int val);
- void (*format_reg)(void *buf, unsigned int reg, unsigned int shift);
- void (*format_val)(void *buf, unsigned int val, unsigned int shift);
- unsigned int (*parse_val)(const void *buf);
- void (*parse_inplace)(void *buf);
-};
-
-struct regmap_async {
- struct list_head list;
- struct regmap *map;
- void *work_buf;
-};
-
-struct regmap {
- union {
- struct mutex mutex;
- struct {
- spinlock_t spinlock;
- unsigned long spinlock_flags;
- };
- };
- regmap_lock lock;
- regmap_unlock unlock;
- void *lock_arg; /* This is passed to lock/unlock functions */
- gfp_t alloc_flags;
-
- struct device *dev; /* Device we do I/O on */
- void *work_buf; /* Scratch buffer used to format I/O */
- struct regmap_format format; /* Buffer format */
- const struct regmap_bus *bus;
- void *bus_context;
- const char *name;
-
- bool async;
- spinlock_t async_lock;
- wait_queue_head_t async_waitq;
- struct list_head async_list;
- struct list_head async_free;
- int async_ret;
-
-#ifdef CONFIG_DEBUG_FS
- bool debugfs_disable;
- struct dentry *debugfs;
- const char *debugfs_name;
-
- unsigned int debugfs_reg_len;
- unsigned int debugfs_val_len;
- unsigned int debugfs_tot_len;
-
- struct list_head debugfs_off_cache;
- struct mutex cache_lock;
-#endif
-
- unsigned int max_register;
- bool (*writeable_reg)(struct device *dev, unsigned int reg);
- bool (*readable_reg)(struct device *dev, unsigned int reg);
- bool (*volatile_reg)(struct device *dev, unsigned int reg);
- bool (*precious_reg)(struct device *dev, unsigned int reg);
- bool (*readable_noinc_reg)(struct device *dev, unsigned int reg);
- const struct regmap_access_table *wr_table;
- const struct regmap_access_table *rd_table;
- const struct regmap_access_table *volatile_table;
- const struct regmap_access_table *precious_table;
- const struct regmap_access_table *rd_noinc_table;
-
- int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
- int (*reg_write)(void *context, unsigned int reg, unsigned int val);
- int (*reg_update_bits)(void *context, unsigned int reg,
- unsigned int mask, unsigned int val);
-
- bool defer_caching;
-
- unsigned long read_flag_mask;
- unsigned long write_flag_mask;
-
- /* number of bits to (left) shift the reg value when formatting*/
- int reg_shift;
- int reg_stride;
- int reg_stride_order;
-
- /* regcache specific members */
- const struct regcache_ops *cache_ops;
- enum regcache_type cache_type;
-
- /* number of bytes in reg_defaults_raw */
- unsigned int cache_size_raw;
- /* number of bytes per word in reg_defaults_raw */
- unsigned int cache_word_size;
- /* number of entries in reg_defaults */
- unsigned int num_reg_defaults;
- /* number of entries in reg_defaults_raw */
- unsigned int num_reg_defaults_raw;
-
- /* if set, only the cache is modified not the HW */
- bool cache_only;
- /* if set, only the HW is modified not the cache */
- bool cache_bypass;
- /* if set, remember to free reg_defaults_raw */
- bool cache_free;
-
- struct reg_default *reg_defaults;
- const void *reg_defaults_raw;
- void *cache;
- /* if set, the cache contains newer data than the HW */
- bool cache_dirty;
- /* if set, the HW registers are known to match map->reg_defaults */
- bool no_sync_defaults;
-
- struct reg_sequence *patch;
- int patch_regs;
-
- /* if set, converts bulk read to single read */
- bool use_single_read;
- /* if set, converts bulk read to single read */
- bool use_single_write;
- /* if set, the device supports multi write mode */
- bool can_multi_write;
-
- /* if set, raw reads/writes are limited to this size */
- size_t max_raw_read;
- size_t max_raw_write;
-
- struct rb_root range_tree;
- void *selector_work_buf; /* Scratch buffer used for selector */
-
- struct hwspinlock *hwlock;
-};
-
-struct regcache_ops {
- const char *name;
- enum regcache_type type;
- int (*init)(struct regmap *map);
- int (*exit)(struct regmap *map);
-#ifdef CONFIG_DEBUG_FS
- void (*debugfs_init)(struct regmap *map);
-#endif
- int (*read)(struct regmap *map, unsigned int reg, unsigned int *value);
- int (*write)(struct regmap *map, unsigned int reg, unsigned int value);
- int (*sync)(struct regmap *map, unsigned int min, unsigned int max);
- int (*drop)(struct regmap *map, unsigned int min, unsigned int max);
-};
-
-bool regmap_cached(struct regmap *map, unsigned int reg);
-bool regmap_writeable(struct regmap *map, unsigned int reg);
-bool regmap_readable(struct regmap *map, unsigned int reg);
-bool regmap_volatile(struct regmap *map, unsigned int reg);
-bool regmap_precious(struct regmap *map, unsigned int reg);
-bool regmap_readable_noinc(struct regmap *map, unsigned int reg);
-
-int _regmap_write(struct regmap *map, unsigned int reg,
- unsigned int val);
-
-struct regmap_range_node {
- struct rb_node node;
- const char *name;
- struct regmap *map;
-
- unsigned int range_min;
- unsigned int range_max;
-
- unsigned int selector_reg;
- unsigned int selector_mask;
- int selector_shift;
-
- unsigned int window_start;
- unsigned int window_len;
-};
-
-struct regmap_field {
- struct regmap *regmap;
- unsigned int mask;
- /* lsb */
- unsigned int shift;
- unsigned int reg;
-
- unsigned int id_size;
- unsigned int id_offset;
-};
-
-#ifdef CONFIG_DEBUG_FS
-extern void regmap_debugfs_initcall(void);
-extern void regmap_debugfs_init(struct regmap *map, const char *name);
-extern void regmap_debugfs_exit(struct regmap *map);
-
-static inline void regmap_debugfs_disable(struct regmap *map)
-{
- map->debugfs_disable = true;
-}
-
-#else
-static inline void regmap_debugfs_initcall(void) { }
-static inline void regmap_debugfs_init(struct regmap *map, const char *name) { }
-static inline void regmap_debugfs_exit(struct regmap *map) { }
-static inline void regmap_debugfs_disable(struct regmap *map) { }
-#endif
-
-/* regcache core declarations */
-int regcache_init(struct regmap *map, const struct regmap_config *config);
-void regcache_exit(struct regmap *map);
-int regcache_read(struct regmap *map,
- unsigned int reg, unsigned int *value);
-int regcache_write(struct regmap *map,
- unsigned int reg, unsigned int value);
-int regcache_sync(struct regmap *map);
-int regcache_sync_block(struct regmap *map, void *block,
- unsigned long *cache_present,
- unsigned int block_base, unsigned int start,
- unsigned int end);
-
-static inline const void *regcache_get_val_addr(struct regmap *map,
- const void *base,
- unsigned int idx)
-{
- return base + (map->cache_word_size * idx);
-}
-
-unsigned int regcache_get_val(struct regmap *map, const void *base,
- unsigned int idx);
-bool regcache_set_val(struct regmap *map, void *base, unsigned int idx,
- unsigned int val);
-int regcache_lookup_reg(struct regmap *map, unsigned int reg);
-
-int _regmap_raw_write(struct regmap *map, unsigned int reg,
- const void *val, size_t val_len);
-
-void regmap_async_complete_cb(struct regmap_async *async, int ret);
-
-enum regmap_endian regmap_get_val_endian(struct device *dev,
- const struct regmap_bus *bus,
- const struct regmap_config *config);
-
-extern struct regcache_ops regcache_rbtree_ops;
-extern struct regcache_ops regcache_lzo_ops;
-extern struct regcache_ops regcache_flat_ops;
-
-static inline const char *regmap_name(const struct regmap *map)
-{
- if (map->dev)
- return dev_name(map->dev);
-
- return map->name;
-}
-
-static inline unsigned int regmap_get_offset(const struct regmap *map,
- unsigned int index)
-{
- if (map->reg_stride_order >= 0)
- return index << map->reg_stride_order;
- else
- return index * map->reg_stride;
-}
-
-static inline unsigned int regcache_get_index_by_order(const struct regmap *map,
- unsigned int reg)
-{
- return reg >> map->reg_stride_order;
-}
-
-#endif
diff --git a/snd-alpx/core/generic/4.19/pcm_dmaengine.c b/snd-alpx/core/generic/4.19/pcm_dmaengine.c
deleted file mode 100755
index 6f6da11..0000000
--- a/snd-alpx/core/generic/4.19/pcm_dmaengine.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright (C) 2012, Analog Devices Inc.
- * Author: Lars-Peter Clausen <lars@metafoo.de>
- *
- * Based on:
- * imx-pcm-dma-mx2.c, Copyright 2009 Sascha Hauer <s.hauer@pengutronix.de>
- * mxs-pcm.c, Copyright (C) 2011 Freescale Semiconductor, Inc.
- * ep93xx-pcm.c, Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
- * Copyright (C) 2006 Applied Data Systems
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/dmaengine.h>
-#include <linux/slab.h>
-#include <sound/pcm.h>
-#include <sound/pcm_params.h>
-#include <sound/soc.h>
-
-#include <sound/dmaengine_pcm.h>
-
-struct dmaengine_pcm_runtime_data {
- struct dma_chan *dma_chan;
- dma_cookie_t cookie;
-
- unsigned int pos;
-};
-
-static inline struct dmaengine_pcm_runtime_data *substream_to_prtd(
- const struct snd_pcm_substream *substream)
-{
- return substream->runtime->private_data;
-}
-
-struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream)
-{
- struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
-
- return prtd->dma_chan;
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_get_chan);
-
-/**
- * snd_hwparams_to_dma_slave_config - Convert hw_params to dma_slave_config
- * @substream: PCM substream
- * @params: hw_params
- * @slave_config: DMA slave config
- *
- * This function can be used to initialize a dma_slave_config from a substream
- * and hw_params in a dmaengine based PCM driver implementation.
- */
-int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream,
- const struct snd_pcm_hw_params *params,
- struct dma_slave_config *slave_config)
-{
- enum dma_slave_buswidth buswidth;
- int bits;
-
- bits = params_physical_width(params);
- if (bits < 8 || bits > 64)
- return -EINVAL;
- else if (bits == 8)
- buswidth = DMA_SLAVE_BUSWIDTH_1_BYTE;
- else if (bits == 16)
- buswidth = DMA_SLAVE_BUSWIDTH_2_BYTES;
- else if (bits == 24)
- buswidth = DMA_SLAVE_BUSWIDTH_3_BYTES;
- else if (bits <= 32)
- buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;
- else
- buswidth = DMA_SLAVE_BUSWIDTH_8_BYTES;
-
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
- slave_config->direction = DMA_MEM_TO_DEV;
- slave_config->dst_addr_width = buswidth;
- } else {
- slave_config->direction = DMA_DEV_TO_MEM;
- slave_config->src_addr_width = buswidth;
- }
-
- slave_config->device_fc = false;
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(snd_hwparams_to_dma_slave_config);
-
-/**
- * snd_dmaengine_pcm_set_config_from_dai_data() - Initializes a dma slave config
- * using DAI DMA data.
- * @substream: PCM substream
- * @dma_data: DAI DMA data
- * @slave_config: DMA slave configuration
- *
- * Initializes the {dst,src}_addr, {dst,src}_maxburst, {dst,src}_addr_width and
- * slave_id fields of the DMA slave config from the same fields of the DAI DMA
- * data struct. The src and dst fields will be initialized depending on the
- * direction of the substream. If the substream is a playback stream the dst
- * fields will be initialized, if it is a capture stream the src fields will be
- * initialized. The {dst,src}_addr_width field will only be initialized if the
- * SND_DMAENGINE_PCM_DAI_FLAG_PACK flag is set or if the addr_width field of
- * the DAI DMA data struct is not equal to DMA_SLAVE_BUSWIDTH_UNDEFINED. If
- * both conditions are met the latter takes priority.
- */
-void snd_dmaengine_pcm_set_config_from_dai_data(
- const struct snd_pcm_substream *substream,
- const struct snd_dmaengine_dai_dma_data *dma_data,
- struct dma_slave_config *slave_config)
-{
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
- slave_config->dst_addr = dma_data->addr;
- slave_config->dst_maxburst = dma_data->maxburst;
- if (dma_data->flags & SND_DMAENGINE_PCM_DAI_FLAG_PACK)
- slave_config->dst_addr_width =
- DMA_SLAVE_BUSWIDTH_UNDEFINED;
- if (dma_data->addr_width != DMA_SLAVE_BUSWIDTH_UNDEFINED)
- slave_config->dst_addr_width = dma_data->addr_width;
- } else {
- slave_config->src_addr = dma_data->addr;
- slave_config->src_maxburst = dma_data->maxburst;
- if (dma_data->flags & SND_DMAENGINE_PCM_DAI_FLAG_PACK)
- slave_config->src_addr_width =
- DMA_SLAVE_BUSWIDTH_UNDEFINED;
- if (dma_data->addr_width != DMA_SLAVE_BUSWIDTH_UNDEFINED)
- slave_config->src_addr_width = dma_data->addr_width;
- }
-
- slave_config->slave_id = dma_data->slave_id;
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_set_config_from_dai_data);
-
-static void dmaengine_pcm_dma_complete(void *arg)
-{
- unsigned int new_pos;
- struct snd_pcm_substream *substream = arg;
- struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
-
- new_pos = prtd->pos + snd_pcm_lib_period_bytes(substream);
- if (new_pos >= snd_pcm_lib_buffer_bytes(substream))
- new_pos = 0;
- prtd->pos = new_pos;
-
- snd_pcm_period_elapsed(substream);
-}
-
-static int dmaengine_pcm_prepare_and_submit(struct snd_pcm_substream *substream)
-{
- struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
- struct dma_chan *chan = prtd->dma_chan;
- struct dma_async_tx_descriptor *desc;
- enum dma_transfer_direction direction;
- unsigned long flags = DMA_CTRL_ACK;
-
- direction = snd_pcm_substream_to_dma_direction(substream);
-
- if (!substream->runtime->no_period_wakeup)
- flags |= DMA_PREP_INTERRUPT;
-
- prtd->pos = 0;
- desc = dmaengine_prep_dma_cyclic(chan,
- substream->runtime->dma_addr,
- snd_pcm_lib_buffer_bytes(substream),
- snd_pcm_lib_period_bytes(substream), direction, flags);
-
- if (!desc)
- return -ENOMEM;
-
- desc->callback = dmaengine_pcm_dma_complete;
- desc->callback_param = substream;
- prtd->cookie = dmaengine_submit(desc);
-
- return 0;
-}
-
-/**
- * snd_dmaengine_pcm_trigger - dmaengine based PCM trigger implementation
- * @substream: PCM substream
- * @cmd: Trigger command
- *
- * Returns 0 on success, a negative error code otherwise.
- *
- * This function can be used as the PCM trigger callback for dmaengine based PCM
- * driver implementations.
- */
-int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-{
- struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
- struct snd_pcm_runtime *runtime = substream->runtime;
- int ret;
-
- switch (cmd) {
- case SNDRV_PCM_TRIGGER_START:
- ret = dmaengine_pcm_prepare_and_submit(substream);
- if (ret)
- return ret;
- dma_async_issue_pending(prtd->dma_chan);
- break;
- case SNDRV_PCM_TRIGGER_RESUME:
- case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
- dmaengine_resume(prtd->dma_chan);
- break;
- case SNDRV_PCM_TRIGGER_SUSPEND:
- if (runtime->info & SNDRV_PCM_INFO_PAUSE)
- dmaengine_pause(prtd->dma_chan);
- else
- dmaengine_terminate_async(prtd->dma_chan);
- break;
- case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
- dmaengine_pause(prtd->dma_chan);
- break;
- case SNDRV_PCM_TRIGGER_STOP:
- dmaengine_terminate_async(prtd->dma_chan);
- break;
- default:
- return -EINVAL;
- }
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_trigger);
-
-/**
- * snd_dmaengine_pcm_pointer_no_residue - dmaengine based PCM pointer implementation
- * @substream: PCM substream
- *
- * This function is deprecated and should not be used by new drivers, as its
- * results may be unreliable.
- */
-snd_pcm_uframes_t snd_dmaengine_pcm_pointer_no_residue(struct snd_pcm_substream *substream)
-{
- struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
- return bytes_to_frames(substream->runtime, prtd->pos);
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_pointer_no_residue);
-
-/**
- * snd_dmaengine_pcm_pointer - dmaengine based PCM pointer implementation
- * @substream: PCM substream
- *
- * This function can be used as the PCM pointer callback for dmaengine based PCM
- * driver implementations.
- */
-snd_pcm_uframes_t snd_dmaengine_pcm_pointer(struct snd_pcm_substream *substream)
-{
- struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
- struct dma_tx_state state;
- enum dma_status status;
- unsigned int buf_size;
- unsigned int pos = 0;
-
- status = dmaengine_tx_status(prtd->dma_chan, prtd->cookie, &state);
- if (status == DMA_IN_PROGRESS || status == DMA_PAUSED) {
- buf_size = snd_pcm_lib_buffer_bytes(substream);
- if (state.residue > 0 && state.residue <= buf_size)
- pos = buf_size - state.residue;
- }
-
- return bytes_to_frames(substream->runtime, pos);
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_pointer);
-
-/**
- * snd_dmaengine_pcm_request_channel - Request channel for the dmaengine PCM
- * @filter_fn: Filter function used to request the DMA channel
- * @filter_data: Data passed to the DMA filter function
- *
- * Returns NULL or the requested DMA channel.
- *
- * This function request a DMA channel for usage with dmaengine PCM.
- */
-struct dma_chan *snd_dmaengine_pcm_request_channel(dma_filter_fn filter_fn,
- void *filter_data)
-{
- dma_cap_mask_t mask;
-
- dma_cap_zero(mask);
- dma_cap_set(DMA_SLAVE, mask);
- dma_cap_set(DMA_CYCLIC, mask);
-
- return dma_request_channel(mask, filter_fn, filter_data);
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_request_channel);
-
-/**
- * snd_dmaengine_pcm_open - Open a dmaengine based PCM substream
- * @substream: PCM substream
- * @chan: DMA channel to use for data transfers
- *
- * Returns 0 on success, a negative error code otherwise.
- *
- * The function should usually be called from the pcm open callback. Note that
- * this function will use private_data field of the substream's runtime. So it
- * is not available to your pcm driver implementation.
- */
-int snd_dmaengine_pcm_open(struct snd_pcm_substream *substream,
- struct dma_chan *chan)
-{
- struct dmaengine_pcm_runtime_data *prtd;
- int ret;
-
- if (!chan)
- return -ENXIO;
-
- ret = snd_pcm_hw_constraint_integer(substream->runtime,
- SNDRV_PCM_HW_PARAM_PERIODS);
- if (ret < 0)
- return ret;
-
- prtd = kzalloc(sizeof(*prtd), GFP_KERNEL);
- if (!prtd)
- return -ENOMEM;
-
- prtd->dma_chan = chan;
-
- substream->runtime->private_data = prtd;
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open);
-
-/**
- * snd_dmaengine_pcm_open_request_chan - Open a dmaengine based PCM substream and request channel
- * @substream: PCM substream
- * @filter_fn: Filter function used to request the DMA channel
- * @filter_data: Data passed to the DMA filter function
- *
- * Returns 0 on success, a negative error code otherwise.
- *
- * This function will request a DMA channel using the passed filter function and
- * data. The function should usually be called from the pcm open callback. Note
- * that this function will use private_data field of the substream's runtime. So
- * it is not available to your pcm driver implementation.
- */
-int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
- dma_filter_fn filter_fn, void *filter_data)
-{
- return snd_dmaengine_pcm_open(substream,
- snd_dmaengine_pcm_request_channel(filter_fn, filter_data));
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan);
-
-/**
- * snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
- * @substream: PCM substream
- */
-int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
-{
- struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
-
- dmaengine_synchronize(prtd->dma_chan);
- kfree(prtd);
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close);
-
-/**
- * snd_dmaengine_pcm_release_chan_close - Close a dmaengine based PCM substream and release channel
- * @substream: PCM substream
- *
- * Releases the DMA channel associated with the PCM substream.
- */
-int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream)
-{
- struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
-
- dmaengine_synchronize(prtd->dma_chan);
- dma_release_channel(prtd->dma_chan);
- kfree(prtd);
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close_release_chan);
-
-MODULE_LICENSE("GPL");
diff --git a/snd-alpx/core/generic/4.19/regmap-mmio.c b/snd-alpx/core/generic/4.19/regmap-mmio.c
deleted file mode 100644
index d524815..0000000
--- a/snd-alpx/core/generic/4.19/regmap-mmio.c
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Register map access API - MMIO support
- *
- * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* Simple patch to embed this file in its user module */
-/* DISABLE the EXPORT_SYMBOL() macros */
-#undef CONFIG_MODULES
-#include <linux/export.h>
-/* Then re-enable the module support to include modle.h */
-#define CONFIG_MODULES
-
-
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/module.h>
-#include <linux/regmap.h>
-#include <linux/slab.h>
-
-#include "internal.h"
-
-struct regmap_mmio_context {
- void __iomem *regs;
- unsigned val_bytes;
-
- bool attached_clk;
- struct clk *clk;
-
- void (*reg_write)(struct regmap_mmio_context *ctx,
- unsigned int reg, unsigned int val);
- unsigned int (*reg_read)(struct regmap_mmio_context *ctx,
- unsigned int reg);
-};
-
-static int regmap_mmio_regbits_check(size_t reg_bits)
-{
- switch (reg_bits) {
- case 8:
- case 16:
- case 32:
-#ifdef CONFIG_64BIT
- case 64:
-#endif
- return 0;
- default:
- return -EINVAL;
- }
-}
-
-static int regmap_mmio_get_min_stride(size_t val_bits)
-{
- int min_stride;
-
- switch (val_bits) {
- case 8:
- /* The core treats 0 as 1 */
- min_stride = 0;
- return 0;
- case 16:
- min_stride = 2;
- break;
- case 32:
- min_stride = 4;
- break;
-#ifdef CONFIG_64BIT
- case 64:
- min_stride = 8;
- break;
-#endif
- default:
- return -EINVAL;
- }
-
- return min_stride;
-}
-
-static void regmap_mmio_write8(struct regmap_mmio_context *ctx,
- unsigned int reg,
- unsigned int val)
-{
- writeb(val, ctx->regs + reg);
-}
-
-static void regmap_mmio_write16le(struct regmap_mmio_context *ctx,
- unsigned int reg,
- unsigned int val)
-{
- writew(val, ctx->regs + reg);
-}
-
-static void regmap_mmio_write16be(struct regmap_mmio_context *ctx,
- unsigned int reg,
- unsigned int val)
-{
- iowrite16be(val, ctx->regs + reg);
-}
-
-static void regmap_mmio_write32le(struct regmap_mmio_context *ctx,
- unsigned int reg,
- unsigned int val)
-{
- writel(val, ctx->regs + reg);
-}
-
-static void regmap_mmio_write32be(struct regmap_mmio_context *ctx,
- unsigned int reg,
- unsigned int val)
-{
- iowrite32be(val, ctx->regs + reg);
-}
-
-#ifdef CONFIG_64BIT
-static void regmap_mmio_write64le(struct regmap_mmio_context *ctx,
- unsigned int reg,
- unsigned int val)
-{
- writeq(val, ctx->regs + reg);
-}
-#endif
-
-static int regmap_mmio_write(void *context, unsigned int reg, unsigned int val)
-{
- struct regmap_mmio_context *ctx = context;
- int ret;
-
- if (!IS_ERR(ctx->clk)) {
- ret = clk_enable(ctx->clk);
- if (ret < 0)
- return ret;
- }
-
- ctx->reg_write(ctx, reg, val);
-
- if (!IS_ERR(ctx->clk))
- clk_disable(ctx->clk);
-
- return 0;
-}
-
-static unsigned int regmap_mmio_read8(struct regmap_mmio_context *ctx,
- unsigned int reg)
-{
- return readb(ctx->regs + reg);
-}
-
-static unsigned int regmap_mmio_read16le(struct regmap_mmio_context *ctx,
- unsigned int reg)
-{
- return readw(ctx->regs + reg);
-}
-
-static unsigned int regmap_mmio_read16be(struct regmap_mmio_context *ctx,
- unsigned int reg)
-{
- return ioread16be(ctx->regs + reg);
-}
-
-static unsigned int regmap_mmio_read32le(struct regmap_mmio_context *ctx,
- unsigned int reg)
-{
- return readl(ctx->regs + reg);
-}
-
-static unsigned int regmap_mmio_read32be(struct regmap_mmio_context *ctx,
- unsigned int reg)
-{
- return ioread32be(ctx->regs + reg);
-}
-
-#ifdef CONFIG_64BIT
-static unsigned int regmap_mmio_read64le(struct regmap_mmio_context *ctx,
- unsigned int reg)
-{
- return readq(ctx->regs + reg);
-}
-#endif
-
-static int regmap_mmio_read(void *context, unsigned int reg, unsigned int *val)
-{
- struct regmap_mmio_context *ctx = context;
- int ret;
-
- if (!IS_ERR(ctx->clk)) {
- ret = clk_enable(ctx->clk);
- if (ret < 0)
- return ret;
- }
-
- *val = ctx->reg_read(ctx, reg);
-
- if (!IS_ERR(ctx->clk))
- clk_disable(ctx->clk);
-
- return 0;
-}
-
-static void regmap_mmio_free_context(void *context)
-{
- struct regmap_mmio_context *ctx = context;
-
- if (!IS_ERR(ctx->clk)) {
- clk_unprepare(ctx->clk);
- if (!ctx->attached_clk)
- clk_put(ctx->clk);
- }
- kfree(context);
-}
-
-static const struct regmap_bus regmap_mmio = {
- .fast_io = true,
- .reg_write = regmap_mmio_write,
- .reg_read = regmap_mmio_read,
- .free_context = regmap_mmio_free_context,
- .val_format_endian_default = REGMAP_ENDIAN_LITTLE,
-};
-
-static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
- const char *clk_id,
- void __iomem *regs,
- const struct regmap_config *config)
-{
- struct regmap_mmio_context *ctx;
- int min_stride;
- int ret;
-
- ret = regmap_mmio_regbits_check(config->reg_bits);
- if (ret)
- return ERR_PTR(ret);
-
- if (config->pad_bits)
- return ERR_PTR(-EINVAL);
-
- min_stride = regmap_mmio_get_min_stride(config->val_bits);
- if (min_stride < 0)
- return ERR_PTR(min_stride);
-
- if (config->reg_stride < min_stride)
- return ERR_PTR(-EINVAL);
-
- ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
- if (!ctx)
- return ERR_PTR(-ENOMEM);
-
- ctx->regs = regs;
- ctx->val_bytes = config->val_bits / 8;
- ctx->clk = ERR_PTR(-ENODEV);
-
- switch (regmap_get_val_endian(dev, &regmap_mmio, config)) {
- case REGMAP_ENDIAN_DEFAULT:
- case REGMAP_ENDIAN_LITTLE:
-#ifdef __LITTLE_ENDIAN
- case REGMAP_ENDIAN_NATIVE:
-#endif
- switch (config->val_bits) {
- case 8:
- ctx->reg_read = regmap_mmio_read8;
- ctx->reg_write = regmap_mmio_write8;
- break;
- case 16:
- ctx->reg_read = regmap_mmio_read16le;
- ctx->reg_write = regmap_mmio_write16le;
- break;
- case 32:
- ctx->reg_read = regmap_mmio_read32le;
- ctx->reg_write = regmap_mmio_write32le;
- break;
-#ifdef CONFIG_64BIT
- case 64:
- ctx->reg_read = regmap_mmio_read64le;
- ctx->reg_write = regmap_mmio_write64le;
- break;
-#endif
- default:
- ret = -EINVAL;
- goto err_free;
- }
- break;
- case REGMAP_ENDIAN_BIG:
-#ifdef __BIG_ENDIAN
- case REGMAP_ENDIAN_NATIVE:
-#endif
- switch (config->val_bits) {
- case 8:
- ctx->reg_read = regmap_mmio_read8;
- ctx->reg_write = regmap_mmio_write8;
- break;
- case 16:
- ctx->reg_read = regmap_mmio_read16be;
- ctx->reg_write = regmap_mmio_write16be;
- break;
- case 32:
- ctx->reg_read = regmap_mmio_read32be;
- ctx->reg_write = regmap_mmio_write32be;
- break;
- default:
- ret = -EINVAL;
- goto err_free;
- }
- break;
- default:
- ret = -EINVAL;
- goto err_free;
- }
-
- if (clk_id == NULL)
- return ctx;
-
- ctx->clk = clk_get(dev, clk_id);
- if (IS_ERR(ctx->clk)) {
- ret = PTR_ERR(ctx->clk);
- goto err_free;
- }
-
- ret = clk_prepare(ctx->clk);
- if (ret < 0) {
- clk_put(ctx->clk);
- goto err_free;
- }
-
- return ctx;
-
-err_free:
- kfree(ctx);
-
- return ERR_PTR(ret);
-}
-
-struct regmap *__regmap_init_mmio_clk(struct device *dev, const char *clk_id,
- void __iomem *regs,
- const struct regmap_config *config,
- struct lock_class_key *lock_key,
- const char *lock_name)
-{
- struct regmap_mmio_context *ctx;
-
- ctx = regmap_mmio_gen_context(dev, clk_id, regs, config);
- if (IS_ERR(ctx))
- return ERR_CAST(ctx);
-
- return __regmap_init(dev, &regmap_mmio, ctx, config,
- lock_key, lock_name);
-}
-EXPORT_SYMBOL_GPL(__regmap_init_mmio_clk);
-
-struct regmap *__devm_regmap_init_mmio_clk(struct device *dev,
- const char *clk_id,
- void __iomem *regs,
- const struct regmap_config *config,
- struct lock_class_key *lock_key,
- const char *lock_name)
-{
- struct regmap_mmio_context *ctx;
-
- ctx = regmap_mmio_gen_context(dev, clk_id, regs, config);
- if (IS_ERR(ctx))
- return ERR_CAST(ctx);
-
- return __devm_regmap_init(dev, &regmap_mmio, ctx, config,
- lock_key, lock_name);
-}
-EXPORT_SYMBOL_GPL(__devm_regmap_init_mmio_clk);
-
-int regmap_mmio_attach_clk(struct regmap *map, struct clk *clk)
-{
- struct regmap_mmio_context *ctx = map->bus_context;
-
- ctx->clk = clk;
- ctx->attached_clk = true;
-
- return clk_prepare(ctx->clk);
-}
-EXPORT_SYMBOL_GPL(regmap_mmio_attach_clk);
-
-void regmap_mmio_detach_clk(struct regmap *map)
-{
- struct regmap_mmio_context *ctx = map->bus_context;
-
- clk_unprepare(ctx->clk);
-
- ctx->attached_clk = false;
- ctx->clk = NULL;
-}
-EXPORT_SYMBOL_GPL(regmap_mmio_detach_clk);
-
-MODULE_LICENSE("GPL v2");