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

tmp513.c (19798B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Driver for Texas Instruments TMP512, TMP513 power monitor chips
      4 *
      5 * TMP513:
      6 * Thermal/Power Management with Triple Remote and
      7 * Local Temperature Sensor and Current Shunt Monitor
      8 * Datasheet: https://www.ti.com/lit/gpn/tmp513
      9 *
     10 * TMP512:
     11 * Thermal/Power Management with Dual Remote
     12 *	and Local Temperature Sensor and Current Shunt Monitor
     13 * Datasheet: https://www.ti.com/lit/gpn/tmp512
     14 *
     15 * Copyright (C) 2019 Eric Tremblay <etremblay@distech-controls.com>
     16 *
     17 * This program is free software; you can redistribute it and/or modify
     18 * it under the terms of the GNU General Public License as published by
     19 * the Free Software Foundation; version 2 of the License.
     20 */
     21
     22#include <linux/err.h>
     23#include <linux/hwmon.h>
     24#include <linux/i2c.h>
     25#include <linux/init.h>
     26#include <linux/kernel.h>
     27#include <linux/module.h>
     28#include <linux/regmap.h>
     29#include <linux/slab.h>
     30#include <linux/util_macros.h>
     31
     32// Common register definition
     33#define TMP51X_SHUNT_CONFIG		0x00
     34#define TMP51X_TEMP_CONFIG		0x01
     35#define TMP51X_STATUS			0x02
     36#define TMP51X_SMBUS_ALERT		0x03
     37#define TMP51X_SHUNT_CURRENT_RESULT	0x04
     38#define TMP51X_BUS_VOLTAGE_RESULT	0x05
     39#define TMP51X_POWER_RESULT		0x06
     40#define TMP51X_BUS_CURRENT_RESULT	0x07
     41#define TMP51X_LOCAL_TEMP_RESULT	0x08
     42#define TMP51X_REMOTE_TEMP_RESULT_1	0x09
     43#define TMP51X_REMOTE_TEMP_RESULT_2	0x0A
     44#define TMP51X_SHUNT_CURRENT_H_LIMIT	0x0C
     45#define TMP51X_SHUNT_CURRENT_L_LIMIT	0x0D
     46#define TMP51X_BUS_VOLTAGE_H_LIMIT	0x0E
     47#define TMP51X_BUS_VOLTAGE_L_LIMIT	0x0F
     48#define TMP51X_POWER_LIMIT		0x10
     49#define TMP51X_LOCAL_TEMP_LIMIT	0x11
     50#define TMP51X_REMOTE_TEMP_LIMIT_1	0x12
     51#define TMP51X_REMOTE_TEMP_LIMIT_2	0x13
     52#define TMP51X_SHUNT_CALIBRATION	0x15
     53#define TMP51X_N_FACTOR_AND_HYST_1	0x16
     54#define TMP51X_N_FACTOR_2		0x17
     55#define TMP51X_MAN_ID_REG		0xFE
     56#define TMP51X_DEVICE_ID_REG		0xFF
     57
     58// TMP513 specific register definition
     59#define TMP513_REMOTE_TEMP_RESULT_3	0x0B
     60#define TMP513_REMOTE_TEMP_LIMIT_3	0x14
     61#define TMP513_N_FACTOR_3		0x18
     62
     63// Common attrs, and NULL
     64#define TMP51X_MANUFACTURER_ID		0x55FF
     65
     66#define TMP512_DEVICE_ID		0x22FF
     67#define TMP513_DEVICE_ID		0x23FF
     68
     69// Default config
     70#define TMP51X_SHUNT_CONFIG_DEFAULT	0x399F
     71#define TMP51X_SHUNT_VALUE_DEFAULT	1000
     72#define TMP51X_VBUS_RANGE_DEFAULT	TMP51X_VBUS_RANGE_32V
     73#define TMP51X_PGA_DEFAULT		8
     74#define TMP51X_MAX_REGISTER_ADDR	0xFF
     75
     76#define TMP512_TEMP_CONFIG_DEFAULT	0xBF80
     77#define TMP513_TEMP_CONFIG_DEFAULT	0xFF80
     78
     79// Mask and shift
     80#define CURRENT_SENSE_VOLTAGE_320_MASK	0x1800
     81#define CURRENT_SENSE_VOLTAGE_160_MASK	0x1000
     82#define CURRENT_SENSE_VOLTAGE_80_MASK	0x0800
     83#define CURRENT_SENSE_VOLTAGE_40_MASK	0
     84
     85#define TMP51X_BUS_VOLTAGE_MASK		0x2000
     86#define TMP51X_NFACTOR_MASK		0xFF00
     87#define TMP51X_HYST_MASK		0x00FF
     88
     89#define TMP51X_BUS_VOLTAGE_SHIFT	3
     90#define TMP51X_TEMP_SHIFT		3
     91
     92// Alarms
     93#define TMP51X_SHUNT_CURRENT_H_LIMIT_POS	15
     94#define TMP51X_SHUNT_CURRENT_L_LIMIT_POS	14
     95#define TMP51X_BUS_VOLTAGE_H_LIMIT_POS		13
     96#define TMP51X_BUS_VOLTAGE_L_LIMIT_POS		12
     97#define TMP51X_POWER_LIMIT_POS			11
     98#define TMP51X_LOCAL_TEMP_LIMIT_POS		10
     99#define TMP51X_REMOTE_TEMP_LIMIT_1_POS		9
    100#define TMP51X_REMOTE_TEMP_LIMIT_2_POS		8
    101#define TMP513_REMOTE_TEMP_LIMIT_3_POS		7
    102
    103#define TMP51X_VBUS_RANGE_32V		32000000
    104#define TMP51X_VBUS_RANGE_16V		16000000
    105
    106// Max and Min value
    107#define MAX_BUS_VOLTAGE_32_LIMIT	32764
    108#define MAX_BUS_VOLTAGE_16_LIMIT	16382
    109
    110// Max possible value is -256 to +256 but datasheet indicated -40 to 125.
    111#define MAX_TEMP_LIMIT			125000
    112#define MIN_TEMP_LIMIT			-40000
    113
    114#define MAX_TEMP_HYST			127500
    115
    116static const u8 TMP51X_TEMP_INPUT[4] = {
    117	TMP51X_LOCAL_TEMP_RESULT,
    118	TMP51X_REMOTE_TEMP_RESULT_1,
    119	TMP51X_REMOTE_TEMP_RESULT_2,
    120	TMP513_REMOTE_TEMP_RESULT_3
    121};
    122
    123static const u8 TMP51X_TEMP_CRIT[4] = {
    124	TMP51X_LOCAL_TEMP_LIMIT,
    125	TMP51X_REMOTE_TEMP_LIMIT_1,
    126	TMP51X_REMOTE_TEMP_LIMIT_2,
    127	TMP513_REMOTE_TEMP_LIMIT_3
    128};
    129
    130static const u8 TMP51X_TEMP_CRIT_ALARM[4] = {
    131	TMP51X_LOCAL_TEMP_LIMIT_POS,
    132	TMP51X_REMOTE_TEMP_LIMIT_1_POS,
    133	TMP51X_REMOTE_TEMP_LIMIT_2_POS,
    134	TMP513_REMOTE_TEMP_LIMIT_3_POS
    135};
    136
    137static const u8 TMP51X_TEMP_CRIT_HYST[4] = {
    138	TMP51X_N_FACTOR_AND_HYST_1,
    139	TMP51X_N_FACTOR_AND_HYST_1,
    140	TMP51X_N_FACTOR_AND_HYST_1,
    141	TMP51X_N_FACTOR_AND_HYST_1
    142};
    143
    144static const u8 TMP51X_CURR_INPUT[2] = {
    145	TMP51X_SHUNT_CURRENT_RESULT,
    146	TMP51X_BUS_CURRENT_RESULT
    147};
    148
    149static struct regmap_config tmp51x_regmap_config = {
    150	.reg_bits = 8,
    151	.val_bits = 16,
    152	.max_register = TMP51X_MAX_REGISTER_ADDR,
    153};
    154
    155enum tmp51x_ids {
    156	tmp512, tmp513
    157};
    158
    159struct tmp51x_data {
    160	u16 shunt_config;
    161	u16 pga_gain;
    162	u32 vbus_range_uvolt;
    163
    164	u16 temp_config;
    165	u32 nfactor[3];
    166
    167	u32 shunt_uohms;
    168
    169	u32 curr_lsb_ua;
    170	u32 pwr_lsb_uw;
    171
    172	enum tmp51x_ids id;
    173	struct regmap *regmap;
    174};
    175
    176// Set the shift based on the gain 8=4, 4=3, 2=2, 1=1
    177static inline u8 tmp51x_get_pga_shift(struct tmp51x_data *data)
    178{
    179	return 5 - ffs(data->pga_gain);
    180}
    181
    182static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,
    183			    unsigned int regval, long *val)
    184{
    185	switch (reg) {
    186	case TMP51X_STATUS:
    187		*val = (regval >> pos) & 1;
    188		break;
    189	case TMP51X_SHUNT_CURRENT_RESULT:
    190	case TMP51X_SHUNT_CURRENT_H_LIMIT:
    191	case TMP51X_SHUNT_CURRENT_L_LIMIT:
    192		/*
    193		 * The valus is read in voltage in the chip but reported as
    194		 * current to the user.
    195		 * 2's complement number shifted by one to four depending
    196		 * on the pga gain setting. 1lsb = 10uV
    197		 */
    198		*val = sign_extend32(regval, 17 - tmp51x_get_pga_shift(data));
    199		*val = DIV_ROUND_CLOSEST(*val * 10000, data->shunt_uohms);
    200		break;
    201	case TMP51X_BUS_VOLTAGE_RESULT:
    202	case TMP51X_BUS_VOLTAGE_H_LIMIT:
    203	case TMP51X_BUS_VOLTAGE_L_LIMIT:
    204		// 1lsb = 4mV
    205		*val = (regval >> TMP51X_BUS_VOLTAGE_SHIFT) * 4;
    206		break;
    207	case TMP51X_POWER_RESULT:
    208	case TMP51X_POWER_LIMIT:
    209		// Power = (current * BusVoltage) / 5000
    210		*val = regval * data->pwr_lsb_uw;
    211		break;
    212	case TMP51X_BUS_CURRENT_RESULT:
    213		// Current = (ShuntVoltage * CalibrationRegister) / 4096
    214		*val = sign_extend32(regval, 16) * data->curr_lsb_ua;
    215		*val = DIV_ROUND_CLOSEST(*val, 1000);
    216		break;
    217	case TMP51X_LOCAL_TEMP_RESULT:
    218	case TMP51X_REMOTE_TEMP_RESULT_1:
    219	case TMP51X_REMOTE_TEMP_RESULT_2:
    220	case TMP513_REMOTE_TEMP_RESULT_3:
    221	case TMP51X_LOCAL_TEMP_LIMIT:
    222	case TMP51X_REMOTE_TEMP_LIMIT_1:
    223	case TMP51X_REMOTE_TEMP_LIMIT_2:
    224	case TMP513_REMOTE_TEMP_LIMIT_3:
    225		// 1lsb = 0.0625 degrees centigrade
    226		*val = sign_extend32(regval, 16) >> TMP51X_TEMP_SHIFT;
    227		*val = DIV_ROUND_CLOSEST(*val * 625, 10);
    228		break;
    229	case TMP51X_N_FACTOR_AND_HYST_1:
    230		// 1lsb = 0.5 degrees centigrade
    231		*val = (regval & TMP51X_HYST_MASK) * 500;
    232		break;
    233	default:
    234		// Programmer goofed
    235		WARN_ON_ONCE(1);
    236		*val = 0;
    237		return -EOPNOTSUPP;
    238	}
    239
    240	return 0;
    241}
    242
    243static int tmp51x_set_value(struct tmp51x_data *data, u8 reg, long val)
    244{
    245	int regval, max_val;
    246	u32 mask = 0;
    247
    248	switch (reg) {
    249	case TMP51X_SHUNT_CURRENT_H_LIMIT:
    250	case TMP51X_SHUNT_CURRENT_L_LIMIT:
    251		/*
    252		 * The user enter current value and we convert it to
    253		 * voltage. 1lsb = 10uV
    254		 */
    255		val = DIV_ROUND_CLOSEST(val * data->shunt_uohms, 10000);
    256		max_val = U16_MAX >> tmp51x_get_pga_shift(data);
    257		regval = clamp_val(val, -max_val, max_val);
    258		break;
    259	case TMP51X_BUS_VOLTAGE_H_LIMIT:
    260	case TMP51X_BUS_VOLTAGE_L_LIMIT:
    261		// 1lsb = 4mV
    262		max_val = (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) ?
    263			MAX_BUS_VOLTAGE_32_LIMIT : MAX_BUS_VOLTAGE_16_LIMIT;
    264
    265		val = clamp_val(DIV_ROUND_CLOSEST(val, 4), 0, max_val);
    266		regval = val << TMP51X_BUS_VOLTAGE_SHIFT;
    267		break;
    268	case TMP51X_POWER_LIMIT:
    269		regval = clamp_val(DIV_ROUND_CLOSEST(val, data->pwr_lsb_uw), 0,
    270				   U16_MAX);
    271		break;
    272	case TMP51X_LOCAL_TEMP_LIMIT:
    273	case TMP51X_REMOTE_TEMP_LIMIT_1:
    274	case TMP51X_REMOTE_TEMP_LIMIT_2:
    275	case TMP513_REMOTE_TEMP_LIMIT_3:
    276		// 1lsb = 0.0625 degrees centigrade
    277		val = clamp_val(val, MIN_TEMP_LIMIT, MAX_TEMP_LIMIT);
    278		regval = DIV_ROUND_CLOSEST(val * 10, 625) << TMP51X_TEMP_SHIFT;
    279		break;
    280	case TMP51X_N_FACTOR_AND_HYST_1:
    281		// 1lsb = 0.5 degrees centigrade
    282		val = clamp_val(val, 0, MAX_TEMP_HYST);
    283		regval = DIV_ROUND_CLOSEST(val, 500);
    284		mask = TMP51X_HYST_MASK;
    285		break;
    286	default:
    287		// Programmer goofed
    288		WARN_ON_ONCE(1);
    289		return -EOPNOTSUPP;
    290	}
    291
    292	if (mask == 0)
    293		return regmap_write(data->regmap, reg, regval);
    294	else
    295		return regmap_update_bits(data->regmap, reg, mask, regval);
    296}
    297
    298static u8 tmp51x_get_reg(enum hwmon_sensor_types type, u32 attr, int channel)
    299{
    300	switch (type) {
    301	case hwmon_temp:
    302		switch (attr) {
    303		case hwmon_temp_input:
    304			return TMP51X_TEMP_INPUT[channel];
    305		case hwmon_temp_crit_alarm:
    306			return TMP51X_STATUS;
    307		case hwmon_temp_crit:
    308			return TMP51X_TEMP_CRIT[channel];
    309		case hwmon_temp_crit_hyst:
    310			return TMP51X_TEMP_CRIT_HYST[channel];
    311		}
    312		break;
    313	case hwmon_in:
    314		switch (attr) {
    315		case hwmon_in_input:
    316			return TMP51X_BUS_VOLTAGE_RESULT;
    317		case hwmon_in_lcrit_alarm:
    318		case hwmon_in_crit_alarm:
    319			return TMP51X_STATUS;
    320		case hwmon_in_lcrit:
    321			return TMP51X_BUS_VOLTAGE_L_LIMIT;
    322		case hwmon_in_crit:
    323			return TMP51X_BUS_VOLTAGE_H_LIMIT;
    324		}
    325		break;
    326	case hwmon_curr:
    327		switch (attr) {
    328		case hwmon_curr_input:
    329			return TMP51X_CURR_INPUT[channel];
    330		case hwmon_curr_lcrit_alarm:
    331		case hwmon_curr_crit_alarm:
    332			return TMP51X_STATUS;
    333		case hwmon_curr_lcrit:
    334			return TMP51X_SHUNT_CURRENT_L_LIMIT;
    335		case hwmon_curr_crit:
    336			return TMP51X_SHUNT_CURRENT_H_LIMIT;
    337		}
    338		break;
    339	case hwmon_power:
    340		switch (attr) {
    341		case hwmon_power_input:
    342			return TMP51X_POWER_RESULT;
    343		case hwmon_power_crit_alarm:
    344			return TMP51X_STATUS;
    345		case hwmon_power_crit:
    346			return TMP51X_POWER_LIMIT;
    347		}
    348		break;
    349	default:
    350		break;
    351	}
    352
    353	return 0;
    354}
    355
    356static u8 tmp51x_get_status_pos(enum hwmon_sensor_types type, u32 attr,
    357				int channel)
    358{
    359	switch (type) {
    360	case hwmon_temp:
    361		switch (attr) {
    362		case hwmon_temp_crit_alarm:
    363			return TMP51X_TEMP_CRIT_ALARM[channel];
    364		}
    365		break;
    366	case hwmon_in:
    367		switch (attr) {
    368		case hwmon_in_lcrit_alarm:
    369			return TMP51X_BUS_VOLTAGE_L_LIMIT_POS;
    370		case hwmon_in_crit_alarm:
    371			return TMP51X_BUS_VOLTAGE_H_LIMIT_POS;
    372		}
    373		break;
    374	case hwmon_curr:
    375		switch (attr) {
    376		case hwmon_curr_lcrit_alarm:
    377			return TMP51X_SHUNT_CURRENT_L_LIMIT_POS;
    378		case hwmon_curr_crit_alarm:
    379			return TMP51X_SHUNT_CURRENT_H_LIMIT_POS;
    380		}
    381		break;
    382	case hwmon_power:
    383		switch (attr) {
    384		case hwmon_power_crit_alarm:
    385			return TMP51X_POWER_LIMIT_POS;
    386		}
    387		break;
    388	default:
    389		break;
    390	}
    391
    392	return 0;
    393}
    394
    395static int tmp51x_read(struct device *dev, enum hwmon_sensor_types type,
    396		       u32 attr, int channel, long *val)
    397{
    398	struct tmp51x_data *data = dev_get_drvdata(dev);
    399	int ret;
    400	u32 regval;
    401	u8 pos = 0, reg = 0;
    402
    403	reg = tmp51x_get_reg(type, attr, channel);
    404	if (reg == 0)
    405		return -EOPNOTSUPP;
    406
    407	if (reg == TMP51X_STATUS)
    408		pos = tmp51x_get_status_pos(type, attr, channel);
    409
    410	ret = regmap_read(data->regmap, reg, &regval);
    411	if (ret < 0)
    412		return ret;
    413
    414	return tmp51x_get_value(data, reg, pos, regval, val);
    415}
    416
    417static int tmp51x_write(struct device *dev, enum hwmon_sensor_types type,
    418			u32 attr, int channel, long val)
    419{
    420	u8 reg = 0;
    421
    422	reg = tmp51x_get_reg(type, attr, channel);
    423	if (reg == 0)
    424		return -EOPNOTSUPP;
    425
    426	return tmp51x_set_value(dev_get_drvdata(dev), reg, val);
    427}
    428
    429static umode_t tmp51x_is_visible(const void *_data,
    430				 enum hwmon_sensor_types type, u32 attr,
    431				 int channel)
    432{
    433	const struct tmp51x_data *data = _data;
    434
    435	switch (type) {
    436	case hwmon_temp:
    437		if (data->id == tmp512 && channel == 4)
    438			return 0;
    439		switch (attr) {
    440		case hwmon_temp_input:
    441		case hwmon_temp_crit_alarm:
    442			return 0444;
    443		case hwmon_temp_crit:
    444			return 0644;
    445		case hwmon_temp_crit_hyst:
    446			if (channel == 0)
    447				return 0644;
    448			return 0444;
    449		}
    450		break;
    451	case hwmon_in:
    452		switch (attr) {
    453		case hwmon_in_input:
    454		case hwmon_in_lcrit_alarm:
    455		case hwmon_in_crit_alarm:
    456			return 0444;
    457		case hwmon_in_lcrit:
    458		case hwmon_in_crit:
    459			return 0644;
    460		}
    461		break;
    462	case hwmon_curr:
    463		if (!data->shunt_uohms)
    464			return 0;
    465
    466		switch (attr) {
    467		case hwmon_curr_input:
    468		case hwmon_curr_lcrit_alarm:
    469		case hwmon_curr_crit_alarm:
    470			return 0444;
    471		case hwmon_curr_lcrit:
    472		case hwmon_curr_crit:
    473			return 0644;
    474		}
    475		break;
    476	case hwmon_power:
    477		if (!data->shunt_uohms)
    478			return 0;
    479
    480		switch (attr) {
    481		case hwmon_power_input:
    482		case hwmon_power_crit_alarm:
    483			return 0444;
    484		case hwmon_power_crit:
    485			return 0644;
    486		}
    487		break;
    488	default:
    489		break;
    490	}
    491	return 0;
    492}
    493
    494static const struct hwmon_channel_info *tmp51x_info[] = {
    495	HWMON_CHANNEL_INFO(temp,
    496			   HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
    497			   HWMON_T_CRIT_HYST,
    498			   HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
    499			   HWMON_T_CRIT_HYST,
    500			   HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
    501			   HWMON_T_CRIT_HYST,
    502			   HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_ALARM |
    503			   HWMON_T_CRIT_HYST),
    504	HWMON_CHANNEL_INFO(in,
    505			   HWMON_I_INPUT | HWMON_I_LCRIT | HWMON_I_LCRIT_ALARM |
    506			   HWMON_I_CRIT | HWMON_I_CRIT_ALARM),
    507	HWMON_CHANNEL_INFO(curr,
    508			   HWMON_C_INPUT | HWMON_C_LCRIT | HWMON_C_LCRIT_ALARM |
    509			   HWMON_C_CRIT | HWMON_C_CRIT_ALARM,
    510			   HWMON_C_INPUT),
    511	HWMON_CHANNEL_INFO(power,
    512			   HWMON_P_INPUT | HWMON_P_CRIT | HWMON_P_CRIT_ALARM),
    513	NULL
    514};
    515
    516static const struct hwmon_ops tmp51x_hwmon_ops = {
    517	.is_visible = tmp51x_is_visible,
    518	.read = tmp51x_read,
    519	.write = tmp51x_write,
    520};
    521
    522static const struct hwmon_chip_info tmp51x_chip_info = {
    523	.ops = &tmp51x_hwmon_ops,
    524	.info = tmp51x_info,
    525};
    526
    527/*
    528 * Calibrate the tmp51x following the datasheet method
    529 */
    530static int tmp51x_calibrate(struct tmp51x_data *data)
    531{
    532	int vshunt_max = data->pga_gain * 40;
    533	u64 max_curr_ma;
    534	u32 div;
    535
    536	/*
    537	 * If shunt_uohms is equal to 0, the calibration should be set to 0.
    538	 * The consequence will be that the current and power measurement engine
    539	 * of the sensor will not work. Temperature and voltage sensing will
    540	 * continue to work.
    541	 */
    542	if (data->shunt_uohms == 0)
    543		return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, 0);
    544
    545	max_curr_ma = DIV_ROUND_CLOSEST_ULL(vshunt_max * 1000 * 1000,
    546					    data->shunt_uohms);
    547
    548	/*
    549	 * Calculate the minimal bit resolution for the current and the power.
    550	 * Those values will be used during register interpretation.
    551	 */
    552	data->curr_lsb_ua = DIV_ROUND_CLOSEST_ULL(max_curr_ma * 1000, 32767);
    553	data->pwr_lsb_uw = 20 * data->curr_lsb_ua;
    554
    555	div = DIV_ROUND_CLOSEST_ULL(data->curr_lsb_ua * data->shunt_uohms,
    556				    1000 * 1000);
    557
    558	return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION,
    559			    DIV_ROUND_CLOSEST(40960, div));
    560}
    561
    562/*
    563 * Initialize the configuration and calibration registers.
    564 */
    565static int tmp51x_init(struct tmp51x_data *data)
    566{
    567	unsigned int regval;
    568	int ret = regmap_write(data->regmap, TMP51X_SHUNT_CONFIG,
    569			       data->shunt_config);
    570	if (ret < 0)
    571		return ret;
    572
    573	ret = regmap_write(data->regmap, TMP51X_TEMP_CONFIG, data->temp_config);
    574	if (ret < 0)
    575		return ret;
    576
    577	// nFactor configuration
    578	ret = regmap_update_bits(data->regmap, TMP51X_N_FACTOR_AND_HYST_1,
    579				 TMP51X_NFACTOR_MASK, data->nfactor[0] << 8);
    580	if (ret < 0)
    581		return ret;
    582
    583	ret = regmap_write(data->regmap, TMP51X_N_FACTOR_2,
    584			   data->nfactor[1] << 8);
    585	if (ret < 0)
    586		return ret;
    587
    588	if (data->id == tmp513) {
    589		ret = regmap_write(data->regmap, TMP513_N_FACTOR_3,
    590				   data->nfactor[2] << 8);
    591		if (ret < 0)
    592			return ret;
    593	}
    594
    595	ret = tmp51x_calibrate(data);
    596	if (ret < 0)
    597		return ret;
    598
    599	// Read the status register before using as the datasheet propose
    600	return regmap_read(data->regmap, TMP51X_STATUS, &regval);
    601}
    602
    603static const struct i2c_device_id tmp51x_id[] = {
    604	{ "tmp512", tmp512 },
    605	{ "tmp513", tmp513 },
    606	{ }
    607};
    608MODULE_DEVICE_TABLE(i2c, tmp51x_id);
    609
    610static const struct of_device_id tmp51x_of_match[] = {
    611	{
    612		.compatible = "ti,tmp512",
    613		.data = (void *)tmp512
    614	},
    615	{
    616		.compatible = "ti,tmp513",
    617		.data = (void *)tmp513
    618	},
    619	{ },
    620};
    621MODULE_DEVICE_TABLE(of, tmp51x_of_match);
    622
    623static int tmp51x_vbus_range_to_reg(struct device *dev,
    624				    struct tmp51x_data *data)
    625{
    626	if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) {
    627		data->shunt_config |= TMP51X_BUS_VOLTAGE_MASK;
    628	} else if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_16V) {
    629		data->shunt_config &= ~TMP51X_BUS_VOLTAGE_MASK;
    630	} else {
    631		dev_err(dev, "ti,bus-range-microvolt is invalid: %u\n",
    632			data->vbus_range_uvolt);
    633		return -EINVAL;
    634	}
    635	return 0;
    636}
    637
    638static int tmp51x_pga_gain_to_reg(struct device *dev, struct tmp51x_data *data)
    639{
    640	if (data->pga_gain == 8) {
    641		data->shunt_config |= CURRENT_SENSE_VOLTAGE_320_MASK;
    642	} else if (data->pga_gain == 4) {
    643		data->shunt_config |= CURRENT_SENSE_VOLTAGE_160_MASK;
    644	} else if (data->pga_gain == 2) {
    645		data->shunt_config |= CURRENT_SENSE_VOLTAGE_80_MASK;
    646	} else if (data->pga_gain == 1) {
    647		data->shunt_config |= CURRENT_SENSE_VOLTAGE_40_MASK;
    648	} else {
    649		dev_err(dev, "ti,pga-gain is invalid: %u\n", data->pga_gain);
    650		return -EINVAL;
    651	}
    652	return 0;
    653}
    654
    655static int tmp51x_read_properties(struct device *dev, struct tmp51x_data *data)
    656{
    657	int ret;
    658	u32 nfactor[3];
    659	u32 val;
    660
    661	ret = device_property_read_u32(dev, "shunt-resistor-micro-ohms", &val);
    662	data->shunt_uohms = (ret >= 0) ? val : TMP51X_SHUNT_VALUE_DEFAULT;
    663
    664	ret = device_property_read_u32(dev, "ti,bus-range-microvolt", &val);
    665	data->vbus_range_uvolt = (ret >= 0) ? val : TMP51X_VBUS_RANGE_DEFAULT;
    666	ret = tmp51x_vbus_range_to_reg(dev, data);
    667	if (ret < 0)
    668		return ret;
    669
    670	ret = device_property_read_u32(dev, "ti,pga-gain", &val);
    671	data->pga_gain = (ret >= 0) ? val : TMP51X_PGA_DEFAULT;
    672	ret = tmp51x_pga_gain_to_reg(dev, data);
    673	if (ret < 0)
    674		return ret;
    675
    676	ret = device_property_read_u32_array(dev, "ti,nfactor", nfactor,
    677					    (data->id == tmp513) ? 3 : 2);
    678	if (ret >= 0)
    679		memcpy(data->nfactor, nfactor, (data->id == tmp513) ? 3 : 2);
    680
    681	// Check if shunt value is compatible with pga-gain
    682	if (data->shunt_uohms > data->pga_gain * 40 * 1000 * 1000) {
    683		dev_err(dev, "shunt-resistor: %u too big for pga_gain: %u\n",
    684			data->shunt_uohms, data->pga_gain);
    685		return -EINVAL;
    686	}
    687
    688	return 0;
    689}
    690
    691static void tmp51x_use_default(struct tmp51x_data *data)
    692{
    693	data->vbus_range_uvolt = TMP51X_VBUS_RANGE_DEFAULT;
    694	data->pga_gain = TMP51X_PGA_DEFAULT;
    695	data->shunt_uohms = TMP51X_SHUNT_VALUE_DEFAULT;
    696}
    697
    698static int tmp51x_configure(struct device *dev, struct tmp51x_data *data)
    699{
    700	data->shunt_config = TMP51X_SHUNT_CONFIG_DEFAULT;
    701	data->temp_config = (data->id == tmp513) ?
    702			TMP513_TEMP_CONFIG_DEFAULT : TMP512_TEMP_CONFIG_DEFAULT;
    703
    704	if (dev->of_node)
    705		return tmp51x_read_properties(dev, data);
    706
    707	tmp51x_use_default(data);
    708
    709	return 0;
    710}
    711
    712static int tmp51x_probe(struct i2c_client *client)
    713{
    714	struct device *dev = &client->dev;
    715	struct tmp51x_data *data;
    716	struct device *hwmon_dev;
    717	int ret;
    718
    719	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
    720	if (!data)
    721		return -ENOMEM;
    722
    723	if (client->dev.of_node)
    724		data->id = (enum tmp51x_ids)device_get_match_data(&client->dev);
    725	else
    726		data->id = i2c_match_id(tmp51x_id, client)->driver_data;
    727
    728	ret = tmp51x_configure(dev, data);
    729	if (ret < 0) {
    730		dev_err(dev, "error configuring the device: %d\n", ret);
    731		return ret;
    732	}
    733
    734	data->regmap = devm_regmap_init_i2c(client, &tmp51x_regmap_config);
    735	if (IS_ERR(data->regmap)) {
    736		dev_err(dev, "failed to allocate register map\n");
    737		return PTR_ERR(data->regmap);
    738	}
    739
    740	ret = tmp51x_init(data);
    741	if (ret < 0) {
    742		dev_err(dev, "error configuring the device: %d\n", ret);
    743		return -ENODEV;
    744	}
    745
    746	hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
    747							 data,
    748							 &tmp51x_chip_info,
    749							 NULL);
    750	if (IS_ERR(hwmon_dev))
    751		return PTR_ERR(hwmon_dev);
    752
    753	dev_dbg(dev, "power monitor %s\n", client->name);
    754
    755	return 0;
    756}
    757
    758static struct i2c_driver tmp51x_driver = {
    759	.driver = {
    760		.name	= "tmp51x",
    761		.of_match_table = of_match_ptr(tmp51x_of_match),
    762	},
    763	.probe_new	= tmp51x_probe,
    764	.id_table	= tmp51x_id,
    765};
    766
    767module_i2c_driver(tmp51x_driver);
    768
    769MODULE_AUTHOR("Eric Tremblay <etremblay@distechcontrols.com>");
    770MODULE_DESCRIPTION("tmp51x driver");
    771MODULE_LICENSE("GPL");