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

ltc2947-core.c (30504B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Analog Devices LTC2947 high precision power and energy monitor
      4 *
      5 * Copyright 2019 Analog Devices Inc.
      6 */
      7#include <linux/bitfield.h>
      8#include <linux/bits.h>
      9#include <linux/clk.h>
     10#include <linux/device.h>
     11#include <linux/hwmon.h>
     12#include <linux/hwmon-sysfs.h>
     13#include <linux/module.h>
     14#include <linux/of.h>
     15#include <linux/regmap.h>
     16
     17#include "ltc2947.h"
     18
     19/* register's */
     20#define LTC2947_REG_PAGE_CTRL		0xFF
     21#define LTC2947_REG_CTRL		0xF0
     22#define LTC2947_REG_TBCTL		0xE9
     23#define LTC2947_CONT_MODE_MASK		BIT(3)
     24#define LTC2947_CONT_MODE(x)		FIELD_PREP(LTC2947_CONT_MODE_MASK, x)
     25#define LTC2947_PRE_MASK		GENMASK(2, 0)
     26#define LTC2947_PRE(x)			FIELD_PREP(LTC2947_PRE_MASK, x)
     27#define LTC2947_DIV_MASK		GENMASK(7, 3)
     28#define LTC2947_DIV(x)			FIELD_PREP(LTC2947_DIV_MASK, x)
     29#define LTC2947_SHUTDOWN_MASK		BIT(0)
     30#define LTC2947_REG_ACCUM_POL		0xE1
     31#define LTC2947_ACCUM_POL_1_MASK	GENMASK(1, 0)
     32#define LTC2947_ACCUM_POL_1(x)		FIELD_PREP(LTC2947_ACCUM_POL_1_MASK, x)
     33#define LTC2947_ACCUM_POL_2_MASK	GENMASK(3, 2)
     34#define LTC2947_ACCUM_POL_2(x)		FIELD_PREP(LTC2947_ACCUM_POL_2_MASK, x)
     35#define LTC2947_REG_ACCUM_DEADBAND	0xE4
     36#define LTC2947_REG_GPIOSTATCTL		0x67
     37#define LTC2947_GPIO_EN_MASK		BIT(0)
     38#define LTC2947_GPIO_EN(x)		FIELD_PREP(LTC2947_GPIO_EN_MASK, x)
     39#define LTC2947_GPIO_FAN_EN_MASK	BIT(6)
     40#define LTC2947_GPIO_FAN_EN(x)		FIELD_PREP(LTC2947_GPIO_FAN_EN_MASK, x)
     41#define LTC2947_GPIO_FAN_POL_MASK	BIT(7)
     42#define LTC2947_GPIO_FAN_POL(x)		FIELD_PREP(LTC2947_GPIO_FAN_POL_MASK, x)
     43#define LTC2947_REG_GPIO_ACCUM		0xE3
     44/* 200Khz */
     45#define LTC2947_CLK_MIN			200000
     46/* 25Mhz */
     47#define LTC2947_CLK_MAX			25000000
     48#define LTC2947_PAGE0			0
     49#define LTC2947_PAGE1			1
     50/* Voltage registers */
     51#define LTC2947_REG_VOLTAGE		0xA0
     52#define LTC2947_REG_VOLTAGE_MAX		0x50
     53#define LTC2947_REG_VOLTAGE_MIN		0x52
     54#define LTC2947_REG_VOLTAGE_THRE_H	0x90
     55#define LTC2947_REG_VOLTAGE_THRE_L	0x92
     56#define LTC2947_REG_DVCC		0xA4
     57#define LTC2947_REG_DVCC_MAX		0x58
     58#define LTC2947_REG_DVCC_MIN		0x5A
     59#define LTC2947_REG_DVCC_THRE_H		0x98
     60#define LTC2947_REG_DVCC_THRE_L		0x9A
     61#define LTC2947_VOLTAGE_GEN_CHAN	0
     62#define LTC2947_VOLTAGE_DVCC_CHAN	1
     63/* in mV */
     64#define VOLTAGE_MAX			15500
     65#define VOLTAGE_MIN			-300
     66#define VDVCC_MAX			15000
     67#define VDVCC_MIN			4750
     68/* Current registers */
     69#define LTC2947_REG_CURRENT		0x90
     70#define LTC2947_REG_CURRENT_MAX		0x40
     71#define LTC2947_REG_CURRENT_MIN		0x42
     72#define LTC2947_REG_CURRENT_THRE_H	0x80
     73#define LTC2947_REG_CURRENT_THRE_L	0x82
     74/* in mA */
     75#define CURRENT_MAX			30000
     76#define CURRENT_MIN			-30000
     77/* Power registers */
     78#define LTC2947_REG_POWER		0x93
     79#define LTC2947_REG_POWER_MAX		0x44
     80#define LTC2947_REG_POWER_MIN		0x46
     81#define LTC2947_REG_POWER_THRE_H	0x84
     82#define LTC2947_REG_POWER_THRE_L	0x86
     83/* in uW */
     84#define POWER_MAX			450000000
     85#define POWER_MIN			-450000000
     86/* Temperature registers */
     87#define LTC2947_REG_TEMP		0xA2
     88#define LTC2947_REG_TEMP_MAX		0x54
     89#define LTC2947_REG_TEMP_MIN		0x56
     90#define LTC2947_REG_TEMP_THRE_H		0x94
     91#define LTC2947_REG_TEMP_THRE_L		0x96
     92#define LTC2947_REG_TEMP_FAN_THRE_H	0x9C
     93#define LTC2947_REG_TEMP_FAN_THRE_L	0x9E
     94#define LTC2947_TEMP_FAN_CHAN		1
     95/* in millidegress Celsius */
     96#define TEMP_MAX			85000
     97#define TEMP_MIN			-40000
     98/* Energy registers */
     99#define LTC2947_REG_ENERGY1		0x06
    100#define LTC2947_REG_ENERGY2		0x16
    101/* Status/Alarm/Overflow registers */
    102#define LTC2947_REG_STATUS		0x80
    103#define LTC2947_REG_STATVT		0x81
    104#define LTC2947_REG_STATIP		0x82
    105#define LTC2947_REG_STATVDVCC		0x87
    106
    107#define LTC2947_ALERTS_SIZE	(LTC2947_REG_STATVDVCC - LTC2947_REG_STATUS)
    108#define LTC2947_MAX_VOLTAGE_MASK	BIT(0)
    109#define LTC2947_MIN_VOLTAGE_MASK	BIT(1)
    110#define LTC2947_MAX_CURRENT_MASK	BIT(0)
    111#define LTC2947_MIN_CURRENT_MASK	BIT(1)
    112#define LTC2947_MAX_POWER_MASK		BIT(2)
    113#define LTC2947_MIN_POWER_MASK		BIT(3)
    114#define LTC2947_MAX_TEMP_MASK		BIT(2)
    115#define LTC2947_MIN_TEMP_MASK		BIT(3)
    116#define LTC2947_MAX_TEMP_FAN_MASK	BIT(4)
    117#define LTC2947_MIN_TEMP_FAN_MASK	BIT(5)
    118
    119struct ltc2947_data {
    120	struct regmap *map;
    121	struct device *dev;
    122	/*
    123	 * The mutex is needed because the device has 2 memory pages. When
    124	 * reading/writing the correct page needs to be set so that, the
    125	 * complete sequence select_page->read/write needs to be protected.
    126	 */
    127	struct mutex lock;
    128	u32 lsb_energy;
    129	bool gpio_out;
    130};
    131
    132static int __ltc2947_val_read16(const struct ltc2947_data *st, const u8 reg,
    133				u64 *val)
    134{
    135	__be16 __val = 0;
    136	int ret;
    137
    138	ret = regmap_bulk_read(st->map, reg, &__val, 2);
    139	if (ret)
    140		return ret;
    141
    142	*val = be16_to_cpu(__val);
    143
    144	return 0;
    145}
    146
    147static int __ltc2947_val_read24(const struct ltc2947_data *st, const u8 reg,
    148				u64 *val)
    149{
    150	__be32 __val = 0;
    151	int ret;
    152
    153	ret = regmap_bulk_read(st->map, reg, &__val, 3);
    154	if (ret)
    155		return ret;
    156
    157	*val = be32_to_cpu(__val) >> 8;
    158
    159	return 0;
    160}
    161
    162static int __ltc2947_val_read64(const struct ltc2947_data *st, const u8 reg,
    163				u64 *val)
    164{
    165	__be64 __val = 0;
    166	int ret;
    167
    168	ret = regmap_bulk_read(st->map, reg, &__val, 6);
    169	if (ret)
    170		return ret;
    171
    172	*val = be64_to_cpu(__val) >> 16;
    173
    174	return 0;
    175}
    176
    177static int ltc2947_val_read(struct ltc2947_data *st, const u8 reg,
    178			    const u8 page, const size_t size, s64 *val)
    179{
    180	int ret;
    181	u64 __val = 0;
    182
    183	mutex_lock(&st->lock);
    184
    185	ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
    186	if (ret) {
    187		mutex_unlock(&st->lock);
    188		return ret;
    189	}
    190
    191	dev_dbg(st->dev, "Read val, reg:%02X, p:%d sz:%zu\n", reg, page,
    192		size);
    193
    194	switch (size) {
    195	case 2:
    196		ret = __ltc2947_val_read16(st, reg, &__val);
    197		break;
    198	case 3:
    199		ret = __ltc2947_val_read24(st, reg, &__val);
    200		break;
    201	case 6:
    202		ret = __ltc2947_val_read64(st, reg, &__val);
    203		break;
    204	default:
    205		ret = -EINVAL;
    206		break;
    207	}
    208
    209	mutex_unlock(&st->lock);
    210
    211	if (ret)
    212		return ret;
    213
    214	*val = sign_extend64(__val, (8 * size) - 1);
    215
    216	dev_dbg(st->dev, "Got s:%lld, u:%016llX\n", *val, __val);
    217
    218	return 0;
    219}
    220
    221static int __ltc2947_val_write64(const struct ltc2947_data *st, const u8 reg,
    222				 const u64 val)
    223{
    224	__be64 __val;
    225
    226	__val = cpu_to_be64(val << 16);
    227	return regmap_bulk_write(st->map, reg, &__val, 6);
    228}
    229
    230static int __ltc2947_val_write16(const struct ltc2947_data *st, const u8 reg,
    231				 const u16 val)
    232{
    233	__be16 __val;
    234
    235	__val = cpu_to_be16(val);
    236	return regmap_bulk_write(st->map, reg, &__val, 2);
    237}
    238
    239static int ltc2947_val_write(struct ltc2947_data *st, const u8 reg,
    240			     const u8 page, const size_t size, const u64 val)
    241{
    242	int ret;
    243
    244	mutex_lock(&st->lock);
    245	/* set device on correct page */
    246	ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, page);
    247	if (ret) {
    248		mutex_unlock(&st->lock);
    249		return ret;
    250	}
    251
    252	dev_dbg(st->dev, "Write val, r:%02X, p:%d, sz:%zu, val:%016llX\n",
    253		reg, page, size, val);
    254
    255	switch (size) {
    256	case 2:
    257		ret = __ltc2947_val_write16(st, reg, val);
    258		break;
    259	case 6:
    260		ret = __ltc2947_val_write64(st, reg, val);
    261		break;
    262	default:
    263		ret = -EINVAL;
    264		break;
    265	}
    266
    267	mutex_unlock(&st->lock);
    268
    269	return ret;
    270}
    271
    272static int ltc2947_reset_history(struct ltc2947_data *st, const u8 reg_h,
    273				 const u8 reg_l)
    274{
    275	int ret;
    276	/*
    277	 * let's reset the tracking register's. Tracking register's have all
    278	 * 2 bytes size
    279	 */
    280	ret = ltc2947_val_write(st, reg_h, LTC2947_PAGE0, 2, 0x8000U);
    281	if (ret)
    282		return ret;
    283
    284	return ltc2947_val_write(st, reg_l, LTC2947_PAGE0, 2, 0x7FFFU);
    285}
    286
    287static int ltc2947_alarm_read(struct ltc2947_data *st, const u8 reg,
    288			      const u32 mask, long *val)
    289{
    290	u8 offset = reg - LTC2947_REG_STATUS;
    291	/* +1 to include status reg */
    292	char alarms[LTC2947_ALERTS_SIZE + 1];
    293	int ret = 0;
    294
    295	memset(alarms, 0, sizeof(alarms));
    296
    297	mutex_lock(&st->lock);
    298
    299	ret = regmap_write(st->map, LTC2947_REG_PAGE_CTRL, LTC2947_PAGE0);
    300	if (ret)
    301		goto unlock;
    302
    303	dev_dbg(st->dev, "Read alarm, reg:%02X, mask:%02X\n", reg, mask);
    304	/*
    305	 * As stated in the datasheet, when Threshold and Overflow registers
    306	 * are used, the status and all alert registers must be read in one
    307	 * multi-byte transaction.
    308	 */
    309	ret = regmap_bulk_read(st->map, LTC2947_REG_STATUS, alarms,
    310			       sizeof(alarms));
    311	if (ret)
    312		goto unlock;
    313
    314	/* get the alarm */
    315	*val = !!(alarms[offset] & mask);
    316unlock:
    317	mutex_unlock(&st->lock);
    318	return ret;
    319}
    320
    321static ssize_t ltc2947_show_value(struct device *dev,
    322				  struct device_attribute *da, char *buf)
    323{
    324	struct ltc2947_data *st = dev_get_drvdata(dev);
    325	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
    326	int ret;
    327	s64 val = 0;
    328
    329	ret = ltc2947_val_read(st, attr->index, LTC2947_PAGE0, 6, &val);
    330	if (ret)
    331		return ret;
    332
    333	/* value in microJoule. st->lsb_energy was multiplied by 10E9 */
    334	val = div_s64(val * st->lsb_energy, 1000);
    335
    336	return sprintf(buf, "%lld\n", val);
    337}
    338
    339static int ltc2947_read_temp(struct device *dev, const u32 attr, long *val,
    340			     const int channel)
    341{
    342	int ret;
    343	struct ltc2947_data *st = dev_get_drvdata(dev);
    344	s64 __val = 0;
    345
    346	switch (attr) {
    347	case hwmon_temp_input:
    348		ret = ltc2947_val_read(st, LTC2947_REG_TEMP, LTC2947_PAGE0,
    349				       2, &__val);
    350		break;
    351	case hwmon_temp_highest:
    352		ret = ltc2947_val_read(st, LTC2947_REG_TEMP_MAX, LTC2947_PAGE0,
    353				       2, &__val);
    354		break;
    355	case hwmon_temp_lowest:
    356		ret = ltc2947_val_read(st, LTC2947_REG_TEMP_MIN, LTC2947_PAGE0,
    357				       2, &__val);
    358		break;
    359	case hwmon_temp_max_alarm:
    360		if (channel == LTC2947_TEMP_FAN_CHAN)
    361			return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
    362						  LTC2947_MAX_TEMP_FAN_MASK,
    363						  val);
    364
    365		return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
    366					  LTC2947_MAX_TEMP_MASK, val);
    367	case hwmon_temp_min_alarm:
    368		if (channel == LTC2947_TEMP_FAN_CHAN)
    369			return	ltc2947_alarm_read(st, LTC2947_REG_STATVT,
    370						   LTC2947_MIN_TEMP_FAN_MASK,
    371						   val);
    372
    373		return	ltc2947_alarm_read(st, LTC2947_REG_STATVT,
    374					   LTC2947_MIN_TEMP_MASK, val);
    375	case hwmon_temp_max:
    376		if (channel == LTC2947_TEMP_FAN_CHAN)
    377			ret = ltc2947_val_read(st, LTC2947_REG_TEMP_FAN_THRE_H,
    378					       LTC2947_PAGE1, 2, &__val);
    379		else
    380			ret = ltc2947_val_read(st, LTC2947_REG_TEMP_THRE_H,
    381					       LTC2947_PAGE1, 2, &__val);
    382		break;
    383	case hwmon_temp_min:
    384		if (channel == LTC2947_TEMP_FAN_CHAN)
    385			ret = ltc2947_val_read(st, LTC2947_REG_TEMP_FAN_THRE_L,
    386					       LTC2947_PAGE1, 2, &__val);
    387		else
    388			ret = ltc2947_val_read(st, LTC2947_REG_TEMP_THRE_L,
    389					       LTC2947_PAGE1, 2, &__val);
    390		break;
    391	default:
    392		return -ENOTSUPP;
    393	}
    394
    395	if (ret)
    396		return ret;
    397
    398	/* in milidegrees celcius, temp is given by: */
    399	*val = (__val * 204) + 550;
    400
    401	return 0;
    402}
    403
    404static int ltc2947_read_power(struct device *dev, const u32 attr, long *val)
    405{
    406	struct ltc2947_data *st = dev_get_drvdata(dev);
    407	int ret;
    408	u32 lsb = 200000; /* in uW */
    409	s64 __val = 0;
    410
    411	switch (attr) {
    412	case hwmon_power_input:
    413		ret = ltc2947_val_read(st, LTC2947_REG_POWER, LTC2947_PAGE0,
    414				       3, &__val);
    415		lsb = 50000;
    416		break;
    417	case hwmon_power_input_highest:
    418		ret = ltc2947_val_read(st, LTC2947_REG_POWER_MAX, LTC2947_PAGE0,
    419				       2, &__val);
    420		break;
    421	case hwmon_power_input_lowest:
    422		ret = ltc2947_val_read(st, LTC2947_REG_POWER_MIN, LTC2947_PAGE0,
    423				       2, &__val);
    424		break;
    425	case hwmon_power_max_alarm:
    426		return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
    427					  LTC2947_MAX_POWER_MASK, val);
    428	case hwmon_power_min_alarm:
    429		return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
    430					  LTC2947_MIN_POWER_MASK, val);
    431	case hwmon_power_max:
    432		ret = ltc2947_val_read(st, LTC2947_REG_POWER_THRE_H,
    433				       LTC2947_PAGE1, 2, &__val);
    434		break;
    435	case hwmon_power_min:
    436		ret = ltc2947_val_read(st, LTC2947_REG_POWER_THRE_L,
    437				       LTC2947_PAGE1, 2, &__val);
    438		break;
    439	default:
    440		return -ENOTSUPP;
    441	}
    442
    443	if (ret)
    444		return ret;
    445
    446	*val = __val * lsb;
    447
    448	return 0;
    449}
    450
    451static int ltc2947_read_curr(struct device *dev, const u32 attr, long *val)
    452{
    453	struct ltc2947_data *st = dev_get_drvdata(dev);
    454	int ret;
    455	u8 lsb = 12; /* in mA */
    456	s64 __val = 0;
    457
    458	switch (attr) {
    459	case hwmon_curr_input:
    460		ret = ltc2947_val_read(st, LTC2947_REG_CURRENT,
    461				       LTC2947_PAGE0, 3, &__val);
    462		lsb = 3;
    463		break;
    464	case hwmon_curr_highest:
    465		ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_MAX,
    466				       LTC2947_PAGE0, 2, &__val);
    467		break;
    468	case hwmon_curr_lowest:
    469		ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_MIN,
    470				       LTC2947_PAGE0, 2, &__val);
    471		break;
    472	case hwmon_curr_max_alarm:
    473		return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
    474					  LTC2947_MAX_CURRENT_MASK, val);
    475	case hwmon_curr_min_alarm:
    476		return ltc2947_alarm_read(st, LTC2947_REG_STATIP,
    477					  LTC2947_MIN_CURRENT_MASK, val);
    478	case hwmon_curr_max:
    479		ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_THRE_H,
    480				       LTC2947_PAGE1, 2, &__val);
    481		break;
    482	case hwmon_curr_min:
    483		ret = ltc2947_val_read(st, LTC2947_REG_CURRENT_THRE_L,
    484				       LTC2947_PAGE1, 2, &__val);
    485		break;
    486	default:
    487		return -ENOTSUPP;
    488	}
    489
    490	if (ret)
    491		return ret;
    492
    493	*val = __val * lsb;
    494
    495	return 0;
    496}
    497
    498static int ltc2947_read_in(struct device *dev, const u32 attr, long *val,
    499			   const int channel)
    500{
    501	struct ltc2947_data *st = dev_get_drvdata(dev);
    502	int ret;
    503	u8 lsb = 2; /* in mV */
    504	s64 __val = 0;
    505
    506	if (channel < 0 || channel > LTC2947_VOLTAGE_DVCC_CHAN) {
    507		dev_err(st->dev, "Invalid chan%d for voltage", channel);
    508		return -EINVAL;
    509	}
    510
    511	switch (attr) {
    512	case hwmon_in_input:
    513		if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
    514			ret = ltc2947_val_read(st, LTC2947_REG_DVCC,
    515					       LTC2947_PAGE0, 2, &__val);
    516			lsb = 145;
    517		} else {
    518			ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE,
    519					       LTC2947_PAGE0, 2, &__val);
    520		}
    521		break;
    522	case hwmon_in_highest:
    523		if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
    524			ret = ltc2947_val_read(st, LTC2947_REG_DVCC_MAX,
    525					       LTC2947_PAGE0, 2, &__val);
    526			lsb = 145;
    527		} else {
    528			ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_MAX,
    529					       LTC2947_PAGE0, 2, &__val);
    530		}
    531		break;
    532	case hwmon_in_lowest:
    533		if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
    534			ret = ltc2947_val_read(st, LTC2947_REG_DVCC_MIN,
    535					       LTC2947_PAGE0, 2, &__val);
    536			lsb = 145;
    537		} else {
    538			ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_MIN,
    539					       LTC2947_PAGE0, 2, &__val);
    540		}
    541		break;
    542	case hwmon_in_max_alarm:
    543		if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
    544			return ltc2947_alarm_read(st, LTC2947_REG_STATVDVCC,
    545						  LTC2947_MAX_VOLTAGE_MASK,
    546						  val);
    547
    548		return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
    549					  LTC2947_MAX_VOLTAGE_MASK, val);
    550	case hwmon_in_min_alarm:
    551		if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
    552			return ltc2947_alarm_read(st, LTC2947_REG_STATVDVCC,
    553						  LTC2947_MIN_VOLTAGE_MASK,
    554						  val);
    555
    556		return ltc2947_alarm_read(st, LTC2947_REG_STATVT,
    557					  LTC2947_MIN_VOLTAGE_MASK, val);
    558	case hwmon_in_max:
    559		if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
    560			ret = ltc2947_val_read(st, LTC2947_REG_DVCC_THRE_H,
    561					       LTC2947_PAGE1, 2, &__val);
    562			lsb = 145;
    563		} else {
    564			ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_THRE_H,
    565					       LTC2947_PAGE1, 2, &__val);
    566		}
    567		break;
    568	case hwmon_in_min:
    569		if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
    570			ret = ltc2947_val_read(st, LTC2947_REG_DVCC_THRE_L,
    571					       LTC2947_PAGE1, 2, &__val);
    572			lsb = 145;
    573		} else {
    574			ret = ltc2947_val_read(st, LTC2947_REG_VOLTAGE_THRE_L,
    575					       LTC2947_PAGE1, 2, &__val);
    576		}
    577		break;
    578	default:
    579		return -ENOTSUPP;
    580	}
    581
    582	if (ret)
    583		return ret;
    584
    585	*val = __val * lsb;
    586
    587	return 0;
    588}
    589
    590static int ltc2947_read(struct device *dev, enum hwmon_sensor_types type,
    591			u32 attr, int channel, long *val)
    592{
    593	switch (type) {
    594	case hwmon_in:
    595		return ltc2947_read_in(dev, attr, val, channel);
    596	case hwmon_curr:
    597		return ltc2947_read_curr(dev, attr, val);
    598	case hwmon_power:
    599		return ltc2947_read_power(dev, attr, val);
    600	case hwmon_temp:
    601		return ltc2947_read_temp(dev, attr, val, channel);
    602	default:
    603		return -ENOTSUPP;
    604	}
    605}
    606
    607static int ltc2947_write_temp(struct device *dev, const u32 attr,
    608			      long val, const int channel)
    609{
    610	struct ltc2947_data *st = dev_get_drvdata(dev);
    611
    612	if (channel < 0 || channel > LTC2947_TEMP_FAN_CHAN) {
    613		dev_err(st->dev, "Invalid chan%d for temperature", channel);
    614		return -EINVAL;
    615	}
    616
    617	switch (attr) {
    618	case hwmon_temp_reset_history:
    619		if (val != 1)
    620			return -EINVAL;
    621		return ltc2947_reset_history(st, LTC2947_REG_TEMP_MAX,
    622					     LTC2947_REG_TEMP_MIN);
    623	case hwmon_temp_max:
    624		val = clamp_val(val, TEMP_MIN, TEMP_MAX);
    625		if (channel == LTC2947_TEMP_FAN_CHAN) {
    626			if (!st->gpio_out)
    627				return -ENOTSUPP;
    628
    629			return ltc2947_val_write(st,
    630					LTC2947_REG_TEMP_FAN_THRE_H,
    631					LTC2947_PAGE1, 2,
    632					DIV_ROUND_CLOSEST(val - 550, 204));
    633		}
    634
    635		return ltc2947_val_write(st, LTC2947_REG_TEMP_THRE_H,
    636					 LTC2947_PAGE1, 2,
    637					 DIV_ROUND_CLOSEST(val - 550, 204));
    638	case hwmon_temp_min:
    639		val = clamp_val(val, TEMP_MIN, TEMP_MAX);
    640		if (channel == LTC2947_TEMP_FAN_CHAN) {
    641			if (!st->gpio_out)
    642				return -ENOTSUPP;
    643
    644			return ltc2947_val_write(st,
    645					LTC2947_REG_TEMP_FAN_THRE_L,
    646					LTC2947_PAGE1, 2,
    647					DIV_ROUND_CLOSEST(val - 550, 204));
    648		}
    649
    650		return ltc2947_val_write(st, LTC2947_REG_TEMP_THRE_L,
    651					 LTC2947_PAGE1, 2,
    652					 DIV_ROUND_CLOSEST(val - 550, 204));
    653	default:
    654		return -ENOTSUPP;
    655	}
    656}
    657
    658static int ltc2947_write_power(struct device *dev, const u32 attr,
    659			       long val)
    660{
    661	struct ltc2947_data *st = dev_get_drvdata(dev);
    662
    663	switch (attr) {
    664	case hwmon_power_reset_history:
    665		if (val != 1)
    666			return -EINVAL;
    667		return ltc2947_reset_history(st, LTC2947_REG_POWER_MAX,
    668					     LTC2947_REG_POWER_MIN);
    669	case hwmon_power_max:
    670		val = clamp_val(val, POWER_MIN, POWER_MAX);
    671		return ltc2947_val_write(st, LTC2947_REG_POWER_THRE_H,
    672					 LTC2947_PAGE1, 2,
    673					 DIV_ROUND_CLOSEST(val, 200000));
    674	case hwmon_power_min:
    675		val = clamp_val(val, POWER_MIN, POWER_MAX);
    676		return ltc2947_val_write(st, LTC2947_REG_POWER_THRE_L,
    677					 LTC2947_PAGE1, 2,
    678					 DIV_ROUND_CLOSEST(val, 200000));
    679	default:
    680		return -ENOTSUPP;
    681	}
    682}
    683
    684static int ltc2947_write_curr(struct device *dev, const u32 attr,
    685			      long val)
    686{
    687	struct ltc2947_data *st = dev_get_drvdata(dev);
    688
    689	switch (attr) {
    690	case hwmon_curr_reset_history:
    691		if (val != 1)
    692			return -EINVAL;
    693		return ltc2947_reset_history(st, LTC2947_REG_CURRENT_MAX,
    694					     LTC2947_REG_CURRENT_MIN);
    695	case hwmon_curr_max:
    696		val = clamp_val(val, CURRENT_MIN, CURRENT_MAX);
    697		return ltc2947_val_write(st, LTC2947_REG_CURRENT_THRE_H,
    698					 LTC2947_PAGE1, 2,
    699					 DIV_ROUND_CLOSEST(val, 12));
    700	case hwmon_curr_min:
    701		val = clamp_val(val, CURRENT_MIN, CURRENT_MAX);
    702		return ltc2947_val_write(st, LTC2947_REG_CURRENT_THRE_L,
    703					 LTC2947_PAGE1, 2,
    704					 DIV_ROUND_CLOSEST(val, 12));
    705	default:
    706		return -ENOTSUPP;
    707	}
    708}
    709
    710static int ltc2947_write_in(struct device *dev, const u32 attr, long val,
    711			    const int channel)
    712{
    713	struct ltc2947_data *st = dev_get_drvdata(dev);
    714
    715	if (channel > LTC2947_VOLTAGE_DVCC_CHAN) {
    716		dev_err(st->dev, "Invalid chan%d for voltage", channel);
    717		return -EINVAL;
    718	}
    719
    720	switch (attr) {
    721	case hwmon_in_reset_history:
    722		if (val != 1)
    723			return -EINVAL;
    724
    725		if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
    726			return ltc2947_reset_history(st, LTC2947_REG_DVCC_MAX,
    727						     LTC2947_REG_DVCC_MIN);
    728
    729		return ltc2947_reset_history(st, LTC2947_REG_VOLTAGE_MAX,
    730					     LTC2947_REG_VOLTAGE_MIN);
    731	case hwmon_in_max:
    732		if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
    733			val = clamp_val(val, VDVCC_MIN, VDVCC_MAX);
    734			return ltc2947_val_write(st, LTC2947_REG_DVCC_THRE_H,
    735						 LTC2947_PAGE1, 2,
    736						 DIV_ROUND_CLOSEST(val, 145));
    737		}
    738
    739		val = clamp_val(val, VOLTAGE_MIN, VOLTAGE_MAX);
    740		return ltc2947_val_write(st, LTC2947_REG_VOLTAGE_THRE_H,
    741					 LTC2947_PAGE1, 2,
    742					 DIV_ROUND_CLOSEST(val, 2));
    743	case hwmon_in_min:
    744		if (channel == LTC2947_VOLTAGE_DVCC_CHAN) {
    745			val = clamp_val(val, VDVCC_MIN, VDVCC_MAX);
    746			return ltc2947_val_write(st, LTC2947_REG_DVCC_THRE_L,
    747						 LTC2947_PAGE1, 2,
    748						 DIV_ROUND_CLOSEST(val, 145));
    749		}
    750
    751		val = clamp_val(val, VOLTAGE_MIN, VOLTAGE_MAX);
    752		return ltc2947_val_write(st, LTC2947_REG_VOLTAGE_THRE_L,
    753					 LTC2947_PAGE1, 2,
    754					 DIV_ROUND_CLOSEST(val, 2));
    755	default:
    756		return -ENOTSUPP;
    757	}
    758}
    759
    760static int ltc2947_write(struct device *dev,
    761			 enum hwmon_sensor_types type,
    762			 u32 attr, int channel, long val)
    763{
    764	switch (type) {
    765	case hwmon_in:
    766		return ltc2947_write_in(dev, attr, val, channel);
    767	case hwmon_curr:
    768		return ltc2947_write_curr(dev, attr, val);
    769	case hwmon_power:
    770		return ltc2947_write_power(dev, attr, val);
    771	case hwmon_temp:
    772		return ltc2947_write_temp(dev, attr, val, channel);
    773	default:
    774		return -ENOTSUPP;
    775	}
    776}
    777
    778static int ltc2947_read_labels(struct device *dev,
    779			       enum hwmon_sensor_types type,
    780			       u32 attr, int channel, const char **str)
    781{
    782	switch (type) {
    783	case hwmon_in:
    784		if (channel == LTC2947_VOLTAGE_DVCC_CHAN)
    785			*str = "DVCC";
    786		else
    787			*str = "VP-VM";
    788		return 0;
    789	case hwmon_curr:
    790		*str = "IP-IM";
    791		return 0;
    792	case hwmon_temp:
    793		if (channel == LTC2947_TEMP_FAN_CHAN)
    794			*str = "TEMPFAN";
    795		else
    796			*str = "Ambient";
    797		return 0;
    798	case hwmon_power:
    799		*str = "Power";
    800		return 0;
    801	default:
    802		return -ENOTSUPP;
    803	}
    804}
    805
    806static int ltc2947_in_is_visible(const u32 attr)
    807{
    808	switch (attr) {
    809	case hwmon_in_input:
    810	case hwmon_in_highest:
    811	case hwmon_in_lowest:
    812	case hwmon_in_max_alarm:
    813	case hwmon_in_min_alarm:
    814	case hwmon_in_label:
    815		return 0444;
    816	case hwmon_in_reset_history:
    817		return 0200;
    818	case hwmon_in_max:
    819	case hwmon_in_min:
    820		return 0644;
    821	default:
    822		return 0;
    823	}
    824}
    825
    826static int ltc2947_curr_is_visible(const u32 attr)
    827{
    828	switch (attr) {
    829	case hwmon_curr_input:
    830	case hwmon_curr_highest:
    831	case hwmon_curr_lowest:
    832	case hwmon_curr_max_alarm:
    833	case hwmon_curr_min_alarm:
    834	case hwmon_curr_label:
    835		return 0444;
    836	case hwmon_curr_reset_history:
    837		return 0200;
    838	case hwmon_curr_max:
    839	case hwmon_curr_min:
    840		return 0644;
    841	default:
    842		return 0;
    843	}
    844}
    845
    846static int ltc2947_power_is_visible(const u32 attr)
    847{
    848	switch (attr) {
    849	case hwmon_power_input:
    850	case hwmon_power_input_highest:
    851	case hwmon_power_input_lowest:
    852	case hwmon_power_label:
    853	case hwmon_power_max_alarm:
    854	case hwmon_power_min_alarm:
    855		return 0444;
    856	case hwmon_power_reset_history:
    857		return 0200;
    858	case hwmon_power_max:
    859	case hwmon_power_min:
    860		return 0644;
    861	default:
    862		return 0;
    863	}
    864}
    865
    866static int ltc2947_temp_is_visible(const u32 attr)
    867{
    868	switch (attr) {
    869	case hwmon_temp_input:
    870	case hwmon_temp_highest:
    871	case hwmon_temp_lowest:
    872	case hwmon_temp_max_alarm:
    873	case hwmon_temp_min_alarm:
    874	case hwmon_temp_label:
    875		return 0444;
    876	case hwmon_temp_reset_history:
    877		return 0200;
    878	case hwmon_temp_max:
    879	case hwmon_temp_min:
    880		return 0644;
    881	default:
    882		return 0;
    883	}
    884}
    885
    886static umode_t ltc2947_is_visible(const void *data,
    887				  enum hwmon_sensor_types type,
    888				  u32 attr, int channel)
    889{
    890	switch (type) {
    891	case hwmon_in:
    892		return ltc2947_in_is_visible(attr);
    893	case hwmon_curr:
    894		return ltc2947_curr_is_visible(attr);
    895	case hwmon_power:
    896		return ltc2947_power_is_visible(attr);
    897	case hwmon_temp:
    898		return ltc2947_temp_is_visible(attr);
    899	default:
    900		return 0;
    901	}
    902}
    903
    904static const struct hwmon_channel_info *ltc2947_info[] = {
    905	HWMON_CHANNEL_INFO(in,
    906			   HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST |
    907			   HWMON_I_MAX | HWMON_I_MIN | HWMON_I_RESET_HISTORY |
    908			   HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM |
    909			   HWMON_I_LABEL,
    910			   HWMON_I_INPUT | HWMON_I_LOWEST | HWMON_I_HIGHEST |
    911			   HWMON_I_MAX | HWMON_I_MIN | HWMON_I_RESET_HISTORY |
    912			   HWMON_I_MIN_ALARM | HWMON_I_MAX_ALARM |
    913			   HWMON_I_LABEL),
    914	HWMON_CHANNEL_INFO(curr,
    915			   HWMON_C_INPUT | HWMON_C_LOWEST | HWMON_C_HIGHEST |
    916			   HWMON_C_MAX | HWMON_C_MIN | HWMON_C_RESET_HISTORY |
    917			   HWMON_C_MIN_ALARM | HWMON_C_MAX_ALARM |
    918			   HWMON_C_LABEL),
    919	HWMON_CHANNEL_INFO(power,
    920			   HWMON_P_INPUT | HWMON_P_INPUT_LOWEST |
    921			   HWMON_P_INPUT_HIGHEST | HWMON_P_MAX | HWMON_P_MIN |
    922			   HWMON_P_RESET_HISTORY | HWMON_P_MAX_ALARM |
    923			   HWMON_P_MIN_ALARM | HWMON_P_LABEL),
    924	HWMON_CHANNEL_INFO(temp,
    925			   HWMON_T_INPUT | HWMON_T_LOWEST | HWMON_T_HIGHEST |
    926			   HWMON_T_MAX | HWMON_T_MIN | HWMON_T_RESET_HISTORY |
    927			   HWMON_T_MIN_ALARM | HWMON_T_MAX_ALARM |
    928			   HWMON_T_LABEL,
    929			   HWMON_T_MAX_ALARM | HWMON_T_MIN_ALARM | HWMON_T_MAX |
    930			   HWMON_T_MIN | HWMON_T_LABEL),
    931	NULL
    932};
    933
    934static const struct hwmon_ops ltc2947_hwmon_ops = {
    935	.is_visible = ltc2947_is_visible,
    936	.read = ltc2947_read,
    937	.write = ltc2947_write,
    938	.read_string = ltc2947_read_labels,
    939};
    940
    941static const struct hwmon_chip_info ltc2947_chip_info = {
    942	.ops = &ltc2947_hwmon_ops,
    943	.info = ltc2947_info,
    944};
    945
    946/* energy attributes are 6bytes wide so we need u64 */
    947static SENSOR_DEVICE_ATTR(energy1_input, 0444, ltc2947_show_value, NULL,
    948			  LTC2947_REG_ENERGY1);
    949static SENSOR_DEVICE_ATTR(energy2_input, 0444, ltc2947_show_value, NULL,
    950			  LTC2947_REG_ENERGY2);
    951
    952static struct attribute *ltc2947_attrs[] = {
    953	&sensor_dev_attr_energy1_input.dev_attr.attr,
    954	&sensor_dev_attr_energy2_input.dev_attr.attr,
    955	NULL,
    956};
    957ATTRIBUTE_GROUPS(ltc2947);
    958
    959static void ltc2947_clk_disable(void *data)
    960{
    961	struct clk *extclk = data;
    962
    963	clk_disable_unprepare(extclk);
    964}
    965
    966static int ltc2947_setup(struct ltc2947_data *st)
    967{
    968	int ret;
    969	struct clk *extclk;
    970	u32 dummy, deadband, pol;
    971	u32 accum[2];
    972
    973	/* clear status register by reading it */
    974	ret = regmap_read(st->map, LTC2947_REG_STATUS, &dummy);
    975	if (ret)
    976		return ret;
    977	/*
    978	 * Set max/min for power here since the default values x scale
    979	 * would overflow on 32bit arch
    980	 */
    981	ret = ltc2947_val_write(st, LTC2947_REG_POWER_THRE_H, LTC2947_PAGE1, 2,
    982				POWER_MAX / 200000);
    983	if (ret)
    984		return ret;
    985
    986	ret = ltc2947_val_write(st, LTC2947_REG_POWER_THRE_L, LTC2947_PAGE1, 2,
    987				POWER_MIN / 200000);
    988	if (ret)
    989		return ret;
    990
    991	/* check external clock presence */
    992	extclk = devm_clk_get_optional(st->dev, NULL);
    993	if (IS_ERR(extclk))
    994		return dev_err_probe(st->dev, PTR_ERR(extclk),
    995				     "Failed to get external clock\n");
    996
    997	if (extclk) {
    998		unsigned long rate_hz;
    999		u8 pre = 0, div, tbctl;
   1000		u64 aux;
   1001
   1002		/* let's calculate and set the right valus in TBCTL */
   1003		rate_hz = clk_get_rate(extclk);
   1004		if (rate_hz < LTC2947_CLK_MIN || rate_hz > LTC2947_CLK_MAX) {
   1005			dev_err(st->dev, "Invalid rate:%lu for external clock",
   1006				rate_hz);
   1007			return -EINVAL;
   1008		}
   1009
   1010		ret = clk_prepare_enable(extclk);
   1011		if (ret)
   1012			return ret;
   1013
   1014		ret = devm_add_action_or_reset(st->dev, ltc2947_clk_disable,
   1015					       extclk);
   1016		if (ret)
   1017			return ret;
   1018		/* as in table 1 of the datasheet */
   1019		if (rate_hz >= LTC2947_CLK_MIN && rate_hz <= 1000000)
   1020			pre = 0;
   1021		else if (rate_hz > 1000000 && rate_hz <= 2000000)
   1022			pre = 1;
   1023		else if (rate_hz > 2000000 && rate_hz <= 4000000)
   1024			pre = 2;
   1025		else if (rate_hz > 4000000 && rate_hz <= 8000000)
   1026			pre = 3;
   1027		else if (rate_hz > 8000000 && rate_hz <= 16000000)
   1028			pre = 4;
   1029		else if (rate_hz > 16000000 && rate_hz <= LTC2947_CLK_MAX)
   1030			pre = 5;
   1031		/*
   1032		 * Div is given by:
   1033		 *	floor(fref / (2^PRE * 32768))
   1034		 */
   1035		div = rate_hz / ((1 << pre) * 32768);
   1036		tbctl = LTC2947_PRE(pre) | LTC2947_DIV(div);
   1037
   1038		ret = regmap_write(st->map, LTC2947_REG_TBCTL, tbctl);
   1039		if (ret)
   1040			return ret;
   1041		/*
   1042		 * The energy lsb is given by (in W*s):
   1043		 *      06416 * (1/fref) * 2^PRE * (DIV + 1)
   1044		 * The value is multiplied by 10E9
   1045		 */
   1046		aux = (div + 1) * ((1 << pre) * 641600000ULL);
   1047		st->lsb_energy = DIV_ROUND_CLOSEST_ULL(aux, rate_hz);
   1048	} else {
   1049		/* 19.89E-6 * 10E9 */
   1050		st->lsb_energy = 19890;
   1051	}
   1052	ret = of_property_read_u32_array(st->dev->of_node,
   1053					 "adi,accumulator-ctl-pol", accum,
   1054					  ARRAY_SIZE(accum));
   1055	if (!ret) {
   1056		u32 accum_reg = LTC2947_ACCUM_POL_1(accum[0]) |
   1057				LTC2947_ACCUM_POL_2(accum[1]);
   1058
   1059		ret = regmap_write(st->map, LTC2947_REG_ACCUM_POL, accum_reg);
   1060		if (ret)
   1061			return ret;
   1062	}
   1063	ret = of_property_read_u32(st->dev->of_node,
   1064				   "adi,accumulation-deadband-microamp",
   1065				   &deadband);
   1066	if (!ret) {
   1067		/* the LSB is the same as the current, so 3mA */
   1068		ret = regmap_write(st->map, LTC2947_REG_ACCUM_DEADBAND,
   1069				   deadband / (1000 * 3));
   1070		if (ret)
   1071			return ret;
   1072	}
   1073	/* check gpio cfg */
   1074	ret = of_property_read_u32(st->dev->of_node, "adi,gpio-out-pol", &pol);
   1075	if (!ret) {
   1076		/* setup GPIO as output */
   1077		u32 gpio_ctl = LTC2947_GPIO_EN(1) | LTC2947_GPIO_FAN_EN(1) |
   1078			LTC2947_GPIO_FAN_POL(pol);
   1079
   1080		st->gpio_out = true;
   1081		ret = regmap_write(st->map, LTC2947_REG_GPIOSTATCTL, gpio_ctl);
   1082		if (ret)
   1083			return ret;
   1084	}
   1085	ret = of_property_read_u32_array(st->dev->of_node, "adi,gpio-in-accum",
   1086					 accum, ARRAY_SIZE(accum));
   1087	if (!ret) {
   1088		/*
   1089		 * Setup the accum options. The gpioctl is already defined as
   1090		 * input by default.
   1091		 */
   1092		u32 accum_val = LTC2947_ACCUM_POL_1(accum[0]) |
   1093				LTC2947_ACCUM_POL_2(accum[1]);
   1094
   1095		if (st->gpio_out) {
   1096			dev_err(st->dev,
   1097				"Cannot have input gpio config if already configured as output");
   1098			return -EINVAL;
   1099		}
   1100
   1101		ret = regmap_write(st->map, LTC2947_REG_GPIO_ACCUM, accum_val);
   1102		if (ret)
   1103			return ret;
   1104	}
   1105
   1106	/* set continuos mode */
   1107	return regmap_update_bits(st->map, LTC2947_REG_CTRL,
   1108				  LTC2947_CONT_MODE_MASK, LTC2947_CONT_MODE(1));
   1109}
   1110
   1111int ltc2947_core_probe(struct regmap *map, const char *name)
   1112{
   1113	struct ltc2947_data *st;
   1114	struct device *dev = regmap_get_device(map);
   1115	struct device *hwmon;
   1116	int ret;
   1117
   1118	st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL);
   1119	if (!st)
   1120		return -ENOMEM;
   1121
   1122	st->map = map;
   1123	st->dev = dev;
   1124	dev_set_drvdata(dev, st);
   1125	mutex_init(&st->lock);
   1126
   1127	ret = ltc2947_setup(st);
   1128	if (ret)
   1129		return ret;
   1130
   1131	hwmon = devm_hwmon_device_register_with_info(dev, name, st,
   1132						     &ltc2947_chip_info,
   1133						     ltc2947_groups);
   1134	return PTR_ERR_OR_ZERO(hwmon);
   1135}
   1136EXPORT_SYMBOL_GPL(ltc2947_core_probe);
   1137
   1138static int __maybe_unused ltc2947_resume(struct device *dev)
   1139{
   1140	struct ltc2947_data *st = dev_get_drvdata(dev);
   1141	u32 ctrl = 0;
   1142	int ret;
   1143
   1144	/* dummy read to wake the device */
   1145	ret = regmap_read(st->map, LTC2947_REG_CTRL, &ctrl);
   1146	if (ret)
   1147		return ret;
   1148	/*
   1149	 * Wait for the device. It takes 100ms to wake up so, 10ms extra
   1150	 * should be enough.
   1151	 */
   1152	msleep(110);
   1153	ret = regmap_read(st->map, LTC2947_REG_CTRL, &ctrl);
   1154	if (ret)
   1155		return ret;
   1156	/* ctrl should be 0 */
   1157	if (ctrl != 0) {
   1158		dev_err(st->dev, "Device failed to wake up, ctl:%02X\n", ctrl);
   1159		return -ETIMEDOUT;
   1160	}
   1161
   1162	/* set continuous mode */
   1163	return regmap_update_bits(st->map, LTC2947_REG_CTRL,
   1164				  LTC2947_CONT_MODE_MASK, LTC2947_CONT_MODE(1));
   1165}
   1166
   1167static int __maybe_unused ltc2947_suspend(struct device *dev)
   1168{
   1169	struct ltc2947_data *st = dev_get_drvdata(dev);
   1170
   1171	return regmap_update_bits(st->map, LTC2947_REG_CTRL,
   1172				  LTC2947_SHUTDOWN_MASK, 1);
   1173}
   1174
   1175SIMPLE_DEV_PM_OPS(ltc2947_pm_ops, ltc2947_suspend, ltc2947_resume);
   1176EXPORT_SYMBOL_GPL(ltc2947_pm_ops);
   1177
   1178const struct of_device_id ltc2947_of_match[] = {
   1179	{ .compatible = "adi,ltc2947" },
   1180	{}
   1181};
   1182EXPORT_SYMBOL_GPL(ltc2947_of_match);
   1183MODULE_DEVICE_TABLE(of, ltc2947_of_match);
   1184
   1185MODULE_AUTHOR("Nuno Sa <nuno.sa@analog.com>");
   1186MODULE_DESCRIPTION("LTC2947 power and energy monitor core driver");
   1187MODULE_LICENSE("GPL");