Skip to content
This repository has been archived by the owner on Nov 14, 2021. It is now read-only.

Commit

Permalink
techpack: audio: Merge tag 'LA.UM.9.12.r1-11000-SMxx50.0' into neutri…
Browse files Browse the repository at this point in the history
…no-msm-kebab-4.19

"LA.UM.9.12.r1-11000-SMxx50.0"

* tag 'LA.UM.9.12.r1-11000-SMxx50.0':
  ASoC: dsp: Synchronise adm and rtac commands
  asoc: bolero: Add core_vote before gfmux access
  asoc: codecs: add child devices after completing initialization

Signed-off-by: Adam W. Willis <return.of.octobot@gmail.com>
  • Loading branch information
0ctobot committed Apr 14, 2021
2 parents ea0d919 + 6ea52f6 commit 188d9a1
Show file tree
Hide file tree
Showing 8 changed files with 96 additions and 67 deletions.
2 changes: 1 addition & 1 deletion techpack/audio/asoc/codecs/bolero/bolero-cdc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1379,7 +1379,6 @@ static int bolero_probe(struct platform_device *pdev)
mutex_init(&priv->vote_lock);
INIT_WORK(&priv->bolero_add_child_devices_work,
bolero_add_child_devices);
schedule_work(&priv->bolero_add_child_devices_work);

/* Register LPASS core hw vote */
lpass_core_hw_vote = devm_clk_get(&pdev->dev, "lpass_core_hw_vote");
Expand All @@ -1403,6 +1402,7 @@ static int bolero_probe(struct platform_device *pdev)
}
priv->lpass_audio_hw_vote = lpass_audio_hw_vote;

schedule_work(&priv->bolero_add_child_devices_work);
return 0;
}

Expand Down
12 changes: 9 additions & 3 deletions techpack/audio/asoc/codecs/bolero/rx-macro.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,7 @@ struct rx_macro_bcl_pmic_params {
u8 ppid;
};

static int rx_macro_core_vote(void *handle, bool enable);
static int rx_macro_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai);
Expand Down Expand Up @@ -1230,6 +1231,7 @@ static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv,
if (rx_priv->rx_mclk_users == 0) {
if (rx_priv->is_native_on)
rx_priv->clk_id = RX_CORE_CLK;
rx_macro_core_vote(rx_priv, true);
ret = bolero_clk_rsc_request_clock(rx_priv->dev,
rx_priv->default_clk_id,
rx_priv->clk_id,
Expand Down Expand Up @@ -1283,6 +1285,7 @@ static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv,
0x01, 0x00);
bolero_clk_rsc_fs_gen_request(rx_priv->dev,
false);
rx_macro_core_vote(rx_priv, true);
bolero_clk_rsc_request_clock(rx_priv->dev,
rx_priv->default_clk_id,
rx_priv->clk_id,
Expand Down Expand Up @@ -1396,18 +1399,21 @@ static int rx_macro_event_handler(struct snd_soc_component *component,
}
break;
case BOLERO_MACRO_EVT_PRE_SSR_UP:
rx_macro_core_vote(rx_priv, true);
/* enable&disable RX_CORE_CLK to reset GFMUX reg */
ret = bolero_clk_rsc_request_clock(rx_priv->dev,
rx_priv->default_clk_id,
RX_CORE_CLK, true);
if (ret < 0)
if (ret < 0) {
dev_err_ratelimited(rx_priv->dev,
"%s, failed to enable clk, ret:%d\n",
__func__, ret);
else
} else {
rx_macro_core_vote(rx_priv, true);
bolero_clk_rsc_request_clock(rx_priv->dev,
rx_priv->default_clk_id,
RX_CORE_CLK, false);
}
break;
case BOLERO_MACRO_EVT_SSR_UP:
trace_printk("%s, enter SSR up\n", __func__);
Expand Down Expand Up @@ -4165,12 +4171,12 @@ static int rx_macro_probe(struct platform_device *pdev)
"%s: register macro failed\n", __func__);
goto err_reg_macro;
}
schedule_work(&rx_priv->rx_macro_add_child_devices_work);
pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY);
pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
pm_suspend_ignore_children(&pdev->dev, true);
pm_runtime_enable(&pdev->dev);
schedule_work(&rx_priv->rx_macro_add_child_devices_work);

