units.h (2654B)
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 HZ_PER_KHZ 1000UL 24#define KHZ_PER_MHZ 1000UL 25#define HZ_PER_MHZ 1000000UL 26 27#define MILLIWATT_PER_WATT 1000UL 28#define MICROWATT_PER_MILLIWATT 1000UL 29#define MICROWATT_PER_WATT 1000000UL 30 31#define ABSOLUTE_ZERO_MILLICELSIUS -273150 32 33static inline long milli_kelvin_to_millicelsius(long t) 34{ 35 return t + ABSOLUTE_ZERO_MILLICELSIUS; 36} 37 38static inline long millicelsius_to_milli_kelvin(long t) 39{ 40 return t - ABSOLUTE_ZERO_MILLICELSIUS; 41} 42 43#define MILLIDEGREE_PER_DEGREE 1000 44#define MILLIDEGREE_PER_DECIDEGREE 100 45 46static inline long kelvin_to_millicelsius(long t) 47{ 48 return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DEGREE); 49} 50 51static inline long millicelsius_to_kelvin(long t) 52{ 53 t = millicelsius_to_milli_kelvin(t); 54 55 return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE); 56} 57 58static inline long deci_kelvin_to_celsius(long t) 59{ 60 t = milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE); 61 62 return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE); 63} 64 65static inline long celsius_to_deci_kelvin(long t) 66{ 67 t = millicelsius_to_milli_kelvin(t * MILLIDEGREE_PER_DEGREE); 68 69 return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE); 70} 71 72/** 73 * deci_kelvin_to_millicelsius_with_offset - convert Kelvin to Celsius 74 * @t: temperature value in decidegrees Kelvin 75 * @offset: difference between Kelvin and Celsius in millidegrees 76 * 77 * Return: temperature value in millidegrees Celsius 78 */ 79static inline long deci_kelvin_to_millicelsius_with_offset(long t, long offset) 80{ 81 return t * MILLIDEGREE_PER_DECIDEGREE - offset; 82} 83 84static inline long deci_kelvin_to_millicelsius(long t) 85{ 86 return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE); 87} 88 89static inline long millicelsius_to_deci_kelvin(long t) 90{ 91 t = millicelsius_to_milli_kelvin(t); 92 93 return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE); 94} 95 96static inline long kelvin_to_celsius(long t) 97{ 98 return t + DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS, 99 MILLIDEGREE_PER_DEGREE); 100} 101 102static inline long celsius_to_kelvin(long t) 103{ 104 return t - DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS, 105 MILLIDEGREE_PER_DEGREE); 106} 107 108#endif /* _LINUX_UNITS_H */