Linux Audio
Check our new training course
Embedded Linux Audio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
/* SPDX-License-Identifier: GPL-2.0 */ /* * mtk-base-afe.h -- Mediatek base afe structure * * Copyright (c) 2016 MediaTek Inc. * Author: Garlic Tseng <garlic.tseng@mediatek.com> */ #ifndef _MTK_BASE_AFE_H_ #define _MTK_BASE_AFE_H_ #define MTK_STREAM_NUM (SNDRV_PCM_STREAM_LAST + 1) struct mtk_base_memif_data { int id; const char *name; int reg_ofs_base; int reg_ofs_cur; int reg_ofs_end; int reg_ofs_base_msb; int reg_ofs_cur_msb; int reg_ofs_end_msb; int fs_reg; int fs_shift; int fs_maskbit; int mono_reg; int mono_shift; int mono_invert; int quad_ch_reg; int quad_ch_mask; int quad_ch_shift; int enable_reg; int enable_shift; int hd_reg; int hd_shift; int hd_align_reg; int hd_align_mshift; int msb_reg; int msb_shift; int msb2_reg; int msb2_shift; int agent_disable_reg; int agent_disable_shift; /* playback memif only */ int pbuf_reg; int pbuf_mask; int pbuf_shift; int minlen_reg; int minlen_mask; int minlen_shift; }; struct mtk_base_irq_data { int id; int irq_cnt_reg; int irq_cnt_shift; int irq_cnt_maskbit; int irq_fs_reg; int irq_fs_shift; int irq_fs_maskbit; int irq_en_reg; int irq_en_shift; int irq_clr_reg; int irq_clr_shift; }; struct device; struct list_head; struct mtk_base_afe_memif; struct mtk_base_afe_irq; struct mtk_base_afe_dai; struct regmap; struct snd_pcm_substream; struct snd_soc_dai; struct mtk_base_afe { void __iomem *base_addr; struct device *dev; struct regmap *regmap; struct mutex irq_alloc_lock; /* dynamic alloc irq lock */ unsigned int const *reg_back_up_list; unsigned int *reg_back_up; unsigned int reg_back_up_list_num; int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); bool suspended; struct mtk_base_afe_memif *memif; int memif_size; struct mtk_base_afe_irq *irqs; int irqs_size; int memif_32bit_supported; struct list_head sub_dais; struct snd_soc_dai_driver *dai_drivers; unsigned int num_dai_drivers; const struct snd_pcm_hardware *mtk_afe_hardware; int (*memif_fs)(struct snd_pcm_substream *substream, unsigned int rate); int (*irq_fs)(struct snd_pcm_substream *substream, unsigned int rate); int (*get_dai_fs)(struct mtk_base_afe *afe, int dai_id, unsigned int rate); int (*get_memif_pbuf_size)(struct snd_pcm_substream *substream); int (*request_dram_resource)(struct device *dev); int (*release_dram_resource)(struct device *dev); void *platform_priv; }; struct mtk_base_afe_memif { unsigned int phys_buf_addr; int buffer_size; struct snd_pcm_substream *substream; const struct mtk_base_memif_data *data; int irq_usage; int const_irq; unsigned char *dma_area; dma_addr_t dma_addr; size_t dma_bytes; }; struct mtk_base_afe_irq { const struct mtk_base_irq_data *irq_data; int irq_occupyed; }; struct mtk_base_afe_dai { struct snd_soc_dai_driver *dai_drivers; unsigned int num_dai_drivers; const struct snd_kcontrol_new *controls; unsigned int num_controls; const struct snd_soc_dapm_widget *dapm_widgets; unsigned int num_dapm_widgets; const struct snd_soc_dapm_route *dapm_routes; unsigned int num_dapm_routes; struct list_head list; }; #endif