#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/slab.h>
#include <linux/bug.h>
#include <linux/i2c.h>
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#include <linux/platform_data/ina2xx.h>
#define INA209_CONFIGURATION …
#define INA209_STATUS …
#define INA209_STATUS_MASK …
#define INA209_SHUNT_VOLTAGE …
#define INA209_BUS_VOLTAGE …
#define INA209_POWER …
#define INA209_CURRENT …
#define INA209_SHUNT_VOLTAGE_POS_PEAK …
#define INA209_SHUNT_VOLTAGE_NEG_PEAK …
#define INA209_BUS_VOLTAGE_MAX_PEAK …
#define INA209_BUS_VOLTAGE_MIN_PEAK …
#define INA209_POWER_PEAK …
#define INA209_SHUNT_VOLTAGE_POS_WARN …
#define INA209_SHUNT_VOLTAGE_NEG_WARN …
#define INA209_POWER_WARN …
#define INA209_BUS_VOLTAGE_OVER_WARN …
#define INA209_BUS_VOLTAGE_UNDER_WARN …
#define INA209_POWER_OVER_LIMIT …
#define INA209_BUS_VOLTAGE_OVER_LIMIT …
#define INA209_BUS_VOLTAGE_UNDER_LIMIT …
#define INA209_CRITICAL_DAC_POS …
#define INA209_CRITICAL_DAC_NEG …
#define INA209_CALIBRATION …
#define INA209_REGISTERS …
#define INA209_CONFIG_DEFAULT …
#define INA209_SHUNT_DEFAULT …
struct ina209_data { … };
static struct ina209_data *ina209_update_device(struct device *dev)
{ … }
static long ina209_from_reg(const u8 reg, const u16 val)
{ … }
static int ina209_to_reg(u8 reg, u16 old, long val)
{ … }
static int ina209_interval_from_reg(u16 reg)
{ … }
static u16 ina209_reg_from_interval(u16 config, long interval)
{ … }
static ssize_t ina209_interval_store(struct device *dev,
struct device_attribute *da,
const char *buf, size_t count)
{ … }
static ssize_t ina209_interval_show(struct device *dev,
struct device_attribute *da, char *buf)
{ … }
static u16 ina209_reset_history_regs[] = …;
static ssize_t ina209_history_store(struct device *dev,
struct device_attribute *da,
const char *buf, size_t count)
{ … }
static ssize_t ina209_value_store(struct device *dev,
struct device_attribute *da,
const char *buf, size_t count)
{ … }
static ssize_t ina209_value_show(struct device *dev,
struct device_attribute *da, char *buf)
{ … }
static ssize_t ina209_alarm_show(struct device *dev,
struct device_attribute *da, char *buf)
{ … }
static SENSOR_DEVICE_ATTR_RO(in0_input, ina209_value, INA209_SHUNT_VOLTAGE);
static SENSOR_DEVICE_ATTR_RO(in0_input_highest, ina209_value,
INA209_SHUNT_VOLTAGE_POS_PEAK);
static SENSOR_DEVICE_ATTR_RO(in0_input_lowest, ina209_value,
INA209_SHUNT_VOLTAGE_NEG_PEAK);
static SENSOR_DEVICE_ATTR_WO(in0_reset_history, ina209_history,
(1 << 0) | (1 << 1));
static SENSOR_DEVICE_ATTR_RW(in0_max, ina209_value,
INA209_SHUNT_VOLTAGE_POS_WARN);
static SENSOR_DEVICE_ATTR_RW(in0_min, ina209_value,
INA209_SHUNT_VOLTAGE_NEG_WARN);
static SENSOR_DEVICE_ATTR_RW(in0_crit_max, ina209_value,
INA209_CRITICAL_DAC_POS);
static SENSOR_DEVICE_ATTR_RW(in0_crit_min, ina209_value,
INA209_CRITICAL_DAC_NEG);
static SENSOR_DEVICE_ATTR_RO(in0_min_alarm, ina209_alarm, 1 << 11);
static SENSOR_DEVICE_ATTR_RO(in0_max_alarm, ina209_alarm, 1 << 12);
static SENSOR_DEVICE_ATTR_RO(in0_crit_min_alarm, ina209_alarm, 1 << 6);
static SENSOR_DEVICE_ATTR_RO(in0_crit_max_alarm, ina209_alarm, 1 << 7);
static SENSOR_DEVICE_ATTR_RO(in1_input, ina209_value, INA209_BUS_VOLTAGE);
static SENSOR_DEVICE_ATTR_RO(in1_input_highest, ina209_value,
INA209_BUS_VOLTAGE_MAX_PEAK);
static SENSOR_DEVICE_ATTR_RO(in1_input_lowest, ina209_value,
INA209_BUS_VOLTAGE_MIN_PEAK);
static SENSOR_DEVICE_ATTR_WO(in1_reset_history, ina209_history,
(1 << 2) | (1 << 3));
static SENSOR_DEVICE_ATTR_RW(in1_max, ina209_value,
INA209_BUS_VOLTAGE_OVER_WARN);
static SENSOR_DEVICE_ATTR_RW(in1_min, ina209_value,
INA209_BUS_VOLTAGE_UNDER_WARN);
static SENSOR_DEVICE_ATTR_RW(in1_crit_max, ina209_value,
INA209_BUS_VOLTAGE_OVER_LIMIT);
static SENSOR_DEVICE_ATTR_RW(in1_crit_min, ina209_value,
INA209_BUS_VOLTAGE_UNDER_LIMIT);
static SENSOR_DEVICE_ATTR_RO(in1_min_alarm, ina209_alarm, 1 << 14);
static SENSOR_DEVICE_ATTR_RO(in1_max_alarm, ina209_alarm, 1 << 15);
static SENSOR_DEVICE_ATTR_RO(in1_crit_min_alarm, ina209_alarm, 1 << 9);
static SENSOR_DEVICE_ATTR_RO(in1_crit_max_alarm, ina209_alarm, 1 << 10);
static SENSOR_DEVICE_ATTR_RO(power1_input, ina209_value, INA209_POWER);
static SENSOR_DEVICE_ATTR_RO(power1_input_highest, ina209_value,
INA209_POWER_PEAK);
static SENSOR_DEVICE_ATTR_WO(power1_reset_history, ina209_history, 1 << 4);
static SENSOR_DEVICE_ATTR_RW(power1_max, ina209_value, INA209_POWER_WARN);
static SENSOR_DEVICE_ATTR_RW(power1_crit, ina209_value,
INA209_POWER_OVER_LIMIT);
static SENSOR_DEVICE_ATTR_RO(power1_max_alarm, ina209_alarm, 1 << 13);
static SENSOR_DEVICE_ATTR_RO(power1_crit_alarm, ina209_alarm, 1 << 8);
static SENSOR_DEVICE_ATTR_RO(curr1_input, ina209_value, INA209_CURRENT);
static SENSOR_DEVICE_ATTR_RW(update_interval, ina209_interval, 0);
static struct attribute *ina209_attrs[] = …;
ATTRIBUTE_GROUPS(…);
static void ina209_restore_conf(struct i2c_client *client,
struct ina209_data *data)
{ … }
static int ina209_init_client(struct i2c_client *client,
struct ina209_data *data)
{ … }
static int ina209_probe(struct i2c_client *client)
{ … }
static void ina209_remove(struct i2c_client *client)
{ … }
static const struct i2c_device_id ina209_id[] = …;
MODULE_DEVICE_TABLE(i2c, ina209_id);
static const struct of_device_id __maybe_unused ina209_of_match[] = …;
MODULE_DEVICE_TABLE(of, ina209_of_match);
static struct i2c_driver ina209_driver = …;
module_i2c_driver(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;