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