mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 07:03:03 +02:00
drm/msm/dp: use msm_dp_utils_pack_sdp_header() for audio packets
Use msm_dp_utils_pack_sdp_header() and call msm_dp_write_link() directly to program audio packet data. Use 0 as Packet ID, as it was not programmed earlier. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Stephen Boyd <swboyd@chromium.org> Tested-by: Stephen Boyd <swboyd@chromium.org> # sc7180-trogdor Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Patchwork: https://patchwork.freedesktop.org/patch/629051/ Link: https://lore.kernel.org/r/20241216-fd-dp-audio-fixup-v4-2-f8d1961cf22f@linaro.org
This commit is contained in:
parent
ba3627bf82
commit
486de5eec0
|
|
@ -14,6 +14,7 @@
|
|||
#include "dp_catalog.h"
|
||||
#include "dp_audio.h"
|
||||
#include "dp_panel.h"
|
||||
#include "dp_reg.h"
|
||||
#include "dp_display.h"
|
||||
#include "dp_utils.h"
|
||||
|
||||
|
|
@ -28,251 +29,64 @@ struct msm_dp_audio_private {
|
|||
struct msm_dp_audio msm_dp_audio;
|
||||
};
|
||||
|
||||
static u32 msm_dp_audio_get_header(struct msm_dp_catalog *catalog,
|
||||
enum msm_dp_catalog_audio_sdp_type sdp,
|
||||
enum msm_dp_catalog_audio_header_type header)
|
||||
{
|
||||
return msm_dp_catalog_audio_get_header(catalog, sdp, header);
|
||||
}
|
||||
|
||||
static void msm_dp_audio_set_header(struct msm_dp_catalog *catalog,
|
||||
u32 data,
|
||||
enum msm_dp_catalog_audio_sdp_type sdp,
|
||||
enum msm_dp_catalog_audio_header_type header)
|
||||
{
|
||||
msm_dp_catalog_audio_set_header(catalog, sdp, header, data);
|
||||
}
|
||||
|
||||
static void msm_dp_audio_stream_sdp(struct msm_dp_audio_private *audio)
|
||||
{
|
||||
struct msm_dp_catalog *catalog = audio->catalog;
|
||||
u32 value, new_value;
|
||||
u8 parity_byte;
|
||||
struct dp_sdp_header sdp_hdr = {
|
||||
.HB0 = 0x00,
|
||||
.HB1 = 0x02,
|
||||
.HB2 = 0x00,
|
||||
.HB3 = audio->channels - 1,
|
||||
};
|
||||
|
||||
/* Config header and parity byte 1 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
new_value = 0x02;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_1_BIT)
|
||||
| (parity_byte << PARITY_BYTE_1_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
/* Config header and parity byte 2 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_2);
|
||||
new_value = value;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_2_BIT)
|
||||
| (parity_byte << PARITY_BYTE_2_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_2);
|
||||
|
||||
/* Config header and parity byte 3 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_3);
|
||||
|
||||
new_value = audio->channels - 1;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_3_BIT)
|
||||
| (parity_byte << PARITY_BYTE_3_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_STREAM, DP_AUDIO_SDP_HEADER_3);
|
||||
msm_dp_catalog_write_audio_stream(audio->catalog, &sdp_hdr);
|
||||
}
|
||||
|
||||
static void msm_dp_audio_timestamp_sdp(struct msm_dp_audio_private *audio)
|
||||
{
|
||||
struct msm_dp_catalog *catalog = audio->catalog;
|
||||
u32 value, new_value;
|
||||
u8 parity_byte;
|
||||
struct dp_sdp_header sdp_hdr = {
|
||||
.HB0 = 0x00,
|
||||
.HB1 = 0x01,
|
||||
.HB2 = 0x17,
|
||||
.HB3 = 0x0 | (0x11 << 2),
|
||||
};
|
||||
|
||||
/* Config header and parity byte 1 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
new_value = 0x1;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_1_BIT)
|
||||
| (parity_byte << PARITY_BYTE_1_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
/* Config header and parity byte 2 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_2);
|
||||
|
||||
new_value = 0x17;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_2_BIT)
|
||||
| (parity_byte << PARITY_BYTE_2_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_2);
|
||||
|
||||
/* Config header and parity byte 3 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_3);
|
||||
|
||||
new_value = (0x0 | (0x11 << 2));
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_3_BIT)
|
||||
| (parity_byte << PARITY_BYTE_3_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_TIMESTAMP, DP_AUDIO_SDP_HEADER_3);
|
||||
msm_dp_catalog_write_audio_timestamp(audio->catalog, &sdp_hdr);
|
||||
}
|
||||
|
||||
static void msm_dp_audio_infoframe_sdp(struct msm_dp_audio_private *audio)
|
||||
{
|
||||
struct msm_dp_catalog *catalog = audio->catalog;
|
||||
u32 value, new_value;
|
||||
u8 parity_byte;
|
||||
struct dp_sdp_header sdp_hdr = {
|
||||
.HB0 = 0x00,
|
||||
.HB1 = 0x84,
|
||||
.HB2 = 0x1b,
|
||||
.HB3 = 0x0 | (0x11 << 2),
|
||||
};
|
||||
|
||||
/* Config header and parity byte 1 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
new_value = 0x84;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_1_BIT)
|
||||
| (parity_byte << PARITY_BYTE_1_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
/* Config header and parity byte 2 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_2);
|
||||
|
||||
new_value = 0x1b;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_2_BIT)
|
||||
| (parity_byte << PARITY_BYTE_2_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_2);
|
||||
|
||||
/* Config header and parity byte 3 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_3);
|
||||
|
||||
new_value = (0x0 | (0x11 << 2));
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_3_BIT)
|
||||
| (parity_byte << PARITY_BYTE_3_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
|
||||
new_value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_INFOFRAME, DP_AUDIO_SDP_HEADER_3);
|
||||
msm_dp_catalog_write_audio_infoframe(audio->catalog, &sdp_hdr);
|
||||
}
|
||||
|
||||
static void msm_dp_audio_copy_management_sdp(struct msm_dp_audio_private *audio)
|
||||
{
|
||||
struct msm_dp_catalog *catalog = audio->catalog;
|
||||
u32 value, new_value;
|
||||
u8 parity_byte;
|
||||
struct dp_sdp_header sdp_hdr = {
|
||||
.HB0 = 0x00,
|
||||
.HB1 = 0x05,
|
||||
.HB2 = 0x0f,
|
||||
.HB3 = 0x00,
|
||||
};
|
||||
|
||||
/* Config header and parity byte 1 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
new_value = 0x05;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_1_BIT)
|
||||
| (parity_byte << PARITY_BYTE_1_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
/* Config header and parity byte 2 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_2);
|
||||
|
||||
new_value = 0x0F;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_2_BIT)
|
||||
| (parity_byte << PARITY_BYTE_2_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_2);
|
||||
|
||||
/* Config header and parity byte 3 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_3);
|
||||
|
||||
new_value = 0x0;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_3_BIT)
|
||||
| (parity_byte << PARITY_BYTE_3_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 3: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_COPYMANAGEMENT, DP_AUDIO_SDP_HEADER_3);
|
||||
msm_dp_catalog_write_audio_copy_mgmt(audio->catalog, &sdp_hdr);
|
||||
}
|
||||
|
||||
static void msm_dp_audio_isrc_sdp(struct msm_dp_audio_private *audio)
|
||||
{
|
||||
struct msm_dp_catalog *catalog = audio->catalog;
|
||||
u32 value, new_value;
|
||||
u8 parity_byte;
|
||||
struct dp_sdp_header sdp_hdr = {
|
||||
.HB0 = 0x00,
|
||||
.HB1 = 0x06,
|
||||
.HB2 = 0x0f,
|
||||
.HB3 = 0x00,
|
||||
};
|
||||
|
||||
/* Config header and parity byte 1 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
new_value = 0x06;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_1_BIT)
|
||||
| (parity_byte << PARITY_BYTE_1_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 1: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_1);
|
||||
|
||||
/* Config header and parity byte 2 */
|
||||
value = msm_dp_audio_get_header(catalog,
|
||||
DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_2);
|
||||
|
||||
new_value = 0x0F;
|
||||
parity_byte = msm_dp_utils_calculate_parity(new_value);
|
||||
value |= ((new_value << HEADER_BYTE_2_BIT)
|
||||
| (parity_byte << PARITY_BYTE_2_BIT));
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"Header Byte 2: value = 0x%x, parity_byte = 0x%x\n",
|
||||
value, parity_byte);
|
||||
msm_dp_audio_set_header(catalog, value,
|
||||
DP_AUDIO_SDP_ISRC, DP_AUDIO_SDP_HEADER_2);
|
||||
msm_dp_catalog_write_audio_isrc(audio->catalog, &sdp_hdr);
|
||||
}
|
||||
|
||||
static void msm_dp_audio_setup_sdp(struct msm_dp_audio_private *audio)
|
||||
|
|
|
|||
|
|
@ -1122,6 +1122,77 @@ struct msm_dp_catalog *msm_dp_catalog_get(struct device *dev)
|
|||
return &catalog->msm_dp_catalog;
|
||||
}
|
||||
|
||||
void msm_dp_catalog_write_audio_stream(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr)
|
||||
{
|
||||
struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
|
||||
struct msm_dp_catalog_private, msm_dp_catalog);
|
||||
u32 header[2];
|
||||
|
||||
msm_dp_utils_pack_sdp_header(sdp_hdr, header);
|
||||
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_STREAM_0, header[0]);
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_STREAM_1, header[1]);
|
||||
}
|
||||
|
||||
void msm_dp_catalog_write_audio_timestamp(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr)
|
||||
{
|
||||
struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
|
||||
struct msm_dp_catalog_private, msm_dp_catalog);
|
||||
u32 header[2];
|
||||
|
||||
msm_dp_utils_pack_sdp_header(sdp_hdr, header);
|
||||
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_TIMESTAMP_0, header[0]);
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_TIMESTAMP_1, header[1]);
|
||||
}
|
||||
|
||||
void msm_dp_catalog_write_audio_infoframe(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr)
|
||||
{
|
||||
struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
|
||||
struct msm_dp_catalog_private, msm_dp_catalog);
|
||||
u32 header[2];
|
||||
|
||||
msm_dp_utils_pack_sdp_header(sdp_hdr, header);
|
||||
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_INFOFRAME_0, header[0]);
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_INFOFRAME_1, header[1]);
|
||||
}
|
||||
|
||||
void msm_dp_catalog_write_audio_copy_mgmt(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr)
|
||||
{
|
||||
struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
|
||||
struct msm_dp_catalog_private, msm_dp_catalog);
|
||||
u32 header[2];
|
||||
|
||||
msm_dp_utils_pack_sdp_header(sdp_hdr, header);
|
||||
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_COPYMANAGEMENT_0, header[0]);
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_COPYMANAGEMENT_1, header[1]);
|
||||
}
|
||||
|
||||
void msm_dp_catalog_write_audio_isrc(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr)
|
||||
{
|
||||
struct msm_dp_catalog_private *catalog = container_of(msm_dp_catalog,
|
||||
struct msm_dp_catalog_private, msm_dp_catalog);
|
||||
struct dp_sdp_header tmp = *sdp_hdr;
|
||||
u32 header[2];
|
||||
u32 reg;
|
||||
|
||||
/* XXX: is it necessary to preserve this field? */
|
||||
reg = msm_dp_read_link(catalog, MMSS_DP_AUDIO_ISRC_1);
|
||||
tmp.HB3 = FIELD_GET(HEADER_3_MASK, reg);
|
||||
|
||||
msm_dp_utils_pack_sdp_header(&tmp, header);
|
||||
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_ISRC_0, header[0]);
|
||||
msm_dp_write_link(catalog, MMSS_DP_AUDIO_ISRC_1, header[1]);
|
||||
}
|
||||
|
||||
u32 msm_dp_catalog_audio_get_header(struct msm_dp_catalog *msm_dp_catalog,
|
||||
enum msm_dp_catalog_audio_sdp_type sdp,
|
||||
enum msm_dp_catalog_audio_header_type header)
|
||||
|
|
|
|||
|
|
@ -111,6 +111,16 @@ void msm_dp_catalog_panel_tpg_disable(struct msm_dp_catalog *msm_dp_catalog);
|
|||
struct msm_dp_catalog *msm_dp_catalog_get(struct device *dev);
|
||||
|
||||
/* DP Audio APIs */
|
||||
void msm_dp_catalog_write_audio_stream(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr);
|
||||
void msm_dp_catalog_write_audio_timestamp(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr);
|
||||
void msm_dp_catalog_write_audio_infoframe(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr);
|
||||
void msm_dp_catalog_write_audio_copy_mgmt(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr);
|
||||
void msm_dp_catalog_write_audio_isrc(struct msm_dp_catalog *msm_dp_catalog,
|
||||
struct dp_sdp_header *sdp_hdr);
|
||||
u32 msm_dp_catalog_audio_get_header(struct msm_dp_catalog *msm_dp_catalog,
|
||||
enum msm_dp_catalog_audio_sdp_type sdp,
|
||||
enum msm_dp_catalog_audio_header_type header);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user