hc
2023-11-07 f45e756958099c35d6afb746df1d40a1c6302cfc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// 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;
}