Patch series "add header file for kelvin to/from Celsius conversion helpers", v4. There are several helper macros to convert kelvin to/from Celsius in <linux/thermal.h> for thermal drivers. These are useful for any other drivers or subsystems, but it's odd to include <linux/thermal.h> just for the helpers. This adds a new <linux/units.h> that provides the equivalent inline functions for any drivers or subsystems, and switches all the users of conversion helpers in <linux/thermal.h> to use <linux/units.h> helpers. This patch (of 12): There are several helper macros to convert kelvin to/from Celsius in <linux/thermal.h> for thermal drivers. These are useful for any other drivers or subsystems, but it's odd to include <linux/thermal.h> just for the helpers. This adds a new <linux/units.h> that provides the equivalent inline functions for any drivers or subsystems. It is intended to replace the helpers in <linux/thermal.h>.
Unified · Split
| @@ -0,0 +1,84 @@ | ||
| 1 | +/* SPDX-License-Identifier: GPL-2.0 */ | |
| 2 | +#ifndef _LINUX_UNITS_H | |
| 3 | +#define _LINUX_UNITS_H | |
| 4 | + | |
| 5 | +#include <linux/kernel.h> | |
| 6 | + | |
| 7 | +#define ABSOLUTE_ZERO_MILLICELSIUS -273150 | |
| 8 | + | |
| 9 | +static inline long milli_kelvin_to_millicelsius(long t) | |
| 10 | +{ | |
| 11 | + return t + ABSOLUTE_ZERO_MILLICELSIUS; | |
| 12 | +} | |
| 13 | + | |
| 14 | +static inline long millicelsius_to_milli_kelvin(long t) | |
| 15 | +{ | |
| 16 | + return t - ABSOLUTE_ZERO_MILLICELSIUS; | |
| 17 | +} | |
| 18 | + | |
| 19 | +#define MILLIDEGREE_PER_DEGREE 1000 | |
| 20 | +#define MILLIDEGREE_PER_DECIDEGREE 100 | |
| 21 | + | |
| 22 | +static inline long kelvin_to_millicelsius(long t) | |
| 23 | +{ | |
| 24 | + return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DEGREE); | |
| 25 | +} | |
| 26 | + | |
| 27 | +static inline long millicelsius_to_kelvin(long t) | |
| 28 | +{ | |
| 29 | + t = millicelsius_to_milli_kelvin(t); | |
| 30 | + | |
| 31 | + return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE); | |
| 32 | +} | |
| 33 | + | |
| 34 | +static inline long deci_kelvin_to_celsius(long t) | |
| 35 | +{ | |
| 36 | + t = milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE); | |
| 37 | + | |
| 38 | + return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DEGREE); | |
| 39 | +} | |
| 40 | + | |
| 41 | +static inline long celsius_to_deci_kelvin(long t) | |
| 42 | +{ | |
| 43 | + t = millicelsius_to_milli_kelvin(t * MILLIDEGREE_PER_DEGREE); | |
| 44 | + | |
| 45 | + return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE); | |
| 46 | +} | |
| 47 | + | |
| 48 | +/** | |
| 49 | + * deci_kelvin_to_millicelsius_with_offset - convert Kelvin to Celsius | |
| 50 | + * @t: temperature value in decidegrees Kelvin | |
| 51 | + * @offset: difference between Kelvin and Celsius in millidegrees | |
| 52 | + * | |
| 53 | + * Return: temperature value in millidegrees Celsius | |
| 54 | + */ | |
| 55 | +static inline long deci_kelvin_to_millicelsius_with_offset(long t, long offset) | |
| 56 | +{ | |
| 57 | + return t * MILLIDEGREE_PER_DECIDEGREE - offset; | |
| 58 | +} | |
| 59 | + | |
| 60 | +static inline long deci_kelvin_to_millicelsius(long t) | |
| 61 | +{ | |
| 62 | + return milli_kelvin_to_millicelsius(t * MILLIDEGREE_PER_DECIDEGREE); | |
| 63 | +} | |
| 64 | + | |
| 65 | +static inline long millicelsius_to_deci_kelvin(long t) | |
| 66 | +{ | |
| 67 | + t = millicelsius_to_milli_kelvin(t); | |
| 68 | + | |
| 69 | + return DIV_ROUND_CLOSEST(t, MILLIDEGREE_PER_DECIDEGREE); | |
| 70 | +} | |
| 71 | + | |
| 72 | +static inline long kelvin_to_celsius(long t) | |
| 73 | +{ | |
| 74 | + return t + DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS, | |
| 75 | + MILLIDEGREE_PER_DEGREE); | |
| 76 | +} | |
| 77 | + | |
| 78 | +static inline long celsius_to_kelvin(long t) | |
| 79 | +{ | |
| 80 | + return t - DIV_ROUND_CLOSEST(ABSOLUTE_ZERO_MILLICELSIUS, | |
| 81 | + MILLIDEGREE_PER_DEGREE); | |
| 82 | +} | |
| 83 | + | |
| 84 | +#endif /* _LINUX_UNITS_H */ | |