6262
6363#define DAI_NUM_SLOT_MAPS 8
6464
65+ #define DAI_INFO_TYPE 0
66+ #define DAI_INFO_DMA_CAPS 1
67+ #define DAI_INFO_DMA_DEV 2
68+
6569/* DAI flags */
6670
6771/** \brief IRQ used for copy() timer */
@@ -86,6 +90,13 @@ struct dai_ops {
8690 int (* remove )(struct dai * dai );
8791};
8892
93+ struct dai_driver {
94+ uint32_t type ; /**< type, one of SOF_DAI_... */
95+ uint32_t dma_caps ;
96+ uint32_t dma_dev ;
97+ struct dai_ops ops ;
98+ };
99+
89100/**
90101 * \brief DAI slot map to audio channel
91102 */
@@ -113,12 +124,11 @@ struct dai_plat_data {
113124};
114125
115126struct dai {
116- uint32_t type ; /**< type, one of SOF_DAI_... */
117127 uint32_t index ; /**< index */
118128 spinlock_t lock ;
119129 int sref ; /**< simple ref counter, guarded by lock */
120130 struct dai_plat_data plat_data ;
121- const struct dai_ops * ops ;
131+ const struct dai_driver * drv ;
122132 void * private ;
123133};
124134
@@ -174,47 +184,72 @@ void dai_put(struct dai *dai);
174184static inline int dai_set_config (struct dai * dai ,
175185 struct sof_ipc_dai_config * config )
176186{
177- return dai -> ops -> set_config (dai , config );
187+ return dai -> drv -> ops . set_config (dai , config );
178188}
179189
180190/**
181191 * \brief Digital Audio interface trigger
182192 */
183193static inline int dai_trigger (struct dai * dai , int cmd , int direction )
184194{
185- return dai -> ops -> trigger (dai , cmd , direction );
195+ return dai -> drv -> ops . trigger (dai , cmd , direction );
186196}
187197
188198/**
189199 * \brief Digital Audio interface PM context store
190200 */
191201static inline int dai_pm_context_store (struct dai * dai )
192202{
193- return dai -> ops -> pm_context_store (dai );
203+ return dai -> drv -> ops . pm_context_store (dai );
194204}
195205
196206/**
197207 * \brief Digital Audio interface PM context restore
198208 */
199209static inline int dai_pm_context_restore (struct dai * dai )
200210{
201- return dai -> ops -> pm_context_restore (dai );
211+ return dai -> drv -> ops . pm_context_restore (dai );
202212}
203213
204214/**
205215 * \brief Digital Audio interface Probe
206216 */
207217static inline int dai_probe (struct dai * dai )
208218{
209- return dai -> ops -> probe (dai );
219+ return dai -> drv -> ops . probe (dai );
210220}
211221
212222/**
213223 * \brief Digital Audio interface Remove
214224 */
215225static inline int dai_remove (struct dai * dai )
216226{
217- return dai -> ops -> remove (dai );
227+ return dai -> drv -> ops .remove (dai );
228+ }
229+
230+ /**
231+ * \brief Get driver specific DAI information
232+ */
233+ static inline int dai_get_info (struct dai * dai , int info )
234+ {
235+ int ret ;
236+
237+ switch (info ) {
238+ case DAI_INFO_TYPE :
239+ ret = dai -> drv -> type ;
240+ break ;
241+ case DAI_INFO_DMA_CAPS :
242+ ret = dai -> drv -> dma_caps ;
243+ break ;
244+ case DAI_INFO_DMA_DEV :
245+ ret = dai -> drv -> dma_dev ;
246+ break ;
247+ default :
248+ ret = - EINVAL ;
249+ break ;
250+ }
251+
252+ return ret ;
218253}
219254
220255/** @}*/
0 commit comments