diff options
author | Christian Pointner <equinox@helsinki.at> | 2024-05-10 18:52:23 (GMT) |
---|---|---|
committer | Christian Pointner <equinox@helsinki.at> | 2024-05-10 18:52:23 (GMT) |
commit | a641800acf13b5fb1463d4280c3ee7fc267143fb (patch) | |
tree | 248b647a682f71d9eb90d14d24081368ea905a42 /snd-alpx/core/generic/4.19 | |
parent | cc4badffe0e02d159c21eb90ea080a6a2f90cb4b (diff) |
import whole driver package
Diffstat (limited to 'snd-alpx/core/generic/4.19')
-rwxr-xr-x | snd-alpx/core/generic/4.19/dmaengine_pcm.h | 163 | ||||
-rw-r--r-- | snd-alpx/core/generic/4.19/internal.h | 297 | ||||
-rwxr-xr-x | snd-alpx/core/generic/4.19/pcm_dmaengine.c | 383 | ||||
-rw-r--r-- | snd-alpx/core/generic/4.19/regmap-mmio.c | 399 |
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, ®map_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, ®map_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, ®map_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"); |