forked from mirrors/linux
		
	 1940979657
			
		
	
	
		1940979657
		
	
	
	
	
		
			
			bcd2bin(0x0A) happily returns 10, despite this being an invalid BCD value. RTC drivers converting possibly corrupted BCD timestamps might want to validate their input before calling bcd2bin(). Provide a macro to do so. Unlike bcd2bin and bin2bcd, out-of-line versions are not implemented. Should the macro experience enough use, this can be retrofitted. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Link: https://lore.kernel.org/r/20221123095527.2771434-2-s.hauer@pengutronix.de Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
		
			
				
	
	
		
			27 lines
		
	
	
	
		
			683 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			27 lines
		
	
	
	
		
			683 B
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| #ifndef _BCD_H
 | |
| #define _BCD_H
 | |
| 
 | |
| #include <linux/compiler.h>
 | |
| 
 | |
| #define bcd2bin(x)					\
 | |
| 		(__builtin_constant_p((u8 )(x)) ?	\
 | |
| 		const_bcd2bin(x) :			\
 | |
| 		_bcd2bin(x))
 | |
| 
 | |
| #define bin2bcd(x)					\
 | |
| 		(__builtin_constant_p((u8 )(x)) ?	\
 | |
| 		const_bin2bcd(x) :			\
 | |
| 		_bin2bcd(x))
 | |
| 
 | |
| #define bcd_is_valid(x)					\
 | |
| 		const_bcd_is_valid(x)
 | |
| 
 | |
| #define const_bcd2bin(x)	(((x) & 0x0f) + ((x) >> 4) * 10)
 | |
| #define const_bin2bcd(x)	((((x) / 10) << 4) + (x) % 10)
 | |
| #define const_bcd_is_valid(x)	(((x) & 0x0f) < 10 && ((x) >> 4) < 10)
 | |
| 
 | |
| unsigned _bcd2bin(unsigned char val) __attribute_const__;
 | |
| unsigned char _bin2bcd(unsigned val) __attribute_const__;
 | |
| 
 | |
| #endif /* _BCD_H */
 |