return 0;

Expand Down
4 changes: 2 additions & 2 deletions techpack/audio/asoc/codecs/bolero/tx-macro.c
Original file line number Diff line number Diff line change
Expand Up @@ -3280,13 +3280,13 @@ static int tx_macro_probe(struct platform_device *pdev)
"%s: register macro failed\n", __func__);
goto err_reg_macro;
}
if (is_used_tx_swr_gpio)
schedule_work(&tx_priv->tx_macro_add_child_devices_work);
pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY);
pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
pm_suspend_ignore_children(&pdev->dev, true);
pm_runtime_enable(&pdev->dev);
if (is_used_tx_swr_gpio)
schedule_work(&tx_priv->tx_macro_add_child_devices_work);

return 0;
err_reg_macro:
Expand Down
4 changes: 2 additions & 2 deletions techpack/audio/asoc/codecs/bolero/va-macro.c
Original file line number Diff line number Diff line change
Expand Up @@ -3199,13 +3199,13 @@ static int va_macro_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "%s: register macro failed\n", __func__);
goto reg_macro_fail;
}
if (is_used_va_swr_gpio)
schedule_work(&va_priv->va_macro_add_child_devices_work);
pm_runtime_set_autosuspend_delay(&pdev->dev, VA_AUTO_SUSPEND_DELAY);
pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
pm_suspend_ignore_children(&pdev->dev, true);
pm_runtime_enable(&pdev->dev);
if (is_used_va_swr_gpio)
schedule_work(&va_priv->va_macro_add_child_devices_work);
return ret;

reg_macro_fail:
Expand Down
2 changes: 1 addition & 1 deletion techpack/audio/asoc/codecs/bolero/wsa-macro.c
Original file line number Diff line number Diff line change
Expand Up @@ -3237,12 +3237,12 @@ static int wsa_macro_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "%s: register macro failed\n", __func__);
goto reg_macro_fail;
}
schedule_work(&wsa_priv->wsa_macro_add_child_devices_work);
pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY);
pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
pm_suspend_ignore_children(&pdev->dev, true);
pm_runtime_enable(&pdev->dev);
schedule_work(&wsa_priv->wsa_macro_add_child_devices_work);

