1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
7 #define pr_fmt(fmt) "[drm-dp] %s: " fmt, __func__
9 #include <linux/of_platform.h>
11 #include <drm/drm_dp_helper.h>
12 #include <drm/drm_edid.h>
14 #include "dp_catalog.h"
17 #include "dp_display.h"
19 #define HEADER_BYTE_2_BIT 0
20 #define PARITY_BYTE_2_BIT 8
21 #define HEADER_BYTE_1_BIT 16
22 #define PARITY_BYTE_1_BIT 24
23 #define HEADER_BYTE_3_BIT 16
24 #define PARITY_BYTE_3_BIT 24
26 struct dp_audio_private {
27 struct platform_device *audio_pdev;
28 struct platform_device *pdev;
29 struct dp_catalog *catalog;
30 struct dp_panel *panel;
35 struct dp_audio dp_audio;
38 static u8 dp_audio_get_g0_value(u8 data)
45 for (i = 0; i < 4; i++)
46 c[i] = (data >> i) & 0x01;
53 for (i = 0; i < 4; i++)
54 ret_data = ((g[i] & 0x01) << i) | ret_data;
59 static u8 dp_audio_get_g1_value(u8 data)
66 for (i = 0; i < 4; i++)
67 c[i] = (data >> i) & 0x01;
70 g[1] = c[0] ^ c[1] ^ c[3];
74 for (i = 0; i < 4; i++)
75 ret_data = ((g[i] & 0x01) << i) | ret_data;
80 static u8 dp_audio_calculate_parity(u32 data)
88 u8 num_byte = (data & 0xFF00) > 0 ? 8 : 2;
90 for (i = 0; i < num_byte; i++) {
91 iData = (data >> i*4) & 0xF;
94 x1 = x0 ^ dp_audio_get_g1_value(ci);
95 x0 = dp_audio_get_g0_value(ci);
98 parity_byte = x1 | (x0 << 4);
103 static u32 dp_audio_get_header(struct dp_catalog *catalog,
104 enum dp_catalog_audio_sdp_type sdp,
105 enum dp_catalog_audio_header_type header)
107 catalog->sdp_type = sdp;
108 catalog->sdp_header = header;
109 dp_catalog_audio_get_header(catalog);
111 return catalog->audio_data;
114 static void dp_audio_set_header(struct dp_catalog *catalog,
116 enum dp_catalog_audio_sdp_type sdp,
117 enum dp_catalog_audio_header_type header)
119 catalog->sdp_type = sdp;
120 catalog->sdp_header = header;
121 catalog->audio_data = data;
122 dp_catalog_audio_set_header(catalog);
125 static void dp_audio_stream_sdp(struct dp_audio_private *audio)
127 struct dp_catalog *catalog = audio->catalog;
128 u32 value, new_value;
131 /* Config header and parity byte 1 */
132 value = dp_audio_get_header(catalog,
133 DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_1);
136 parity_byte = dp_audio_calculate_parity(new_value);
137 value |= ((new_value << HEADER_BYTE_1_BIT)
138 | (parity_byte << PARITY_BYTE_1_BIT));
139 DRM_DEBUG_DP("Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
141 dp_audio_set_header(catalog, value,
142 DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_1);
144 /* Config header and parity byte 2 */
145 value = dp_audio_get_header(catalog,
146 DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_2);
148 parity_byte = dp_audio_calculate_parity(new_value);
149 value |= ((new_value << HEADER_BYTE_2_BIT)
150 | (parity_byte << PARITY_BYTE_2_BIT));
151 DRM_DEBUG_DP("Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
154 dp_audio_set_header(catalog, value,
155 DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_2);
157 /* Config header and parity byte 3 */
158 value = dp_audio_get_header(catalog,
159 DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_3);
161 new_value = audio->channels - 1;
162 parity_byte = dp_audio_calculate_parity(new_value);
163 value |= ((new_value << HEADER_BYTE_3_BIT)
164 | (parity_byte << PARITY_BYTE_3_BIT));
165 DRM_DEBUG_DP("Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
168 dp_audio_set_header(catalog, value,
169 DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_3);
172 static void dp_audio_timestamp_sdp(struct dp_audio_private *audio)
174 struct dp_catalog *catalog = audio->catalog;
175 u32 value, new_value;
178 /* Config header and parity byte 1 */
179 value = dp_audio_get_header(catalog,
180 DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_1);
183 parity_byte = dp_audio_calculate_parity(new_value);
184 value |= ((new_value << HEADER_BYTE_1_BIT)
185 | (parity_byte << PARITY_BYTE_1_BIT));
186 DRM_DEBUG_DP("Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
188 dp_audio_set_header(catalog, value,
189 DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_1);
191 /* Config header and parity byte 2 */
192 value = dp_audio_get_header(catalog,
193 DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_2);
196 parity_byte = dp_audio_calculate_parity(new_value);
197 value |= ((new_value << HEADER_BYTE_2_BIT)
198 | (parity_byte << PARITY_BYTE_2_BIT));
199 DRM_DEBUG_DP("Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
201 dp_audio_set_header(catalog, value,
202 DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_2);
204 /* Config header and parity byte 3 */
205 value = dp_audio_get_header(catalog,
206 DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_3);
208 new_value = (0x0 | (0x11 << 2));
209 parity_byte = dp_audio_calculate_parity(new_value);
210 value |= ((new_value << HEADER_BYTE_3_BIT)
211 | (parity_byte << PARITY_BYTE_3_BIT));
212 DRM_DEBUG_DP("Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
214 dp_audio_set_header(catalog, value,
215 DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_3);
218 static void dp_audio_infoframe_sdp(struct dp_audio_private *audio)
220 struct dp_catalog *catalog = audio->catalog;
221 u32 value, new_value;
224 /* Config header and parity byte 1 */
225 value = dp_audio_get_header(catalog,
226 DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_1);
229 parity_byte = dp_audio_calculate_parity(new_value);
230 value |= ((new_value << HEADER_BYTE_1_BIT)
231 | (parity_byte << PARITY_BYTE_1_BIT));
232 DRM_DEBUG_DP("Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
234 dp_audio_set_header(catalog, value,
235 DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_1);
237 /* Config header and parity byte 2 */
238 value = dp_audio_get_header(catalog,
239 DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_2);
242 parity_byte = dp_audio_calculate_parity(new_value);
243 value |= ((new_value << HEADER_BYTE_2_BIT)
244 | (parity_byte << PARITY_BYTE_2_BIT));
245 DRM_DEBUG_DP("Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
247 dp_audio_set_header(catalog, value,
248 DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_2);
250 /* Config header and parity byte 3 */
251 value = dp_audio_get_header(catalog,
252 DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_3);
254 new_value = (0x0 | (0x11 << 2));
255 parity_byte = dp_audio_calculate_parity(new_value);
256 value |= ((new_value << HEADER_BYTE_3_BIT)
257 | (parity_byte << PARITY_BYTE_3_BIT));
258 DRM_DEBUG_DP("Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
259 new_value, parity_byte);
260 dp_audio_set_header(catalog, value,
261 DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_3);
264 static void dp_audio_copy_management_sdp(struct dp_audio_private *audio)
266 struct dp_catalog *catalog = audio->catalog;
267 u32 value, new_value;
270 /* Config header and parity byte 1 */
271 value = dp_audio_get_header(catalog,
272 DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_1);
275 parity_byte = dp_audio_calculate_parity(new_value);
276 value |= ((new_value << HEADER_BYTE_1_BIT)
277 | (parity_byte << PARITY_BYTE_1_BIT));
278 DRM_DEBUG_DP("Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
280 dp_audio_set_header(catalog, value,
281 DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_1);
283 /* Config header and parity byte 2 */
284 value = dp_audio_get_header(catalog,
285 DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_2);
288 parity_byte = dp_audio_calculate_parity(new_value);
289 value |= ((new_value << HEADER_BYTE_2_BIT)
290 | (parity_byte << PARITY_BYTE_2_BIT));
291 DRM_DEBUG_DP("Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
293 dp_audio_set_header(catalog, value,
294 DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_2);
296 /* Config header and parity byte 3 */
297 value = dp_audio_get_header(catalog,
298 DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_3);
301 parity_byte = dp_audio_calculate_parity(new_value);
302 value |= ((new_value << HEADER_BYTE_3_BIT)
303 | (parity_byte << PARITY_BYTE_3_BIT));
304 DRM_DEBUG_DP("Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
306 dp_audio_set_header(catalog, value,
307 DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_3);
310 static void dp_audio_isrc_sdp(struct dp_audio_private *audio)
312 struct dp_catalog *catalog = audio->catalog;
313 u32 value, new_value;
316 /* Config header and parity byte 1 */
317 value = dp_audio_get_header(catalog,
318 DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_1);
321 parity_byte = dp_audio_calculate_parity(new_value);
322 value |= ((new_value << HEADER_BYTE_1_BIT)
323 | (parity_byte << PARITY_BYTE_1_BIT));
324 DRM_DEBUG_DP("Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
326 dp_audio_set_header(catalog, value,
327 DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_1);
329 /* Config header and parity byte 2 */
330 value = dp_audio_get_header(catalog,
331 DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_2);
334 parity_byte = dp_audio_calculate_parity(new_value);
335 value |= ((new_value << HEADER_BYTE_2_BIT)
336 | (parity_byte << PARITY_BYTE_2_BIT));
337 DRM_DEBUG_DP("Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
339 dp_audio_set_header(catalog, value,
340 DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_2);
343 static void dp_audio_setup_sdp(struct dp_audio_private *audio)
345 dp_catalog_audio_config_sdp(audio->catalog);
347 dp_audio_stream_sdp(audio);
348 dp_audio_timestamp_sdp(audio);
349 dp_audio_infoframe_sdp(audio);
350 dp_audio_copy_management_sdp(audio);
351 dp_audio_isrc_sdp(audio);
354 static void dp_audio_setup_acr(struct dp_audio_private *audio)
357 struct dp_catalog *catalog = audio->catalog;
359 switch (audio->dp_audio.bw_code) {
360 case DP_LINK_BW_1_62:
373 DRM_DEBUG_DP("Unknown link rate\n");
378 catalog->audio_data = select;
379 dp_catalog_audio_config_acr(catalog);
382 static void dp_audio_safe_to_exit_level(struct dp_audio_private *audio)
384 struct dp_catalog *catalog = audio->catalog;
385 u32 safe_to_exit_level = 0;
387 switch (audio->dp_audio.lane_count) {
389 safe_to_exit_level = 14;
392 safe_to_exit_level = 8;
395 safe_to_exit_level = 5;
398 DRM_DEBUG_DP("setting the default safe_to_exit_level = %u\n",
400 safe_to_exit_level = 14;
404 catalog->audio_data = safe_to_exit_level;
405 dp_catalog_audio_sfe_level(catalog);
408 static void dp_audio_enable(struct dp_audio_private *audio, bool enable)
410 struct dp_catalog *catalog = audio->catalog;
412 catalog->audio_data = enable;
413 dp_catalog_audio_enable(catalog);
415 audio->engine_on = enable;
418 static struct dp_audio_private *dp_audio_get_data(struct platform_device *pdev)
420 struct dp_audio *dp_audio;
421 struct msm_dp *dp_display;
424 DRM_ERROR("invalid input\n");
425 return ERR_PTR(-ENODEV);
428 dp_display = platform_get_drvdata(pdev);
430 DRM_ERROR("invalid input\n");
431 return ERR_PTR(-ENODEV);
434 dp_audio = dp_display->dp_audio;
437 DRM_ERROR("invalid dp_audio data\n");
438 return ERR_PTR(-EINVAL);
441 return container_of(dp_audio, struct dp_audio_private, dp_audio);
444 static int dp_audio_hook_plugged_cb(struct device *dev, void *data,
445 hdmi_codec_plugged_cb fn,
446 struct device *codec_dev)
449 struct platform_device *pdev;
450 struct msm_dp *dp_display;
452 pdev = to_platform_device(dev);
454 pr_err("invalid input\n");
458 dp_display = platform_get_drvdata(pdev);
460 pr_err("invalid input\n");
464 return dp_display_set_plugged_cb(dp_display, fn, codec_dev);
467 static int dp_audio_get_eld(struct device *dev,
468 void *data, uint8_t *buf, size_t len)
470 struct platform_device *pdev;
471 struct msm_dp *dp_display;
473 pdev = to_platform_device(dev);
476 DRM_ERROR("invalid input\n");
480 dp_display = platform_get_drvdata(pdev);
482 DRM_ERROR("invalid input\n");
486 memcpy(buf, dp_display->connector->eld,
487 min(sizeof(dp_display->connector->eld), len));
492 int dp_audio_hw_params(struct device *dev,
494 struct hdmi_codec_daifmt *daifmt,
495 struct hdmi_codec_params *params)
498 struct dp_audio_private *audio;
499 struct platform_device *pdev;
500 struct msm_dp *dp_display;
502 pdev = to_platform_device(dev);
503 dp_display = platform_get_drvdata(pdev);
506 * there could be cases where sound card can be opened even
507 * before OR even when DP is not connected . This can cause
508 * unclocked access as the audio subsystem relies on the DP
509 * driver to maintain the correct state of clocks. To protect
510 * such cases check for connection status and bail out if not
513 if (!dp_display->power_on) {
518 audio = dp_audio_get_data(pdev);
524 audio->channels = params->channels;
526 dp_audio_setup_sdp(audio);
527 dp_audio_setup_acr(audio);
528 dp_audio_safe_to_exit_level(audio);
529 dp_audio_enable(audio, true);
530 dp_display_signal_audio_start(dp_display);
531 dp_display->audio_enabled = true;
537 static void dp_audio_shutdown(struct device *dev, void *data)
539 struct dp_audio_private *audio;
540 struct platform_device *pdev;
541 struct msm_dp *dp_display;
543 pdev = to_platform_device(dev);
544 dp_display = platform_get_drvdata(pdev);
545 audio = dp_audio_get_data(pdev);
547 DRM_ERROR("failed to get audio data\n");
552 * if audio was not enabled there is no need
553 * to execute the shutdown and we can bail out early.
554 * This also makes sure that we dont cause an unclocked
555 * access when audio subsystem calls this without DP being
556 * connected. is_connected cannot be used here as its set
557 * to false earlier than this call
559 if (!dp_display->audio_enabled)
562 dp_audio_enable(audio, false);
563 /* signal the dp display to safely shutdown clocks */
564 dp_display_signal_audio_complete(dp_display);
567 static const struct hdmi_codec_ops dp_audio_codec_ops = {
568 .hw_params = dp_audio_hw_params,
569 .audio_shutdown = dp_audio_shutdown,
570 .get_eld = dp_audio_get_eld,
571 .hook_plugged_cb = dp_audio_hook_plugged_cb,
574 static struct hdmi_codec_pdata codec_data = {
575 .ops = &dp_audio_codec_ops,
576 .max_i2s_channels = 8,
580 int dp_register_audio_driver(struct device *dev,
581 struct dp_audio *dp_audio)
583 struct dp_audio_private *audio_priv;
585 audio_priv = container_of(dp_audio,
586 struct dp_audio_private, dp_audio);
588 audio_priv->audio_pdev = platform_device_register_data(dev,
593 return PTR_ERR_OR_ZERO(audio_priv->audio_pdev);
596 struct dp_audio *dp_audio_get(struct platform_device *pdev,
597 struct dp_panel *panel,
598 struct dp_catalog *catalog)
601 struct dp_audio_private *audio;
602 struct dp_audio *dp_audio;
604 if (!pdev || !panel || !catalog) {
605 DRM_ERROR("invalid input\n");
610 audio = devm_kzalloc(&pdev->dev, sizeof(*audio), GFP_KERNEL);
617 audio->panel = panel;
618 audio->catalog = catalog;
620 dp_audio = &audio->dp_audio;
622 dp_catalog_audio_init(catalog);
629 void dp_audio_put(struct dp_audio *dp_audio)
631 struct dp_audio_private *audio;
636 audio = container_of(dp_audio, struct dp_audio_private, dp_audio);
638 devm_kfree(&audio->pdev->dev, audio);