xref: /openbmc/linux/include/linux/units.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _LINUX_UNITS_H
3  #define _LINUX_UNITS_H
4  
5  #include <linux/math.h>
6  
7  /* Metric prefixes in accordance with Système international (d'unités) */
8  #define PETA	1000000000000000ULL
9  #define TERA	1000000000000ULL
10  #define GIGA	1000000000UL
11  #define MEGA	1000000UL
12  #define KILO	1000UL
13  #define HECTO	100UL
14  #define DECA	10UL
15  #define DECI	10UL
16  #define CENTI	100UL
17  #define MILLI	1000UL
18  #define MICRO	1000000UL
19  #define NANO	1000000000UL
20  #define PICO	1000000000000ULL
21  #define FEMTO	1000000000000000ULL
22  
23  #define NANOHZ_PER_HZ		1000000000UL
24  #define MICROHZ_PER_HZ		1000000UL
25  #define MILLIHZ_PER_HZ		1000UL
26  #define HZ_PER_KHZ		1000UL
27  #define KHZ_PER_MHZ		1000UL
28  #define HZ_PER_MHZ		1000000UL
29  
30  #define MILLIWATT_PER_WATT	1000UL
31  #define MICROWATT_PER_MILLIWATT	1000UL
32  #define MICROWATT_PER_WATT	1000000UL
33  
34  #define ABSOLUTE_ZERO_MILLICELSIUS -273150
35  
milli_kelvin_to_millicelsius(long t)36  static inline long milli_kelvin_to_millicelsius(long t)
37  {
38  	return t + ABSOLUTE_ZERO_MILLICELSIUS;
39  }
40  
millicelsius_to_milli_kelvin(long t)41  static inline long millicelsius_to_milli_kelvin(long t)
42  {
43  	return t - ABSOLUTE_ZERO_MILLICELSIUS;
44  }
45  
46  #define MILLIDEGREE_PER_DEGREE 1000
47  #define MILLIDEGREE_PER_DECIDEGREE 100
48  
kelvin_to_millicelsius(long t)49  static inline long kelvin_to_millicelsius(long t)
50  {
51  	return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DEGREE);
52  }
53  
millicelsius_to_kelvin(long t)54  static inline long millicelsius_to_kelvin(long t)
55  {
56  	t = millicelsius_to_milli_kelvin(t);
57  
58  	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE);
59  }
60  
deci_kelvin_to_celsius(long t)61  static inline long deci_kelvin_to_celsius(long t)
62  {
63  	t = milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
64  
65  	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE);
66  }
67  
celsius_to_deci_kelvin(long t)68  static inline long celsius_to_deci_kelvin(long t)
69  {
70  	t = millicelsius_to_milli_kelvin(t * MILLIDEGREE_PER_DEGREE);
71  
72  	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE);
73  }
74  
75  /**
76   * deci_kelvin_to_millicelsius_with_offset - convert Kelvin to Celsius
77   * @t: temperature value in decidegrees Kelvin
78   * @offset: difference between Kelvin and Celsius in millidegrees
79   *
80   * Return: temperature value in millidegrees Celsius
81   */
deci_kelvin_to_millicelsius_with_offset(long t,long offset)82  static inline long deci_kelvin_to_millicelsius_with_offset(long t, long offset)
83  {
84  	return t * MILLIDEGREE_PER_DECIDEGREE - offset;
85  }
86  
deci_kelvin_to_millicelsius(long t)87  static inline long deci_kelvin_to_millicelsius(long t)
88  {
89  	return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
90  }
91  
millicelsius_to_deci_kelvin(long t)92  static inline long millicelsius_to_deci_kelvin(long t)
93  {
94  	t = millicelsius_to_milli_kelvin(t);
95  
96  	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE);
97  }
98  
kelvin_to_celsius(long t)99  static inline long kelvin_to_celsius(long t)
100  {
101  	return t + DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
102  				     MILLIDEGREE_PER_DEGREE);
103  }
104  
celsius_to_kelvin(long t)105  static inline long celsius_to_kelvin(long t)
106  {
107  	return t - DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
108  				     MILLIDEGREE_PER_DEGREE);
109  }
110  
111  #endif /* _LINUX_UNITS_H */
112