Merge tag 'fbdev-for-6.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[linux-block.git] / include / linux / units.h
CommitLineData
23331e48
AM
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _LINUX_UNITS_H
3#define _LINUX_UNITS_H
4
aa6159ab 5#include <linux/math.h>
23331e48 6
26471d4a
AS
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
d2a4cbcb
DR
23#define NANOHZ_PER_HZ 1000000000UL
24#define MICROHZ_PER_HZ 1000000UL
25#define MILLIHZ_PER_HZ 1000UL
e2c77032
DL
26#define HZ_PER_KHZ 1000UL
27#define KHZ_PER_MHZ 1000UL
28#define HZ_PER_MHZ 1000000UL
29
c9221919
DL
30#define MILLIWATT_PER_WATT 1000UL
31#define MICROWATT_PER_MILLIWATT 1000UL
32#define MICROWATT_PER_WATT 1000000UL
2ee5f8f0 33
23331e48
AM
34#define ABSOLUTE_ZERO_MILLICELSIUS -273150
35
36static inline long milli_kelvin_to_millicelsius(long t)
37{
38 return t + ABSOLUTE_ZERO_MILLICELSIUS;
39}
40
41static 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
49static inline long kelvin_to_millicelsius(long t)
50{
51 return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DEGREE);
52}
53
54static 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
61static 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
68static 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 */
82static inline long deci_kelvin_to_millicelsius_with_offset(long t, long offset)
83{
84 return t * MILLIDEGREE_PER_DECIDEGREE - offset;
85}
86
87static inline long deci_kelvin_to_millicelsius(long t)
88{
89 return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
90}
91
92static 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
99static inline long kelvin_to_celsius(long t)
100{
101 return t + DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
102 MILLIDEGREE_PER_DEGREE);
103}
104
105static 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 */