Skip to content

Commit 596ff70

Browse files
committed
drm: apple: av: Do not open AV service from afk receive handler
Use a completion to do it from avep_init() instead. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 580df64 commit 596ff70

1 file changed

Lines changed: 27 additions & 10 deletions

File tree

  • drivers/gpu/drm/apple

drivers/gpu/drm/apple/av.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ struct audiosrv_data {
5151
bool plugged;
5252
struct mutex plug_lock;
5353

54+
struct completion init_completion;
5455
struct apple_epic_service *srv;
5556
struct rw_semaphore srv_rwsem;
5657

@@ -67,24 +68,15 @@ static void av_audiosrv_init(struct apple_epic_service *service, const char *nam
6768
{
6869
struct apple_dcp *dcp = service->ep->dcp;
6970
struct audiosrv_data *asrv = dcp->audiosrv;
70-
int err;
7171

7272
mutex_lock(&asrv->plug_lock);
7373

7474
down_write(&asrv->srv_rwsem);
7575
asrv->srv = service;
7676
up_write(&asrv->srv_rwsem);
7777

78-
/* TODO: this must be done elsewhere */
79-
err = afk_service_call(asrv->srv, 0, asrv->cmds.open, NULL, 0, 32, NULL,
80-
0, 32);
81-
if (err)
82-
dev_err(dcp->dev, "error opening audio service: %d\n", err);
83-
78+
complete(&asrv->init_completion);
8479
asrv->plugged = true;
85-
if (asrv->hotplug_cb)
86-
asrv->hotplug_cb(asrv->audio_dev, true);
87-
8880
mutex_unlock(&asrv->plug_lock);
8981
}
9082

@@ -314,6 +306,7 @@ int avep_init(struct apple_dcp *dcp)
314306
dev_err(dcp->dev, "Audio not supported for firmware\n");
315307
return -ENODEV;
316308
}
309+
init_completion(&audiosrv_data->init_completion);
317310

318311
dcp->audiosrv = audiosrv_data;
319312

@@ -341,5 +334,29 @@ int avep_init(struct apple_dcp *dcp)
341334
if (ret)
342335
return ret;
343336

337+
ret = wait_for_completion_timeout(&dcp->audiosrv->init_completion,
338+
msecs_to_jiffies(500));
339+
if (ret < 0) {
340+
dev_err(dcp->dev, "error waiting on audio service init: %d\n", ret);
341+
return ret;
342+
} else if (!ret) {
343+
dev_err(dcp->dev, "timeout while waiting for audio service init\n");
344+
return -ETIMEDOUT;
345+
}
346+
347+
/* open AV audio service */
348+
ret = afk_service_call(dcp->audiosrv->srv, 0, dcp->audiosrv->cmds.open,
349+
NULL, 0, 32, NULL, 0, 32);
350+
if (ret) {
351+
dev_err(dcp->dev, "error opening audio service: %d\n", ret);
352+
return ret;
353+
}
354+
355+
mutex_lock(&dcp->audiosrv->plug_lock);
356+
if (dcp->audiosrv->hotplug_cb)
357+
dcp->audiosrv->hotplug_cb(dcp->audiosrv->audio_dev,
358+
dcp->audiosrv->plugged);
359+
mutex_unlock(&dcp->audiosrv->plug_lock);
360+
344361
return 0;
345362
}

0 commit comments

Comments
 (0)