return ret;
reg_macro_fail:
Expand Down
107 changes: 75 additions & 32 deletions techpack/audio/dsp/q6adm.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ struct adm_ctl {
struct param_outband outband_memmap;
struct source_tracking_data sourceTrackingData;

struct mutex adm_apr_lock;
int set_custom_topology;
int ec_ref_rx;
int num_ec_ref_rx_chans;
Expand Down Expand Up @@ -869,6 +870,58 @@ int adm_set_custom_chmix_cfg(int port_id, int copp_idx,
}
EXPORT_SYMBOL(adm_set_custom_chmix_cfg);

/*
* adm_apr_send_pkt : returns 0 on success, negative otherwise.
*/
int adm_apr_send_pkt(void *data, wait_queue_head_t *wait,
int port_idx, int copp_idx)
{
int ret = 0;
atomic_t *copp_stat = NULL;
wait = &this_adm.copp.wait[port_idx][copp_idx];

if (!wait)
return -EINVAL;

mutex_lock(&this_adm.adm_apr_lock);
pr_debug("%s: port idx %d copp idx %d\n", __func__,
port_idx, copp_idx);
copp_stat = &this_adm.copp.stat[port_idx][copp_idx];
atomic_set(copp_stat, -1);

if (atomic_read(&this_adm.copp.cnt[port_idx][copp_idx]) == 0) {
pr_err("%s: port[0x%x] coppid[0x%x] is not active, ERROR\n",
__func__, port_idx, copp_idx);
mutex_unlock(&this_adm.adm_apr_lock);
return -EINVAL;
}

ret = apr_send_pkt(this_adm.apr, data);
if (ret > 0) {
ret = wait_event_timeout(*wait,
atomic_read(copp_stat) >= 0,
msecs_to_jiffies(TIMEOUT_MS));
if (atomic_read(copp_stat) > 0) {
pr_err("%s: DSP returned error[%s]\n", __func__,
adsp_err_get_err_str(atomic_read(copp_stat)));
ret = adsp_err_get_lnx_err_code(atomic_read(copp_stat));
} else if (!ret) {
pr_err_ratelimited("%s: request timedout\n",
__func__);
ret = -ETIMEDOUT;
} else {
ret = 0;
}
} else if (ret == 0) {
pr_err("%s: packet not transmitted\n", __func__);
/* apr_send_pkt can return 0 when nothing is transmitted */
ret = -EINVAL;
}

mutex_unlock(&this_adm.adm_apr_lock);
return ret;
}

/*
* With pre-packed data, only the opcode differes from V5 and V6.
* Use q6common_pack_pp_params to pack the data correctly.
Expand All @@ -880,7 +933,6 @@ int adm_set_pp_params(int port_id, int copp_idx,
struct adm_cmd_set_pp_params *adm_set_params = NULL;
int size = 0;
int port_idx = 0;
atomic_t *copp_stat = NULL;
int ret = 0;

port_id = afe_convert_virtual_to_portid(port_id);
Expand Down Expand Up @@ -938,32 +990,9 @@ int adm_set_pp_params(int port_id, int copp_idx,
ret = -EINVAL;
goto done;
}

copp_stat = &this_adm.copp.stat[port_idx][copp_idx];
atomic_set(copp_stat, -1);
ret = apr_send_pkt(this_adm.apr, (uint32_t *) adm_set_params);
if (ret < 0) {
pr_err("%s: Set params APR send failed port = 0x%x ret %d\n",
__func__, port_id, ret);
goto done;
}
ret = wait_event_timeout(this_adm.copp.wait[port_idx][copp_idx],
atomic_read(copp_stat) >= 0,
msecs_to_jiffies(TIMEOUT_MS));
if (!ret) {
pr_err("%s: Set params timed out port = 0x%x\n", __func__,
port_id);
ret = -ETIMEDOUT;
goto done;
}
if (atomic_read(copp_stat) > 0) {
pr_err("%s: DSP returned error[%s]\n", __func__,
adsp_err_get_err_str(atomic_read(copp_stat)));
ret = adsp_err_get_lnx_err_code(atomic_read(copp_stat));
goto done;
}

ret = 0;
ret = adm_apr_send_pkt((uint32_t *) adm_set_params,
&this_adm.copp.wait[port_idx][copp_idx],
port_idx, copp_idx);
done:
kfree(adm_set_params);
return ret;
Expand Down Expand Up @@ -1601,8 +1630,15 @@ static int32_t adm_callback(struct apr_client_data *data, void *priv)
this_adm.sourceTrackingData.
apr_cmd_status = payload[1];
else if (rtac_make_adm_callback(payload,
data->payload_size))
break;
data->payload_size)) {
pr_debug("%s: rtac cmd response\n",
__func__);
}
atomic_set(&this_adm.copp.stat[port_idx]
[copp_idx], payload[1]);
wake_up(
&this_adm.copp.wait[port_idx][copp_idx]);
break;
/*
* if soft volume is called and already
* interrupted break out of the sequence here
Expand All @@ -1611,8 +1647,8 @@ static int32_t adm_callback(struct apr_client_data *data, void *priv)
case ADM_CMD_DEVICE_CLOSE_V5:
case ADM_CMD_DEVICE_OPEN_V6:
case ADM_CMD_DEVICE_OPEN_V8:
pr_debug("%s: Basic callback received, wake up.\n",
__func__);
pr_debug("%s: Basic callback received for 0x%x, wake up.\n",
__func__, payload[0]);
atomic_set(&this_adm.copp.stat[port_idx]
[copp_idx], payload[1]);
wake_up(
Expand Down Expand Up @@ -1745,8 +1781,13 @@ static int32_t adm_callback(struct apr_client_data *data, void *priv)
this_adm.sourceTrackingData.apr_cmd_status =
payload[0];
else if (rtac_make_adm_callback(payload,
data->payload_size))
data->payload_size)) {
pr_debug("%s: rtac cmd response\n", __func__);
atomic_set(&this_adm.copp.stat[port_idx][copp_idx],
payload[0]);
wake_up(&this_adm.copp.wait[port_idx][copp_idx]);
break;
}

idx = ADM_GET_PARAMETER_LENGTH * copp_idx;
if (payload[0] == 0 && data->payload_size > 0) {
Expand Down Expand Up @@ -5504,6 +5545,7 @@ int __init adm_init(void)
this_adm.ffecns_port_id = -1;
init_waitqueue_head(&this_adm.matrix_map_wait);
init_waitqueue_head(&this_adm.adm_wait);
mutex_init(&this_adm.adm_apr_lock);

for (i = 0; i < AFE_MAX_PORTS; i++) {
for (j = 0; j < MAX_COPPS_PER_PORT; j++) {
Expand All @@ -5528,6 +5570,7 @@ int __init adm_init(void)

void adm_exit(void)
{
mutex_destroy(&this_adm.adm_apr_lock);
if (this_adm.apr)
adm_reset_data();
adm_delete_cal_data();
Expand Down
30 changes: 4 additions & 26 deletions techpack/audio/dsp/rtac.c
Original file line number Diff line number Diff line change
Expand Up @@ -728,7 +728,6 @@ bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size)
atomic_set(&rtac_common.apr_err_code, payload[1]);

atomic_set(&rtac_adm_apr_data.cmd_state, 0);
wake_up(&rtac_adm_apr_data.cmd_wait);
return true;
}

Expand Down Expand Up @@ -880,33 +879,12 @@ int send_adm_apr(void *buf, u32 opcode)
pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n",
__func__, opcode,
&rtac_cal[ADM_RTAC_CAL].cal_data.paddr);
mutex_unlock(&rtac_adm_apr_mutex);

result = apr_send_pkt(rtac_adm_apr_data.apr_handle,
(uint32_t *)rtac_adm_buffer);
if (result < 0) {
pr_err("%s: Set params failed copp = %d\n", __func__, copp_id);
goto err;
}
/* Wait for the callback */
result = wait_event_timeout(rtac_adm_apr_data.cmd_wait,
(atomic_read(&rtac_adm_apr_data.cmd_state) == 0),
msecs_to_jiffies(TIMEOUT_MS));
if (!result) {
pr_err("%s: Set params timed out copp = %d\n", __func__,
copp_id);
goto err;
}
if (atomic_read(&rtac_common.apr_err_code)) {
pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n",
__func__, adsp_err_get_err_str(atomic_read(
&rtac_common.apr_err_code)),
opcode);
result = adsp_err_get_lnx_err_code(
atomic_read(
&rtac_common.apr_err_code));
goto err;
}
result = adm_apr_send_pkt((uint32_t *)rtac_adm_buffer,
NULL, port_idx, copp_idx);

mutex_lock(&rtac_adm_apr_mutex);
if (opcode == ADM_CMD_GET_PP_PARAMS_V5) {
bytes_returned = ((u32 *)rtac_cal[ADM_RTAC_CAL].cal_data.
kvaddr)[2] + 3 * sizeof(u32);
Expand Down
2 changes: 2 additions & 0 deletions techpack/audio/include/dsp/q6adm-v2.h
Original file line number Diff line number Diff line change
Expand Up @@ -229,4 +229,6 @@ void msm_dts_srs_acquire_lock(void);
void msm_dts_srs_release_lock(void);
void adm_set_native_mode(int mode);
int adm_set_ffecns_freeze_event(bool ffecns_freeze_event);
int adm_apr_send_pkt(void *data, wait_queue_head_t *wait,
int port_idx, int copp_idx);
#endif /* __Q6_ADM_V2_H__ */

0 comments on commit 188d9a1

Please sign in to comment.