Skip to content

Commit 105764e

Browse files
committed
drm: apple: av: Support macOS 12.3 and 13.5 firmware APIs
Signed-off-by: Janne Grunau <j@jannau.net>
1 parent 84775d3 commit 105764e

1 file changed

Lines changed: 65 additions & 9 deletions

File tree

  • drivers/gpu/drm/apple

drivers/gpu/drm/apple/av.c

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,39 @@
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

1548
struct 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

2560
static 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

Comments
 (0)