1 /*
2  * Copyright 2021 Google LLC.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #ifndef DRIVERS_SYSCON_SYSCON_COMMON_H_
7 #define DRIVERS_SYSCON_SYSCON_COMMON_H_
8 
9 #include <sys/util.h>
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 /**
16  * @brief Align and check register address
17  *
18  * @param reg Pointer to the register address in question.
19  * @param reg_size The size of the syscon register region.
20  * @param reg_width The width of a single register (in bytes).
21  * @return 0 if the register read is valid.
22  * @return -EINVAL is the read is invalid.
23  */
syscon_sanitize_reg(uint16_t * reg,size_t reg_size,uint8_t reg_width)24 static inline int syscon_sanitize_reg(uint16_t *reg, size_t reg_size, uint8_t reg_width)
25 {
26 	/* Avoid unaligned readings */
27 	*reg = ROUND_DOWN(*reg, reg_width);
28 
29 	/* Check for out-of-bounds readings */
30 	if (*reg >= reg_size) {
31 		return -EINVAL;
32 	}
33 
34 	return 0;
35 }
36 
37 #ifdef __cplusplus
38 }
39 #endif
40 
41 #endif /* DRIVERS_SYSCON_SYSCON_COMMON_H_ */
42