Skip to content

Commit 54cb247

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 <j@jannau.net>
1 parent 846aca8 commit 54cb247

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;
@@ -305,7 +338,7 @@ int avep_init(struct apple_dcp *dcp)
305338
dev_err(dcp->dev, "Audio not supported for firmware\n");
306339
return -ENODEV;
307340
}
308-
init_completion(&audiosrv_data->init_completion);
341+
INIT_WORK(&audiosrv_data->start_av_service_wq, av_work_service_start);
309342

310343
dcp->audiosrv = audiosrv_data;
311344

@@ -330,28 +363,4 @@ int avep_init(struct apple_dcp *dcp)
330363
return PTR_ERR(dcp->avep);
331364
dcp->avep->debugfs_entry = dcp->ep_debugfs[AV_ENDPOINT - 0x20];
332365
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);
357366
}

0 commit comments

Comments
 (0)