root/drivers/hwmon/max31790.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. max31790_update_device
  2. get_tach_period
  3. bits_for_tach_period
  4. max31790_read_fan
  5. max31790_write_fan
  6. max31790_fan_is_visible
  7. max31790_read_pwm
  8. max31790_write_pwm
  9. max31790_pwm_is_visible
  10. max31790_read
  11. max31790_write
  12. max31790_is_visible
  13. max31790_init_client
  14. max31790_probe

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * max31790.c - Part of lm_sensors, Linux kernel modules for hardware
   4  *             monitoring.
   5  *
   6  * (C) 2015 by Il Han <corone.il.han@gmail.com>
   7  */
   8 
   9 #include <linux/err.h>
  10 #include <linux/hwmon.h>
  11 #include <linux/i2c.h>
  12 #include <linux/init.h>
  13 #include <linux/jiffies.h>
  14 #include <linux/module.h>
  15 #include <linux/slab.h>
  16 
  17 /* MAX31790 registers */
  18 #define MAX31790_REG_GLOBAL_CONFIG      0x00
  19 #define MAX31790_REG_FAN_CONFIG(ch)     (0x02 + (ch))
  20 #define MAX31790_REG_FAN_DYNAMICS(ch)   (0x08 + (ch))
  21 #define MAX31790_REG_FAN_FAULT_STATUS2  0x10
  22 #define MAX31790_REG_FAN_FAULT_STATUS1  0x11
  23 #define MAX31790_REG_TACH_COUNT(ch)     (0x18 + (ch) * 2)
  24 #define MAX31790_REG_PWM_DUTY_CYCLE(ch) (0x30 + (ch) * 2)
  25 #define MAX31790_REG_PWMOUT(ch)         (0x40 + (ch) * 2)
  26 #define MAX31790_REG_TARGET_COUNT(ch)   (0x50 + (ch) * 2)
  27 
  28 /* Fan Config register bits */
  29 #define MAX31790_FAN_CFG_RPM_MODE       0x80
  30 #define MAX31790_FAN_CFG_TACH_INPUT_EN  0x08
  31 #define MAX31790_FAN_CFG_TACH_INPUT     0x01
  32 
  33 /* Fan Dynamics register bits */
  34 #define MAX31790_FAN_DYN_SR_SHIFT       5
  35 #define MAX31790_FAN_DYN_SR_MASK        0xE0
  36 #define SR_FROM_REG(reg)                (((reg) & MAX31790_FAN_DYN_SR_MASK) \
  37                                          >> MAX31790_FAN_DYN_SR_SHIFT)
  38 
  39 #define FAN_RPM_MIN                     120
  40 #define FAN_RPM_MAX                     7864320
  41 
  42 #define RPM_FROM_REG(reg, sr)           (((reg) >> 4) ? \
  43                                          ((60 * (sr) * 8192) / ((reg) >> 4)) : \
  44                                          FAN_RPM_MAX)
  45 #define RPM_TO_REG(rpm, sr)             ((60 * (sr) * 8192) / ((rpm) * 2))
  46 
  47 #define NR_CHANNEL                      6
  48 
  49 /*
  50  * Client data (each client gets its own)
  51  */
  52 struct max31790_data {
  53         struct i2c_client *client;
  54         struct mutex update_lock;
  55         bool valid; /* zero until following fields are valid */
  56         unsigned long last_updated; /* in jiffies */
  57 
  58         /* register values */
  59         u8 fan_config[NR_CHANNEL];
  60         u8 fan_dynamics[NR_CHANNEL];
  61         u16 fault_status;
  62         u16 tach[NR_CHANNEL * 2];
  63         u16 pwm[NR_CHANNEL];
  64         u16 target_count[NR_CHANNEL];
  65 };
  66 
  67 static struct max31790_data *max31790_update_device(struct device *dev)
  68 {
  69         struct max31790_data *data = dev_get_drvdata(dev);
  70         struct i2c_client *client = data->client;
  71         struct max31790_data *ret = data;
  72         int i;
  73         int rv;
  74 
  75         mutex_lock(&data->update_lock);
  76 
  77         if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
  78                 rv = i2c_smbus_read_byte_data(client,
  79                                 MAX31790_REG_FAN_FAULT_STATUS1);
  80                 if (rv < 0)
  81                         goto abort;
  82                 data->fault_status = rv & 0x3F;
  83 
  84                 rv = i2c_smbus_read_byte_data(client,
  85                                 MAX31790_REG_FAN_FAULT_STATUS2);
  86                 if (rv < 0)
  87                         goto abort;
  88                 data->fault_status |= (rv & 0x3F) << 6;
  89 
  90                 for (i = 0; i < NR_CHANNEL; i++) {
  91                         rv = i2c_smbus_read_word_swapped(client,
  92                                         MAX31790_REG_TACH_COUNT(i));
  93                         if (rv < 0)
  94                                 goto abort;
  95                         data->tach[i] = rv;
  96 
  97                         if (data->fan_config[i]
  98                             & MAX31790_FAN_CFG_TACH_INPUT) {
  99                                 rv = i2c_smbus_read_word_swapped(client,
 100                                         MAX31790_REG_TACH_COUNT(NR_CHANNEL
 101                                                                 + i));
 102                                 if (rv < 0)
 103                                         goto abort;
 104                                 data->tach[NR_CHANNEL + i] = rv;
 105                         } else {
 106                                 rv = i2c_smbus_read_word_swapped(client,
 107                                                 MAX31790_REG_PWMOUT(i));
 108                                 if (rv < 0)
 109                                         goto abort;
 110                                 data->pwm[i] = rv;
 111 
 112                                 rv = i2c_smbus_read_word_swapped(client,
 113                                                 MAX31790_REG_TARGET_COUNT(i));
 114                                 if (rv < 0)
 115                                         goto abort;
 116                                 data->target_count[i] = rv;
 117                         }
 118                 }
 119 
 120                 data->last_updated = jiffies;
 121                 data->valid = true;
 122         }
 123         goto done;
 124 
 125 abort:
 126         data->valid = false;
 127         ret = ERR_PTR(rv);
 128 
 129 done:
 130         mutex_unlock(&data->update_lock);
 131 
 132         return ret;
 133 }
 134 
 135 static const u8 tach_period[8] = { 1, 2, 4, 8, 16, 32, 32, 32 };
 136 
 137 static u8 get_tach_period(u8 fan_dynamics)
 138 {
 139         return tach_period[SR_FROM_REG(fan_dynamics)];
 140 }
 141 
 142 static u8 bits_for_tach_period(int rpm)
 143 {
 144         u8 bits;
 145 
 146         if (rpm < 500)
 147                 bits = 0x0;
 148         else if (rpm < 1000)
 149                 bits = 0x1;
 150         else if (rpm < 2000)
 151                 bits = 0x2;
 152         else if (rpm < 4000)
 153                 bits = 0x3;
 154         else if (rpm < 8000)
 155                 bits = 0x4;
 156         else
 157                 bits = 0x5;
 158 
 159         return bits;
 160 }
 161 
 162 static int max31790_read_fan(struct device *dev, u32 attr, int channel,
 163                              long *val)
 164 {
 165         struct max31790_data *data = max31790_update_device(dev);
 166         int sr, rpm;
 167 
 168         if (IS_ERR(data))
 169                 return PTR_ERR(data);
 170 
 171         switch (attr) {
 172         case hwmon_fan_input:
 173                 sr = get_tach_period(data->fan_dynamics[channel]);
 174                 rpm = RPM_FROM_REG(data->tach[channel], sr);
 175                 *val = rpm;
 176                 return 0;
 177         case hwmon_fan_target:
 178                 sr = get_tach_period(data->fan_dynamics[channel]);
 179                 rpm = RPM_FROM_REG(data->target_count[channel], sr);
 180                 *val = rpm;
 181                 return 0;
 182         case hwmon_fan_fault:
 183                 *val = !!(data->fault_status & (1 << channel));
 184                 return 0;
 185         default:
 186                 return -EOPNOTSUPP;
 187         }
 188 }
 189 
 190 static int max31790_write_fan(struct device *dev, u32 attr, int channel,
 191                               long val)
 192 {
 193         struct max31790_data *data = dev_get_drvdata(dev);
 194         struct i2c_client *client = data->client;
 195         int target_count;
 196         int err = 0;
 197         u8 bits;
 198         int sr;
 199 
 200         mutex_lock(&data->update_lock);
 201 
 202         switch (attr) {
 203         case hwmon_fan_target:
 204                 val = clamp_val(val, FAN_RPM_MIN, FAN_RPM_MAX);
 205                 bits = bits_for_tach_period(val);
 206                 data->fan_dynamics[channel] =
 207                         ((data->fan_dynamics[channel] &
 208                           ~MAX31790_FAN_DYN_SR_MASK) |
 209                          (bits << MAX31790_FAN_DYN_SR_SHIFT));
 210                 err = i2c_smbus_write_byte_data(client,
 211                                         MAX31790_REG_FAN_DYNAMICS(channel),
 212                                         data->fan_dynamics[channel]);
 213                 if (err < 0)
 214                         break;
 215 
 216                 sr = get_tach_period(data->fan_dynamics[channel]);
 217                 target_count = RPM_TO_REG(val, sr);
 218                 target_count = clamp_val(target_count, 0x1, 0x7FF);
 219 
 220                 data->target_count[channel] = target_count << 5;
 221 
 222                 err = i2c_smbus_write_word_swapped(client,
 223                                         MAX31790_REG_TARGET_COUNT(channel),
 224                                         data->target_count[channel]);
 225                 break;
 226         default:
 227                 err = -EOPNOTSUPP;
 228                 break;
 229         }
 230 
 231         mutex_unlock(&data->update_lock);
 232 
 233         return err;
 234 }
 235 
 236 static umode_t max31790_fan_is_visible(const void *_data, u32 attr, int channel)
 237 {
 238         const struct max31790_data *data = _data;
 239         u8 fan_config = data->fan_config[channel % NR_CHANNEL];
 240 
 241         switch (attr) {
 242         case hwmon_fan_input:
 243         case hwmon_fan_fault:
 244                 if (channel < NR_CHANNEL ||
 245                     (fan_config & MAX31790_FAN_CFG_TACH_INPUT))
 246                         return 0444;
 247                 return 0;
 248         case hwmon_fan_target:
 249                 if (channel < NR_CHANNEL &&
 250                     !(fan_config & MAX31790_FAN_CFG_TACH_INPUT))
 251                         return 0644;
 252                 return 0;
 253         default:
 254                 return 0;
 255         }
 256 }
 257 
 258 static int max31790_read_pwm(struct device *dev, u32 attr, int channel,
 259                              long *val)
 260 {
 261         struct max31790_data *data = max31790_update_device(dev);
 262         u8 fan_config;
 263 
 264         if (IS_ERR(data))
 265                 return PTR_ERR(data);
 266 
 267         fan_config = data->fan_config[channel];
 268 
 269         switch (attr) {
 270         case hwmon_pwm_input:
 271                 *val = data->pwm[channel] >> 8;
 272                 return 0;
 273         case hwmon_pwm_enable:
 274                 if (fan_config & MAX31790_FAN_CFG_RPM_MODE)
 275                         *val = 2;
 276                 else if (fan_config & MAX31790_FAN_CFG_TACH_INPUT_EN)
 277                         *val = 1;
 278                 else
 279                         *val = 0;
 280                 return 0;
 281         default:
 282                 return -EOPNOTSUPP;
 283         }
 284 }
 285 
 286 static int max31790_write_pwm(struct device *dev, u32 attr, int channel,
 287                               long val)
 288 {
 289         struct max31790_data *data = dev_get_drvdata(dev);
 290         struct i2c_client *client = data->client;
 291         u8 fan_config;
 292         int err = 0;
 293 
 294         mutex_lock(&data->update_lock);
 295 
 296         switch (attr) {
 297         case hwmon_pwm_input:
 298                 if (val < 0 || val > 255) {
 299                         err = -EINVAL;
 300                         break;
 301                 }
 302                 data->pwm[channel] = val << 8;
 303                 err = i2c_smbus_write_word_swapped(client,
 304                                                    MAX31790_REG_PWMOUT(channel),
 305                                                    data->pwm[channel]);
 306                 break;
 307         case hwmon_pwm_enable:
 308                 fan_config = data->fan_config[channel];
 309                 if (val == 0) {
 310                         fan_config &= ~(MAX31790_FAN_CFG_TACH_INPUT_EN |
 311                                         MAX31790_FAN_CFG_RPM_MODE);
 312                 } else if (val == 1) {
 313                         fan_config = (fan_config |
 314                                       MAX31790_FAN_CFG_TACH_INPUT_EN) &
 315                                      ~MAX31790_FAN_CFG_RPM_MODE;
 316                 } else if (val == 2) {
 317                         fan_config |= MAX31790_FAN_CFG_TACH_INPUT_EN |
 318                                       MAX31790_FAN_CFG_RPM_MODE;
 319                 } else {
 320                         err = -EINVAL;
 321                         break;
 322                 }
 323                 data->fan_config[channel] = fan_config;
 324                 err = i2c_smbus_write_byte_data(client,
 325                                         MAX31790_REG_FAN_CONFIG(channel),
 326                                         fan_config);
 327                 break;
 328         default:
 329                 err = -EOPNOTSUPP;
 330                 break;
 331         }
 332 
 333         mutex_unlock(&data->update_lock);
 334 
 335         return err;
 336 }
 337 
 338 static umode_t max31790_pwm_is_visible(const void *_data, u32 attr, int channel)
 339 {
 340         const struct max31790_data *data = _data;
 341         u8 fan_config = data->fan_config[channel];
 342 
 343         switch (attr) {
 344         case hwmon_pwm_input:
 345         case hwmon_pwm_enable:
 346                 if (!(fan_config & MAX31790_FAN_CFG_TACH_INPUT))
 347                         return 0644;
 348                 return 0;
 349         default:
 350                 return 0;
 351         }
 352 }
 353 
 354 static int max31790_read(struct device *dev, enum hwmon_sensor_types type,
 355                          u32 attr, int channel, long *val)
 356 {
 357         switch (type) {
 358         case hwmon_fan:
 359                 return max31790_read_fan(dev, attr, channel, val);
 360         case hwmon_pwm:
 361                 return max31790_read_pwm(dev, attr, channel, val);
 362         default:
 363                 return -EOPNOTSUPP;
 364         }
 365 }
 366 
 367 static int max31790_write(struct device *dev, enum hwmon_sensor_types type,
 368                           u32 attr, int channel, long val)
 369 {
 370         switch (type) {
 371         case hwmon_fan:
 372                 return max31790_write_fan(dev, attr, channel, val);
 373         case hwmon_pwm:
 374                 return max31790_write_pwm(dev, attr, channel, val);
 375         default:
 376                 return -EOPNOTSUPP;
 377         }
 378 }
 379 
 380 static umode_t max31790_is_visible(const void *data,
 381                                    enum hwmon_sensor_types type,
 382                                    u32 attr, int channel)
 383 {
 384         switch (type) {
 385         case hwmon_fan:
 386                 return max31790_fan_is_visible(data, attr, channel);
 387         case hwmon_pwm:
 388                 return max31790_pwm_is_visible(data, attr, channel);
 389         default:
 390                 return 0;
 391         }
 392 }
 393 
 394 static const struct hwmon_channel_info *max31790_info[] = {
 395         HWMON_CHANNEL_INFO(fan,
 396                            HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
 397                            HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
 398                            HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
 399                            HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
 400                            HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
 401                            HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
 402                            HWMON_F_INPUT | HWMON_F_FAULT,
 403                            HWMON_F_INPUT | HWMON_F_FAULT,
 404                            HWMON_F_INPUT | HWMON_F_FAULT,
 405                            HWMON_F_INPUT | HWMON_F_FAULT,
 406                            HWMON_F_INPUT | HWMON_F_FAULT,
 407                            HWMON_F_INPUT | HWMON_F_FAULT),
 408         HWMON_CHANNEL_INFO(pwm,
 409                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
 410                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
 411                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
 412                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
 413                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
 414                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE),
 415         NULL
 416 };
 417 
 418 static const struct hwmon_ops max31790_hwmon_ops = {
 419         .is_visible = max31790_is_visible,
 420         .read = max31790_read,
 421         .write = max31790_write,
 422 };
 423 
 424 static const struct hwmon_chip_info max31790_chip_info = {
 425         .ops = &max31790_hwmon_ops,
 426         .info = max31790_info,
 427 };
 428 
 429 static int max31790_init_client(struct i2c_client *client,
 430                                 struct max31790_data *data)
 431 {
 432         int i, rv;
 433 
 434         for (i = 0; i < NR_CHANNEL; i++) {
 435                 rv = i2c_smbus_read_byte_data(client,
 436                                 MAX31790_REG_FAN_CONFIG(i));
 437                 if (rv < 0)
 438                         return rv;
 439                 data->fan_config[i] = rv;
 440 
 441                 rv = i2c_smbus_read_byte_data(client,
 442                                 MAX31790_REG_FAN_DYNAMICS(i));
 443                 if (rv < 0)
 444                         return rv;
 445                 data->fan_dynamics[i] = rv;
 446         }
 447 
 448         return 0;
 449 }
 450 
 451 static int max31790_probe(struct i2c_client *client,
 452                           const struct i2c_device_id *id)
 453 {
 454         struct i2c_adapter *adapter = client->adapter;
 455         struct device *dev = &client->dev;
 456         struct max31790_data *data;
 457         struct device *hwmon_dev;
 458         int err;
 459 
 460         if (!i2c_check_functionality(adapter,
 461                         I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
 462                 return -ENODEV;
 463 
 464         data = devm_kzalloc(dev, sizeof(struct max31790_data), GFP_KERNEL);
 465         if (!data)
 466                 return -ENOMEM;
 467 
 468         data->client = client;
 469         mutex_init(&data->update_lock);
 470 
 471         /*
 472          * Initialize the max31790 chip
 473          */
 474         err = max31790_init_client(client, data);
 475         if (err)
 476                 return err;
 477 
 478         hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
 479                                                          data,
 480                                                          &max31790_chip_info,
 481                                                          NULL);
 482 
 483         return PTR_ERR_OR_ZERO(hwmon_dev);
 484 }
 485 
 486 static const struct i2c_device_id max31790_id[] = {
 487         { "max31790", 0 },
 488         { }
 489 };
 490 MODULE_DEVICE_TABLE(i2c, max31790_id);
 491 
 492 static struct i2c_driver max31790_driver = {
 493         .class          = I2C_CLASS_HWMON,
 494         .probe          = max31790_probe,
 495         .driver = {
 496                 .name   = "max31790",
 497         },
 498         .id_table       = max31790_id,
 499 };
 500 
 501 module_i2c_driver(max31790_driver);
 502 
 503 MODULE_AUTHOR("Il Han <corone.il.han@gmail.com>");
 504 MODULE_DESCRIPTION("MAX31790 sensor driver");
 505 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */