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
8385static 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+
283316int 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