Skip to content

Commit 980171e

Browse files
slawblauciaktlauda
authored andcommitted
dai: supply caps and other info from within drivers
This change gathers some of the information inside of the DAI drivers, which was previously inferred using external logic. Signed-off-by: Slawomir Blauciak <slawomir.blauciak@linux.intel.com>
1 parent 6e4faef commit 980171e

15 files changed

Lines changed: 136 additions & 96 deletions

File tree

scripts/const_structs.checkpatch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
comp_func_map
22
dma_ops
3-
dai_ops
3+
dai_driver
44
freq_table

src/audio/dai.c

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -230,25 +230,12 @@ static struct comp_dev *dai_new(struct sof_ipc_comp *comp)
230230
}
231231

232232
/* request GP LP DMA with shared access privilege */
233-
/* TODO: hda: retrieve req'ed caps from the dai,
234-
* dmas are not cross-compatible.
235-
*/
236-
switch (dai->type) {
237-
case SOF_DAI_INTEL_HDA:
238-
dir = dai->direction == SOF_IPC_STREAM_PLAYBACK ?
239-
DMA_DIR_MEM_TO_DEV : DMA_DIR_DEV_TO_MEM;
240-
caps = DMA_CAP_HDA;
241-
dma_dev = DMA_DEV_HDA;
242-
break;
243-
case SOF_DAI_INTEL_SSP:
244-
case SOF_DAI_INTEL_DMIC:
245-
case SOF_DAI_INTEL_SOUNDWIRE:
246-
default:
247-
dir = DMA_DIR_MEM_TO_DEV | DMA_DIR_DEV_TO_MEM;
248-
caps = DMA_CAP_GP_LP | DMA_CAP_GP_HP;
249-
dma_dev = DMA_DEV_SSP | DMA_DEV_DMIC | DMA_DEV_SOUNDWIRE;
250-
break;
251-
}
233+
dir = dai->direction == SOF_IPC_STREAM_PLAYBACK ?
234+
DMA_DIR_MEM_TO_DEV : DMA_DIR_DEV_TO_MEM;
235+
236+
caps = dai_get_info(dd->dai, DAI_INFO_DMA_CAPS);
237+
dma_dev = dai_get_info(dd->dai, DAI_INFO_DMA_DEV);
238+
252239
dd->dma = dma_get(dir, caps, dma_dev, DMA_ACCESS_SHARED);
253240
if (!dd->dma) {
254241
trace_dai_error("dai_new() error: dma_get() failed to get "
@@ -353,7 +340,7 @@ static int dai_capture_params(struct comp_dev *dev)
353340
config->src_dev = dd->dai->plat_data.fifo[1].handshake;
354341

355342
/* TODO: Make this code platform-specific or move it driver callback */
356-
if (dd->dai->type == SOF_DAI_INTEL_DMIC) {
343+
if (dai_get_info(dd->dai, DAI_INFO_TYPE) == SOF_DAI_INTEL_DMIC) {
357344
/* For DMIC the DMA src and dest widths should always be 4 bytes
358345
* due to 32 bit FIFO packer. Setting width to 2 bytes for
359346
* 16 bit format would result in recording at double rate.

src/drivers/intel/baytrail/ssp.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -592,10 +592,15 @@ static int ssp_probe(struct dai *dai)
592592
return 0;
593593
}
594594

595-
const struct dai_ops ssp_ops = {
596-
.trigger = ssp_trigger,
597-
.set_config = ssp_set_config,
598-
.pm_context_store = ssp_context_store,
599-
.pm_context_restore = ssp_context_restore,
600-
.probe = ssp_probe,
595+
const struct dai_driver ssp_driver = {
596+
.type = SOF_DAI_INTEL_SSP,
597+
.dma_caps = DMA_CAP_GP_LP | DMA_CAP_GP_HP,
598+
.dma_dev = DMA_DEV_SSP,
599+
.ops = {
600+
.trigger = ssp_trigger,
601+
.set_config = ssp_set_config,
602+
.pm_context_store = ssp_context_store,
603+
.pm_context_restore = ssp_context_restore,
604+
.probe = ssp_probe,
605+
},
601606
};

src/drivers/intel/cavs/dmic.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,13 +1579,18 @@ static int dmic_remove(struct dai *dai)
15791579
return 0;
15801580
}
15811581

1582-
const struct dai_ops dmic_ops = {
1583-
.trigger = dmic_trigger,
1584-
.set_config = dmic_set_config,
1585-
.pm_context_store = dmic_context_store,
1586-
.pm_context_restore = dmic_context_restore,
1587-
.probe = dmic_probe,
1588-
.remove = dmic_remove,
1582+
const struct dai_driver dmic_driver = {
1583+
.type = SOF_DAI_INTEL_DMIC,
1584+
.dma_caps = DMA_CAP_GP_LP | DMA_CAP_GP_HP,
1585+
.dma_dev = DMA_DEV_DMIC,
1586+
.ops = {
1587+
.trigger = dmic_trigger,
1588+
.set_config = dmic_set_config,
1589+
.pm_context_store = dmic_context_store,
1590+
.pm_context_restore = dmic_context_restore,
1591+
.probe = dmic_probe,
1592+
.remove = dmic_remove,
1593+
},
15891594
};
15901595

15911596
#endif

src/drivers/intel/cavs/hda.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,16 @@ static int hda_dummy(struct dai *dai)
4747
return 0;
4848
}
4949

50-
const struct dai_ops hda_ops = {
51-
.trigger = hda_trigger,
52-
.set_config = hda_set_config,
53-
.pm_context_store = hda_dummy,
54-
.pm_context_restore = hda_dummy,
55-
.probe = hda_dummy,
56-
.remove = hda_dummy,
50+
const struct dai_driver hda_driver = {
51+
.type = SOF_DAI_INTEL_HDA,
52+
.dma_caps = DMA_CAP_HDA,
53+
.dma_dev = DMA_DEV_HDA,
54+
.ops = {
55+
.trigger = hda_trigger,
56+
.set_config = hda_set_config,
57+
.pm_context_store = hda_dummy,
58+
.pm_context_restore = hda_dummy,
59+
.probe = hda_dummy,
60+
.remove = hda_dummy,
61+
},
5762
};

src/drivers/intel/cavs/soundwire.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,16 @@ static int soundwire_remove(struct dai *dai)
8989
return 0;
9090
}
9191

92-
const struct dai_ops soundwire_ops = {
93-
.trigger = soundwire_trigger,
94-
.set_config = soundwire_set_config,
95-
.pm_context_store = soundwire_context_store,
96-
.pm_context_restore = soundwire_context_restore,
97-
.probe = soundwire_probe,
98-
.remove = soundwire_remove,
92+
const struct dai_driver soundwire_driver = {
93+
.type = SOF_DAI_INTEL_SOUNDWIRE,
94+
.dma_caps = DMA_CAP_GP_LP | DMA_CAP_GP_HP,
95+
.dma_dev = DMA_DEV_SOUNDWIRE,
96+
.ops = {
97+
.trigger = soundwire_trigger,
98+
.set_config = soundwire_set_config,
99+
.pm_context_store = soundwire_context_store,
100+
.pm_context_restore = soundwire_context_restore,
101+
.probe = soundwire_probe,
102+
.remove = soundwire_remove,
103+
},
99104
};

src/drivers/intel/cavs/ssp.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -877,11 +877,16 @@ static int ssp_remove(struct dai *dai)
877877
return 0;
878878
}
879879

880-
const struct dai_ops ssp_ops = {
881-
.trigger = ssp_trigger,
882-
.set_config = ssp_set_config,
883-
.pm_context_store = ssp_context_store,
884-
.pm_context_restore = ssp_context_restore,
885-
.probe = ssp_probe,
886-
.remove = ssp_remove,
880+
const struct dai_driver ssp_driver = {
881+
.type = SOF_DAI_INTEL_SSP,
882+
.dma_caps = DMA_CAP_GP_LP | DMA_CAP_GP_HP,
883+
.dma_dev = DMA_DEV_SSP,
884+
.ops = {
885+
.trigger = ssp_trigger,
886+
.set_config = ssp_set_config,
887+
.pm_context_store = ssp_context_store,
888+
.pm_context_restore = ssp_context_restore,
889+
.probe = ssp_probe,
890+
.remove = ssp_remove,
891+
},
887892
};

src/drivers/intel/haswell/ssp.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -496,10 +496,15 @@ static int ssp_probe(struct dai *dai)
496496
return 0;
497497
}
498498

499-
const struct dai_ops ssp_ops = {
500-
.trigger = ssp_trigger,
501-
.set_config = ssp_set_config,
502-
.pm_context_store = ssp_context_store,
503-
.pm_context_restore = ssp_context_restore,
504-
.probe = ssp_probe,
499+
const struct dai_driver ssp_driver = {
500+
.type = SOF_DAI_INTEL_SSP,
501+
.dma_caps = DMA_CAP_GP_LP | DMA_CAP_GP_HP,
502+
.dma_dev = DMA_DEV_SSP,
503+
.ops = {
504+
.trigger = ssp_trigger,
505+
.set_config = ssp_set_config,
506+
.pm_context_store = ssp_context_store,
507+
.pm_context_restore = ssp_context_restore,
508+
.probe = ssp_probe,
509+
},
505510
};

src/include/sof/dai.h

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@
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

115126
struct 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);
174184
static 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
*/
183193
static 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
*/
191201
static 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
*/
199209
static 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
*/
207217
static 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
*/
215225
static 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
/** @}*/

src/include/sof/dmic.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ struct dmic_pdata {
335335
int32_t gain;
336336
};
337337

338-
extern const struct dai_ops dmic_ops;
338+
extern const struct dai_driver dmic_driver;
339339

340340
#endif /* DMIC_HW_VERSION */
341341
#endif /* __INCLUDE_DMIC__ */

0 commit comments

Comments
 (0)