Skip to content

Commit 617b1e2

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 105764e commit 617b1e2

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

@@ -313,6 +305,7 @@ int avep_init(struct apple_dcp *dcp)
313305
dev_err(dcp->dev, "Audio not supported for firmware\n");
314306
return -ENODEV;
315307
}
308+
init_completion(&audiosrv_data->init_completion);
316309

317310
dcp->audiosrv = audiosrv_data;
318311

@@ -337,4 +330,28 @@ int avep_init(struct apple_dcp *dcp)
337330
return PTR_ERR(dcp->avep);
338331
dcp->avep->debugfs_entry = dcp->ep_debugfs[AV_ENDPOINT - 0x20];
339332
return afk_start(dcp->avep);
333+
334+
ret = wait_for_completion_timeout(&dcp->audiosrv->init_completion,
335+
msecs_to_jiffies(500));
336+
if (ret < 0) {
337+
dev_err(dcp->dev, "error waiting on audio service init: %d\n", ret);
338+
return ret;
339+
} else if (!ret) {
340+
dev_err(dcp->dev, "timeout while waiting for audio service init\n");
341+
return -ETIMEDOUT;
342+
}
343+
344+
/* open AV audio service */
345+
ret = afk_service_call(dcp->audiosrv->srv, 0, dcp->audiosrv->cmds.open,
346+
NULL, 0, 32, NULL, 0, 32);
347+
if (ret) {
348+
dev_err(dcp->dev, "error opening audio service: %d\n", ret);
349+
return ret;
350+
}
351+
352+
mutex_lock(&dcp->audiosrv->plug_lock);
353+
if (dcp->audiosrv->hotplug_cb)
354+
dcp->audiosrv->hotplug_cb(dcp->audiosrv->audio_dev,
355+
dcp->audiosrv->plugged);
356+
mutex_unlock(&dcp->audiosrv->plug_lock);
340357
}

0 commit comments

Comments
 (0)