From 2f7c68cb55ecb7331f2381deb497c27155f32faf Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 03 Jan 2024 09:43:39 +0000 Subject: [PATCH] update kernel to 5.10.198 --- kernel/sound/soc/rockchip/rockchip_dlp.h | 128 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 117 insertions(+), 11 deletions(-) diff --git a/kernel/sound/soc/rockchip/rockchip_dlp.h b/kernel/sound/soc/rockchip/rockchip_dlp.h index 6235482..e3c6d24 100644 --- a/kernel/sound/soc/rockchip/rockchip_dlp.h +++ b/kernel/sound/soc/rockchip/rockchip_dlp.h @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: GPL-2.0 */ +/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Rockchip DLP (Digital Loopback) driver * @@ -10,19 +10,125 @@ #ifndef _ROCKCHIP_DLP_H #define _ROCKCHIP_DLP_H -struct snd_dlp_config { - int (*get_fifo_count)(struct device *dev, int stream); +#include "rockchip_dlp_pcm.h" + +#define DLP_MAX_DRDS 8 + +/* MUST: enum dlp_mode should be match to dlp_text */ +enum dlp_mode { + DLP_MODE_DISABLED, + DLP_MODE_2CH_1LP_1MIC, /* replace cap-ch-0 with play-ch-0 */ + DLP_MODE_2CH_1MIC_1LP, /* replace cap-ch-1 with play-ch-1 */ + DLP_MODE_2CH_1MIC_1LP_MIX, /* replace cap-ch-1 with play-ch-all-mix */ + DLP_MODE_2CH_2LP, /* replace cap-ch-0~1 with play-ch-0~1 */ + DLP_MODE_4CH_2MIC_2LP, /* replace cap-ch-2~3 with play-ch-0~1 */ + DLP_MODE_4CH_2MIC_1LP_MIX, /* replace cap-ch-3 with play-ch-all-mix */ + DLP_MODE_4CH_4LP, /* replace cap-ch-0~3 with play-ch-0~3 */ + DLP_MODE_6CH_4MIC_2LP, /* replace cap-ch-4~5 with play-ch-0~1 */ + DLP_MODE_6CH_4MIC_1LP_MIX, /* replace cap-ch-4 with play-ch-all-mix */ + DLP_MODE_6CH_6LP, /* replace cap-ch-0~5 with play-ch-0~5 */ + DLP_MODE_8CH_6MIC_2LP, /* replace cap-ch-6~7 with play-ch-0~1 */ + DLP_MODE_8CH_6MIC_1LP_MIX, /* replace cap-ch-6 with play-ch-all-mix */ + DLP_MODE_8CH_8LP, /* replace cap-ch-0~7 with play-ch-0~7 */ + DLP_MODE_10CH_8MIC_2LP, /* replace cap-ch-8~9 with play-ch-0~1 */ + DLP_MODE_10CH_8MIC_1LP_MIX, /* replace cap-ch-8 with play-ch-all-mix */ + DLP_MODE_16CH_8MIC_8LP, /* replace cap-ch-8~f with play-ch-8~f */ }; -#if IS_REACHABLE(CONFIG_SND_SOC_ROCKCHIP_DLP) -int devm_snd_dmaengine_dlp_register(struct device *dev, - const struct snd_dlp_config *config); -#else -static inline int devm_snd_dmaengine_dlp_register(struct device *dev, - const struct snd_dlp_config *config) +struct dlp; + +struct dlp_runtime_data { + struct dlp *parent; + struct kref refcount; + struct list_head node; + char *buf; + snd_pcm_uframes_t buf_sz; + snd_pcm_uframes_t last_buf_sz; + snd_pcm_uframes_t period_sz; + int64_t hw_ptr; + int64_t hw_ptr_delta; /* play-ptr - cap-ptr */ + atomic64_t period_elapsed; + atomic_t stop; + unsigned int frame_bytes; + unsigned int channels; + unsigned int buf_ofs; + int stream; +}; + +struct dlp { + struct device *dev; + struct list_head drd_avl_list; + struct list_head drd_rdy_list; + struct list_head drd_ref_list; + struct dlp_runtime_data drds[DLP_MAX_DRDS]; + struct dlp_runtime_data *drd_pb_shadow; + struct snd_soc_component component; + const struct snd_dlp_config *config; + enum dlp_mode mode; + int drd_avl_count; + atomic_t active; + spinlock_t lock; +}; + +typedef snd_pcm_uframes_t (*dma_pointer_f)(struct snd_soc_component *component, + struct snd_pcm_substream *substream); + +static inline struct dlp *soc_component_to_dlp(struct snd_soc_component *p) { - return -ENOSYS; + return container_of(p, struct dlp, component); } -#endif + +static inline struct dlp_runtime_data *substream_to_drd( + const struct snd_pcm_substream *substream) +{ + if (!substream->runtime) + return NULL; + + return substream->runtime->private_data; +} + +static inline ssize_t dlp_channels_to_bytes(struct dlp_runtime_data *drd, + int channels) +{ + return (drd->frame_bytes / drd->channels) * channels; +} + +static inline ssize_t dlp_frames_to_bytes(struct dlp_runtime_data *drd, + snd_pcm_sframes_t size) +{ + return size * drd->frame_bytes; +} + +static inline snd_pcm_sframes_t dlp_bytes_to_frames(struct dlp_runtime_data *drd, + ssize_t size) +{ + return size / drd->frame_bytes; +} + +void dlp_dma_complete(struct dlp *dlp, struct dlp_runtime_data *drd); +int dlp_open(struct dlp *dlp, struct dlp_runtime_data *drd, + struct snd_pcm_substream *substream); +int dlp_close(struct dlp *dlp, struct dlp_runtime_data *drd, + struct snd_pcm_substream *substream); +int dlp_hw_params(struct snd_soc_component *component, + struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params); +int dlp_start(struct snd_soc_component *component, + struct snd_pcm_substream *substream, + struct device *dev, + dma_pointer_f dma_pointer); +void dlp_stop(struct snd_soc_component *component, + struct snd_pcm_substream *substream, + dma_pointer_f dma_pointer); +int dlp_copy_user(struct snd_soc_component *component, + struct snd_pcm_substream *substream, + int channel, unsigned long hwoff, + void __user *buf, unsigned long bytes); +int dlp_prepare(struct snd_soc_component *component, + struct snd_pcm_substream *substream); +int dlp_probe(struct snd_soc_component *component); +int dlp_register(struct dlp *dlp, struct device *dev, + const struct snd_soc_component_driver *driver, + const struct snd_dlp_config *config); #endif -- Gitblit v1.6.2