cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ltc2992.c (24196B)


      1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
      2/*
      3 * LTC2992 - Dual Wide Range Power Monitor
      4 *
      5 * Copyright 2020 Analog Devices Inc.
      6 */
      7
      8#include <linux/bitfield.h>
      9#include <linux/bitops.h>
     10#include <linux/err.h>
     11#include <linux/gpio/driver.h>
     12#include <linux/hwmon.h>
     13#include <linux/i2c.h>
     14#include <linux/kernel.h>
     15#include <linux/module.h>
     16#include <linux/property.h>
     17#include <linux/regmap.h>
     18
     19#define LTC2992_CTRLB			0x01
     20#define LTC2992_FAULT1			0x03
     21#define LTC2992_POWER1			0x05
     22#define LTC2992_POWER1_MAX		0x08
     23#define LTC2992_POWER1_MIN		0x0B
     24#define LTC2992_POWER1_MAX_THRESH	0x0E
     25#define LTC2992_POWER1_MIN_THRESH	0x11
     26#define LTC2992_DSENSE1			0x14
     27#define LTC2992_DSENSE1_MAX		0x16
     28#define LTC2992_DSENSE1_MIN		0x18
     29#define LTC2992_DSENSE1_MAX_THRESH	0x1A
     30#define LTC2992_DSENSE1_MIN_THRESH	0x1C
     31#define LTC2992_SENSE1			0x1E
     32#define LTC2992_SENSE1_MAX		0x20
     33#define LTC2992_SENSE1_MIN		0x22
     34#define LTC2992_SENSE1_MAX_THRESH	0x24
     35#define LTC2992_SENSE1_MIN_THRESH	0x26
     36#define LTC2992_G1			0x28
     37#define LTC2992_G1_MAX			0x2A
     38#define LTC2992_G1_MIN			0x2C
     39#define LTC2992_G1_MAX_THRESH		0x2E
     40#define LTC2992_G1_MIN_THRESH		0x30
     41#define LTC2992_FAULT2			0x35
     42#define LTC2992_G2			0x5A
     43#define LTC2992_G2_MAX			0x5C
     44#define LTC2992_G2_MIN			0x5E
     45#define LTC2992_G2_MAX_THRESH		0x60
     46#define LTC2992_G2_MIN_THRESH		0x62
     47#define LTC2992_G3			0x64
     48#define LTC2992_G3_MAX			0x66
     49#define LTC2992_G3_MIN			0x68
     50#define LTC2992_G3_MAX_THRESH		0x6A
     51#define LTC2992_G3_MIN_THRESH		0x6C
     52#define LTC2992_G4			0x6E
     53#define LTC2992_G4_MAX			0x70
     54#define LTC2992_G4_MIN			0x72
     55#define LTC2992_G4_MAX_THRESH		0x74
     56#define LTC2992_G4_MIN_THRESH		0x76
     57#define LTC2992_FAULT3			0x92
     58#define LTC2992_GPIO_STATUS		0x95
     59#define LTC2992_GPIO_IO_CTRL		0x96
     60#define LTC2992_GPIO_CTRL		0x97
     61
     62#define LTC2992_POWER(x)		(LTC2992_POWER1 + ((x) * 0x32))
     63#define LTC2992_POWER_MAX(x)		(LTC2992_POWER1_MAX + ((x) * 0x32))
     64#define LTC2992_POWER_MIN(x)		(LTC2992_POWER1_MIN + ((x) * 0x32))
     65#define LTC2992_POWER_MAX_THRESH(x)	(LTC2992_POWER1_MAX_THRESH + ((x) * 0x32))
     66#define LTC2992_POWER_MIN_THRESH(x)	(LTC2992_POWER1_MIN_THRESH + ((x) * 0x32))
     67#define LTC2992_DSENSE(x)		(LTC2992_DSENSE1 + ((x) * 0x32))
     68#define LTC2992_DSENSE_MAX(x)		(LTC2992_DSENSE1_MAX + ((x) * 0x32))
     69#define LTC2992_DSENSE_MIN(x)		(LTC2992_DSENSE1_MIN + ((x) * 0x32))
     70#define LTC2992_DSENSE_MAX_THRESH(x)	(LTC2992_DSENSE1_MAX_THRESH + ((x) * 0x32))
     71#define LTC2992_DSENSE_MIN_THRESH(x)	(LTC2992_DSENSE1_MIN_THRESH + ((x) * 0x32))
     72#define LTC2992_SENSE(x)		(LTC2992_SENSE1 + ((x) * 0x32))
     73#define LTC2992_SENSE_MAX(x)		(LTC2992_SENSE1_MAX + ((x) * 0x32))
     74#define LTC2992_SENSE_MIN(x)		(LTC2992_SENSE1_MIN + ((x) * 0x32))
     75#define LTC2992_SENSE_MAX_THRESH(x)	(LTC2992_SENSE1_MAX_THRESH + ((x) * 0x32))
     76#define LTC2992_SENSE_MIN_THRESH(x)	(LTC2992_SENSE1_MIN_THRESH + ((x) * 0x32))
     77#define LTC2992_POWER_FAULT(x)		(LTC2992_FAULT1 + ((x) * 0x32))
     78#define LTC2992_SENSE_FAULT(x)		(LTC2992_FAULT1 + ((x) * 0x32))
     79#define LTC2992_DSENSE_FAULT(x)		(LTC2992_FAULT1 + ((x) * 0x32))
     80
     81/* CTRLB register bitfields */
     82#define LTC2992_RESET_HISTORY		BIT(3)
     83
     84/* FAULT1 FAULT2 registers common bitfields */
     85#define LTC2992_POWER_FAULT_MSK(x)	(BIT(6) << (x))
     86#define LTC2992_DSENSE_FAULT_MSK(x)	(BIT(4) << (x))
     87#define LTC2992_SENSE_FAULT_MSK(x)	(BIT(2) << (x))
     88
     89/* FAULT1 bitfields */
     90#define LTC2992_GPIO1_FAULT_MSK(x)	(BIT(0) << (x))
     91
     92/* FAULT2 bitfields */
     93#define LTC2992_GPIO2_FAULT_MSK(x)	(BIT(0) << (x))
     94
     95/* FAULT3 bitfields */
     96#define LTC2992_GPIO3_FAULT_MSK(x)	(BIT(6) << (x))
     97#define LTC2992_GPIO4_FAULT_MSK(x)	(BIT(4) << (x))
     98
     99#define LTC2992_IADC_NANOV_LSB		12500
    100#define LTC2992_VADC_UV_LSB		25000
    101#define LTC2992_VADC_GPIO_UV_LSB	500
    102
    103#define LTC2992_GPIO_NR		4
    104#define LTC2992_GPIO1_BIT	7
    105#define LTC2992_GPIO2_BIT	6
    106#define LTC2992_GPIO3_BIT	0
    107#define LTC2992_GPIO4_BIT	6
    108#define LTC2992_GPIO_BIT(x)	(LTC2992_GPIO_NR - (x) - 1)
    109
    110struct ltc2992_state {
    111	struct i2c_client		*client;
    112	struct gpio_chip		gc;
    113	struct mutex			gpio_mutex; /* lock for gpio access */
    114	const char			*gpio_names[LTC2992_GPIO_NR];
    115	struct regmap			*regmap;
    116	u32				r_sense_uohm[2];
    117};
    118
    119struct ltc2992_gpio_regs {
    120	u8	data;
    121	u8	max;
    122	u8	min;
    123	u8	max_thresh;
    124	u8	min_thresh;
    125	u8	alarm;
    126	u8	min_alarm_msk;
    127	u8	max_alarm_msk;
    128	u8	ctrl;
    129	u8	ctrl_bit;
    130};
    131
    132static const struct ltc2992_gpio_regs ltc2992_gpio_addr_map[] = {
    133	{
    134		.data = LTC2992_G1,
    135		.max = LTC2992_G1_MAX,
    136		.min = LTC2992_G1_MIN,
    137		.max_thresh = LTC2992_G1_MAX_THRESH,
    138		.min_thresh = LTC2992_G1_MIN_THRESH,
    139		.alarm = LTC2992_FAULT1,
    140		.min_alarm_msk = LTC2992_GPIO1_FAULT_MSK(0),
    141		.max_alarm_msk = LTC2992_GPIO1_FAULT_MSK(1),
    142		.ctrl = LTC2992_GPIO_IO_CTRL,
    143		.ctrl_bit = LTC2992_GPIO1_BIT,
    144	},
    145	{
    146		.data = LTC2992_G2,
    147		.max = LTC2992_G2_MAX,
    148		.min = LTC2992_G2_MIN,
    149		.max_thresh = LTC2992_G2_MAX_THRESH,
    150		.min_thresh = LTC2992_G2_MIN_THRESH,
    151		.alarm = LTC2992_FAULT2,
    152		.min_alarm_msk = LTC2992_GPIO2_FAULT_MSK(0),
    153		.max_alarm_msk = LTC2992_GPIO2_FAULT_MSK(1),
    154		.ctrl = LTC2992_GPIO_IO_CTRL,
    155		.ctrl_bit = LTC2992_GPIO2_BIT,
    156	},
    157	{
    158		.data = LTC2992_G3,
    159		.max = LTC2992_G3_MAX,
    160		.min = LTC2992_G3_MIN,
    161		.max_thresh = LTC2992_G3_MAX_THRESH,
    162		.min_thresh = LTC2992_G3_MIN_THRESH,
    163		.alarm = LTC2992_FAULT3,
    164		.min_alarm_msk = LTC2992_GPIO3_FAULT_MSK(0),
    165		.max_alarm_msk = LTC2992_GPIO3_FAULT_MSK(1),
    166		.ctrl = LTC2992_GPIO_IO_CTRL,
    167		.ctrl_bit = LTC2992_GPIO3_BIT,
    168	},
    169	{
    170		.data = LTC2992_G4,
    171		.max = LTC2992_G4_MAX,
    172		.min = LTC2992_G4_MIN,
    173		.max_thresh = LTC2992_G4_MAX_THRESH,
    174		.min_thresh = LTC2992_G4_MIN_THRESH,
    175		.alarm = LTC2992_FAULT3,
    176		.min_alarm_msk = LTC2992_GPIO4_FAULT_MSK(0),
    177		.max_alarm_msk = LTC2992_GPIO4_FAULT_MSK(1),
    178		.ctrl = LTC2992_GPIO_CTRL,
    179		.ctrl_bit = LTC2992_GPIO4_BIT,
    180	},
    181};
    182
    183static const char *ltc2992_gpio_names[LTC2992_GPIO_NR] = {
    184	"GPIO1", "GPIO2", "GPIO3", "GPIO4",
    185};
    186
    187static int ltc2992_read_reg(struct ltc2992_state *st, u8 addr, const u8 reg_len)
    188{
    189	u8 regvals[4];
    190	int val;
    191	int ret;
    192	int i;
    193
    194	ret = regmap_bulk_read(st->regmap, addr, regvals, reg_len);
    195	if (ret < 0)
    196		return ret;
    197
    198	val = 0;
    199	for (i = 0; i < reg_len; i++)
    200		val |= regvals[reg_len - i - 1] << (i * 8);
    201
    202	return val;
    203}
    204
    205static int ltc2992_write_reg(struct ltc2992_state *st, u8 addr, const u8 reg_len, u32 val)
    206{
    207	u8 regvals[4];
    208	int i;
    209
    210	for (i = 0; i < reg_len; i++)
    211		regvals[reg_len - i - 1] = (val >> (i * 8)) & 0xFF;
    212
    213	return regmap_bulk_write(st->regmap, addr, regvals, reg_len);
    214}
    215
    216static int ltc2992_gpio_get(struct gpio_chip *chip, unsigned int offset)
    217{
    218	struct ltc2992_state *st = gpiochip_get_data(chip);
    219	unsigned long gpio_status;
    220	int reg;
    221
    222	mutex_lock(&st->gpio_mutex);
    223	reg = ltc2992_read_reg(st, LTC2992_GPIO_STATUS, 1);
    224	mutex_unlock(&st->gpio_mutex);
    225
    226	if (reg < 0)
    227		return reg;
    228
    229	gpio_status = reg;
    230
    231	return !test_bit(LTC2992_GPIO_BIT(offset), &gpio_status);
    232}
    233
    234static int ltc2992_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask,
    235				     unsigned long *bits)
    236{
    237	struct ltc2992_state *st = gpiochip_get_data(chip);
    238	unsigned long gpio_status;
    239	unsigned int gpio_nr;
    240	int reg;
    241
    242	mutex_lock(&st->gpio_mutex);
    243	reg = ltc2992_read_reg(st, LTC2992_GPIO_STATUS, 1);
    244	mutex_unlock(&st->gpio_mutex);
    245
    246	if (reg < 0)
    247		return reg;
    248
    249	gpio_status = reg;
    250
    251	for_each_set_bit(gpio_nr, mask, LTC2992_GPIO_NR) {
    252		if (test_bit(LTC2992_GPIO_BIT(gpio_nr), &gpio_status))
    253			set_bit(gpio_nr, bits);
    254	}
    255
    256	return 0;
    257}
    258
    259static void ltc2992_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
    260{
    261	struct ltc2992_state *st = gpiochip_get_data(chip);
    262	unsigned long gpio_ctrl;
    263	int reg;
    264
    265	mutex_lock(&st->gpio_mutex);
    266	reg = ltc2992_read_reg(st, ltc2992_gpio_addr_map[offset].ctrl, 1);
    267	if (reg < 0) {
    268		mutex_unlock(&st->gpio_mutex);
    269		return;
    270	}
    271
    272	gpio_ctrl = reg;
    273	assign_bit(ltc2992_gpio_addr_map[offset].ctrl_bit, &gpio_ctrl, value);
    274
    275	ltc2992_write_reg(st, ltc2992_gpio_addr_map[offset].ctrl, 1, gpio_ctrl);
    276	mutex_unlock(&st->gpio_mutex);
    277}
    278
    279static void ltc2992_gpio_set_multiple(struct gpio_chip *chip, unsigned long *mask,
    280				      unsigned long *bits)
    281{
    282	struct ltc2992_state *st = gpiochip_get_data(chip);
    283	unsigned long gpio_ctrl_io = 0;
    284	unsigned long gpio_ctrl = 0;
    285	unsigned int gpio_nr;
    286
    287	for_each_set_bit(gpio_nr, mask, LTC2992_GPIO_NR) {
    288		if (gpio_nr < 3)
    289			assign_bit(ltc2992_gpio_addr_map[gpio_nr].ctrl_bit, &gpio_ctrl_io, true);
    290
    291		if (gpio_nr == 3)
    292			assign_bit(ltc2992_gpio_addr_map[gpio_nr].ctrl_bit, &gpio_ctrl, true);
    293	}
    294
    295	mutex_lock(&st->gpio_mutex);
    296	ltc2992_write_reg(st, LTC2992_GPIO_IO_CTRL, 1, gpio_ctrl_io);
    297	ltc2992_write_reg(st, LTC2992_GPIO_CTRL, 1, gpio_ctrl);
    298	mutex_unlock(&st->gpio_mutex);
    299}
    300
    301static int ltc2992_config_gpio(struct ltc2992_state *st)
    302{
    303	const char *name = dev_name(&st->client->dev);
    304	char *gpio_name;
    305	int ret;
    306	int i;
    307
    308	ret = ltc2992_write_reg(st, LTC2992_GPIO_IO_CTRL, 1, 0);
    309	if (ret < 0)
    310		return ret;
    311
    312	mutex_init(&st->gpio_mutex);
    313
    314	for (i = 0; i < ARRAY_SIZE(st->gpio_names); i++) {
    315		gpio_name = devm_kasprintf(&st->client->dev, GFP_KERNEL, "ltc2992-%x-%s",
    316					   st->client->addr, ltc2992_gpio_names[i]);
    317		if (!gpio_name)
    318			return -ENOMEM;
    319
    320		st->gpio_names[i] = gpio_name;
    321	}
    322
    323	st->gc.label = name;
    324	st->gc.parent = &st->client->dev;
    325	st->gc.owner = THIS_MODULE;
    326	st->gc.base = -1;
    327	st->gc.names = st->gpio_names;
    328	st->gc.ngpio = ARRAY_SIZE(st->gpio_names);
    329	st->gc.get = ltc2992_gpio_get;
    330	st->gc.get_multiple = ltc2992_gpio_get_multiple;
    331	st->gc.set = ltc2992_gpio_set;
    332	st->gc.set_multiple = ltc2992_gpio_set_multiple;
    333
    334	ret = devm_gpiochip_add_data(&st->client->dev, &st->gc, st);
    335	if (ret)
    336		dev_err(&st->client->dev, "GPIO registering failed (%d)\n", ret);
    337
    338	return ret;
    339}
    340
    341static umode_t ltc2992_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr,
    342				  int channel)
    343{
    344	const struct ltc2992_state *st = data;
    345
    346	switch (type) {
    347	case hwmon_chip:
    348		switch (attr) {
    349		case hwmon_chip_in_reset_history:
    350			return 0200;
    351		}
    352		break;
    353	case hwmon_in:
    354		switch (attr) {
    355		case hwmon_in_input:
    356		case hwmon_in_lowest:
    357		case hwmon_in_highest:
    358		case hwmon_in_min_alarm:
    359		case hwmon_in_max_alarm:
    360			return 0444;
    361		case hwmon_in_min:
    362		case hwmon_in_max:
    363			return 0644;
    364		}
    365		break;
    366	case hwmon_curr:
    367		switch (attr) {
    368		case hwmon_curr_input:
    369		case hwmon_curr_lowest:
    370		case hwmon_curr_highest:
    371		case hwmon_curr_min_alarm:
    372		case hwmon_curr_max_alarm:
    373			if (st->r_sense_uohm[channel])
    374				return 0444;
    375			break;
    376		case hwmon_curr_min:
    377		case hwmon_curr_max:
    378			if (st->r_sense_uohm[channel])
    379				return 0644;
    380			break;
    381		}
    382		break;
    383	case hwmon_power:
    384		switch (attr) {
    385		case hwmon_power_input:
    386		case hwmon_power_input_lowest:
    387		case hwmon_power_input_highest:
    388		case hwmon_power_min_alarm:
    389		case hwmon_power_max_alarm:
    390			if (st->r_sense_uohm[channel])
    391				return 0444;
    392			break;
    393		case hwmon_power_min:
    394		case hwmon_power_max:
    395			if (st->r_sense_uohm[channel])
    396				return 0644;
    397			break;
    398		}
    399		break;
    400	default:
    401		break;
    402	}
    403
    404	return 0;
    405}
    406
    407static int ltc2992_get_voltage(struct ltc2992_state *st, u32 reg, u32 scale, long *val)
    408{
    409	int reg_val;
    410
    411	reg_val = ltc2992_read_reg(st, reg, 2);
    412	if (reg_val < 0)
    413		return reg_val;
    414
    415	reg_val = reg_val >> 4;
    416	*val = DIV_ROUND_CLOSEST(reg_val * scale, 1000);
    417
    418	return 0;
    419}
    420
    421static int ltc2992_set_voltage(struct ltc2992_state *st, u32 reg, u32 scale, long val)
    422{
    423	val = DIV_ROUND_CLOSEST(val * 1000, scale);
    424	val = val << 4;
    425
    426	return ltc2992_write_reg(st, reg, 2, val);
    427}
    428
    429static int ltc2992_read_gpio_alarm(struct ltc2992_state *st, int nr_gpio, u32 attr, long *val)
    430{
    431	int reg_val;
    432	u32 mask;
    433
    434	if (attr == hwmon_in_max_alarm)
    435		mask = ltc2992_gpio_addr_map[nr_gpio].max_alarm_msk;
    436	else
    437		mask = ltc2992_gpio_addr_map[nr_gpio].min_alarm_msk;
    438
    439	reg_val = ltc2992_read_reg(st, ltc2992_gpio_addr_map[nr_gpio].alarm, 1);
    440	if (reg_val < 0)
    441		return reg_val;
    442
    443	*val = !!(reg_val & mask);
    444	reg_val &= ~mask;
    445
    446	return ltc2992_write_reg(st, ltc2992_gpio_addr_map[nr_gpio].alarm, 1, reg_val);
    447}
    448
    449static int ltc2992_read_gpios_in(struct device *dev, u32 attr, int nr_gpio, long *val)
    450{
    451	struct ltc2992_state *st = dev_get_drvdata(dev);
    452	u32 reg;
    453
    454	switch (attr) {
    455	case hwmon_in_input:
    456		reg = ltc2992_gpio_addr_map[nr_gpio].data;
    457		break;
    458	case hwmon_in_lowest:
    459		reg = ltc2992_gpio_addr_map[nr_gpio].min;
    460		break;
    461	case hwmon_in_highest:
    462		reg = ltc2992_gpio_addr_map[nr_gpio].max;
    463		break;
    464	case hwmon_in_min:
    465		reg = ltc2992_gpio_addr_map[nr_gpio].min_thresh;
    466		break;
    467	case hwmon_in_max:
    468		reg = ltc2992_gpio_addr_map[nr_gpio].max_thresh;
    469		break;
    470	case hwmon_in_min_alarm:
    471	case hwmon_in_max_alarm:
    472		return ltc2992_read_gpio_alarm(st, nr_gpio, attr, val);
    473	default:
    474		return -EOPNOTSUPP;
    475	}
    476
    477	return ltc2992_get_voltage(st, reg, LTC2992_VADC_GPIO_UV_LSB, val);
    478}
    479
    480static int ltc2992_read_in_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr)
    481{
    482	int reg_val;
    483	u32 mask;
    484
    485	if (attr == hwmon_in_max_alarm)
    486		mask = LTC2992_SENSE_FAULT_MSK(1);
    487	else
    488		mask = LTC2992_SENSE_FAULT_MSK(0);
    489
    490	reg_val = ltc2992_read_reg(st, LTC2992_SENSE_FAULT(channel), 1);
    491	if (reg_val < 0)
    492		return reg_val;
    493
    494	*val = !!(reg_val & mask);
    495	reg_val &= ~mask;
    496
    497	return ltc2992_write_reg(st, LTC2992_SENSE_FAULT(channel), 1, reg_val);
    498}
    499
    500static int ltc2992_read_in(struct device *dev, u32 attr, int channel, long *val)
    501{
    502	struct ltc2992_state *st = dev_get_drvdata(dev);
    503	u32 reg;
    504
    505	if (channel > 1)
    506		return ltc2992_read_gpios_in(dev, attr, channel - 2, val);
    507
    508	switch (attr) {
    509	case hwmon_in_input:
    510		reg = LTC2992_SENSE(channel);
    511		break;
    512	case hwmon_in_lowest:
    513		reg = LTC2992_SENSE_MIN(channel);
    514		break;
    515	case hwmon_in_highest:
    516		reg = LTC2992_SENSE_MAX(channel);
    517		break;
    518	case hwmon_in_min:
    519		reg = LTC2992_SENSE_MIN_THRESH(channel);
    520		break;
    521	case hwmon_in_max:
    522		reg = LTC2992_SENSE_MAX_THRESH(channel);
    523		break;
    524	case hwmon_in_min_alarm:
    525	case hwmon_in_max_alarm:
    526		return ltc2992_read_in_alarm(st, channel, val, attr);
    527	default:
    528		return -EOPNOTSUPP;
    529	}
    530
    531	return ltc2992_get_voltage(st, reg, LTC2992_VADC_UV_LSB, val);
    532}
    533
    534static int ltc2992_get_current(struct ltc2992_state *st, u32 reg, u32 channel, long *val)
    535{
    536	int reg_val;
    537
    538	reg_val = ltc2992_read_reg(st, reg, 2);
    539	if (reg_val < 0)
    540		return reg_val;
    541
    542	reg_val = reg_val >> 4;
    543	*val = DIV_ROUND_CLOSEST(reg_val * LTC2992_IADC_NANOV_LSB, st->r_sense_uohm[channel]);
    544
    545	return 0;
    546}
    547
    548static int ltc2992_set_current(struct ltc2992_state *st, u32 reg, u32 channel, long val)
    549{
    550	u32 reg_val;
    551
    552	reg_val = DIV_ROUND_CLOSEST(val * st->r_sense_uohm[channel], LTC2992_IADC_NANOV_LSB);
    553	reg_val = reg_val << 4;
    554
    555	return ltc2992_write_reg(st, reg, 2, reg_val);
    556}
    557
    558static int ltc2992_read_curr_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr)
    559{
    560	int reg_val;
    561	u32 mask;
    562
    563	if (attr == hwmon_curr_max_alarm)
    564		mask = LTC2992_DSENSE_FAULT_MSK(1);
    565	else
    566		mask = LTC2992_DSENSE_FAULT_MSK(0);
    567
    568	reg_val = ltc2992_read_reg(st, LTC2992_DSENSE_FAULT(channel), 1);
    569	if (reg_val < 0)
    570		return reg_val;
    571
    572	*val = !!(reg_val & mask);
    573
    574	reg_val &= ~mask;
    575	return ltc2992_write_reg(st, LTC2992_DSENSE_FAULT(channel), 1, reg_val);
    576}
    577
    578static int ltc2992_read_curr(struct device *dev, u32 attr, int channel, long *val)
    579{
    580	struct ltc2992_state *st = dev_get_drvdata(dev);
    581	u32 reg;
    582
    583	switch (attr) {
    584	case hwmon_curr_input:
    585		reg = LTC2992_DSENSE(channel);
    586		break;
    587	case hwmon_curr_lowest:
    588		reg = LTC2992_DSENSE_MIN(channel);
    589		break;
    590	case hwmon_curr_highest:
    591		reg = LTC2992_DSENSE_MAX(channel);
    592		break;
    593	case hwmon_curr_min:
    594		reg = LTC2992_DSENSE_MIN_THRESH(channel);
    595		break;
    596	case hwmon_curr_max:
    597		reg = LTC2992_DSENSE_MAX_THRESH(channel);
    598		break;
    599	case hwmon_curr_min_alarm:
    600	case hwmon_curr_max_alarm:
    601		return ltc2992_read_curr_alarm(st, channel, val, attr);
    602	default:
    603		return -EOPNOTSUPP;
    604	}
    605
    606	return ltc2992_get_current(st, reg, channel, val);
    607}
    608
    609static int ltc2992_get_power(struct ltc2992_state *st, u32 reg, u32 channel, long *val)
    610{
    611	int reg_val;
    612
    613	reg_val = ltc2992_read_reg(st, reg, 3);
    614	if (reg_val < 0)
    615		return reg_val;
    616
    617	*val = mul_u64_u32_div(reg_val, LTC2992_VADC_UV_LSB * LTC2992_IADC_NANOV_LSB,
    618			       st->r_sense_uohm[channel] * 1000);
    619
    620	return 0;
    621}
    622
    623static int ltc2992_set_power(struct ltc2992_state *st, u32 reg, u32 channel, long val)
    624{
    625	u32 reg_val;
    626
    627	reg_val = mul_u64_u32_div(val, st->r_sense_uohm[channel] * 1000,
    628				  LTC2992_VADC_UV_LSB * LTC2992_IADC_NANOV_LSB);
    629
    630	return ltc2992_write_reg(st, reg, 3, reg_val);
    631}
    632
    633static int ltc2992_read_power_alarm(struct ltc2992_state *st, int channel, long *val, u32 attr)
    634{
    635	int reg_val;
    636	u32 mask;
    637
    638	if (attr == hwmon_power_max_alarm)
    639		mask = LTC2992_POWER_FAULT_MSK(1);
    640	else
    641		mask = LTC2992_POWER_FAULT_MSK(0);
    642
    643	reg_val = ltc2992_read_reg(st, LTC2992_POWER_FAULT(channel), 1);
    644	if (reg_val < 0)
    645		return reg_val;
    646
    647	*val = !!(reg_val & mask);
    648	reg_val &= ~mask;
    649
    650	return ltc2992_write_reg(st, LTC2992_POWER_FAULT(channel), 1, reg_val);
    651}
    652
    653static int ltc2992_read_power(struct device *dev, u32 attr, int channel, long *val)
    654{
    655	struct ltc2992_state *st = dev_get_drvdata(dev);
    656	u32 reg;
    657
    658	switch (attr) {
    659	case hwmon_power_input:
    660		reg = LTC2992_POWER(channel);
    661		break;
    662	case hwmon_power_input_lowest:
    663		reg = LTC2992_POWER_MIN(channel);
    664		break;
    665	case hwmon_power_input_highest:
    666		reg = LTC2992_POWER_MAX(channel);
    667		break;
    668	case hwmon_power_min:
    669		reg = LTC2992_POWER_MIN_THRESH(channel);
    670		break;
    671	case hwmon_power_max:
    672		reg = LTC2992_POWER_MAX_THRESH(channel);
    673		break;
    674	case hwmon_power_min_alarm:
    675	case hwmon_power_max_alarm:
    676		return ltc2992_read_power_alarm(st, channel, val, attr);
    677	default:
    678		return -EOPNOTSUPP;
    679	}
    680
    681	return ltc2992_get_power(st, reg, channel, val);
    682}
    683
    684static int ltc2992_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
    685			long *val)
    686{
    687	switch (type) {
    688	case hwmon_in:
    689		return ltc2992_read_in(dev, attr, channel, val);
    690	case hwmon_curr:
    691		return ltc2992_read_curr(dev, attr, channel, val);
    692	case hwmon_power:
    693		return ltc2992_read_power(dev, attr, channel, val);
    694	default:
    695		return -EOPNOTSUPP;
    696	}
    697}
    698
    699static int ltc2992_write_curr(struct device *dev, u32 attr, int channel, long val)
    700{
    701	struct ltc2992_state *st = dev_get_drvdata(dev);
    702	u32 reg;
    703
    704	switch (attr) {
    705	case hwmon_curr_min:
    706		reg = LTC2992_DSENSE_MIN_THRESH(channel);
    707		break;
    708	case hwmon_curr_max:
    709		reg = LTC2992_DSENSE_MAX_THRESH(channel);
    710		break;
    711	default:
    712		return -EOPNOTSUPP;
    713	}
    714
    715	return ltc2992_set_current(st, reg, channel, val);
    716}
    717
    718static int ltc2992_write_gpios_in(struct device *dev, u32 attr, int nr_gpio, long val)
    719{
    720	struct ltc2992_state *st = dev_get_drvdata(dev);
    721	u32 reg;
    722
    723	switch (attr) {
    724	case hwmon_in_min:
    725		reg = ltc2992_gpio_addr_map[nr_gpio].min_thresh;
    726		break;
    727	case hwmon_in_max:
    728		reg = ltc2992_gpio_addr_map[nr_gpio].max_thresh;
    729		break;
    730	default:
    731		return -EOPNOTSUPP;
    732	}
    733
    734	return ltc2992_set_voltage(st, reg, LTC2992_VADC_GPIO_UV_LSB, val);
    735}
    736
    737static int ltc2992_write_in(struct device *dev, u32 attr, int channel, long val)
    738{
    739	struct ltc2992_state *st = dev_get_drvdata(dev);
    740	u32 reg;
    741
    742	if (channel > 1)
    743		return ltc2992_write_gpios_in(dev, attr, channel - 2, val);
    744
    745	switch (attr) {
    746	case hwmon_in_min:
    747		reg = LTC2992_SENSE_MIN_THRESH(channel);
    748		break;
    749	case hwmon_in_max:
    750		reg = LTC2992_SENSE_MAX_THRESH(channel);
    751		break;
    752	default:
    753		return -EOPNOTSUPP;
    754	}
    755
    756	return ltc2992_set_voltage(st, reg, LTC2992_VADC_UV_LSB, val);
    757}
    758
    759static int ltc2992_write_power(struct device *dev, u32 attr, int channel, long val)
    760{
    761	struct ltc2992_state *st = dev_get_drvdata(dev);
    762	u32 reg;
    763
    764	switch (attr) {
    765	case hwmon_power_min:
    766		reg = LTC2992_POWER_MIN_THRESH(channel);
    767		break;
    768	case hwmon_power_max:
    769		reg = LTC2992_POWER_MAX_THRESH(channel);
    770		break;
    771	default:
    772		return -EOPNOTSUPP;
    773	}
    774
    775	return ltc2992_set_power(st, reg, channel, val);
    776}
    777
    778static int ltc2992_write_chip(struct device *dev, u32 attr, int channel, long val)
    779{
    780	struct ltc2992_state *st = dev_get_drvdata(dev);
    781
    782	switch (attr) {
    783	case hwmon_chip_in_reset_history:
    784		return regmap_update_bits(st->regmap, LTC2992_CTRLB, LTC2992_RESET_HISTORY,
    785					  LTC2992_RESET_HISTORY);
    786	default:
    787		return -EOPNOTSUPP;
    788	}
    789}
    790
    791static int ltc2992_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
    792			 long val)
    793{
    794	switch (type) {
    795	case hwmon_chip:
    796		return ltc2992_write_chip(dev, attr, channel, val);
    797	case hwmon_in:
    798		return ltc2992_write_in(dev, attr, channel, val);
    799	case hwmon_curr:
    800		return ltc2992_write_curr(dev, attr, channel, val);
    801	case hwmon_power:
    802		return ltc2992_write_power(dev, attr, channel, val);
    803	default:
    804		return -EOPNOTSUPP;
    805	}
    806}
    807
    808static const struct hwmon_ops ltc2992_hwmon_ops = {
    809	.is_visible = ltc2992_is_visible,
    810	.read = ltc2992_read,
    811	.write = ltc2992_write,
    812};
    813
    814static const struct hwmon_channel_info *ltc2992_info[] = {
    815	HWMON_CHANNEL_INFO(chip,
    816			   HWMON_C_IN_RESET_HISTORY),
    817	HWMON_CHANNEL_INFO(in,
    818			   HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | HWMON_I_MIN |
    819			   HWMON_I_MAX | HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM,
    820			   HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | HWMON_I_MIN |
    821			   HWMON_I_MAX | HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM,
    822			   HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | HWMON_I_MIN |
    823			   HWMON_I_MAX | HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM,
    824			   HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | HWMON_I_MIN |
    825			   HWMON_I_MAX | HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM,
    826			   HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | HWMON_I_MIN |
    827			   HWMON_I_MAX | HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM,
    828			   HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST | HWMON_I_MIN |
    829			   HWMON_I_MAX | HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM),
    830	HWMON_CHANNEL_INFO(curr,
    831			   HWMON_C_INPUT | HWMON_C_LOWEST | HWMON_C_HIGHEST | HWMON_C_MIN |
    832			   HWMON_C_MAX | HWMON_C_MIN_ALARM | HWMON_C_MAX_ALARM,
    833			   HWMON_C_INPUT | HWMON_C_LOWEST | HWMON_C_HIGHEST | HWMON_C_MIN |
    834			   HWMON_C_MAX | HWMON_C_MIN_ALARM | HWMON_C_MAX_ALARM),
    835	HWMON_CHANNEL_INFO(power,
    836			   HWMON_P_INPUT | HWMON_P_INPUT_LOWEST | HWMON_P_INPUT_HIGHEST |
    837			   HWMON_P_MIN | HWMON_P_MAX | HWMON_P_MIN_ALARM | HWMON_P_MAX_ALARM,
    838			   HWMON_P_INPUT | HWMON_P_INPUT_LOWEST | HWMON_P_INPUT_HIGHEST |
    839			   HWMON_P_MIN | HWMON_P_MAX | HWMON_P_MIN_ALARM | HWMON_P_MAX_ALARM),
    840	NULL
    841};
    842
    843static const struct hwmon_chip_info ltc2992_chip_info = {
    844	.ops = &ltc2992_hwmon_ops,
    845	.info = ltc2992_info,
    846};
    847
    848static const struct regmap_config ltc2992_regmap_config = {
    849	.reg_bits = 8,
    850	.val_bits = 8,
    851	.max_register = 0xE8,
    852};
    853
    854static int ltc2992_parse_dt(struct ltc2992_state *st)
    855{
    856	struct fwnode_handle *fwnode;
    857	struct fwnode_handle *child;
    858	u32 addr;
    859	u32 val;
    860	int ret;
    861
    862	fwnode = dev_fwnode(&st->client->dev);
    863
    864	fwnode_for_each_available_child_node(fwnode, child) {
    865		ret = fwnode_property_read_u32(child, "reg", &addr);
    866		if (ret < 0) {
    867			fwnode_handle_put(child);
    868			return ret;
    869		}
    870
    871		if (addr > 1) {
    872			fwnode_handle_put(child);
    873			return -EINVAL;
    874		}
    875
    876		ret = fwnode_property_read_u32(child, "shunt-resistor-micro-ohms", &val);
    877		if (!ret)
    878			st->r_sense_uohm[addr] = val;
    879	}
    880
    881	return 0;
    882}
    883
    884static int ltc2992_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
    885{
    886	struct device *hwmon_dev;
    887	struct ltc2992_state *st;
    888	int ret;
    889
    890	st = devm_kzalloc(&client->dev, sizeof(*st), GFP_KERNEL);
    891	if (!st)
    892		return -ENOMEM;
    893
    894	st->client = client;
    895	st->regmap = devm_regmap_init_i2c(client, &ltc2992_regmap_config);
    896	if (IS_ERR(st->regmap))
    897		return PTR_ERR(st->regmap);
    898
    899	ret = ltc2992_parse_dt(st);
    900	if (ret < 0)
    901		return ret;
    902
    903	ret = ltc2992_config_gpio(st);
    904	if (ret < 0)
    905		return ret;
    906
    907	hwmon_dev = devm_hwmon_device_register_with_info(&client->dev, client->name, st,
    908							 &ltc2992_chip_info, NULL);
    909
    910	return PTR_ERR_OR_ZERO(hwmon_dev);
    911}
    912
    913static const struct of_device_id ltc2992_of_match[] = {
    914	{ .compatible = "adi,ltc2992" },
    915	{ }
    916};
    917MODULE_DEVICE_TABLE(of, ltc2992_of_match);
    918
    919static const struct i2c_device_id ltc2992_i2c_id[] = {
    920	{"ltc2992", 0},
    921	{}
    922};
    923MODULE_DEVICE_TABLE(i2c, ltc2992_i2c_id);
    924
    925static struct i2c_driver ltc2992_i2c_driver = {
    926	.driver = {
    927		.name = "ltc2992",
    928		.of_match_table = ltc2992_of_match,
    929	},
    930	.probe    = ltc2992_i2c_probe,
    931	.id_table = ltc2992_i2c_id,
    932};
    933
    934module_i2c_driver(ltc2992_i2c_driver);
    935
    936MODULE_AUTHOR("Alexandru Tachici <alexandru.tachici@analog.com>");
    937MODULE_DESCRIPTION("Hwmon driver for Linear Technology 2992");
    938MODULE_LICENSE("Dual BSD/GPL");