1114402Sru/* SPDX-License-Identifier: GPL-2.0 */
2104862Sru#ifndef _LINUX_UNITS_H
3104862Sru#define _LINUX_UNITS_H
4104862Sru
5104862Sru#include <linux/bits.h>
6151497Sru#include <linux/math.h>
7151497Sru
8151497Sru/* Metric prefixes in accordance with Syst��me international (d'unit��s) */
9104862Sru#define PETA	1000000000000000ULL
10104862Sru#define TERA	1000000000000ULL
11104862Sru#define GIGA	1000000000UL
12104862Sru#define MEGA	1000000UL
13104862Sru#define KILO	1000UL
14104862Sru#define HECTO	100UL
15151497Sru#define DECA	10UL
16151497Sru#define DECI	10UL
17151497Sru#define CENTI	100UL
18114402Sru#define MILLI	1000UL
19151497Sru#define MICRO	1000000UL
20151497Sru#define NANO	1000000000UL
21151497Sru#define PICO	1000000000000ULL
22114402Sru#define FEMTO	1000000000000000ULL
23104862Sru
24104862Sru#define NANOHZ_PER_HZ		1000000000UL
25114402Sru#define MICROHZ_PER_HZ		1000000UL
26104862Sru#define MILLIHZ_PER_HZ		1000UL
27104862Sru
28114402Sru#define HZ_PER_KHZ		1000UL
29104862Sru#define HZ_PER_MHZ		1000000UL
30104862Sru
31114402Sru#define KHZ_PER_MHZ		1000UL
32104862Sru#define KHZ_PER_GHZ		1000000UL
33104862Sru
34114402Sru#define MILLIWATT_PER_WATT	1000UL
35104862Sru#define MICROWATT_PER_MILLIWATT	1000UL
36104862Sru#define MICROWATT_PER_WATT	1000000UL
37114402Sru
38114402Sru#define BYTES_PER_KBIT		(KILO / BITS_PER_BYTE)
39114402Sru#define BYTES_PER_MBIT		(MEGA / BITS_PER_BYTE)
40114402Sru#define BYTES_PER_GBIT		(GIGA / BITS_PER_BYTE)
41114402Sru
42114402Sru#define ABSOLUTE_ZERO_MILLICELSIUS -273150
43151497Sru
44151497Srustatic inline long milli_kelvin_to_millicelsius(long t)
45151497Sru{
46114402Sru	return t + ABSOLUTE_ZERO_MILLICELSIUS;
47104862Sru}
48104862Sru
49114402Srustatic inline long millicelsius_to_milli_kelvin(long t)
50104862Sru{
51104862Sru	return t - ABSOLUTE_ZERO_MILLICELSIUS;
52114402Sru}
53114402Sru
54114402Sru#define MILLIDEGREE_PER_DEGREE 1000
55104862Sru#define MILLIDEGREE_PER_DECIDEGREE 100
56104862Sru
57104862Srustatic inline long kelvin_to_millicelsius(long t)
58114402Sru{
59104862Sru	return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DEGREE);
60104862Sru}
61151497Sru
62151497Srustatic inline long millicelsius_to_kelvin(long t)
63151497Sru{
64114402Sru	t = millicelsius_to_milli_kelvin(t);
65104862Sru
66104862Sru	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE);
67114402Sru}
68104862Sru
69104862Srustatic inline long deci_kelvin_to_celsius(long t)
70114402Sru{
71114402Sru	t = milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
72114402Sru
73114402Sru	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE);
74104862Sru}
75104862Sru
76114402Srustatic inline long celsius_to_deci_kelvin(long t)
77104862Sru{
78104862Sru	t = millicelsius_to_milli_kelvin(t * MILLIDEGREE_PER_DEGREE);
79114402Sru
80104862Sru	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE);
81104862Sru}
82114402Sru
83104862Sru/**
84104862Sru * deci_kelvin_to_millicelsius_with_offset - convert Kelvin to Celsius
85114402Sru * @t: temperature value in decidegrees Kelvin
86104862Sru * @offset: difference between Kelvin and Celsius in millidegrees
87104862Sru *
88114402Sru * Return: temperature value in millidegrees Celsius
89104862Sru */
90104862Srustatic inline long deci_kelvin_to_millicelsius_with_offset(long t, long offset)
91114402Sru{
92104862Sru	return t * MILLIDEGREE_PER_DECIDEGREE - offset;
93104862Sru}
94114402Sru
95104862Srustatic inline long deci_kelvin_to_millicelsius(long t)
96104862Sru{
97114402Sru	return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE);
98104862Sru}
99104862Sru
100114402Srustatic inline long millicelsius_to_deci_kelvin(long t)
101104862Sru{
102104862Sru	t = millicelsius_to_milli_kelvin(t);
103104862Sru
104104862Sru	return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE);
105104862Sru}
106114402Sru
107104862Srustatic inline long kelvin_to_celsius(long t)
108104862Sru{
109151497Sru	return t + DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
110104862Sru				     MILLIDEGREE_PER_DEGREE);
111104862Sru}
112151497Sru
113104862Srustatic inline long celsius_to_kelvin(long t)
114104862Sru{
115114402Sru	return t - DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS,
116114402Sru				     MILLIDEGREE_PER_DEGREE);
117114402Sru}
118114402Sru
119104862Sru#endif /* _LINUX_UNITS_H */
120104862Sru