Skip to content

Commit bc56f1d

Browse files
committed
drm: apple: av: Use a workqueue
Functionally a revert of "drm: apple: av: Do not open AV service from afk receive handler" with more workqueues. Signed-off-by: Janne Grunau <[email protected]>
1 parent d341bca commit bc56f1d

1 file changed

Lines changed: 36 additions & 27 deletions

File tree

  • drivers/gpu/drm/apple

drivers/gpu/drm/apple/av.c

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <linux/kconfig.h>
88
#include <linux/rwsem.h>
99
#include <linux/types.h>
10+
#include <linux/workqueue.h>
1011

1112
#include "audio.h"
1213
#include "afk.h"
@@ -51,9 +52,10 @@ struct audiosrv_data {
5152
bool plugged;
5253
struct mutex plug_lock;
5354

54-
struct completion init_completion;
5555
struct apple_epic_service *srv;
5656
struct rw_semaphore srv_rwsem;
57+
/* Workqueue for starting the audio service */
58+
struct work_struct start_av_service_wq;
5759

5860
struct dcp_av_audio_cmds cmds;
5961
};
@@ -75,9 +77,9 @@ static void av_audiosrv_init(struct apple_epic_service *service, const char *nam
7577
asrv->srv = service;
7678
up_write(&asrv->srv_rwsem);
7779

78-
complete(&asrv->init_completion);
7980
asrv->plugged = true;
8081
mutex_unlock(&asrv->plug_lock);
82+
schedule_work(&asrv->start_av_service_wq);
8183
}
8284

8385
static void av_audiosrv_teardown(struct apple_epic_service *service)
@@ -280,6 +282,37 @@ static const struct apple_epic_service_ops avep_ops[] = {
280282
{}
281283
};
282284

285+
static void av_work_service_start(struct work_struct *work)
286+
{
287+
int ret;
288+
struct audiosrv_data *audiosrv_data;
289+
struct apple_dcp *dcp;
290+
291+
audiosrv_data = container_of(work, struct audiosrv_data, start_av_service_wq);
292+
if (!audiosrv_data->srv ||
293+
!audiosrv_data->srv->ep ||
294+
!audiosrv_data->srv->ep->dcp) {
295+
pr_err("%s: dcp: av: NULL ptr during startup\n", __func__);
296+
return;
297+
}
298+
dcp = audiosrv_data->srv->ep->dcp;
299+
300+
/* open AV audio service */
301+
dev_info(dcp->dev, "%s: starting audio service\n", __func__);
302+
ret = afk_service_call(dcp->audiosrv->srv, 0, dcp->audiosrv->cmds.open,
303+
NULL, 0, 32, NULL, 0, 32);
304+
if (ret) {
305+
dev_err(dcp->dev, "error opening audio service: %d\n", ret);
306+
return;
307+
}
308+
309+
mutex_lock(&dcp->audiosrv->plug_lock);
310+
if (dcp->audiosrv->hotplug_cb)
311+
dcp->audiosrv->hotplug_cb(dcp->audiosrv->audio_dev,
312+
dcp->audiosrv->plugged);
313+
mutex_unlock(&dcp->audiosrv->plug_lock);
314+
}
315+
283316
int avep_init(struct apple_dcp *dcp)
284317
{
285318
struct dcp_audio_pdata *audio_pdata;
@@ -306,7 +339,7 @@ int avep_init(struct apple_dcp *dcp)
306339
dev_err(dcp->dev, "Audio not supported for firmware\n");
307340
return -ENODEV;
308341
}
309-
init_completion(&audiosrv_data->init_completion);
342+
INIT_WORK(&audiosrv_data->start_av_service_wq, av_work_service_start);
310343

311344
dcp->audiosrv = audiosrv_data;
312345

@@ -334,29 +367,5 @@ int avep_init(struct apple_dcp *dcp)
334367
if (ret)
335368
return ret;
336369

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-
361370
return 0;
362371
}

0 commit comments

Comments
 (0)