mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-03 08:14:12 +00:00
Parity calculation is necessary for VSC SDP implementation. Therefore create new files dp_utils.c and dp_utils.h and move the parity calculating functions here. This ensures that they are usable by SDP programming in both dp_catalog.c and dp_audio.c Changes in v3: - Change ordering of the header byte macros Changes in v2: - Create new files dp_utils.c and dp_utils.h - Move the parity calculation to these new files instead of having them in dp_catalog.c and dp_catalog.h Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Patchwork: https://patchwork.freedesktop.org/patch/579617/ Link: https://lore.kernel.org/r/20240222194025.25329-13-quic_parellan@quicinc.com Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
74 lines
1.1 KiB
C
74 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2024, The Linux Foundation. All rights reserved.
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include "dp_utils.h"
|
|
|
|
u8 dp_utils_get_g0_value(u8 data)
|
|
{
|
|
u8 c[4];
|
|
u8 g[4];
|
|
u8 ret_data = 0;
|
|
u8 i;
|
|
|
|
for (i = 0; i < 4; i++)
|
|
c[i] = (data >> i) & 0x01;
|
|
|
|
g[0] = c[3];
|
|
g[1] = c[0] ^ c[3];
|
|
g[2] = c[1];
|
|
g[3] = c[2];
|
|
|
|
for (i = 0; i < 4; i++)
|
|
ret_data = ((g[i] & 0x01) << i) | ret_data;
|
|
|
|
return ret_data;
|
|
}
|
|
|
|
u8 dp_utils_get_g1_value(u8 data)
|
|
{
|
|
u8 c[4];
|
|
u8 g[4];
|
|
u8 ret_data = 0;
|
|
u8 i;
|
|
|
|
for (i = 0; i < 4; i++)
|
|
c[i] = (data >> i) & 0x01;
|
|
|
|
g[0] = c[0] ^ c[3];
|
|
g[1] = c[0] ^ c[1] ^ c[3];
|
|
g[2] = c[1] ^ c[2];
|
|
g[3] = c[2] ^ c[3];
|
|
|
|
for (i = 0; i < 4; i++)
|
|
ret_data = ((g[i] & 0x01) << i) | ret_data;
|
|
|
|
return ret_data;
|
|
}
|
|
|
|
u8 dp_utils_calculate_parity(u32 data)
|
|
{
|
|
u8 x0 = 0;
|
|
u8 x1 = 0;
|
|
u8 ci = 0;
|
|
u8 iData = 0;
|
|
u8 i = 0;
|
|
u8 parity_byte;
|
|
u8 num_byte = (data & 0xFF00) > 0 ? 8 : 2;
|
|
|
|
for (i = 0; i < num_byte; i++) {
|
|
iData = (data >> i * 4) & 0xF;
|
|
|
|
ci = iData ^ x1;
|
|
x1 = x0 ^ dp_utils_get_g1_value(ci);
|
|
x0 = dp_utils_get_g0_value(ci);
|
|
}
|
|
|
|
parity_byte = x1 | (x0 << 4);
|
|
|
|
return parity_byte;
|
|
}
|