@@ -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