xref: /rk3399_rockchip-uboot/lib/crc8.c (revision 456ecd08ec026e67a17a77baa3778c9f1b8e474d)
160d18d3fSSimon Glass /*
260d18d3fSSimon Glass  * Copyright (c) 2013 Google, Inc
360d18d3fSSimon Glass  *
460d18d3fSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
560d18d3fSSimon Glass  */
660d18d3fSSimon Glass 
760d18d3fSSimon Glass #include "linux/crc8.h"
860d18d3fSSimon Glass 
9*456ecd08SStefan Roese #define POLY	(0x1070U << 3)
10*456ecd08SStefan Roese 
_crc8(unsigned short data)11*456ecd08SStefan Roese static unsigned char _crc8(unsigned short data)
1260d18d3fSSimon Glass {
13*456ecd08SStefan Roese 	int i;
1460d18d3fSSimon Glass 
15*456ecd08SStefan Roese 	for (i = 0; i < 8; i++) {
16*456ecd08SStefan Roese 		if (data & 0x8000)
17*456ecd08SStefan Roese 			data = data ^ POLY;
18*456ecd08SStefan Roese 		data = data << 1;
1960d18d3fSSimon Glass 	}
2060d18d3fSSimon Glass 
21*456ecd08SStefan Roese 	return (unsigned char)(data >> 8);
22*456ecd08SStefan Roese }
23*456ecd08SStefan Roese 
crc8(unsigned int crc,const unsigned char * vptr,int len)24*456ecd08SStefan Roese unsigned int crc8(unsigned int crc, const unsigned char *vptr, int len)
25*456ecd08SStefan Roese {
26*456ecd08SStefan Roese 	int i;
27*456ecd08SStefan Roese 
28*456ecd08SStefan Roese 	for (i = 0; i < len; i++)
29*456ecd08SStefan Roese 		crc = _crc8((crc ^ vptr[i]) << 8);
30*456ecd08SStefan Roese 
31*456ecd08SStefan Roese 	return crc;
3260d18d3fSSimon Glass }
33