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