Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/bridge: write full Audio InfoFrame

Instead of writing the first byte of the infoframe (and hoping that the
rest is default / zeroes), hook Audio InfoFrame support into the
write_infoframe / clear_infoframes callbacks and use
drm_atomic_helper_connector_hdmi_update_audio_infoframe() to write the
frame.

Acked-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20250903-adv7511-audio-infoframe-v1-2-05b24459b9a4@oss.qualcomm.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>

+24 -17
+6 -17
drivers/gpu/drm/bridge/adv7511/adv7511_audio.c
··· 12 12 #include <sound/soc.h> 13 13 #include <linux/of_graph.h> 14 14 15 + #include <drm/display/drm_hdmi_state_helper.h> 16 + 15 17 #include "adv7511.h" 16 18 17 19 static void adv7511_calc_cts_n(unsigned int f_tmds, unsigned int fs, ··· 157 155 regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG, 158 156 ADV7511_I2C_FREQ_ID_CFG_RATE_MASK, rate << 4); 159 157 160 - /* send current Audio infoframe values while updating */ 161 - regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, 162 - BIT(5), BIT(5)); 163 - 164 - regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME(0), 0x1); 165 - 166 - /* use Audio infoframe updated info */ 167 - regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, 168 - BIT(5), 0); 169 - 170 - return 0; 158 + return drm_atomic_helper_connector_hdmi_update_audio_infoframe(connector, 159 + &hparms->cea); 171 160 } 172 161 173 162 int adv7511_hdmi_audio_startup(struct drm_bridge *bridge, ··· 181 188 /* not copyrighted */ 182 189 regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CFG1, 183 190 BIT(5), BIT(5)); 184 - /* enable audio infoframes */ 185 - regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1, 186 - BIT(3), BIT(3)); 187 191 /* AV mute disable */ 188 192 regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(0), 189 193 BIT(7) | BIT(6), BIT(7)); 190 - /* use Audio infoframe updated info */ 191 - regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, 192 - BIT(5), 0); 193 194 194 195 /* enable SPDIF receiver */ 195 196 if (adv7511->audio_source == ADV7511_AUDIO_SOURCE_SPDIF) ··· 201 214 if (adv7511->audio_source == ADV7511_AUDIO_SOURCE_SPDIF) 202 215 regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, 203 216 BIT(7), 0); 217 + 218 + drm_atomic_helper_connector_hdmi_clear_audio_infoframe(connector); 204 219 }
+18
drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
··· 893 893 struct adv7511 *adv7511 = bridge_to_adv7511(bridge); 894 894 895 895 switch (type) { 896 + case HDMI_INFOFRAME_TYPE_AUDIO: 897 + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME); 898 + break; 896 899 case HDMI_INFOFRAME_TYPE_AVI: 897 900 adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); 898 901 break; ··· 920 917 struct adv7511 *adv7511 = bridge_to_adv7511(bridge); 921 918 922 919 switch (type) { 920 + case HDMI_INFOFRAME_TYPE_AUDIO: 921 + /* send current Audio infoframe values while updating */ 922 + regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, 923 + BIT(5), BIT(5)); 924 + 925 + /* The Audio infoframe id is not configurable */ 926 + regmap_bulk_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_VERSION, 927 + buffer + 1, len - 1); 928 + 929 + /* use Audio infoframe updated info */ 930 + regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, 931 + BIT(5), 0); 932 + 933 + adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME); 934 + break; 923 935 case HDMI_INFOFRAME_TYPE_AVI: 924 936 /* send current AVI infoframe values while updating */ 925 937 regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,