1111#include "audio.h"
1212#include "afk.h"
1313#include "dcp.h"
14+ #include "dcp-internal.h"
15+
16+ struct dcp_av_audio_cmds {
17+ /* commands in group 0*/
18+ u32 open ;
19+ u32 prepare ;
20+ u32 start_link ;
21+ u32 stop_link ;
22+ u32 unprepare ;
23+ /* commands in group 1*/
24+ u32 get_elements ;
25+ u32 get_product_attrs ;
26+ };
27+
28+ static const struct dcp_av_audio_cmds dcp_av_audio_cmds_v12_3 = {
29+ .open = 6 ,
30+ .prepare = 8 ,
31+ .start_link = 9 ,
32+ .stop_link = 12 ,
33+ .unprepare = 13 ,
34+ .get_elements = 18 ,
35+ .get_product_attrs = 20 ,
36+ };
37+
38+ static const struct dcp_av_audio_cmds dcp_av_audio_cmds_v13_5 = {
39+ .open = 4 ,
40+ .prepare = 6 ,
41+ .start_link = 7 ,
42+ .stop_link = 10 ,
43+ .unprepare = 11 ,
44+ .get_elements = 16 ,
45+ .get_product_attrs = 18 ,
46+ };
1447
1548struct audiosrv_data {
1649 struct device * audio_dev ;
@@ -20,6 +53,8 @@ struct audiosrv_data {
2053
2154 struct apple_epic_service * srv ;
2255 struct rw_semaphore srv_rwsem ;
56+
57+ struct dcp_av_audio_cmds cmds ;
2358};
2459
2560static void av_interface_init (struct apple_epic_service * service , const char * name ,
@@ -41,7 +76,8 @@ static void av_audiosrv_init(struct apple_epic_service *service, const char *nam
4176 up_write (& asrv -> srv_rwsem );
4277
4378 /* TODO: this must be done elsewhere */
44- err = afk_service_call (asrv -> srv , 0 , 6 , NULL , 0 , 32 , NULL , 0 , 32 );
79+ err = afk_service_call (asrv -> srv , 0 , asrv -> cmds .open , NULL , 0 , 32 , NULL ,
80+ 0 , 32 );
4581 if (err )
4682 dev_err (dcp -> dev , "error opening audio service: %d\n" , err );
4783
@@ -93,8 +129,9 @@ int dcp_audiosrv_prepare(struct device *dev, struct dcp_sound_cookie *cookie)
93129 int ret ;
94130
95131 down_write (& asrv -> srv_rwsem );
96- ret = afk_service_call (asrv -> srv , 0 , 8 , cookie , sizeof (* cookie ),
97- 64 - sizeof (* cookie ), NULL , 0 , 64 );
132+ ret = afk_service_call (asrv -> srv , 0 , asrv -> cmds .prepare , cookie ,
133+ sizeof (* cookie ), 64 - sizeof (* cookie ), NULL , 0 ,
134+ 64 );
98135 up_write (& asrv -> srv_rwsem );
99136
100137 return ret ;
@@ -108,8 +145,9 @@ int dcp_audiosrv_startlink(struct device *dev, struct dcp_sound_cookie *cookie)
108145 int ret ;
109146
110147 down_write (& asrv -> srv_rwsem );
111- ret = afk_service_call (asrv -> srv , 0 , 9 , cookie , sizeof (* cookie ),
112- 64 - sizeof (* cookie ), NULL , 0 , 64 );
148+ ret = afk_service_call (asrv -> srv , 0 , asrv -> cmds .start_link , cookie ,
149+ sizeof (* cookie ), 64 - sizeof (* cookie ), NULL , 0 ,
150+ 64 );
113151 up_write (& asrv -> srv_rwsem );
114152
115153 return ret ;
@@ -123,7 +161,8 @@ int dcp_audiosrv_stoplink(struct device *dev)
123161 int ret ;
124162
125163 down_write (& asrv -> srv_rwsem );
126- ret = afk_service_call (asrv -> srv , 0 , 12 , NULL , 0 , 64 , NULL , 0 , 64 );
164+ ret = afk_service_call (asrv -> srv , 0 , asrv -> cmds .stop_link , NULL , 0 , 64 ,
165+ NULL , 0 , 64 );
127166 up_write (& asrv -> srv_rwsem );
128167
129168 return ret ;
@@ -137,7 +176,8 @@ int dcp_audiosrv_unprepare(struct device *dev)
137176 int ret ;
138177
139178 down_write (& asrv -> srv_rwsem );
140- ret = afk_service_call (asrv -> srv , 0 , 13 , NULL , 0 , 64 , NULL , 0 , 64 );
179+ ret = afk_service_call (asrv -> srv , 0 , asrv -> cmds .unprepare , NULL , 0 , 64 ,
180+ NULL , 0 , 64 );
141181 up_write (& asrv -> srv_rwsem );
142182
143183 return ret ;
@@ -188,7 +228,8 @@ int dcp_audiosrv_get_elements(struct device *dev, void *elements, size_t maxsize
188228 int ret ;
189229
190230 down_write (& asrv -> srv_rwsem );
191- ret = dcp_audiosrv_osobject_call (asrv -> srv , 1 , 18 , elements , maxsize , & size );
231+ ret = dcp_audiosrv_osobject_call (asrv -> srv , 1 , asrv -> cmds .get_elements ,
232+ elements , maxsize , & size );
192233 up_write (& asrv -> srv_rwsem );
193234
194235 if (ret )
@@ -208,7 +249,9 @@ int dcp_audiosrv_get_product_attrs(struct device *dev, void *attrs, size_t maxsi
208249 int ret ;
209250
210251 down_write (& asrv -> srv_rwsem );
211- ret = dcp_audiosrv_osobject_call (asrv -> srv , 1 , 20 , attrs , maxsize , & size );
252+ ret = dcp_audiosrv_osobject_call (asrv -> srv , 1 ,
253+ asrv -> cmds .get_product_attrs , attrs ,
254+ maxsize , & size );
212255 up_write (& asrv -> srv_rwsem );
213256
214257 if (ret )
@@ -258,6 +301,19 @@ int avep_init(struct apple_dcp *dcp)
258301 return - ENOMEM ;
259302 init_rwsem (& audiosrv_data -> srv_rwsem );
260303 mutex_init (& audiosrv_data -> plug_lock );
304+
305+ switch (dcp -> fw_compat ) {
306+ case DCP_FIRMWARE_V_12_3 :
307+ audiosrv_data -> cmds = dcp_av_audio_cmds_v12_3 ;
308+ break ;
309+ case DCP_FIRMWARE_V_13_5 :
310+ audiosrv_data -> cmds = dcp_av_audio_cmds_v13_5 ;
311+ break ;
312+ default :
313+ dev_err (dcp -> dev , "Audio not supported for firmware\n" );
314+ return - ENODEV ;
315+ }
316+
261317 dcp -> audiosrv = audiosrv_data ;
262318
263319 audio_pdata -> dcp_dev = dcp -> dev ;
0 commit comments