linux/drivers/hwmon/lm95245.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Copyright (C) 2011 Alexander Stein <alexander.stein@systec-electronic.com>
   4 *
   5 * The LM95245 is a sensor chip made by TI / National Semiconductor.
   6 * It reports up to two temperatures (its own plus an external one).
   7 *
   8 * This driver is based on lm95241.c
   9 */
  10
  11#include <linux/err.h>
  12#include <linux/init.h>
  13#include <linux/hwmon.h>
  14#include <linux/i2c.h>
  15#include <linux/module.h>
  16#include <linux/mutex.h>
  17#include <linux/regmap.h>
  18#include <linux/slab.h>
  19
  20static const unsigned short normal_i2c[] = {
  21        0x18, 0x19, 0x29, 0x4c, 0x4d, I2C_CLIENT_END };
  22
  23/* LM95245 registers */
  24/* general registers */
  25#define LM95245_REG_RW_CONFIG1          0x03
  26#define LM95245_REG_RW_CONVERS_RATE     0x04
  27#define LM95245_REG_W_ONE_SHOT          0x0F
  28
  29/* diode configuration */
  30#define LM95245_REG_RW_CONFIG2          0xBF
  31#define LM95245_REG_RW_REMOTE_OFFH      0x11
  32#define LM95245_REG_RW_REMOTE_OFFL      0x12
  33
  34/* status registers */
  35#define LM95245_REG_R_STATUS1           0x02
  36#define LM95245_REG_R_STATUS2           0x33
  37
  38/* limit registers */
  39#define LM95245_REG_RW_REMOTE_OS_LIMIT          0x07
  40#define LM95245_REG_RW_LOCAL_OS_TCRIT_LIMIT     0x20
  41#define LM95245_REG_RW_REMOTE_TCRIT_LIMIT       0x19
  42#define LM95245_REG_RW_COMMON_HYSTERESIS        0x21
  43
  44/* temperature signed */
  45#define LM95245_REG_R_LOCAL_TEMPH_S     0x00
  46#define LM95245_REG_R_LOCAL_TEMPL_S     0x30
  47#define LM95245_REG_R_REMOTE_TEMPH_S    0x01
  48#define LM95245_REG_R_REMOTE_TEMPL_S    0x10
  49/* temperature unsigned */
  50#define LM95245_REG_R_REMOTE_TEMPH_U    0x31
  51#define LM95245_REG_R_REMOTE_TEMPL_U    0x32
  52
  53/* id registers */
  54#define LM95245_REG_R_MAN_ID            0xFE
  55#define LM95245_REG_R_CHIP_ID           0xFF
  56
  57/* LM95245 specific bitfields */
  58#define CFG_STOP                0x40
  59#define CFG_REMOTE_TCRIT_MASK   0x10
  60#define CFG_REMOTE_OS_MASK      0x08
  61#define CFG_LOCAL_TCRIT_MASK    0x04
  62#define CFG_LOCAL_OS_MASK       0x02
  63
  64#define CFG2_OS_A0              0x40
  65#define CFG2_DIODE_FAULT_OS     0x20
  66#define CFG2_DIODE_FAULT_TCRIT  0x10
  67#define CFG2_REMOTE_TT          0x08
  68#define CFG2_REMOTE_FILTER_DIS  0x00
  69#define CFG2_REMOTE_FILTER_EN   0x06
  70
  71/* conversation rate in ms */
  72#define RATE_CR0063     0x00
  73#define RATE_CR0364     0x01
  74#define RATE_CR1000     0x02
  75#define RATE_CR2500     0x03
  76
  77#define STATUS1_ROS             0x10
  78#define STATUS1_DIODE_FAULT     0x04
  79#define STATUS1_RTCRIT          0x02
  80#define STATUS1_LOC             0x01
  81
  82#define MANUFACTURER_ID         0x01
  83#define LM95235_REVISION        0xB1
  84#define LM95245_REVISION        0xB3
  85
  86/* Client data (each client gets its own) */
  87struct lm95245_data {
  88        struct regmap *regmap;
  89        struct mutex update_lock;
  90        int interval;   /* in msecs */
  91};
  92
  93/* Conversions */
  94static int temp_from_reg_unsigned(u8 val_h, u8 val_l)
  95{
  96        return val_h * 1000 + val_l * 1000 / 256;
  97}
  98
  99static int temp_from_reg_signed(u8 val_h, u8 val_l)
 100{
 101        if (val_h & 0x80)
 102                return (val_h - 0x100) * 1000;
 103        return temp_from_reg_unsigned(val_h, val_l);
 104}
 105
 106static int lm95245_read_conversion_rate(struct lm95245_data *data)
 107{
 108        unsigned int rate;
 109        int ret;
 110
 111        ret = regmap_read(data->regmap, LM95245_REG_RW_CONVERS_RATE, &rate);
 112        if (ret < 0)
 113                return ret;
 114
 115        switch (rate) {
 116        case RATE_CR0063:
 117                data->interval = 63;
 118                break;
 119        case RATE_CR0364:
 120                data->interval = 364;
 121                break;
 122        case RATE_CR1000:
 123                data->interval = 1000;
 124                break;
 125        case RATE_CR2500:
 126        default:
 127                data->interval = 2500;
 128                break;
 129        }
 130        return 0;
 131}
 132
 133static int lm95245_set_conversion_rate(struct lm95245_data *data, long interval)
 134{
 135        int ret, rate;
 136
 137        if (interval <= 63) {
 138                interval = 63;
 139                rate = RATE_CR0063;
 140        } else if (interval <= 364) {
 141                interval = 364;
 142                rate = RATE_CR0364;
 143        } else if (interval <= 1000) {
 144                interval = 1000;
 145                rate = RATE_CR1000;
 146        } else {
 147                interval = 2500;
 148                rate = RATE_CR2500;
 149        }
 150
 151        ret = regmap_write(data->regmap, LM95245_REG_RW_CONVERS_RATE, rate);
 152        if (ret < 0)
 153                return ret;
 154
 155        data->interval = interval;
 156        return 0;
 157}
 158
 159static int lm95245_read_temp(struct device *dev, u32 attr, int channel,
 160                             long *val)
 161{
 162        struct lm95245_data *data = dev_get_drvdata(dev);
 163        struct regmap *regmap = data->regmap;
 164        int ret, regl, regh, regvall, regvalh;
 165
 166        switch (attr) {
 167        case hwmon_temp_input:
 168                regl = channel ? LM95245_REG_R_REMOTE_TEMPL_S :
 169                                 LM95245_REG_R_LOCAL_TEMPL_S;
 170                regh = channel ? LM95245_REG_R_REMOTE_TEMPH_S :
 171                                 LM95245_REG_R_LOCAL_TEMPH_S;
 172                ret = regmap_read(regmap, regl, &regvall);
 173                if (ret < 0)
 174                        return ret;
 175                ret = regmap_read(regmap, regh, &regvalh);
 176                if (ret < 0)
 177                        return ret;
 178                /*
 179                 * Local temp is always signed.
 180                 * Remote temp has both signed and unsigned data.
 181                 * Use signed calculation for remote if signed bit is set
 182                 * or if reported temperature is below signed limit.
 183                 */
 184                if (!channel || (regvalh & 0x80) || regvalh < 0x7f) {
 185                        *val = temp_from_reg_signed(regvalh, regvall);
 186                        return 0;
 187                }
 188                ret = regmap_read(regmap, LM95245_REG_R_REMOTE_TEMPL_U,
 189                                  &regvall);
 190                if (ret < 0)
 191                        return ret;
 192                ret = regmap_read(regmap, LM95245_REG_R_REMOTE_TEMPH_U,
 193                                  &regvalh);
 194                if (ret < 0)
 195                        return ret;
 196                *val = temp_from_reg_unsigned(regvalh, regvall);
 197                return 0;
 198        case hwmon_temp_max:
 199                ret = regmap_read(regmap, LM95245_REG_RW_REMOTE_OS_LIMIT,
 200                                  &regvalh);
 201                if (ret < 0)
 202                        return ret;
 203                *val = regvalh * 1000;
 204                return 0;
 205        case hwmon_temp_crit:
 206                regh = channel ? LM95245_REG_RW_REMOTE_TCRIT_LIMIT :
 207                                 LM95245_REG_RW_LOCAL_OS_TCRIT_LIMIT;
 208                ret = regmap_read(regmap, regh, &regvalh);
 209                if (ret < 0)
 210                        return ret;
 211                *val = regvalh * 1000;
 212                return 0;
 213        case hwmon_temp_max_hyst:
 214                ret = regmap_read(regmap, LM95245_REG_RW_REMOTE_OS_LIMIT,
 215                                  &regvalh);
 216                if (ret < 0)
 217                        return ret;
 218                ret = regmap_read(regmap, LM95245_REG_RW_COMMON_HYSTERESIS,
 219                                  &regvall);
 220                if (ret < 0)
 221                        return ret;
 222                *val = (regvalh - regvall) * 1000;
 223                return 0;
 224        case hwmon_temp_crit_hyst:
 225                regh = channel ? LM95245_REG_RW_REMOTE_TCRIT_LIMIT :
 226                                 LM95245_REG_RW_LOCAL_OS_TCRIT_LIMIT;
 227                ret = regmap_read(regmap, regh, &regvalh);
 228                if (ret < 0)
 229                        return ret;
 230                ret = regmap_read(regmap, LM95245_REG_RW_COMMON_HYSTERESIS,
 231                                  &regvall);
 232                if (ret < 0)
 233                        return ret;
 234                *val = (regvalh - regvall) * 1000;
 235                return 0;
 236        case hwmon_temp_type:
 237                ret = regmap_read(regmap, LM95245_REG_RW_CONFIG2, &regvalh);
 238                if (ret < 0)
 239                        return ret;
 240                *val = (regvalh & CFG2_REMOTE_TT) ? 1 : 2;
 241                return 0;
 242        case hwmon_temp_offset:
 243                ret = regmap_read(regmap, LM95245_REG_RW_REMOTE_OFFL,
 244                                  &regvall);
 245                if (ret < 0)
 246                        return ret;
 247                ret = regmap_read(regmap, LM95245_REG_RW_REMOTE_OFFH,
 248                                  &regvalh);
 249                if (ret < 0)
 250                        return ret;
 251                *val = temp_from_reg_signed(regvalh, regvall);
 252                return 0;
 253        case hwmon_temp_max_alarm:
 254                ret = regmap_read(regmap, LM95245_REG_R_STATUS1, &regvalh);
 255                if (ret < 0)
 256                        return ret;
 257                *val = !!(regvalh & STATUS1_ROS);
 258                return 0;
 259        case hwmon_temp_crit_alarm:
 260                ret = regmap_read(regmap, LM95245_REG_R_STATUS1, &regvalh);
 261                if (ret < 0)
 262                        return ret;
 263                *val = !!(regvalh & (channel ? STATUS1_RTCRIT : STATUS1_LOC));
 264                return 0;
 265        case hwmon_temp_fault:
 266                ret = regmap_read(regmap, LM95245_REG_R_STATUS1, &regvalh);
 267                if (ret < 0)
 268                        return ret;
 269                *val = !!(regvalh & STATUS1_DIODE_FAULT);
 270                return 0;
 271        default:
 272                return -EOPNOTSUPP;
 273        }
 274}
 275
 276static int lm95245_write_temp(struct device *dev, u32 attr, int channel,
 277                              long val)
 278{
 279        struct lm95245_data *data = dev_get_drvdata(dev);
 280        struct regmap *regmap = data->regmap;
 281        unsigned int regval;
 282        int ret, reg;
 283
 284        switch (attr) {
 285        case hwmon_temp_max:
 286                val = clamp_val(val / 1000, 0, 255);
 287                ret = regmap_write(regmap, LM95245_REG_RW_REMOTE_OS_LIMIT, val);
 288                return ret;
 289        case hwmon_temp_crit:
 290                reg = channel ? LM95245_REG_RW_REMOTE_TCRIT_LIMIT :
 291                                LM95245_REG_RW_LOCAL_OS_TCRIT_LIMIT;
 292                val = clamp_val(val / 1000, 0, channel ? 255 : 127);
 293                ret = regmap_write(regmap, reg, val);
 294                return ret;
 295        case hwmon_temp_crit_hyst:
 296                mutex_lock(&data->update_lock);
 297                ret = regmap_read(regmap, LM95245_REG_RW_LOCAL_OS_TCRIT_LIMIT,
 298                                  &regval);
 299                if (ret < 0) {
 300                        mutex_unlock(&data->update_lock);
 301                        return ret;
 302                }
 303                /* Clamp to reasonable range to prevent overflow */
 304                val = clamp_val(val, -1000000, 1000000);
 305                val = regval - val / 1000;
 306                val = clamp_val(val, 0, 31);
 307                ret = regmap_write(regmap, LM95245_REG_RW_COMMON_HYSTERESIS,
 308                                   val);
 309                mutex_unlock(&data->update_lock);
 310                return ret;
 311        case hwmon_temp_offset:
 312                val = clamp_val(val, -128000, 127875);
 313                val = val * 256 / 1000;
 314                mutex_lock(&data->update_lock);
 315                ret = regmap_write(regmap, LM95245_REG_RW_REMOTE_OFFL,
 316                                   val & 0xe0);
 317                if (ret < 0) {
 318                        mutex_unlock(&data->update_lock);
 319                        return ret;
 320                }
 321                ret = regmap_write(regmap, LM95245_REG_RW_REMOTE_OFFH,
 322                                   (val >> 8) & 0xff);
 323                mutex_unlock(&data->update_lock);
 324                return ret;
 325        case hwmon_temp_type:
 326                if (val != 1 && val != 2)
 327                        return -EINVAL;
 328                ret = regmap_update_bits(regmap, LM95245_REG_RW_CONFIG2,
 329                                         CFG2_REMOTE_TT,
 330                                         val == 1 ? CFG2_REMOTE_TT : 0);
 331                return ret;
 332        default:
 333                return -EOPNOTSUPP;
 334        }
 335}
 336
 337static int lm95245_read_chip(struct device *dev, u32 attr, int channel,
 338                             long *val)
 339{
 340        struct lm95245_data *data = dev_get_drvdata(dev);
 341
 342        switch (attr) {
 343        case hwmon_chip_update_interval:
 344                *val = data->interval;
 345                return 0;
 346        default:
 347                return -EOPNOTSUPP;
 348        }
 349}
 350
 351static int lm95245_write_chip(struct device *dev, u32 attr, int channel,
 352                              long val)
 353{
 354        struct lm95245_data *data = dev_get_drvdata(dev);
 355        int ret;
 356
 357        switch (attr) {
 358        case hwmon_chip_update_interval:
 359                mutex_lock(&data->update_lock);
 360                ret = lm95245_set_conversion_rate(data, val);
 361                mutex_unlock(&data->update_lock);
 362                return ret;
 363        default:
 364                return -EOPNOTSUPP;
 365        }
 366}
 367
 368static int lm95245_read(struct device *dev, enum hwmon_sensor_types type,
 369                        u32 attr, int channel, long *val)
 370{
 371        switch (type) {
 372        case hwmon_chip:
 373                return lm95245_read_chip(dev, attr, channel, val);
 374        case hwmon_temp:
 375                return lm95245_read_temp(dev, attr, channel, val);
 376        default:
 377                return -EOPNOTSUPP;
 378        }
 379}
 380
 381static int lm95245_write(struct device *dev, enum hwmon_sensor_types type,
 382                         u32 attr, int channel, long val)
 383{
 384        switch (type) {
 385        case hwmon_chip:
 386                return lm95245_write_chip(dev, attr, channel, val);
 387        case hwmon_temp:
 388                return lm95245_write_temp(dev, attr, channel, val);
 389        default:
 390                return -EOPNOTSUPP;
 391        }
 392}
 393
 394static umode_t lm95245_temp_is_visible(const void *data, u32 attr, int channel)
 395{
 396        switch (attr) {
 397        case hwmon_temp_input:
 398        case hwmon_temp_max_alarm:
 399        case hwmon_temp_max_hyst:
 400        case hwmon_temp_crit_alarm:
 401        case hwmon_temp_fault:
 402                return 0444;
 403        case hwmon_temp_type:
 404        case hwmon_temp_max:
 405        case hwmon_temp_crit:
 406        case hwmon_temp_offset:
 407                return 0644;
 408        case hwmon_temp_crit_hyst:
 409                return (channel == 0) ? 0644 : 0444;
 410        default:
 411                return 0;
 412        }
 413}
 414
 415static umode_t lm95245_is_visible(const void *data,
 416                                  enum hwmon_sensor_types type,
 417                                  u32 attr, int channel)
 418{
 419        switch (type) {
 420        case hwmon_chip:
 421                switch (attr) {
 422                case hwmon_chip_update_interval:
 423                        return 0644;
 424                default:
 425                        return 0;
 426                }
 427        case hwmon_temp:
 428                return lm95245_temp_is_visible(data, attr, channel);
 429        default:
 430                return 0;
 431        }
 432}
 433
 434/* Return 0 if detection is successful, -ENODEV otherwise */
 435static int lm95245_detect(struct i2c_client *new_client,
 436                          struct i2c_board_info *info)
 437{
 438        struct i2c_adapter *adapter = new_client->adapter;
 439        int address = new_client->addr;
 440        const char *name;
 441        int rev, id;
 442
 443        if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 444                return -ENODEV;
 445
 446        id = i2c_smbus_read_byte_data(new_client, LM95245_REG_R_MAN_ID);
 447        if (id != MANUFACTURER_ID)
 448                return -ENODEV;
 449
 450        rev = i2c_smbus_read_byte_data(new_client, LM95245_REG_R_CHIP_ID);
 451        switch (rev) {
 452        case LM95235_REVISION:
 453                if (address != 0x18 && address != 0x29 && address != 0x4c)
 454                        return -ENODEV;
 455                name = "lm95235";
 456                break;
 457        case LM95245_REVISION:
 458                name = "lm95245";
 459                break;
 460        default:
 461                return -ENODEV;
 462        }
 463
 464        strlcpy(info->type, name, I2C_NAME_SIZE);
 465        return 0;
 466}
 467
 468static int lm95245_init_client(struct lm95245_data *data)
 469{
 470        int ret;
 471
 472        ret = lm95245_read_conversion_rate(data);
 473        if (ret < 0)
 474                return ret;
 475
 476        return regmap_update_bits(data->regmap, LM95245_REG_RW_CONFIG1,
 477                                  CFG_STOP, 0);
 478}
 479
 480static bool lm95245_is_writeable_reg(struct device *dev, unsigned int reg)
 481{
 482        switch (reg) {
 483        case LM95245_REG_RW_CONFIG1:
 484        case LM95245_REG_RW_CONVERS_RATE:
 485        case LM95245_REG_W_ONE_SHOT:
 486        case LM95245_REG_RW_CONFIG2:
 487        case LM95245_REG_RW_REMOTE_OFFH:
 488        case LM95245_REG_RW_REMOTE_OFFL:
 489        case LM95245_REG_RW_REMOTE_OS_LIMIT:
 490        case LM95245_REG_RW_LOCAL_OS_TCRIT_LIMIT:
 491        case LM95245_REG_RW_REMOTE_TCRIT_LIMIT:
 492        case LM95245_REG_RW_COMMON_HYSTERESIS:
 493                return true;
 494        default:
 495                return false;
 496        }
 497}
 498
 499static bool lm95245_is_volatile_reg(struct device *dev, unsigned int reg)
 500{
 501        switch (reg) {
 502        case LM95245_REG_R_STATUS1:
 503        case LM95245_REG_R_STATUS2:
 504        case LM95245_REG_R_LOCAL_TEMPH_S:
 505        case LM95245_REG_R_LOCAL_TEMPL_S:
 506        case LM95245_REG_R_REMOTE_TEMPH_S:
 507        case LM95245_REG_R_REMOTE_TEMPL_S:
 508        case LM95245_REG_R_REMOTE_TEMPH_U:
 509        case LM95245_REG_R_REMOTE_TEMPL_U:
 510                return true;
 511        default:
 512                return false;
 513        }
 514}
 515
 516static const struct regmap_config lm95245_regmap_config = {
 517        .reg_bits = 8,
 518        .val_bits = 8,
 519        .writeable_reg = lm95245_is_writeable_reg,
 520        .volatile_reg = lm95245_is_volatile_reg,
 521        .cache_type = REGCACHE_RBTREE,
 522        .use_single_read = true,
 523        .use_single_write = true,
 524};
 525
 526static const struct hwmon_channel_info *lm95245_info[] = {
 527        HWMON_CHANNEL_INFO(chip,
 528                           HWMON_C_UPDATE_INTERVAL),
 529        HWMON_CHANNEL_INFO(temp,
 530                           HWMON_T_INPUT | HWMON_T_CRIT | HWMON_T_CRIT_HYST |
 531                           HWMON_T_CRIT_ALARM,
 532                           HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MAX_HYST |
 533                           HWMON_T_CRIT | HWMON_T_CRIT_HYST | HWMON_T_FAULT |
 534                           HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM |
 535                           HWMON_T_TYPE | HWMON_T_OFFSET),
 536        NULL
 537};
 538
 539static const struct hwmon_ops lm95245_hwmon_ops = {
 540        .is_visible = lm95245_is_visible,
 541        .read = lm95245_read,
 542        .write = lm95245_write,
 543};
 544
 545static const struct hwmon_chip_info lm95245_chip_info = {
 546        .ops = &lm95245_hwmon_ops,
 547        .info = lm95245_info,
 548};
 549
 550static int lm95245_probe(struct i2c_client *client)
 551{
 552        struct device *dev = &client->dev;
 553        struct lm95245_data *data;
 554        struct device *hwmon_dev;
 555        int ret;
 556
 557        data = devm_kzalloc(dev, sizeof(struct lm95245_data), GFP_KERNEL);
 558        if (!data)
 559                return -ENOMEM;
 560
 561        data->regmap = devm_regmap_init_i2c(client, &lm95245_regmap_config);
 562        if (IS_ERR(data->regmap))
 563                return PTR_ERR(data->regmap);
 564
 565        mutex_init(&data->update_lock);
 566
 567        /* Initialize the LM95245 chip */
 568        ret = lm95245_init_client(data);
 569        if (ret < 0)
 570                return ret;
 571
 572        hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
 573                                                         data,
 574                                                         &lm95245_chip_info,
 575                                                         NULL);
 576        return PTR_ERR_OR_ZERO(hwmon_dev);
 577}
 578
 579/* Driver data (common to all clients) */
 580static const struct i2c_device_id lm95245_id[] = {
 581        { "lm95235", 0 },
 582        { "lm95245", 0 },
 583        { }
 584};
 585MODULE_DEVICE_TABLE(i2c, lm95245_id);
 586
 587static const struct of_device_id __maybe_unused lm95245_of_match[] = {
 588        { .compatible = "national,lm95235" },
 589        { .compatible = "national,lm95245" },
 590        { },
 591};
 592MODULE_DEVICE_TABLE(of, lm95245_of_match);
 593
 594static struct i2c_driver lm95245_driver = {
 595        .class          = I2C_CLASS_HWMON,
 596        .driver = {
 597                .name   = "lm95245",
 598                .of_match_table = of_match_ptr(lm95245_of_match),
 599        },
 600        .probe_new      = lm95245_probe,
 601        .id_table       = lm95245_id,
 602        .detect         = lm95245_detect,
 603        .address_list   = normal_i2c,
 604};
 605
 606module_i2c_driver(lm95245_driver);
 607
 608MODULE_AUTHOR("Alexander Stein <alexander.stein@systec-electronic.com>");
 609MODULE_DESCRIPTION("LM95235/LM95245 sensor driver");
 610MODULE_LICENSE("GPL");
 611