1*e2fe950fSVictor Duicu // SPDX-License-Identifier: GPL-2.0+ 2*e2fe950fSVictor Duicu /* 3*e2fe950fSVictor Duicu * HWMON driver for MCP998X/33 and MCP998XD/33D Multichannel Automotive 4*e2fe950fSVictor Duicu * Temperature Monitor Family 5*e2fe950fSVictor Duicu * 6*e2fe950fSVictor Duicu * Copyright (C) 2026 Microchip Technology Inc. and its subsidiaries 7*e2fe950fSVictor Duicu * 8*e2fe950fSVictor Duicu * Author: Victor Duicu <victor.duicu@microchip.com> 9*e2fe950fSVictor Duicu * 10*e2fe950fSVictor Duicu * Datasheet can be found here: 11*e2fe950fSVictor Duicu * https://ww1.microchip.com/downloads/aemDocuments/documents/MSLD/ProductDocuments/DataSheets/MCP998X-Family-Data-Sheet-DS20006827.pdf 12*e2fe950fSVictor Duicu */ 13*e2fe950fSVictor Duicu 14*e2fe950fSVictor Duicu #include <linux/array_size.h> 15*e2fe950fSVictor Duicu #include <linux/bitfield.h> 16*e2fe950fSVictor Duicu #include <linux/bitops.h> 17*e2fe950fSVictor Duicu #include <linux/bits.h> 18*e2fe950fSVictor Duicu #include <linux/byteorder/generic.h> 19*e2fe950fSVictor Duicu #include <linux/delay.h> 20*e2fe950fSVictor Duicu #include <linux/device/devres.h> 21*e2fe950fSVictor Duicu #include <linux/device.h> 22*e2fe950fSVictor Duicu #include <linux/dev_printk.h> 23*e2fe950fSVictor Duicu #include <linux/err.h> 24*e2fe950fSVictor Duicu #include <linux/hwmon.h> 25*e2fe950fSVictor Duicu #include <linux/i2c.h> 26*e2fe950fSVictor Duicu #include <linux/math.h> 27*e2fe950fSVictor Duicu #include <linux/minmax.h> 28*e2fe950fSVictor Duicu #include <linux/property.h> 29*e2fe950fSVictor Duicu #include <linux/regmap.h> 30*e2fe950fSVictor Duicu #include <linux/time64.h> 31*e2fe950fSVictor Duicu #include <linux/util_macros.h> 32*e2fe950fSVictor Duicu 33*e2fe950fSVictor Duicu /* MCP9982 Registers */ 34*e2fe950fSVictor Duicu #define MCP9982_HIGH_BYTE_ADDR(index) (2 * (index)) 35*e2fe950fSVictor Duicu #define MCP9982_ONE_SHOT_ADDR 0x0A 36*e2fe950fSVictor Duicu #define MCP9982_INTERNAL_HIGH_LIMIT_ADDR 0x0B 37*e2fe950fSVictor Duicu #define MCP9982_INTERNAL_LOW_LIMIT_ADDR 0x0C 38*e2fe950fSVictor Duicu #define MCP9982_EXT_HIGH_LIMIT_ADDR(index) (4 * ((index) - 1) + 0x0D) 39*e2fe950fSVictor Duicu #define MCP9982_EXT_LOW_LIMIT_ADDR(index) (4 * ((index) - 1) + 0x0F) 40*e2fe950fSVictor Duicu #define MCP9982_THERM_LIMIT_ADDR(index) ((index) + 0x1D) 41*e2fe950fSVictor Duicu #define MCP9982_CFG_ADDR 0x22 42*e2fe950fSVictor Duicu #define MCP9982_CONV_ADDR 0x24 43*e2fe950fSVictor Duicu #define MCP9982_HYS_ADDR 0x25 44*e2fe950fSVictor Duicu #define MCP9982_CONSEC_ALRT_ADDR 0x26 45*e2fe950fSVictor Duicu #define MCP9982_ALRT_CFG_ADDR 0x27 46*e2fe950fSVictor Duicu #define MCP9982_RUNNING_AVG_ADDR 0x28 47*e2fe950fSVictor Duicu #define MCP9982_HOTTEST_CFG_ADDR 0x29 48*e2fe950fSVictor Duicu #define MCP9982_STATUS_ADDR 0x2A 49*e2fe950fSVictor Duicu #define MCP9982_EXT_FAULT_STATUS_ADDR 0x2B 50*e2fe950fSVictor Duicu #define MCP9982_HIGH_LIMIT_STATUS_ADDR 0x2C 51*e2fe950fSVictor Duicu #define MCP9982_LOW_LIMIT_STATUS_ADDR 0x2D 52*e2fe950fSVictor Duicu #define MCP9982_THERM_LIMIT_STATUS_ADDR 0x2E 53*e2fe950fSVictor Duicu #define MCP9982_HOTTEST_HIGH_BYTE_ADDR 0x2F 54*e2fe950fSVictor Duicu #define MCP9982_HOTTEST_LOW_BYTE_ADDR 0x30 55*e2fe950fSVictor Duicu #define MCP9982_HOTTEST_STATUS_ADDR 0x31 56*e2fe950fSVictor Duicu #define MCP9982_THERM_SHTDWN_CFG_ADDR 0x32 57*e2fe950fSVictor Duicu #define MCP9982_HRDW_THERM_SHTDWN_LIMIT_ADDR 0x33 58*e2fe950fSVictor Duicu #define MCP9982_EXT_BETA_CFG_ADDR(index) ((index) + 0x33) 59*e2fe950fSVictor Duicu #define MCP9982_EXT_IDEAL_ADDR(index) ((index) + 0x35) 60*e2fe950fSVictor Duicu 61*e2fe950fSVictor Duicu /* MCP9982 Bits */ 62*e2fe950fSVictor Duicu #define MCP9982_CFG_MSKAL BIT(7) 63*e2fe950fSVictor Duicu #define MCP9982_CFG_RS BIT(6) 64*e2fe950fSVictor Duicu #define MCP9982_CFG_ATTHM BIT(5) 65*e2fe950fSVictor Duicu #define MCP9982_CFG_RECD12 BIT(4) 66*e2fe950fSVictor Duicu #define MCP9982_CFG_RECD34 BIT(3) 67*e2fe950fSVictor Duicu #define MCP9982_CFG_RANGE BIT(2) 68*e2fe950fSVictor Duicu #define MCP9982_CFG_DA_ENA BIT(1) 69*e2fe950fSVictor Duicu #define MCP9982_CFG_APDD BIT(0) 70*e2fe950fSVictor Duicu 71*e2fe950fSVictor Duicu #define MCP9982_STATUS_BUSY BIT(5) 72*e2fe950fSVictor Duicu 73*e2fe950fSVictor Duicu /* Constants and default values */ 74*e2fe950fSVictor Duicu #define MCP9982_MAX_NUM_CHANNELS 5 75*e2fe950fSVictor Duicu #define MCP9982_BETA_AUTODETECT 16 76*e2fe950fSVictor Duicu #define MCP9982_IDEALITY_DEFAULT 18 77*e2fe950fSVictor Duicu #define MCP9982_OFFSET 64 78*e2fe950fSVictor Duicu #define MCP9982_DEFAULT_CONSEC_ALRT_VAL 112 79*e2fe950fSVictor Duicu #define MCP9982_DEFAULT_HYS_VAL 10 80*e2fe950fSVictor Duicu #define MCP9982_DEFAULT_CONV_VAL 6 81*e2fe950fSVictor Duicu #define MCP9982_WAKE_UP_TIME_US 125000 82*e2fe950fSVictor Duicu #define MCP9982_WAKE_UP_TIME_MAX_US 130000 83*e2fe950fSVictor Duicu #define MCP9982_HIGH_LIMIT_DEFAULT 85000 84*e2fe950fSVictor Duicu #define MCP9982_LOW_LIMIT_DEFAULT 0 85*e2fe950fSVictor Duicu 86*e2fe950fSVictor Duicu static const struct hwmon_channel_info * const mcp9985_info[] = { 87*e2fe950fSVictor Duicu HWMON_CHANNEL_INFO(temp, 88*e2fe950fSVictor Duicu HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN | 89*e2fe950fSVictor Duicu HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM | 90*e2fe950fSVictor Duicu HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | 91*e2fe950fSVictor Duicu HWMON_T_CRIT_HYST, 92*e2fe950fSVictor Duicu HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN | 93*e2fe950fSVictor Duicu HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM | 94*e2fe950fSVictor Duicu HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | 95*e2fe950fSVictor Duicu HWMON_T_CRIT_HYST, 96*e2fe950fSVictor Duicu HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN | 97*e2fe950fSVictor Duicu HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM | 98*e2fe950fSVictor Duicu HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | 99*e2fe950fSVictor Duicu HWMON_T_CRIT_HYST, 100*e2fe950fSVictor Duicu HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN | 101*e2fe950fSVictor Duicu HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM | 102*e2fe950fSVictor Duicu HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | 103*e2fe950fSVictor Duicu HWMON_T_CRIT_HYST, 104*e2fe950fSVictor Duicu HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_MIN | 105*e2fe950fSVictor Duicu HWMON_T_MIN_ALARM | HWMON_T_MAX | HWMON_T_MAX_ALARM | 106*e2fe950fSVictor Duicu HWMON_T_MAX_HYST | HWMON_T_CRIT | HWMON_T_CRIT_ALARM | 107*e2fe950fSVictor Duicu HWMON_T_CRIT_HYST), 108*e2fe950fSVictor Duicu HWMON_CHANNEL_INFO(chip, 109*e2fe950fSVictor Duicu HWMON_C_UPDATE_INTERVAL), 110*e2fe950fSVictor Duicu NULL 111*e2fe950fSVictor Duicu }; 112*e2fe950fSVictor Duicu 113*e2fe950fSVictor Duicu /** 114*e2fe950fSVictor Duicu * struct mcp9982_features - features of a mcp9982 instance 115*e2fe950fSVictor Duicu * @name: chip's name 116*e2fe950fSVictor Duicu * @phys_channels: number of physical channels supported by the chip 117*e2fe950fSVictor Duicu * @hw_thermal_shutdown: presence of hardware thermal shutdown circuitry 118*e2fe950fSVictor Duicu * @allow_apdd: whether the chip supports enabling APDD 119*e2fe950fSVictor Duicu * @has_recd34: whether the chip has the channels that are affected by recd34 120*e2fe950fSVictor Duicu */ 121*e2fe950fSVictor Duicu struct mcp9982_features { 122*e2fe950fSVictor Duicu const char *name; 123*e2fe950fSVictor Duicu u8 phys_channels; 124*e2fe950fSVictor Duicu bool hw_thermal_shutdown; 125*e2fe950fSVictor Duicu bool allow_apdd; 126*e2fe950fSVictor Duicu bool has_recd34; 127*e2fe950fSVictor Duicu }; 128*e2fe950fSVictor Duicu 129*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9933_chip_config = { 130*e2fe950fSVictor Duicu .name = "mcp9933", 131*e2fe950fSVictor Duicu .phys_channels = 3, 132*e2fe950fSVictor Duicu .hw_thermal_shutdown = false, 133*e2fe950fSVictor Duicu .allow_apdd = true, 134*e2fe950fSVictor Duicu .has_recd34 = false, 135*e2fe950fSVictor Duicu }; 136*e2fe950fSVictor Duicu 137*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9933d_chip_config = { 138*e2fe950fSVictor Duicu .name = "mcp9933d", 139*e2fe950fSVictor Duicu .phys_channels = 3, 140*e2fe950fSVictor Duicu .hw_thermal_shutdown = true, 141*e2fe950fSVictor Duicu .allow_apdd = true, 142*e2fe950fSVictor Duicu .has_recd34 = false, 143*e2fe950fSVictor Duicu }; 144*e2fe950fSVictor Duicu 145*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9982_chip_config = { 146*e2fe950fSVictor Duicu .name = "mcp9982", 147*e2fe950fSVictor Duicu .phys_channels = 2, 148*e2fe950fSVictor Duicu .hw_thermal_shutdown = false, 149*e2fe950fSVictor Duicu .allow_apdd = false, 150*e2fe950fSVictor Duicu .has_recd34 = false, 151*e2fe950fSVictor Duicu }; 152*e2fe950fSVictor Duicu 153*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9982d_chip_config = { 154*e2fe950fSVictor Duicu .name = "mcp9982d", 155*e2fe950fSVictor Duicu .phys_channels = 2, 156*e2fe950fSVictor Duicu .hw_thermal_shutdown = true, 157*e2fe950fSVictor Duicu .allow_apdd = false, 158*e2fe950fSVictor Duicu .has_recd34 = false, 159*e2fe950fSVictor Duicu }; 160*e2fe950fSVictor Duicu 161*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9983_chip_config = { 162*e2fe950fSVictor Duicu .name = "mcp9983", 163*e2fe950fSVictor Duicu .phys_channels = 3, 164*e2fe950fSVictor Duicu .hw_thermal_shutdown = false, 165*e2fe950fSVictor Duicu .allow_apdd = false, 166*e2fe950fSVictor Duicu .has_recd34 = true, 167*e2fe950fSVictor Duicu }; 168*e2fe950fSVictor Duicu 169*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9983d_chip_config = { 170*e2fe950fSVictor Duicu .name = "mcp9983d", 171*e2fe950fSVictor Duicu .phys_channels = 3, 172*e2fe950fSVictor Duicu .hw_thermal_shutdown = true, 173*e2fe950fSVictor Duicu .allow_apdd = false, 174*e2fe950fSVictor Duicu .has_recd34 = true, 175*e2fe950fSVictor Duicu }; 176*e2fe950fSVictor Duicu 177*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9984_chip_config = { 178*e2fe950fSVictor Duicu .name = "mcp9984", 179*e2fe950fSVictor Duicu .phys_channels = 4, 180*e2fe950fSVictor Duicu .hw_thermal_shutdown = false, 181*e2fe950fSVictor Duicu .allow_apdd = true, 182*e2fe950fSVictor Duicu .has_recd34 = true, 183*e2fe950fSVictor Duicu }; 184*e2fe950fSVictor Duicu 185*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9984d_chip_config = { 186*e2fe950fSVictor Duicu .name = "mcp9984d", 187*e2fe950fSVictor Duicu .phys_channels = 4, 188*e2fe950fSVictor Duicu .hw_thermal_shutdown = true, 189*e2fe950fSVictor Duicu .allow_apdd = true, 190*e2fe950fSVictor Duicu .has_recd34 = true, 191*e2fe950fSVictor Duicu }; 192*e2fe950fSVictor Duicu 193*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9985_chip_config = { 194*e2fe950fSVictor Duicu .name = "mcp9985", 195*e2fe950fSVictor Duicu .phys_channels = 5, 196*e2fe950fSVictor Duicu .hw_thermal_shutdown = false, 197*e2fe950fSVictor Duicu .allow_apdd = true, 198*e2fe950fSVictor Duicu .has_recd34 = true, 199*e2fe950fSVictor Duicu }; 200*e2fe950fSVictor Duicu 201*e2fe950fSVictor Duicu static const struct mcp9982_features mcp9985d_chip_config = { 202*e2fe950fSVictor Duicu .name = "mcp9985d", 203*e2fe950fSVictor Duicu .phys_channels = 5, 204*e2fe950fSVictor Duicu .hw_thermal_shutdown = true, 205*e2fe950fSVictor Duicu .allow_apdd = true, 206*e2fe950fSVictor Duicu .has_recd34 = true, 207*e2fe950fSVictor Duicu }; 208*e2fe950fSVictor Duicu 209*e2fe950fSVictor Duicu static const unsigned int mcp9982_update_interval[11] = { 210*e2fe950fSVictor Duicu 16000, 8000, 4000, 2000, 1000, 500, 250, 125, 64, 32, 16 211*e2fe950fSVictor Duicu }; 212*e2fe950fSVictor Duicu 213*e2fe950fSVictor Duicu /* MCP9982 regmap configuration */ 214*e2fe950fSVictor Duicu static const struct regmap_range mcp9982_regmap_wr_ranges[] = { 215*e2fe950fSVictor Duicu regmap_reg_range(MCP9982_ONE_SHOT_ADDR, MCP9982_CFG_ADDR), 216*e2fe950fSVictor Duicu regmap_reg_range(MCP9982_CONV_ADDR, MCP9982_HOTTEST_CFG_ADDR), 217*e2fe950fSVictor Duicu regmap_reg_range(MCP9982_THERM_SHTDWN_CFG_ADDR, MCP9982_THERM_SHTDWN_CFG_ADDR), 218*e2fe950fSVictor Duicu regmap_reg_range(MCP9982_EXT_BETA_CFG_ADDR(1), MCP9982_EXT_IDEAL_ADDR(4)), 219*e2fe950fSVictor Duicu }; 220*e2fe950fSVictor Duicu 221*e2fe950fSVictor Duicu static const struct regmap_access_table mcp9982_regmap_wr_table = { 222*e2fe950fSVictor Duicu .yes_ranges = mcp9982_regmap_wr_ranges, 223*e2fe950fSVictor Duicu .n_yes_ranges = ARRAY_SIZE(mcp9982_regmap_wr_ranges), 224*e2fe950fSVictor Duicu }; 225*e2fe950fSVictor Duicu 226*e2fe950fSVictor Duicu static const struct regmap_range mcp9982_regmap_rd_ranges[] = { 227*e2fe950fSVictor Duicu regmap_reg_range(MCP9982_HIGH_BYTE_ADDR(0), MCP9982_CFG_ADDR), 228*e2fe950fSVictor Duicu regmap_reg_range(MCP9982_CONV_ADDR, MCP9982_EXT_IDEAL_ADDR(4)), 229*e2fe950fSVictor Duicu }; 230*e2fe950fSVictor Duicu 231*e2fe950fSVictor Duicu static const struct regmap_access_table mcp9982_regmap_rd_table = { 232*e2fe950fSVictor Duicu .yes_ranges = mcp9982_regmap_rd_ranges, 233*e2fe950fSVictor Duicu .n_yes_ranges = ARRAY_SIZE(mcp9982_regmap_rd_ranges), 234*e2fe950fSVictor Duicu }; 235*e2fe950fSVictor Duicu 236*e2fe950fSVictor Duicu static bool mcp9982_is_volatile_reg(struct device *dev, unsigned int reg) 237*e2fe950fSVictor Duicu { 238*e2fe950fSVictor Duicu switch (reg) { 239*e2fe950fSVictor Duicu case MCP9982_ONE_SHOT_ADDR: 240*e2fe950fSVictor Duicu case MCP9982_INTERNAL_HIGH_LIMIT_ADDR: 241*e2fe950fSVictor Duicu case MCP9982_INTERNAL_LOW_LIMIT_ADDR: 242*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(1): 243*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(1) + 1: 244*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(2): 245*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(2) + 1: 246*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(3): 247*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(3) + 1: 248*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(4): 249*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(4) + 1: 250*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(1): 251*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(1) + 1: 252*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(2): 253*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(2) + 1: 254*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(3): 255*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(3) + 1: 256*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(4): 257*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(4) + 1: 258*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(0): 259*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(1): 260*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(2): 261*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(3): 262*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(4): 263*e2fe950fSVictor Duicu case MCP9982_CFG_ADDR: 264*e2fe950fSVictor Duicu case MCP9982_CONV_ADDR: 265*e2fe950fSVictor Duicu case MCP9982_HYS_ADDR: 266*e2fe950fSVictor Duicu case MCP9982_CONSEC_ALRT_ADDR: 267*e2fe950fSVictor Duicu case MCP9982_ALRT_CFG_ADDR: 268*e2fe950fSVictor Duicu case MCP9982_RUNNING_AVG_ADDR: 269*e2fe950fSVictor Duicu case MCP9982_HOTTEST_CFG_ADDR: 270*e2fe950fSVictor Duicu case MCP9982_THERM_SHTDWN_CFG_ADDR: 271*e2fe950fSVictor Duicu return false; 272*e2fe950fSVictor Duicu default: 273*e2fe950fSVictor Duicu return true; 274*e2fe950fSVictor Duicu } 275*e2fe950fSVictor Duicu } 276*e2fe950fSVictor Duicu 277*e2fe950fSVictor Duicu static const struct regmap_config mcp9982_regmap_config = { 278*e2fe950fSVictor Duicu .reg_bits = 8, 279*e2fe950fSVictor Duicu .val_bits = 8, 280*e2fe950fSVictor Duicu .rd_table = &mcp9982_regmap_rd_table, 281*e2fe950fSVictor Duicu .wr_table = &mcp9982_regmap_wr_table, 282*e2fe950fSVictor Duicu .volatile_reg = mcp9982_is_volatile_reg, 283*e2fe950fSVictor Duicu .max_register = MCP9982_EXT_IDEAL_ADDR(4), 284*e2fe950fSVictor Duicu .cache_type = REGCACHE_MAPLE, 285*e2fe950fSVictor Duicu }; 286*e2fe950fSVictor Duicu 287*e2fe950fSVictor Duicu /** 288*e2fe950fSVictor Duicu * struct mcp9982_priv - information about chip parameters 289*e2fe950fSVictor Duicu * @regmap: device register map 290*e2fe950fSVictor Duicu * @chip: pointer to structure holding chip features 291*e2fe950fSVictor Duicu * @labels: labels of the channels 292*e2fe950fSVictor Duicu * @interval_idx: index representing the current update interval 293*e2fe950fSVictor Duicu * @enabled_channel_mask: mask containing which channels should be enabled 294*e2fe950fSVictor Duicu * @num_channels: number of active physical channels 295*e2fe950fSVictor Duicu * @recd34_enable: state of Resistance Error Correction(REC) on channels 3 and 4 296*e2fe950fSVictor Duicu * @recd12_enable: state of Resistance Error Correction(REC) on channels 1 and 2 297*e2fe950fSVictor Duicu * @apdd_enable: state of anti-parallel diode mode 298*e2fe950fSVictor Duicu * @run_state: chip is in Run state, otherwise is in Standby state 299*e2fe950fSVictor Duicu */ 300*e2fe950fSVictor Duicu struct mcp9982_priv { 301*e2fe950fSVictor Duicu struct regmap *regmap; 302*e2fe950fSVictor Duicu const struct mcp9982_features *chip; 303*e2fe950fSVictor Duicu const char *labels[MCP9982_MAX_NUM_CHANNELS]; 304*e2fe950fSVictor Duicu unsigned int interval_idx; 305*e2fe950fSVictor Duicu unsigned long enabled_channel_mask; 306*e2fe950fSVictor Duicu u8 num_channels; 307*e2fe950fSVictor Duicu bool recd34_enable; 308*e2fe950fSVictor Duicu bool recd12_enable; 309*e2fe950fSVictor Duicu bool apdd_enable; 310*e2fe950fSVictor Duicu bool run_state; 311*e2fe950fSVictor Duicu }; 312*e2fe950fSVictor Duicu 313*e2fe950fSVictor Duicu static int mcp9982_read_limit(struct mcp9982_priv *priv, u8 address, long *val) 314*e2fe950fSVictor Duicu { 315*e2fe950fSVictor Duicu unsigned int limit, reg_high, reg_low; 316*e2fe950fSVictor Duicu int ret; 317*e2fe950fSVictor Duicu 318*e2fe950fSVictor Duicu switch (address) { 319*e2fe950fSVictor Duicu case MCP9982_INTERNAL_HIGH_LIMIT_ADDR: 320*e2fe950fSVictor Duicu case MCP9982_INTERNAL_LOW_LIMIT_ADDR: 321*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(0): 322*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(1): 323*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(2): 324*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(3): 325*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(4): 326*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, address, &limit); 327*e2fe950fSVictor Duicu if (ret) 328*e2fe950fSVictor Duicu return ret; 329*e2fe950fSVictor Duicu 330*e2fe950fSVictor Duicu *val = ((int)limit - MCP9982_OFFSET) * 1000; 331*e2fe950fSVictor Duicu 332*e2fe950fSVictor Duicu return 0; 333*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(1): 334*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(2): 335*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(3): 336*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(4): 337*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(1): 338*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(2): 339*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(3): 340*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(4): 341*e2fe950fSVictor Duicu /* 342*e2fe950fSVictor Duicu * In order to keep consistency with reading temperature memory region we will use 343*e2fe950fSVictor Duicu * single byte I2C read. 344*e2fe950fSVictor Duicu */ 345*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, address, ®_high); 346*e2fe950fSVictor Duicu if (ret) 347*e2fe950fSVictor Duicu return ret; 348*e2fe950fSVictor Duicu 349*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, address + 1, ®_low); 350*e2fe950fSVictor Duicu if (ret) 351*e2fe950fSVictor Duicu return ret; 352*e2fe950fSVictor Duicu 353*e2fe950fSVictor Duicu *val = ((reg_high << 8) + reg_low) >> 5; 354*e2fe950fSVictor Duicu *val = (*val - (MCP9982_OFFSET << 3)) * 125; 355*e2fe950fSVictor Duicu 356*e2fe950fSVictor Duicu return 0; 357*e2fe950fSVictor Duicu default: 358*e2fe950fSVictor Duicu return -EINVAL; 359*e2fe950fSVictor Duicu } 360*e2fe950fSVictor Duicu } 361*e2fe950fSVictor Duicu 362*e2fe950fSVictor Duicu static int mcp9982_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, 363*e2fe950fSVictor Duicu long *val) 364*e2fe950fSVictor Duicu { 365*e2fe950fSVictor Duicu struct mcp9982_priv *priv = dev_get_drvdata(dev); 366*e2fe950fSVictor Duicu unsigned int reg_high, reg_low, hyst, reg_status; 367*e2fe950fSVictor Duicu int ret; 368*e2fe950fSVictor Duicu u8 addr; 369*e2fe950fSVictor Duicu 370*e2fe950fSVictor Duicu /* 371*e2fe950fSVictor Duicu * In Standby State the conversion cycle must be initated manually in 372*e2fe950fSVictor Duicu * order to read fresh temperature values and the status of the alarms. 373*e2fe950fSVictor Duicu */ 374*e2fe950fSVictor Duicu if (!priv->run_state) { 375*e2fe950fSVictor Duicu switch (type) { 376*e2fe950fSVictor Duicu case hwmon_temp: 377*e2fe950fSVictor Duicu switch (attr) { 378*e2fe950fSVictor Duicu case hwmon_temp_input: 379*e2fe950fSVictor Duicu case hwmon_temp_max_alarm: 380*e2fe950fSVictor Duicu case hwmon_temp_min_alarm: 381*e2fe950fSVictor Duicu case hwmon_temp_crit_alarm: 382*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_ONE_SHOT_ADDR, 1); 383*e2fe950fSVictor Duicu if (ret) 384*e2fe950fSVictor Duicu return ret; 385*e2fe950fSVictor Duicu /* 386*e2fe950fSVictor Duicu * When the device is in Standby mode, 125 ms need 387*e2fe950fSVictor Duicu * to pass from writing in One Shot register before 388*e2fe950fSVictor Duicu * the conversion cycle begins. 389*e2fe950fSVictor Duicu */ 390*e2fe950fSVictor Duicu usleep_range(MCP9982_WAKE_UP_TIME_US, MCP9982_WAKE_UP_TIME_MAX_US); 391*e2fe950fSVictor Duicu ret = regmap_read_poll_timeout 392*e2fe950fSVictor Duicu (priv->regmap, MCP9982_STATUS_ADDR, 393*e2fe950fSVictor Duicu reg_status, !(reg_status & MCP9982_STATUS_BUSY), 394*e2fe950fSVictor Duicu MCP9982_WAKE_UP_TIME_US, 395*e2fe950fSVictor Duicu MCP9982_WAKE_UP_TIME_US * 10); 396*e2fe950fSVictor Duicu break; 397*e2fe950fSVictor Duicu } 398*e2fe950fSVictor Duicu break; 399*e2fe950fSVictor Duicu default: 400*e2fe950fSVictor Duicu break; 401*e2fe950fSVictor Duicu } 402*e2fe950fSVictor Duicu } 403*e2fe950fSVictor Duicu 404*e2fe950fSVictor Duicu switch (type) { 405*e2fe950fSVictor Duicu case hwmon_temp: 406*e2fe950fSVictor Duicu switch (attr) { 407*e2fe950fSVictor Duicu case hwmon_temp_input: 408*e2fe950fSVictor Duicu /* 409*e2fe950fSVictor Duicu * The only areas of memory that support SMBus block read are 80h->89h 410*e2fe950fSVictor Duicu * (temperature memory block) and 90h->97h(status memory block). 411*e2fe950fSVictor Duicu * In this context the read operation uses SMBus protocol and the first 412*e2fe950fSVictor Duicu * value returned will be the number of addresses that can be read. 413*e2fe950fSVictor Duicu * Temperature memory block is 10 bytes long and status memory block is 8 414*e2fe950fSVictor Duicu * bytes long. 415*e2fe950fSVictor Duicu * 416*e2fe950fSVictor Duicu * Depending on the read instruction used, the chip behaves differently: 417*e2fe950fSVictor Duicu * - regmap_bulk_read() when applied to the temperature memory block 418*e2fe950fSVictor Duicu * (80h->89h), the chip replies with SMBus block read, including count, 419*e2fe950fSVictor Duicu * additionally to the high and the low bytes. This function cannot be 420*e2fe950fSVictor Duicu * applied on the memory region 00h->09h(memory area which does not support 421*e2fe950fSVictor Duicu * block reads, returns wrong data) unless use_single_read is set in 422*e2fe950fSVictor Duicu * regmap_config. 423*e2fe950fSVictor Duicu * 424*e2fe950fSVictor Duicu * - regmap_multi_reg_read() when applied to the 00h->09h area uses I2C 425*e2fe950fSVictor Duicu * and returns only the high and low temperature bytes. When applied to 426*e2fe950fSVictor Duicu * the temperature memory block (80h->89h) returns the count till the end of 427*e2fe950fSVictor Duicu * the temperature memory block(aka SMBus count). 428*e2fe950fSVictor Duicu * 429*e2fe950fSVictor Duicu * - i2c_smbus_read_block_data() is not supported by all drivers. 430*e2fe950fSVictor Duicu * 431*e2fe950fSVictor Duicu * In order to keep consistency with reading limit memory region we will 432*e2fe950fSVictor Duicu * use single byte I2C read. 433*e2fe950fSVictor Duicu * 434*e2fe950fSVictor Duicu * Low register is latched when high temperature register is read. 435*e2fe950fSVictor Duicu */ 436*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, MCP9982_HIGH_BYTE_ADDR(channel), ®_high); 437*e2fe950fSVictor Duicu if (ret) 438*e2fe950fSVictor Duicu return ret; 439*e2fe950fSVictor Duicu 440*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, MCP9982_HIGH_BYTE_ADDR(channel) + 1, 441*e2fe950fSVictor Duicu ®_low); 442*e2fe950fSVictor Duicu if (ret) 443*e2fe950fSVictor Duicu return ret; 444*e2fe950fSVictor Duicu 445*e2fe950fSVictor Duicu *val = ((reg_high << 8) + reg_low) >> 5; 446*e2fe950fSVictor Duicu *val = (*val - (MCP9982_OFFSET << 3)) * 125; 447*e2fe950fSVictor Duicu 448*e2fe950fSVictor Duicu return 0; 449*e2fe950fSVictor Duicu case hwmon_temp_max: 450*e2fe950fSVictor Duicu if (channel) 451*e2fe950fSVictor Duicu addr = MCP9982_EXT_HIGH_LIMIT_ADDR(channel); 452*e2fe950fSVictor Duicu else 453*e2fe950fSVictor Duicu addr = MCP9982_INTERNAL_HIGH_LIMIT_ADDR; 454*e2fe950fSVictor Duicu 455*e2fe950fSVictor Duicu return mcp9982_read_limit(priv, addr, val); 456*e2fe950fSVictor Duicu case hwmon_temp_max_alarm: 457*e2fe950fSVictor Duicu *val = regmap_test_bits(priv->regmap, MCP9982_HIGH_LIMIT_STATUS_ADDR, 458*e2fe950fSVictor Duicu BIT(channel)); 459*e2fe950fSVictor Duicu if (*val < 0) 460*e2fe950fSVictor Duicu return *val; 461*e2fe950fSVictor Duicu 462*e2fe950fSVictor Duicu return 0; 463*e2fe950fSVictor Duicu case hwmon_temp_max_hyst: 464*e2fe950fSVictor Duicu if (channel) 465*e2fe950fSVictor Duicu addr = MCP9982_EXT_HIGH_LIMIT_ADDR(channel); 466*e2fe950fSVictor Duicu else 467*e2fe950fSVictor Duicu addr = MCP9982_INTERNAL_HIGH_LIMIT_ADDR; 468*e2fe950fSVictor Duicu ret = mcp9982_read_limit(priv, addr, val); 469*e2fe950fSVictor Duicu if (ret) 470*e2fe950fSVictor Duicu return ret; 471*e2fe950fSVictor Duicu 472*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, MCP9982_HYS_ADDR, &hyst); 473*e2fe950fSVictor Duicu if (ret) 474*e2fe950fSVictor Duicu return ret; 475*e2fe950fSVictor Duicu 476*e2fe950fSVictor Duicu *val -= hyst * 1000; 477*e2fe950fSVictor Duicu 478*e2fe950fSVictor Duicu return 0; 479*e2fe950fSVictor Duicu case hwmon_temp_min: 480*e2fe950fSVictor Duicu if (channel) 481*e2fe950fSVictor Duicu addr = MCP9982_EXT_LOW_LIMIT_ADDR(channel); 482*e2fe950fSVictor Duicu else 483*e2fe950fSVictor Duicu addr = MCP9982_INTERNAL_LOW_LIMIT_ADDR; 484*e2fe950fSVictor Duicu 485*e2fe950fSVictor Duicu return mcp9982_read_limit(priv, addr, val); 486*e2fe950fSVictor Duicu case hwmon_temp_min_alarm: 487*e2fe950fSVictor Duicu *val = regmap_test_bits(priv->regmap, MCP9982_LOW_LIMIT_STATUS_ADDR, 488*e2fe950fSVictor Duicu BIT(channel)); 489*e2fe950fSVictor Duicu if (*val < 0) 490*e2fe950fSVictor Duicu return *val; 491*e2fe950fSVictor Duicu 492*e2fe950fSVictor Duicu return 0; 493*e2fe950fSVictor Duicu case hwmon_temp_crit: 494*e2fe950fSVictor Duicu return mcp9982_read_limit(priv, MCP9982_THERM_LIMIT_ADDR(channel), val); 495*e2fe950fSVictor Duicu case hwmon_temp_crit_alarm: 496*e2fe950fSVictor Duicu *val = regmap_test_bits(priv->regmap, MCP9982_THERM_LIMIT_STATUS_ADDR, 497*e2fe950fSVictor Duicu BIT(channel)); 498*e2fe950fSVictor Duicu if (*val < 0) 499*e2fe950fSVictor Duicu return *val; 500*e2fe950fSVictor Duicu 501*e2fe950fSVictor Duicu return 0; 502*e2fe950fSVictor Duicu case hwmon_temp_crit_hyst: 503*e2fe950fSVictor Duicu ret = mcp9982_read_limit(priv, MCP9982_THERM_LIMIT_ADDR(channel), val); 504*e2fe950fSVictor Duicu if (ret) 505*e2fe950fSVictor Duicu return ret; 506*e2fe950fSVictor Duicu 507*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, MCP9982_HYS_ADDR, &hyst); 508*e2fe950fSVictor Duicu if (ret) 509*e2fe950fSVictor Duicu return ret; 510*e2fe950fSVictor Duicu 511*e2fe950fSVictor Duicu *val -= hyst * 1000; 512*e2fe950fSVictor Duicu 513*e2fe950fSVictor Duicu return 0; 514*e2fe950fSVictor Duicu default: 515*e2fe950fSVictor Duicu return -EINVAL; 516*e2fe950fSVictor Duicu } 517*e2fe950fSVictor Duicu case hwmon_chip: 518*e2fe950fSVictor Duicu switch (attr) { 519*e2fe950fSVictor Duicu case hwmon_chip_update_interval: 520*e2fe950fSVictor Duicu *val = mcp9982_update_interval[priv->interval_idx]; 521*e2fe950fSVictor Duicu return 0; 522*e2fe950fSVictor Duicu default: 523*e2fe950fSVictor Duicu return -EINVAL; 524*e2fe950fSVictor Duicu } 525*e2fe950fSVictor Duicu default: 526*e2fe950fSVictor Duicu return -EINVAL; 527*e2fe950fSVictor Duicu } 528*e2fe950fSVictor Duicu } 529*e2fe950fSVictor Duicu 530*e2fe950fSVictor Duicu static int mcp9982_read_label(struct device *dev, enum hwmon_sensor_types type, u32 attr, 531*e2fe950fSVictor Duicu int channel, const char **str) 532*e2fe950fSVictor Duicu { 533*e2fe950fSVictor Duicu struct mcp9982_priv *priv = dev_get_drvdata(dev); 534*e2fe950fSVictor Duicu 535*e2fe950fSVictor Duicu switch (type) { 536*e2fe950fSVictor Duicu case hwmon_temp: 537*e2fe950fSVictor Duicu switch (attr) { 538*e2fe950fSVictor Duicu case hwmon_temp_label: 539*e2fe950fSVictor Duicu *str = priv->labels[channel]; 540*e2fe950fSVictor Duicu return 0; 541*e2fe950fSVictor Duicu default: 542*e2fe950fSVictor Duicu return -EOPNOTSUPP; 543*e2fe950fSVictor Duicu } 544*e2fe950fSVictor Duicu default: 545*e2fe950fSVictor Duicu return -EOPNOTSUPP; 546*e2fe950fSVictor Duicu } 547*e2fe950fSVictor Duicu } 548*e2fe950fSVictor Duicu 549*e2fe950fSVictor Duicu static int mcp9982_write_limit(struct mcp9982_priv *priv, u8 address, long val) 550*e2fe950fSVictor Duicu { 551*e2fe950fSVictor Duicu int ret; 552*e2fe950fSVictor Duicu unsigned int regh, regl; 553*e2fe950fSVictor Duicu 554*e2fe950fSVictor Duicu switch (address) { 555*e2fe950fSVictor Duicu case MCP9982_INTERNAL_HIGH_LIMIT_ADDR: 556*e2fe950fSVictor Duicu case MCP9982_INTERNAL_LOW_LIMIT_ADDR: 557*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(0): 558*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(1): 559*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(2): 560*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(3): 561*e2fe950fSVictor Duicu case MCP9982_THERM_LIMIT_ADDR(4): 562*e2fe950fSVictor Duicu regh = DIV_ROUND_CLOSEST(val, 1000); 563*e2fe950fSVictor Duicu regh = clamp_val(regh, 0, 255); 564*e2fe950fSVictor Duicu 565*e2fe950fSVictor Duicu return regmap_write(priv->regmap, address, regh); 566*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(1): 567*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(2): 568*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(3): 569*e2fe950fSVictor Duicu case MCP9982_EXT_HIGH_LIMIT_ADDR(4): 570*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(1): 571*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(2): 572*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(3): 573*e2fe950fSVictor Duicu case MCP9982_EXT_LOW_LIMIT_ADDR(4): 574*e2fe950fSVictor Duicu val = DIV_ROUND_CLOSEST(val, 125); 575*e2fe950fSVictor Duicu regh = (val >> 3) & 0xff; 576*e2fe950fSVictor Duicu regl = (val & 0x07) << 5; 577*e2fe950fSVictor Duicu /* Block writing is not supported by the chip. */ 578*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, address, regh); 579*e2fe950fSVictor Duicu if (ret) 580*e2fe950fSVictor Duicu return ret; 581*e2fe950fSVictor Duicu 582*e2fe950fSVictor Duicu return regmap_write(priv->regmap, address + 1, regl); 583*e2fe950fSVictor Duicu default: 584*e2fe950fSVictor Duicu return -EINVAL; 585*e2fe950fSVictor Duicu } 586*e2fe950fSVictor Duicu } 587*e2fe950fSVictor Duicu 588*e2fe950fSVictor Duicu static int mcp9982_write_hyst(struct mcp9982_priv *priv, int channel, long val) 589*e2fe950fSVictor Duicu { 590*e2fe950fSVictor Duicu int hyst, ret; 591*e2fe950fSVictor Duicu int limit; 592*e2fe950fSVictor Duicu 593*e2fe950fSVictor Duicu val = DIV_ROUND_CLOSEST(val, 1000); 594*e2fe950fSVictor Duicu val = clamp_val(val, 0, 255); 595*e2fe950fSVictor Duicu 596*e2fe950fSVictor Duicu /* Therm register is 8 bits and so it keeps only the integer part of the temperature. */ 597*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, MCP9982_THERM_LIMIT_ADDR(channel), &limit); 598*e2fe950fSVictor Duicu if (ret) 599*e2fe950fSVictor Duicu return ret; 600*e2fe950fSVictor Duicu 601*e2fe950fSVictor Duicu hyst = clamp_val(limit - val, 0, 255); 602*e2fe950fSVictor Duicu 603*e2fe950fSVictor Duicu return regmap_write(priv->regmap, MCP9982_HYS_ADDR, hyst); 604*e2fe950fSVictor Duicu } 605*e2fe950fSVictor Duicu 606*e2fe950fSVictor Duicu static int mcp9982_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, 607*e2fe950fSVictor Duicu long val) 608*e2fe950fSVictor Duicu { 609*e2fe950fSVictor Duicu struct mcp9982_priv *priv = dev_get_drvdata(dev); 610*e2fe950fSVictor Duicu unsigned int idx; 611*e2fe950fSVictor Duicu u8 addr; 612*e2fe950fSVictor Duicu 613*e2fe950fSVictor Duicu switch (type) { 614*e2fe950fSVictor Duicu case hwmon_chip: 615*e2fe950fSVictor Duicu switch (attr) { 616*e2fe950fSVictor Duicu case hwmon_chip_update_interval: 617*e2fe950fSVictor Duicu 618*e2fe950fSVictor Duicu /* 619*e2fe950fSVictor Duicu * For MCP998XD and MCP9933D update interval 620*e2fe950fSVictor Duicu * can't be longer than 1 second. 621*e2fe950fSVictor Duicu */ 622*e2fe950fSVictor Duicu if (priv->chip->hw_thermal_shutdown) 623*e2fe950fSVictor Duicu val = clamp_val(val, 0, 1000); 624*e2fe950fSVictor Duicu 625*e2fe950fSVictor Duicu idx = find_closest_descending(val, mcp9982_update_interval, 626*e2fe950fSVictor Duicu ARRAY_SIZE(mcp9982_update_interval)); 627*e2fe950fSVictor Duicu priv->interval_idx = idx; 628*e2fe950fSVictor Duicu 629*e2fe950fSVictor Duicu return regmap_write(priv->regmap, MCP9982_CONV_ADDR, idx); 630*e2fe950fSVictor Duicu default: 631*e2fe950fSVictor Duicu return -EINVAL; 632*e2fe950fSVictor Duicu } 633*e2fe950fSVictor Duicu case hwmon_temp: 634*e2fe950fSVictor Duicu val = clamp_val(val, -64000, 191875); 635*e2fe950fSVictor Duicu val = val + (MCP9982_OFFSET * 1000); 636*e2fe950fSVictor Duicu switch (attr) { 637*e2fe950fSVictor Duicu case hwmon_temp_max: 638*e2fe950fSVictor Duicu if (channel) 639*e2fe950fSVictor Duicu addr = MCP9982_EXT_HIGH_LIMIT_ADDR(channel); 640*e2fe950fSVictor Duicu else 641*e2fe950fSVictor Duicu addr = MCP9982_INTERNAL_HIGH_LIMIT_ADDR; 642*e2fe950fSVictor Duicu 643*e2fe950fSVictor Duicu return mcp9982_write_limit(priv, addr, val); 644*e2fe950fSVictor Duicu case hwmon_temp_min: 645*e2fe950fSVictor Duicu if (channel) 646*e2fe950fSVictor Duicu addr = MCP9982_EXT_LOW_LIMIT_ADDR(channel); 647*e2fe950fSVictor Duicu else 648*e2fe950fSVictor Duicu addr = MCP9982_INTERNAL_LOW_LIMIT_ADDR; 649*e2fe950fSVictor Duicu 650*e2fe950fSVictor Duicu return mcp9982_write_limit(priv, addr, val); 651*e2fe950fSVictor Duicu case hwmon_temp_crit: 652*e2fe950fSVictor Duicu return mcp9982_write_limit(priv, MCP9982_THERM_LIMIT_ADDR(channel), val); 653*e2fe950fSVictor Duicu case hwmon_temp_crit_hyst: 654*e2fe950fSVictor Duicu return mcp9982_write_hyst(priv, channel, val); 655*e2fe950fSVictor Duicu default: 656*e2fe950fSVictor Duicu return -EINVAL; 657*e2fe950fSVictor Duicu } 658*e2fe950fSVictor Duicu default: 659*e2fe950fSVictor Duicu return -EINVAL; 660*e2fe950fSVictor Duicu } 661*e2fe950fSVictor Duicu } 662*e2fe950fSVictor Duicu 663*e2fe950fSVictor Duicu static umode_t mcp9982_is_visible(const void *_data, enum hwmon_sensor_types type, u32 attr, 664*e2fe950fSVictor Duicu int channel) 665*e2fe950fSVictor Duicu { 666*e2fe950fSVictor Duicu const struct mcp9982_priv *priv = _data; 667*e2fe950fSVictor Duicu 668*e2fe950fSVictor Duicu if (!test_bit(channel, &priv->enabled_channel_mask)) 669*e2fe950fSVictor Duicu return 0; 670*e2fe950fSVictor Duicu 671*e2fe950fSVictor Duicu switch (type) { 672*e2fe950fSVictor Duicu case hwmon_temp: 673*e2fe950fSVictor Duicu switch (attr) { 674*e2fe950fSVictor Duicu case hwmon_temp_label: 675*e2fe950fSVictor Duicu if (priv->labels[channel]) 676*e2fe950fSVictor Duicu return 0444; 677*e2fe950fSVictor Duicu else 678*e2fe950fSVictor Duicu return 0; 679*e2fe950fSVictor Duicu case hwmon_temp_input: 680*e2fe950fSVictor Duicu case hwmon_temp_min_alarm: 681*e2fe950fSVictor Duicu case hwmon_temp_max_alarm: 682*e2fe950fSVictor Duicu case hwmon_temp_max_hyst: 683*e2fe950fSVictor Duicu case hwmon_temp_crit_alarm: 684*e2fe950fSVictor Duicu return 0444; 685*e2fe950fSVictor Duicu case hwmon_temp_min: 686*e2fe950fSVictor Duicu case hwmon_temp_max: 687*e2fe950fSVictor Duicu case hwmon_temp_crit: 688*e2fe950fSVictor Duicu case hwmon_temp_crit_hyst: 689*e2fe950fSVictor Duicu return 0644; 690*e2fe950fSVictor Duicu default: 691*e2fe950fSVictor Duicu return 0; 692*e2fe950fSVictor Duicu } 693*e2fe950fSVictor Duicu case hwmon_chip: 694*e2fe950fSVictor Duicu switch (attr) { 695*e2fe950fSVictor Duicu case hwmon_chip_update_interval: 696*e2fe950fSVictor Duicu return 0644; 697*e2fe950fSVictor Duicu default: 698*e2fe950fSVictor Duicu return 0; 699*e2fe950fSVictor Duicu } 700*e2fe950fSVictor Duicu default: 701*e2fe950fSVictor Duicu return 0; 702*e2fe950fSVictor Duicu } 703*e2fe950fSVictor Duicu } 704*e2fe950fSVictor Duicu 705*e2fe950fSVictor Duicu static const struct hwmon_ops mcp9982_hwmon_ops = { 706*e2fe950fSVictor Duicu .is_visible = mcp9982_is_visible, 707*e2fe950fSVictor Duicu .read = mcp9982_read, 708*e2fe950fSVictor Duicu .read_string = mcp9982_read_label, 709*e2fe950fSVictor Duicu .write = mcp9982_write, 710*e2fe950fSVictor Duicu }; 711*e2fe950fSVictor Duicu 712*e2fe950fSVictor Duicu static int mcp9982_init(struct device *dev, struct mcp9982_priv *priv) 713*e2fe950fSVictor Duicu { 714*e2fe950fSVictor Duicu long high_limit, low_limit; 715*e2fe950fSVictor Duicu unsigned int i; 716*e2fe950fSVictor Duicu int ret; 717*e2fe950fSVictor Duicu u8 val; 718*e2fe950fSVictor Duicu 719*e2fe950fSVictor Duicu /* Chips 82/83 and 82D/83D do not support anti-parallel diode mode. */ 720*e2fe950fSVictor Duicu if (!priv->chip->allow_apdd && priv->apdd_enable == 1) 721*e2fe950fSVictor Duicu return dev_err_probe(dev, -EINVAL, "Incorrect setting of APDD.\n"); 722*e2fe950fSVictor Duicu 723*e2fe950fSVictor Duicu /* Chips with "D" work only in Run state. */ 724*e2fe950fSVictor Duicu if (priv->chip->hw_thermal_shutdown && !priv->run_state) 725*e2fe950fSVictor Duicu return dev_err_probe(dev, -EINVAL, "Incorrect setting of Power State.\n"); 726*e2fe950fSVictor Duicu 727*e2fe950fSVictor Duicu /* All chips with "D" in the name must have RECD12 enabled. */ 728*e2fe950fSVictor Duicu if (priv->chip->hw_thermal_shutdown && !priv->recd12_enable) 729*e2fe950fSVictor Duicu return dev_err_probe(dev, -EINVAL, "Incorrect setting of RECD12.\n"); 730*e2fe950fSVictor Duicu /* Chips 83D/84D/85D must have RECD34 enabled. */ 731*e2fe950fSVictor Duicu if (priv->chip->hw_thermal_shutdown) 732*e2fe950fSVictor Duicu if ((priv->chip->has_recd34 && !priv->recd34_enable)) 733*e2fe950fSVictor Duicu return dev_err_probe(dev, -EINVAL, "Incorrect setting of RECD34.\n"); 734*e2fe950fSVictor Duicu 735*e2fe950fSVictor Duicu /* 736*e2fe950fSVictor Duicu * Set default values in registers. 737*e2fe950fSVictor Duicu * APDD, RECD12 and RECD34 are active on 0. 738*e2fe950fSVictor Duicu */ 739*e2fe950fSVictor Duicu val = FIELD_PREP(MCP9982_CFG_MSKAL, 1) | 740*e2fe950fSVictor Duicu FIELD_PREP(MCP9982_CFG_RS, !priv->run_state) | 741*e2fe950fSVictor Duicu FIELD_PREP(MCP9982_CFG_ATTHM, 1) | 742*e2fe950fSVictor Duicu FIELD_PREP(MCP9982_CFG_RECD12, !priv->recd12_enable) | 743*e2fe950fSVictor Duicu FIELD_PREP(MCP9982_CFG_RECD34, !priv->recd34_enable) | 744*e2fe950fSVictor Duicu FIELD_PREP(MCP9982_CFG_RANGE, 1) | FIELD_PREP(MCP9982_CFG_DA_ENA, 0) | 745*e2fe950fSVictor Duicu FIELD_PREP(MCP9982_CFG_APDD, !priv->apdd_enable); 746*e2fe950fSVictor Duicu 747*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_CFG_ADDR, val); 748*e2fe950fSVictor Duicu if (ret) 749*e2fe950fSVictor Duicu return ret; 750*e2fe950fSVictor Duicu 751*e2fe950fSVictor Duicu /* 752*e2fe950fSVictor Duicu * Read initial value from register. 753*e2fe950fSVictor Duicu * The convert register utilises only 4 out of 8 bits. 754*e2fe950fSVictor Duicu * Numerical values 0->10 set their respective update intervals, 755*e2fe950fSVictor Duicu * while numerical values 11->15 default to 1 second. 756*e2fe950fSVictor Duicu */ 757*e2fe950fSVictor Duicu ret = regmap_read(priv->regmap, MCP9982_CONV_ADDR, &priv->interval_idx); 758*e2fe950fSVictor Duicu if (ret) 759*e2fe950fSVictor Duicu return ret; 760*e2fe950fSVictor Duicu if (priv->interval_idx >= 11) 761*e2fe950fSVictor Duicu priv->interval_idx = 4; 762*e2fe950fSVictor Duicu 763*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_HYS_ADDR, MCP9982_DEFAULT_HYS_VAL); 764*e2fe950fSVictor Duicu if (ret) 765*e2fe950fSVictor Duicu return ret; 766*e2fe950fSVictor Duicu 767*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_CONSEC_ALRT_ADDR, MCP9982_DEFAULT_CONSEC_ALRT_VAL); 768*e2fe950fSVictor Duicu if (ret) 769*e2fe950fSVictor Duicu return ret; 770*e2fe950fSVictor Duicu 771*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_ALRT_CFG_ADDR, 0); 772*e2fe950fSVictor Duicu if (ret) 773*e2fe950fSVictor Duicu return ret; 774*e2fe950fSVictor Duicu 775*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_RUNNING_AVG_ADDR, 0); 776*e2fe950fSVictor Duicu if (ret) 777*e2fe950fSVictor Duicu return ret; 778*e2fe950fSVictor Duicu 779*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_HOTTEST_CFG_ADDR, 0); 780*e2fe950fSVictor Duicu if (ret) 781*e2fe950fSVictor Duicu return ret; 782*e2fe950fSVictor Duicu 783*e2fe950fSVictor Duicu /* 784*e2fe950fSVictor Duicu * Only external channels 1 and 2 support beta compensation. 785*e2fe950fSVictor Duicu * Set beta auto-detection. 786*e2fe950fSVictor Duicu */ 787*e2fe950fSVictor Duicu for (i = 1; i < 3; i++) 788*e2fe950fSVictor Duicu if (test_bit(i, &priv->enabled_channel_mask)) { 789*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_EXT_BETA_CFG_ADDR(i), 790*e2fe950fSVictor Duicu MCP9982_BETA_AUTODETECT); 791*e2fe950fSVictor Duicu if (ret) 792*e2fe950fSVictor Duicu return ret; 793*e2fe950fSVictor Duicu } 794*e2fe950fSVictor Duicu 795*e2fe950fSVictor Duicu high_limit = MCP9982_HIGH_LIMIT_DEFAULT + (MCP9982_OFFSET * 1000); 796*e2fe950fSVictor Duicu low_limit = MCP9982_LOW_LIMIT_DEFAULT + (MCP9982_OFFSET * 1000); 797*e2fe950fSVictor Duicu 798*e2fe950fSVictor Duicu /* Set default values for internal channel limits. */ 799*e2fe950fSVictor Duicu if (test_bit(0, &priv->enabled_channel_mask)) { 800*e2fe950fSVictor Duicu ret = mcp9982_write_limit(priv, MCP9982_INTERNAL_HIGH_LIMIT_ADDR, high_limit); 801*e2fe950fSVictor Duicu if (ret) 802*e2fe950fSVictor Duicu return ret; 803*e2fe950fSVictor Duicu 804*e2fe950fSVictor Duicu ret = mcp9982_write_limit(priv, MCP9982_INTERNAL_LOW_LIMIT_ADDR, low_limit); 805*e2fe950fSVictor Duicu if (ret) 806*e2fe950fSVictor Duicu return ret; 807*e2fe950fSVictor Duicu 808*e2fe950fSVictor Duicu ret = mcp9982_write_limit(priv, MCP9982_THERM_LIMIT_ADDR(0), high_limit); 809*e2fe950fSVictor Duicu if (ret) 810*e2fe950fSVictor Duicu return ret; 811*e2fe950fSVictor Duicu } 812*e2fe950fSVictor Duicu 813*e2fe950fSVictor Duicu /* Set ideality factor and limits to default for external channels. */ 814*e2fe950fSVictor Duicu for (i = 1; i < MCP9982_MAX_NUM_CHANNELS; i++) 815*e2fe950fSVictor Duicu if (test_bit(i, &priv->enabled_channel_mask)) { 816*e2fe950fSVictor Duicu ret = regmap_write(priv->regmap, MCP9982_EXT_IDEAL_ADDR(i), 817*e2fe950fSVictor Duicu MCP9982_IDEALITY_DEFAULT); 818*e2fe950fSVictor Duicu if (ret) 819*e2fe950fSVictor Duicu return ret; 820*e2fe950fSVictor Duicu 821*e2fe950fSVictor Duicu ret = mcp9982_write_limit(priv, MCP9982_EXT_HIGH_LIMIT_ADDR(i), high_limit); 822*e2fe950fSVictor Duicu if (ret) 823*e2fe950fSVictor Duicu return ret; 824*e2fe950fSVictor Duicu 825*e2fe950fSVictor Duicu ret = mcp9982_write_limit(priv, MCP9982_EXT_LOW_LIMIT_ADDR(i), low_limit); 826*e2fe950fSVictor Duicu if (ret) 827*e2fe950fSVictor Duicu return ret; 828*e2fe950fSVictor Duicu 829*e2fe950fSVictor Duicu ret = mcp9982_write_limit(priv, MCP9982_THERM_LIMIT_ADDR(i), high_limit); 830*e2fe950fSVictor Duicu if (ret) 831*e2fe950fSVictor Duicu return ret; 832*e2fe950fSVictor Duicu } 833*e2fe950fSVictor Duicu 834*e2fe950fSVictor Duicu return 0; 835*e2fe950fSVictor Duicu } 836*e2fe950fSVictor Duicu 837*e2fe950fSVictor Duicu static int mcp9982_parse_fw_config(struct device *dev, int device_nr_channels) 838*e2fe950fSVictor Duicu { 839*e2fe950fSVictor Duicu struct mcp9982_priv *priv = dev_get_drvdata(dev); 840*e2fe950fSVictor Duicu unsigned int reg_nr; 841*e2fe950fSVictor Duicu int ret; 842*e2fe950fSVictor Duicu 843*e2fe950fSVictor Duicu /* Initialise internal channel( which is always present ). */ 844*e2fe950fSVictor Duicu priv->labels[0] = "internal diode"; 845*e2fe950fSVictor Duicu priv->enabled_channel_mask = 1; 846*e2fe950fSVictor Duicu 847*e2fe950fSVictor Duicu /* Default values to work on systems without devicetree or firmware nodes. */ 848*e2fe950fSVictor Duicu if (!dev_fwnode(dev)) { 849*e2fe950fSVictor Duicu priv->num_channels = device_nr_channels; 850*e2fe950fSVictor Duicu priv->enabled_channel_mask = BIT(priv->num_channels) - 1; 851*e2fe950fSVictor Duicu priv->apdd_enable = false; 852*e2fe950fSVictor Duicu priv->recd12_enable = true; 853*e2fe950fSVictor Duicu priv->recd34_enable = true; 854*e2fe950fSVictor Duicu priv->run_state = true; 855*e2fe950fSVictor Duicu return 0; 856*e2fe950fSVictor Duicu } 857*e2fe950fSVictor Duicu 858*e2fe950fSVictor Duicu priv->apdd_enable = 859*e2fe950fSVictor Duicu device_property_read_bool(dev, "microchip,enable-anti-parallel"); 860*e2fe950fSVictor Duicu 861*e2fe950fSVictor Duicu priv->recd12_enable = 862*e2fe950fSVictor Duicu device_property_read_bool(dev, "microchip,parasitic-res-on-channel1-2"); 863*e2fe950fSVictor Duicu 864*e2fe950fSVictor Duicu priv->recd34_enable = 865*e2fe950fSVictor Duicu device_property_read_bool(dev, "microchip,parasitic-res-on-channel3-4"); 866*e2fe950fSVictor Duicu 867*e2fe950fSVictor Duicu priv->run_state = 868*e2fe950fSVictor Duicu device_property_read_bool(dev, "microchip,power-state"); 869*e2fe950fSVictor Duicu 870*e2fe950fSVictor Duicu priv->num_channels = device_get_child_node_count(dev) + 1; 871*e2fe950fSVictor Duicu 872*e2fe950fSVictor Duicu if (priv->num_channels > device_nr_channels) 873*e2fe950fSVictor Duicu return dev_err_probe(dev, -EINVAL, 874*e2fe950fSVictor Duicu "More channels than the chip supports.\n"); 875*e2fe950fSVictor Duicu 876*e2fe950fSVictor Duicu /* Read information about the external channels. */ 877*e2fe950fSVictor Duicu device_for_each_named_child_node_scoped(dev, child, "channel") { 878*e2fe950fSVictor Duicu reg_nr = 0; 879*e2fe950fSVictor Duicu ret = fwnode_property_read_u32(child, "reg", ®_nr); 880*e2fe950fSVictor Duicu if (ret || !reg_nr || reg_nr >= device_nr_channels) 881*e2fe950fSVictor Duicu return dev_err_probe(dev, -EINVAL, 882*e2fe950fSVictor Duicu "Channel reg is incorrectly set.\n"); 883*e2fe950fSVictor Duicu 884*e2fe950fSVictor Duicu fwnode_property_read_string(child, "label", &priv->labels[reg_nr]); 885*e2fe950fSVictor Duicu set_bit(reg_nr, &priv->enabled_channel_mask); 886*e2fe950fSVictor Duicu } 887*e2fe950fSVictor Duicu 888*e2fe950fSVictor Duicu return 0; 889*e2fe950fSVictor Duicu } 890*e2fe950fSVictor Duicu 891*e2fe950fSVictor Duicu static const struct hwmon_chip_info mcp998x_chip_info = { 892*e2fe950fSVictor Duicu .ops = &mcp9982_hwmon_ops, 893*e2fe950fSVictor Duicu .info = mcp9985_info, 894*e2fe950fSVictor Duicu }; 895*e2fe950fSVictor Duicu 896*e2fe950fSVictor Duicu static int mcp9982_probe(struct i2c_client *client) 897*e2fe950fSVictor Duicu { 898*e2fe950fSVictor Duicu const struct mcp9982_features *chip; 899*e2fe950fSVictor Duicu struct device *dev = &client->dev; 900*e2fe950fSVictor Duicu struct mcp9982_priv *priv; 901*e2fe950fSVictor Duicu struct device *hwmon_dev; 902*e2fe950fSVictor Duicu int ret; 903*e2fe950fSVictor Duicu 904*e2fe950fSVictor Duicu priv = devm_kzalloc(dev, sizeof(struct mcp9982_priv), GFP_KERNEL); 905*e2fe950fSVictor Duicu if (!priv) 906*e2fe950fSVictor Duicu return -ENOMEM; 907*e2fe950fSVictor Duicu 908*e2fe950fSVictor Duicu priv->regmap = devm_regmap_init_i2c(client, &mcp9982_regmap_config); 909*e2fe950fSVictor Duicu 910*e2fe950fSVictor Duicu if (IS_ERR(priv->regmap)) 911*e2fe950fSVictor Duicu return dev_err_probe(dev, PTR_ERR(priv->regmap), 912*e2fe950fSVictor Duicu "Cannot initialize register map.\n"); 913*e2fe950fSVictor Duicu 914*e2fe950fSVictor Duicu dev_set_drvdata(dev, priv); 915*e2fe950fSVictor Duicu 916*e2fe950fSVictor Duicu chip = i2c_get_match_data(client); 917*e2fe950fSVictor Duicu if (!chip) 918*e2fe950fSVictor Duicu return -EINVAL; 919*e2fe950fSVictor Duicu priv->chip = chip; 920*e2fe950fSVictor Duicu 921*e2fe950fSVictor Duicu ret = mcp9982_parse_fw_config(dev, chip->phys_channels); 922*e2fe950fSVictor Duicu if (ret) 923*e2fe950fSVictor Duicu return ret; 924*e2fe950fSVictor Duicu 925*e2fe950fSVictor Duicu ret = mcp9982_init(dev, priv); 926*e2fe950fSVictor Duicu if (ret) 927*e2fe950fSVictor Duicu return ret; 928*e2fe950fSVictor Duicu 929*e2fe950fSVictor Duicu hwmon_dev = devm_hwmon_device_register_with_info(dev, chip->name, priv, 930*e2fe950fSVictor Duicu &mcp998x_chip_info, NULL); 931*e2fe950fSVictor Duicu 932*e2fe950fSVictor Duicu return PTR_ERR_OR_ZERO(hwmon_dev); 933*e2fe950fSVictor Duicu } 934*e2fe950fSVictor Duicu 935*e2fe950fSVictor Duicu static const struct i2c_device_id mcp9982_id[] = { 936*e2fe950fSVictor Duicu { .name = "mcp9933", .driver_data = (kernel_ulong_t)&mcp9933_chip_config }, 937*e2fe950fSVictor Duicu { .name = "mcp9933d", .driver_data = (kernel_ulong_t)&mcp9933d_chip_config }, 938*e2fe950fSVictor Duicu { .name = "mcp9982", .driver_data = (kernel_ulong_t)&mcp9982_chip_config }, 939*e2fe950fSVictor Duicu { .name = "mcp9982d", .driver_data = (kernel_ulong_t)&mcp9982d_chip_config }, 940*e2fe950fSVictor Duicu { .name = "mcp9983", .driver_data = (kernel_ulong_t)&mcp9983_chip_config }, 941*e2fe950fSVictor Duicu { .name = "mcp9983d", .driver_data = (kernel_ulong_t)&mcp9983d_chip_config }, 942*e2fe950fSVictor Duicu { .name = "mcp9984", .driver_data = (kernel_ulong_t)&mcp9984_chip_config }, 943*e2fe950fSVictor Duicu { .name = "mcp9984d", .driver_data = (kernel_ulong_t)&mcp9984d_chip_config }, 944*e2fe950fSVictor Duicu { .name = "mcp9985", .driver_data = (kernel_ulong_t)&mcp9985_chip_config }, 945*e2fe950fSVictor Duicu { .name = "mcp9985d", .driver_data = (kernel_ulong_t)&mcp9985d_chip_config }, 946*e2fe950fSVictor Duicu { } 947*e2fe950fSVictor Duicu }; 948*e2fe950fSVictor Duicu MODULE_DEVICE_TABLE(i2c, mcp9982_id); 949*e2fe950fSVictor Duicu 950*e2fe950fSVictor Duicu static const struct of_device_id mcp9982_of_match[] = { 951*e2fe950fSVictor Duicu { 952*e2fe950fSVictor Duicu .compatible = "microchip,mcp9933", 953*e2fe950fSVictor Duicu .data = &mcp9933_chip_config, 954*e2fe950fSVictor Duicu }, { 955*e2fe950fSVictor Duicu .compatible = "microchip,mcp9933d", 956*e2fe950fSVictor Duicu .data = &mcp9933d_chip_config, 957*e2fe950fSVictor Duicu }, { 958*e2fe950fSVictor Duicu .compatible = "microchip,mcp9982", 959*e2fe950fSVictor Duicu .data = &mcp9982_chip_config, 960*e2fe950fSVictor Duicu }, { 961*e2fe950fSVictor Duicu .compatible = "microchip,mcp9982d", 962*e2fe950fSVictor Duicu .data = &mcp9982d_chip_config, 963*e2fe950fSVictor Duicu }, { 964*e2fe950fSVictor Duicu .compatible = "microchip,mcp9983", 965*e2fe950fSVictor Duicu .data = &mcp9983_chip_config, 966*e2fe950fSVictor Duicu }, { 967*e2fe950fSVictor Duicu .compatible = "microchip,mcp9983d", 968*e2fe950fSVictor Duicu .data = &mcp9983d_chip_config, 969*e2fe950fSVictor Duicu }, { 970*e2fe950fSVictor Duicu .compatible = "microchip,mcp9984", 971*e2fe950fSVictor Duicu .data = &mcp9984_chip_config, 972*e2fe950fSVictor Duicu }, { 973*e2fe950fSVictor Duicu .compatible = "microchip,mcp9984d", 974*e2fe950fSVictor Duicu .data = &mcp9984d_chip_config, 975*e2fe950fSVictor Duicu }, { 976*e2fe950fSVictor Duicu .compatible = "microchip,mcp9985", 977*e2fe950fSVictor Duicu .data = &mcp9985_chip_config, 978*e2fe950fSVictor Duicu }, { 979*e2fe950fSVictor Duicu .compatible = "microchip,mcp9985d", 980*e2fe950fSVictor Duicu .data = &mcp9985d_chip_config, 981*e2fe950fSVictor Duicu }, 982*e2fe950fSVictor Duicu { } 983*e2fe950fSVictor Duicu }; 984*e2fe950fSVictor Duicu MODULE_DEVICE_TABLE(of, mcp9982_of_match); 985*e2fe950fSVictor Duicu 986*e2fe950fSVictor Duicu static struct i2c_driver mcp9982_driver = { 987*e2fe950fSVictor Duicu .driver = { 988*e2fe950fSVictor Duicu .name = "mcp9982", 989*e2fe950fSVictor Duicu .of_match_table = mcp9982_of_match, 990*e2fe950fSVictor Duicu }, 991*e2fe950fSVictor Duicu .probe = mcp9982_probe, 992*e2fe950fSVictor Duicu .id_table = mcp9982_id, 993*e2fe950fSVictor Duicu }; 994*e2fe950fSVictor Duicu module_i2c_driver(mcp9982_driver); 995*e2fe950fSVictor Duicu 996*e2fe950fSVictor Duicu MODULE_AUTHOR("Victor Duicu <victor.duicu@microchip.com>"); 997*e2fe950fSVictor Duicu MODULE_DESCRIPTION("MCP998X/33 and MCP998XD/33D Multichannel Automotive Temperature Monitor Driver"); 998*e2fe950fSVictor Duicu MODULE_LICENSE("GPL"); 999