plugin_shared_mem_t *plugin;
apm_shared_state_t *apm; /* For a plugin it stores parent apm data */
struct nvadsp_mbox apm_mbox;
- struct completion msg_complete; /* For ADSP ack wait */
+ struct completion *msg_complete; /* For ADSP ack wait */
uint32_t reg;
uint32_t adma_chan; /* Valid for only ADMA app */
uint32_t fe:1; /* Whether the app is used as a FE APM */
__func__);
flags &= ~TEGRA210_ADSP_MSG_FLAG_NEED_ACK;
} else {
- INIT_COMPLETION(app->msg_complete);
+ INIT_COMPLETION(*app->msg_complete);
apm_msg->msg.call_params.method |=
NVFX_APM_METHOD_ACK_BIT;
}
return ret;
ret = wait_for_completion_interruptible_timeout(
- &app->msg_complete,
+ app->msg_complete,
msecs_to_jiffies(ADSP_RESPONSE_TIMEOUT));
if (WARN_ON(ret <= 0))
pr_err("%s: Failed to reset app %d\n", __func__, app->reg);
goto err_app_exit;
}
- init_completion(&app->msg_complete);
+ app->msg_complete = devm_kzalloc(adsp->dev,
+ sizeof(struct completion), GFP_KERNEL);
+ if (!app->msg_complete) {
+ dev_err(adsp->dev, "Failed to allocate completion struct.");
+ return -ENOMEM;
+ }
+
+ init_completion(app->msg_complete);
ret = nvadsp_app_start(app->info);
if (ret < 0) {
apm_out->plugin = app->plugin;
apm_out->apm = app->apm;
apm_out->apm_mbox = app->apm_mbox;
+ apm_out->msg_complete = app->msg_complete;
} else if (IS_ADMA(app->reg)) {
app->adma_chan = find_first_zero_bit(adsp->adma_usage,
TEGRA210_ADSP_ADMA_CHANNEL_COUNT);
snd_pcm_period_elapsed(prtd->substream);
break;
case nvfx_apm_method_ack:
- complete(&app->msg_complete);
+ complete(app->msg_complete);
break;
default:
dev_err(prtd->dev, "Unsupported cmd %d.",
prtd->is_draining = 0;
break;
case nvfx_apm_method_ack:
- complete(&app->msg_complete);
+ complete(app->msg_complete);
break;
default:
dev_err(prtd->dev, "Unsupported cmd %d.",
if (prtd) {
tegra210_adsp_send_reset_msg(prtd->fe_apm,
- TEGRA210_ADSP_MSG_FLAG_SEND);
+ TEGRA210_ADSP_MSG_FLAG_SEND |
+ TEGRA210_ADSP_MSG_FLAG_NEED_ACK);
spin_lock_irqsave(&prtd->fe_apm->lock, flags);