xref: /linux-6.15/include/linux/bcd.h (revision 19409796)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _BCD_H
31da177e4SLinus Torvalds #define _BCD_H
41da177e4SLinus Torvalds 
5d3de851aSDavid Brownell #include <linux/compiler.h>
6d3de851aSDavid Brownell 
7b53d657dSSebastian Andrzej Siewior #define bcd2bin(x)					\
8b53d657dSSebastian Andrzej Siewior 		(__builtin_constant_p((u8 )(x)) ?	\
9b53d657dSSebastian Andrzej Siewior 		const_bcd2bin(x) :			\
10b53d657dSSebastian Andrzej Siewior 		_bcd2bin(x))
11b53d657dSSebastian Andrzej Siewior 
12b53d657dSSebastian Andrzej Siewior #define bin2bcd(x)					\
13b53d657dSSebastian Andrzej Siewior 		(__builtin_constant_p((u8 )(x)) ?	\
14b53d657dSSebastian Andrzej Siewior 		const_bin2bcd(x) :			\
15b53d657dSSebastian Andrzej Siewior 		_bin2bcd(x))
16b53d657dSSebastian Andrzej Siewior 
17*19409796SAhmad Fatoum #define bcd_is_valid(x)					\
18*19409796SAhmad Fatoum 		const_bcd_is_valid(x)
19*19409796SAhmad Fatoum 
20b53d657dSSebastian Andrzej Siewior #define const_bcd2bin(x)	(((x) & 0x0f) + ((x) >> 4) * 10)
21b53d657dSSebastian Andrzej Siewior #define const_bin2bcd(x)	((((x) / 10) << 4) + (x) % 10)
22*19409796SAhmad Fatoum #define const_bcd_is_valid(x)	(((x) & 0x0f) < 10 && ((x) >> 4) < 10)
23b53d657dSSebastian Andrzej Siewior 
24b53d657dSSebastian Andrzej Siewior unsigned _bcd2bin(unsigned char val) __attribute_const__;
25b53d657dSSebastian Andrzej Siewior unsigned char _bin2bcd(unsigned val) __attribute_const__;
26d3de851aSDavid Brownell 
271da177e4SLinus Torvalds #endif /* _BCD_H */
28