// SPDX-License-Identifier: GPL-2.0 #include "hdmi.h" void pack_hdmi_infoframe(struct packed_hdmi_infoframe *packed_frame, u8 *raw_frame, ssize_t len) { u32 header = 0; u32 subpack0_low = 0; u32 subpack0_high = 0; u32 subpack1_low = 0; u32 subpack1_high = 0; switch (len) { /* * "When in doubt, use brute force." * -- Ken Thompson. */ default: /* * We presume that no valid frame is longer than 17 * octets, including header... And truncate to that * if it's longer. */ case 17: subpack1_high = (raw_frame[16] << 16); case 16: subpack1_high |= (raw_frame[15] << 8); case 15: subpack1_high |= raw_frame[14]; case 14: subpack1_low = (raw_frame[13] << 24); case 13: subpack1_low |= (raw_frame[12] << 16); case 12: subpack1_low |= (raw_frame[11] << 8); case 11: subpack1_low |= raw_frame[10]; case 10: subpack0_high = (raw_frame[9] << 16); case 9: subpack0_high |= (raw_frame[8] << 8); case 8: subpack0_high |= raw_frame[7]; case 7: subpack0_low = (raw_frame[6] << 24); case 6: subpack0_low |= (raw_frame[5] << 16); case 5: subpack0_low |= (raw_frame[4] << 8); case 4: subpack0_low |= raw_frame[3]; case 3: header = (raw_frame[2] << 16); case 2: header |= (raw_frame[1] << 8); case 1: header |= raw_frame[0]; case 0: break; } packed_frame->header = header; packed_frame->subpack0_low = subpack0_low; packed_frame->subpack0_high = subpack0_high; packed_frame->subpack1_low = subpack1_low; packed_frame->subpack1_high = subpack1_high; }