#include <linux/hwmon-sysfs.h>
#include <linux/math64.h>
#include <linux/mfd/lochnagar.h>
#include <linux/mfd/lochnagar2_regs.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#define LN2_MAX_NSAMPLE 1023
#define LN2_SAMPLE_US 1670
#define LN2_CURR_UNITS 1000
#define LN2_VOLT_UNITS 1000
#define LN2_TEMP_UNITS 1000
#define LN2_PWR_UNITS 1000000
static const char * const lochnagar_chan_names[] = {
long power_nsamples[ARRAY_SIZE(lochnagar_chan_names)];
struct mutex sensor_lock;
enum lochnagar_measure_mode {
static long float_to_long(u32 data, u32 precision)
u64 man = data & 0x007FFFFF;
int exp = ((data & 0x7F800000) >> 23) - 127 - 23;
bool negative = data & 0x80000000;
man = (man + (1 << 23)) * precision;
if (fls64(man) + exp > (int)sizeof(long) * 8 - 1)
result = (man + (1ull << (-exp - 1))) >> -exp;
return negative ? -result : result;
static int do_measurement(struct regmap *regmap, int chan,
enum lochnagar_measure_mode mode, int nsamples)