Skip to content

Commit 5d3777a

Browse files
committed
drivers: dai: intel: ssp: Introduce DMA control set API
This commit adds a new API function, `dai_ssp_dma_control_set`, to the Intel SSP DAI driver. This function is designed to set DMA control parameters specifically for the SSP interface. The addition of this API function allows for more granular control of DMA settings, which can be beneficial in scenarios where DMA configuration needs to be modified independently of other DAI settings. Signed-off-by: Tomasz Leman <[email protected]>
1 parent 9d51439 commit 5d3777a

File tree

1 file changed

+58
-0
lines changed
  • drivers/dai/intel/ssp

1 file changed

+58
-0
lines changed

drivers/dai/intel/ssp/ssp.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1900,6 +1900,39 @@ static int dai_ssp_check_aux_data(struct ssp_intel_aux_tlv *aux_tlv, int aux_len
19001900
return 0;
19011901
}
19021902

1903+
/**
1904+
* This function checks if the provided buffer contains valid DMA control
1905+
* TLV (Type-Length-Value) entries. It ensures that only specific types
1906+
* of DMA control settings are allowed to be modified at runtime.
1907+
*/
1908+
static int dai_ssp_check_dma_control(const uint8_t *aux_ptr, int aux_len)
1909+
{
1910+
int hop;
1911+
struct ssp_intel_aux_tlv *aux_tlv;
1912+
1913+
for (int i = 0; i < aux_len; i += hop) {
1914+
aux_tlv = (struct ssp_intel_aux_tlv *)(aux_ptr);
1915+
switch (aux_tlv->type) {
1916+
case SSP_DMA_CLK_CONTROLS:
1917+
case SSP_DMA_TRANSMISSION_START:
1918+
case SSP_DMA_TRANSMISSION_STOP:
1919+
case SSP_DMA_ALWAYS_RUNNING_MODE:
1920+
case SSP_DMA_SYNC_DATA:
1921+
case SSP_DMA_CLK_CONTROLS_EXT:
1922+
case SSP_LINK_CLK_SOURCE:
1923+
break;
1924+
default:
1925+
LOG_ERR("incorect config type %u", aux_tlv->type);
1926+
return -EINVAL;
1927+
}
1928+
1929+
hop = aux_tlv->size + sizeof(struct ssp_intel_aux_tlv);
1930+
aux_ptr += hop;
1931+
}
1932+
1933+
return 0;
1934+
}
1935+
19031936
static int dai_ssp_parse_tlv(struct dai_intel_ssp *dp, const uint8_t *aux_ptr, size_t aux_len)
19041937
{
19051938
int hop, i, j;
@@ -2585,13 +2618,38 @@ static int ssp_init(const struct device *dev)
25852618
return pm_device_runtime_enable(dev);
25862619
}
25872620

2621+
static int dai_ssp_dma_control_set(const struct device *dev,
2622+
const void *bespoke_cfg,
2623+
size_t size)
2624+
{
2625+
struct dai_intel_ssp *dp = (struct dai_intel_ssp *)dev->data;
2626+
2627+
LOG_INF("SSP%d: tlv addr = 0x%x, tlv size = %d",
2628+
dp->dai_index, (uint32_t)bespoke_cfg, size);
2629+
if (size < sizeof(struct ssp_intel_aux_tlv)) {
2630+
return -EINVAL;
2631+
}
2632+
2633+
if (dp->state[DAI_DIR_PLAYBACK] != DAI_STATE_READY ||
2634+
dp->state[DAI_DIR_CAPTURE] != DAI_STATE_READY) {
2635+
return -EIO;
2636+
}
2637+
2638+
if (dai_ssp_check_dma_control(bespoke_cfg, size)) {
2639+
return -EINVAL;
2640+
}
2641+
2642+
return dai_ssp_parse_tlv(dp, bespoke_cfg, size);
2643+
}
2644+
25882645
static struct dai_driver_api dai_intel_ssp_api_funcs = {
25892646
.probe = pm_device_runtime_get,
25902647
.remove = pm_device_runtime_put,
25912648
.config_set = dai_ssp_config_set,
25922649
.config_get = dai_ssp_config_get,
25932650
.trigger = dai_ssp_trigger,
25942651
.get_properties = dai_ssp_get_properties,
2652+
.config_update = dai_ssp_dma_control_set,
25952653
};
25962654

25972655

0 commit comments

Comments
 (0)