xref: /openbmc/linux/include/linux/units.h (revision d2a4cbcb)
123331e48SAkinobu Mita /* SPDX-License-Identifier: GPL-2.0 */
223331e48SAkinobu Mita #ifndef _LINUX_UNITS_H
323331e48SAkinobu Mita #define _LINUX_UNITS_H
423331e48SAkinobu Mita 
5aa6159abSAndy Shevchenko #include <linux/math.h>
623331e48SAkinobu Mita 
726471d4aSAndy Shevchenko /* Metric prefixes in accordance with Système international (d'unités) */
826471d4aSAndy Shevchenko #define PETA	1000000000000000ULL
926471d4aSAndy Shevchenko #define TERA	1000000000000ULL
1026471d4aSAndy Shevchenko #define GIGA	1000000000UL
1126471d4aSAndy Shevchenko #define MEGA	1000000UL
1226471d4aSAndy Shevchenko #define KILO	1000UL
1326471d4aSAndy Shevchenko #define HECTO	100UL
1426471d4aSAndy Shevchenko #define DECA	10UL
1526471d4aSAndy Shevchenko #define DECI	10UL
1626471d4aSAndy Shevchenko #define CENTI	100UL
1726471d4aSAndy Shevchenko #define MILLI	1000UL
1826471d4aSAndy Shevchenko #define MICRO	1000000UL
1926471d4aSAndy Shevchenko #define NANO	1000000000UL
2026471d4aSAndy Shevchenko #define PICO	1000000000000ULL
2126471d4aSAndy Shevchenko #define FEMTO	1000000000000000ULL
2226471d4aSAndy Shevchenko 
23*d2a4cbcbSDmitry Rokosov #define NANOHZ_PER_HZ		1000000000UL
24*d2a4cbcbSDmitry Rokosov #define MICROHZ_PER_HZ		1000000UL
25*d2a4cbcbSDmitry Rokosov #define MILLIHZ_PER_HZ		1000UL
26e2c77032SDaniel Lezcano #define HZ_PER_KHZ		1000UL
27e2c77032SDaniel Lezcano #define KHZ_PER_MHZ		1000UL
28e2c77032SDaniel Lezcano #define HZ_PER_MHZ		1000000UL
29e2c77032SDaniel Lezcano 
30c9221919SDaniel Lezcano #define MILLIWATT_PER_WATT	1000UL
31c9221919SDaniel Lezcano #define MICROWATT_PER_MILLIWATT	1000UL
32c9221919SDaniel Lezcano #define MICROWATT_PER_WATT	1000000UL
332ee5f8f0SDaniel Lezcano 
3423331e48SAkinobu Mita #define ABSOLUTE_ZERO_MILLICELSIUS -273150
3523331e48SAkinobu Mita 
milli_kelvin_to_millicelsius(long t)3623331e48SAkinobu Mita static inline long milli_kelvin_to_millicelsius(long t)
3723331e48SAkinobu Mita {
3823331e48SAkinobu Mita 	return t + ABSOLUTE_ZERO_MILLICELSIUS;
3923331e48SAkinobu Mita }
4023331e48SAkinobu Mita 
millicelsius_to_milli_kelvin(long t)4123331e48SAkinobu Mita static inline long millicelsius_to_milli_kelvin(long t)
4223331e48SAkinobu Mita {
4323331e48SAkinobu Mita 	return t - ABSOLUTE_ZERO_MILLICELSIUS;
4423331e48SAkinobu Mita }
4523331e48SAkinobu Mita 
4623331e48SAkinobu Mita #define MILLIDEGREE_PER_DEGREE 1000
4723331e48SAkinobu Mita #define MILLIDEGREE_PER_DECIDEGREE 100
4823331e48SAkinobu Mita 
kelvin_to_millicelsius(long t)4923331e48SAkinobu Mita static inline long kelvin_to_millicelsius(long t)
5023331e48SAkinobu Mita {
5123331e48SAkinobu Mita 	return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DEGREE);
5223331e48SAkinobu Mita }
5323331e48SAkinobu Mita 
millicelsius_to_kelvin(long t)5423331e48SAkinobu Mita static inline long millicelsius_to_kelvin(long t)
5523331e48SAkinobu Mita {
5623331e48SAkinobu Mita 	t = millicelsius_to_milli_kelvin(t);
5723331e48SAkinobu Mita 
5823331e48SAkinobu Mita 	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE);
5923331e48SAkinobu Mita }
6023331e48SAkinobu Mita 
deci_kelvin_to_celsius(long t)6123331e48SAkinobu Mita static inline long deci_kelvin_to_celsius(long t)
6223331e48SAkinobu Mita {
6323331e48SAkinobu Mita 	t = milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
6423331e48SAkinobu Mita 
6523331e48SAkinobu Mita 	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE);
6623331e48SAkinobu Mita }
6723331e48SAkinobu Mita 
celsius_to_deci_kelvin(long t)6823331e48SAkinobu Mita static inline long celsius_to_deci_kelvin(long t)
6923331e48SAkinobu Mita {
7023331e48SAkinobu Mita 	t = millicelsius_to_milli_kelvin(t * MILLIDEGREE_PER_DEGREE);
7123331e48SAkinobu Mita 
7223331e48SAkinobu Mita 	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE);
7323331e48SAkinobu Mita }
7423331e48SAkinobu Mita 
7523331e48SAkinobu Mita /**
7623331e48SAkinobu Mita  * deci_kelvin_to_millicelsius_with_offset - convert Kelvin to Celsius
7723331e48SAkinobu Mita  * @t: temperature value in decidegrees Kelvin
7823331e48SAkinobu Mita  * @offset: difference between Kelvin and Celsius in millidegrees
7923331e48SAkinobu Mita  *
8023331e48SAkinobu Mita  * Return: temperature value in millidegrees Celsius
8123331e48SAkinobu Mita  */
deci_kelvin_to_millicelsius_with_offset(long t,long offset)8223331e48SAkinobu Mita static inline long deci_kelvin_to_millicelsius_with_offset(long t, long offset)
8323331e48SAkinobu Mita {
8423331e48SAkinobu Mita 	return t * MILLIDEGREE_PER_DECIDEGREE - offset;
8523331e48SAkinobu Mita }
8623331e48SAkinobu Mita 
deci_kelvin_to_millicelsius(long t)8723331e48SAkinobu Mita static inline long deci_kelvin_to_millicelsius(long t)
8823331e48SAkinobu Mita {
8923331e48SAkinobu Mita 	return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
9023331e48SAkinobu Mita }
9123331e48SAkinobu Mita 
millicelsius_to_deci_kelvin(long t)9223331e48SAkinobu Mita static inline long millicelsius_to_deci_kelvin(long t)
9323331e48SAkinobu Mita {
9423331e48SAkinobu Mita 	t = millicelsius_to_milli_kelvin(t);
9523331e48SAkinobu Mita 
9623331e48SAkinobu Mita 	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE);
9723331e48SAkinobu Mita }
9823331e48SAkinobu Mita 
kelvin_to_celsius(long t)9923331e48SAkinobu Mita static inline long kelvin_to_celsius(long t)
10023331e48SAkinobu Mita {
10123331e48SAkinobu Mita 	return t + DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
10223331e48SAkinobu Mita 				     MILLIDEGREE_PER_DEGREE);
10323331e48SAkinobu Mita }
10423331e48SAkinobu Mita 
celsius_to_kelvin(long t)10523331e48SAkinobu Mita static inline long celsius_to_kelvin(long t)
10623331e48SAkinobu Mita {
10723331e48SAkinobu Mita 	return t - DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
10823331e48SAkinobu Mita 				     MILLIDEGREE_PER_DEGREE);
10923331e48SAkinobu Mita }
11023331e48SAkinobu Mita 
11123331e48SAkinobu Mita #endif /* _LINUX_UNITS_H */
112