@@ -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
@@ -314,6 +306,7 @@ int avep_init(struct apple_dcp *dcp)
314306 dev_err (dcp -> dev , "Audio not supported for firmware\n" );
315307 return - ENODEV ;
316308 }
309+ init_completion (& audiosrv_data -> init_completion );
317310
318311 dcp -> audiosrv = audiosrv_data ;
319312
@@ -341,5 +334,29 @@ int avep_init(struct apple_dcp *dcp)
341334 if (ret )
342335 return ret ;
343336
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+
344361 return 0 ;
345362}
0 commit comments