dai: add DAI info to sof context

Adds DAI info to sof main context. Also implements
getter to easily retrieve the info through one point
of access.

Signed-off-by: Tomasz Lauda <tomasz.lauda@linux.intel.com>
This commit is contained in:
Tomasz Lauda 2020-01-08 15:06:31 +01:00 committed by Liam Girdwood
parent 81730d4da8
commit 781ccb10c7
7 changed files with 41 additions and 28 deletions

View File

@ -19,13 +19,13 @@
#include <platform/lib/dai.h>
#include <sof/bit.h>
#include <sof/lib/io.h>
#include <sof/sof.h>
#include <sof/spinlock.h>
#include <errno.h>
#include <stddef.h>
#include <stdint.h>
struct dai;
struct sof;
struct sof_ipc_dai_config;
/** \addtogroup sof_dai_drivers DAI Drivers
@ -136,16 +136,6 @@ struct dai_info {
*/
int dai_init(struct sof *sof);
/**
* \brief Plugs platform specific DAI array once initialized into the lib.
*
* Lib serves the DAIs to other FW elements with dai_get()
*
* \param[in] dai_type_array Array of DAI arrays grouped by type.
* \param[in] num_dai_types Number of elements in the dai_type_array.
*/
void dai_install(struct dai_type_info *dai_type_array, size_t num_dai_types);
/**
* \brief API to request a platform DAI.
*
@ -281,6 +271,11 @@ static inline void dai_update_bits(struct dai *dai, uint32_t reg,
io_reg_update_bits(dai_base(dai) + reg, mask, value);
}
static inline struct dai_info *dai_info_get(void)
{
return sof_get()->dai_info;
}
/** @}*/
#endif /* __SOF_LIB_DAI_H__ */

View File

@ -13,6 +13,7 @@
#include <sof/lib/memory.h>
struct clock_info;
struct dai_info;
struct dma_trace_data;
struct ipc;
struct ll_schedule_domain;
@ -68,6 +69,9 @@ struct sof {
/* shared notifier data */
struct notify_data *notify_data;
/* platform dai information */
struct dai_info *dai_info;
__aligned(PLATFORM_DCACHE_ALIGN) int alignment[0];
} __aligned(PLATFORM_DCACHE_ALIGN);

View File

@ -14,23 +14,13 @@
#define trace_dai(__e, ...) trace_event(TRACE_CLASS_DAI, __e, ##__VA_ARGS__)
static struct dai_info lib_dai = {
.dai_type_array = NULL,
.num_dai_types = 0
};
void dai_install(struct dai_type_info *dai_type_array, size_t num_dai_types)
{
lib_dai.dai_type_array = dai_type_array;
lib_dai.num_dai_types = num_dai_types;
}
static inline struct dai_type_info *dai_find_type(uint32_t type)
{
struct dai_info *info = dai_info_get();
struct dai_type_info *dti;
for (dti = lib_dai.dai_type_array;
dti < lib_dai.dai_type_array + lib_dai.num_dai_types; dti++) {
for (dti = info->dai_type_array;
dti < info->dai_type_array + info->num_dai_types; dti++) {
if (dti->type == type)
return dti;
}

View File

@ -124,6 +124,11 @@ static struct dai_type_info dti[] = {
}
};
static struct dai_info lib_dai = {
.dai_type_array = dti,
.num_dai_types = ARRAY_SIZE(dti)
};
int dai_init(struct sof *sof)
{
int i;
@ -132,6 +137,7 @@ int dai_init(struct sof *sof)
for (i = 0; i < ARRAY_SIZE(ssp); i++)
spinlock_init(&ssp[i].lock);
dai_install(dti, ARRAY_SIZE(dti));
sof->dai_info = &lib_dai;
return 0;
}

View File

@ -56,6 +56,11 @@ static struct dai_type_info dti[] = {
}
};
static struct dai_info lib_dai = {
.dai_type_array = dti,
.num_dai_types = ARRAY_SIZE(dti)
};
int dai_init(struct sof *sof)
{
int i;
@ -64,6 +69,7 @@ int dai_init(struct sof *sof)
for (i = 0; i < ARRAY_SIZE(ssp); i++)
spinlock_init(&ssp[i].lock);
dai_install(dti, ARRAY_SIZE(dti));
sof->dai_info = &lib_dai;
return 0;
}

View File

@ -76,6 +76,11 @@ static struct dai_type_info dti[] = {
},
};
static struct dai_info lib_dai = {
.dai_type_array = dti,
.num_dai_types = ARRAY_SIZE(dti)
};
int dai_init(struct sof *sof)
{
int i;
@ -87,6 +92,7 @@ int dai_init(struct sof *sof)
for (i = 0; i < ARRAY_SIZE(sai); i++)
spinlock_init(&sai[i].lock);
dai_install(dti, ARRAY_SIZE(dti));
sof->dai_info = &lib_dai;
return 0;
}

View File

@ -116,6 +116,11 @@ static struct dai_type_info dti[] = {
#endif
};
static struct dai_info lib_dai = {
.dai_type_array = dti,
.num_dai_types = ARRAY_SIZE(dti)
};
int dai_init(struct sof *sof)
{
int i;
@ -169,6 +174,7 @@ int dai_init(struct sof *sof)
}
#endif
dai_install(dti, ARRAY_SIZE(dti));
sof->dai_info = &lib_dai;
return 0;
}