10dd9c7a9SMike Dunn /*
2*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
30dd9c7a9SMike Dunn *
40dd9c7a9SMike Dunn * Based on bitrev from the Linux kernel, by Akinobu Mita
50dd9c7a9SMike Dunn */
60dd9c7a9SMike Dunn
70dd9c7a9SMike Dunn
80dd9c7a9SMike Dunn #include <linux/types.h>
90dd9c7a9SMike Dunn #include <linux/bitrev.h>
100dd9c7a9SMike Dunn
110dd9c7a9SMike Dunn const u8 byte_rev_table[256] = {
120dd9c7a9SMike Dunn 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
130dd9c7a9SMike Dunn 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
140dd9c7a9SMike Dunn 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
150dd9c7a9SMike Dunn 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
160dd9c7a9SMike Dunn 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
170dd9c7a9SMike Dunn 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
180dd9c7a9SMike Dunn 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
190dd9c7a9SMike Dunn 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
200dd9c7a9SMike Dunn 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
210dd9c7a9SMike Dunn 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
220dd9c7a9SMike Dunn 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
230dd9c7a9SMike Dunn 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
240dd9c7a9SMike Dunn 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
250dd9c7a9SMike Dunn 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
260dd9c7a9SMike Dunn 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
270dd9c7a9SMike Dunn 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
280dd9c7a9SMike Dunn 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
290dd9c7a9SMike Dunn 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
300dd9c7a9SMike Dunn 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
310dd9c7a9SMike Dunn 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
320dd9c7a9SMike Dunn 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
330dd9c7a9SMike Dunn 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
340dd9c7a9SMike Dunn 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
350dd9c7a9SMike Dunn 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
360dd9c7a9SMike Dunn 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
370dd9c7a9SMike Dunn 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
380dd9c7a9SMike Dunn 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
390dd9c7a9SMike Dunn 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
400dd9c7a9SMike Dunn 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
410dd9c7a9SMike Dunn 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
420dd9c7a9SMike Dunn 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
430dd9c7a9SMike Dunn 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
440dd9c7a9SMike Dunn };
450dd9c7a9SMike Dunn
bitrev16(u16 x)460dd9c7a9SMike Dunn u16 bitrev16(u16 x)
470dd9c7a9SMike Dunn {
480dd9c7a9SMike Dunn return (bitrev8(x & 0xff) << 8) | bitrev8(x >> 8);
490dd9c7a9SMike Dunn }
500dd9c7a9SMike Dunn
510dd9c7a9SMike Dunn /**
520dd9c7a9SMike Dunn * bitrev32 - reverse the order of bits in a u32 value
530dd9c7a9SMike Dunn * @x: value to be bit-reversed
540dd9c7a9SMike Dunn */
bitrev32(u32 x)550dd9c7a9SMike Dunn u32 bitrev32(u32 x)
560dd9c7a9SMike Dunn {
570dd9c7a9SMike Dunn return (bitrev16(x & 0xffff) << 16) | bitrev16(x >> 16);
580dd9c7a9SMike Dunn }
59