linux/drivers/hwmon/max127.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Hardware monitoring driver for MAX127.
   4 *
   5 * Copyright (c) 2020 Facebook Inc.
   6 */
   7
   8#include <linux/err.h>
   9#include <linux/hwmon.h>
  10#include <linux/i2c.h>
  11#include <linux/init.h>
  12#include <linux/module.h>
  13
  14/*
  15 * MAX127 Control Byte. Refer to MAX127 datasheet, Table 1 "Control-Byte
  16 * Format" for details.
  17 */
  18#define MAX127_CTRL_START       BIT(7)
  19#define MAX127_CTRL_SEL_SHIFT   4
  20#define MAX127_CTRL_RNG         BIT(3)
  21#define MAX127_CTRL_BIP         BIT(2)
  22#define MAX127_CTRL_PD1         BIT(1)
  23#define MAX127_CTRL_PD0         BIT(0)
  24
  25#define MAX127_NUM_CHANNELS     8
  26#define MAX127_SET_CHANNEL(ch)  (((ch) & 7) << MAX127_CTRL_SEL_SHIFT)
  27
  28/*
  29 * MAX127 channel input ranges. Refer to MAX127 datasheet, Table 3 "Range
  30 * and Polarity Selection" for details.
  31 */
  32#define MAX127_FULL_RANGE       10000   /* 10V */
  33#define MAX127_HALF_RANGE       5000    /* 5V */
  34
  35/*
  36 * MAX127 returns 2 bytes at read:
  37 *   - the first byte contains data[11:4].
  38 *   - the second byte contains data[3:0] (MSB) and 4 dummy 0s (LSB).
  39 * Refer to MAX127 datasheet, "Read a Conversion (Read Cycle)" section
  40 * for details.
  41 */
  42#define MAX127_DATA_LEN         2
  43#define MAX127_DATA_SHIFT       4
  44
  45#define MAX127_SIGN_BIT         BIT(11)
  46
  47struct max127_data {
  48        struct mutex lock;
  49        struct i2c_client *client;
  50        u8 ctrl_byte[MAX127_NUM_CHANNELS];
  51};
  52
  53static int max127_select_channel(struct i2c_client *client, u8 ctrl_byte)
  54{
  55        int status;
  56        struct i2c_msg msg = {
  57                .addr = client->addr,
  58                .flags = 0,
  59                .len = sizeof(ctrl_byte),
  60                .buf = &ctrl_byte,
  61        };
  62
  63        status = i2c_transfer(client->adapter, &msg, 1);
  64        if (status < 0)
  65                return status;
  66        if (status != 1)
  67                return -EIO;
  68
  69        return 0;
  70}
  71
  72static int max127_read_channel(struct i2c_client *client, long *val)
  73{
  74        int status;
  75        u8 i2c_data[MAX127_DATA_LEN];
  76        struct i2c_msg msg = {
  77                .addr = client->addr,
  78                .flags = I2C_M_RD,
  79                .len = sizeof(i2c_data),
  80                .buf = i2c_data,
  81        };
  82
  83        status = i2c_transfer(client->adapter, &msg, 1);
  84        if (status < 0)
  85                return status;
  86        if (status != 1)
  87                return -EIO;
  88
  89        *val = (i2c_data[1] >> MAX127_DATA_SHIFT) |
  90                ((u16)i2c_data[0] << MAX127_DATA_SHIFT);
  91        return 0;
  92}
  93
  94static long max127_process_raw(u8 ctrl_byte, long raw)
  95{
  96        long scale, weight;
  97
  98        /*
  99         * MAX127's data coding is binary in unipolar mode with 1 LSB =
 100         * (Full-Scale/4096) and two’s complement binary in bipolar mode
 101         * with 1 LSB = [(2 x |FS|)/4096].
 102         * Refer to MAX127 datasheet, "Transfer Function" section for
 103         * details.
 104         */
 105        scale = (ctrl_byte & MAX127_CTRL_RNG) ? MAX127_FULL_RANGE :
 106                                                MAX127_HALF_RANGE;
 107        if (ctrl_byte & MAX127_CTRL_BIP) {
 108                weight = (raw & MAX127_SIGN_BIT);
 109                raw &= ~MAX127_SIGN_BIT;
 110                raw -= weight;
 111                raw *= 2;
 112        }
 113
 114        return raw * scale / 4096;
 115}
 116
 117static int max127_read_input(struct max127_data *data, int channel, long *val)
 118{
 119        long raw;
 120        int status;
 121        struct i2c_client *client = data->client;
 122        u8 ctrl_byte = data->ctrl_byte[channel];
 123
 124        mutex_lock(&data->lock);
 125
 126        status = max127_select_channel(client, ctrl_byte);
 127        if (status)
 128                goto exit;
 129
 130        status = max127_read_channel(client, &raw);
 131        if (status)
 132                goto exit;
 133
 134        *val = max127_process_raw(ctrl_byte, raw);
 135
 136exit:
 137        mutex_unlock(&data->lock);
 138        return status;
 139}
 140
 141static int max127_read_min(struct max127_data *data, int channel, long *val)
 142{
 143        u8 rng_bip = (data->ctrl_byte[channel] >> 2) & 3;
 144        static const int min_input_map[4] = {
 145                0,                      /* RNG=0, BIP=0 */
 146                -MAX127_HALF_RANGE,     /* RNG=0, BIP=1 */
 147                0,                      /* RNG=1, BIP=0 */
 148                -MAX127_FULL_RANGE,     /* RNG=1, BIP=1 */
 149        };
 150
 151        *val = min_input_map[rng_bip];
 152        return 0;
 153}
 154
 155static int max127_read_max(struct max127_data *data, int channel, long *val)
 156{
 157        u8 rng_bip = (data->ctrl_byte[channel] >> 2) & 3;
 158        static const int max_input_map[4] = {
 159                MAX127_HALF_RANGE,      /* RNG=0, BIP=0 */
 160                MAX127_HALF_RANGE,      /* RNG=0, BIP=1 */
 161                MAX127_FULL_RANGE,      /* RNG=1, BIP=0 */
 162                MAX127_FULL_RANGE,      /* RNG=1, BIP=1 */
 163        };
 164
 165        *val = max_input_map[rng_bip];
 166        return 0;
 167}
 168
 169static int max127_write_min(struct max127_data *data, int channel, long val)
 170{
 171        u8 ctrl;
 172
 173        mutex_lock(&data->lock);
 174
 175        ctrl = data->ctrl_byte[channel];
 176        if (val <= -MAX127_FULL_RANGE) {
 177                ctrl |= (MAX127_CTRL_RNG | MAX127_CTRL_BIP);
 178        } else if (val < 0) {
 179                ctrl |= MAX127_CTRL_BIP;
 180                ctrl &= ~MAX127_CTRL_RNG;
 181        } else {
 182                ctrl &= ~MAX127_CTRL_BIP;
 183        }
 184        data->ctrl_byte[channel] = ctrl;
 185
 186        mutex_unlock(&data->lock);
 187
 188        return 0;
 189}
 190
 191static int max127_write_max(struct max127_data *data, int channel, long val)
 192{
 193        mutex_lock(&data->lock);
 194
 195        if (val >= MAX127_FULL_RANGE)
 196                data->ctrl_byte[channel] |= MAX127_CTRL_RNG;
 197        else
 198                data->ctrl_byte[channel] &= ~MAX127_CTRL_RNG;
 199
 200        mutex_unlock(&data->lock);
 201
 202        return 0;
 203}
 204
 205static umode_t max127_is_visible(const void *_data,
 206                                 enum hwmon_sensor_types type,
 207                                 u32 attr, int channel)
 208{
 209        if (type == hwmon_in) {
 210                switch (attr) {
 211                case hwmon_in_input:
 212                        return 0444;
 213
 214                case hwmon_in_min:
 215                case hwmon_in_max:
 216                        return 0644;
 217
 218                default:
 219                        break;
 220                }
 221        }
 222
 223        return 0;
 224}
 225
 226static int max127_read(struct device *dev, enum hwmon_sensor_types type,
 227                        u32 attr, int channel, long *val)
 228{
 229        int status;
 230        struct max127_data *data = dev_get_drvdata(dev);
 231
 232        if (type != hwmon_in)
 233                return -EOPNOTSUPP;
 234
 235        switch (attr) {
 236        case hwmon_in_input:
 237                status = max127_read_input(data, channel, val);
 238                break;
 239
 240        case hwmon_in_min:
 241                status = max127_read_min(data, channel, val);
 242                break;
 243
 244        case hwmon_in_max:
 245                status = max127_read_max(data, channel, val);
 246                break;
 247
 248        default:
 249                status = -EOPNOTSUPP;
 250                break;
 251        }
 252
 253        return status;
 254}
 255
 256static int max127_write(struct device *dev, enum hwmon_sensor_types type,
 257                        u32 attr, int channel, long val)
 258{
 259        int status;
 260        struct max127_data *data = dev_get_drvdata(dev);
 261
 262        if (type != hwmon_in)
 263                return -EOPNOTSUPP;
 264
 265        switch (attr) {
 266        case hwmon_in_min:
 267                status = max127_write_min(data, channel, val);
 268                break;
 269
 270        case hwmon_in_max:
 271                status = max127_write_max(data, channel, val);
 272                break;
 273
 274        default:
 275                status = -EOPNOTSUPP;
 276                break;
 277        }
 278
 279        return status;
 280}
 281
 282static const struct hwmon_ops max127_hwmon_ops = {
 283        .is_visible = max127_is_visible,
 284        .read = max127_read,
 285        .write = max127_write,
 286};
 287
 288static const struct hwmon_channel_info *max127_info[] = {
 289        HWMON_CHANNEL_INFO(in,
 290                           HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX,
 291                           HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX,
 292                           HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX,
 293                           HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX,
 294                           HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX,
 295                           HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX,
 296                           HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX,
 297                           HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX),
 298        NULL,
 299};
 300
 301static const struct hwmon_chip_info max127_chip_info = {
 302        .ops = &max127_hwmon_ops,
 303        .info = max127_info,
 304};
 305
 306static int max127_probe(struct i2c_client *client,
 307                        const struct i2c_device_id *id)
 308{
 309        int i;
 310        struct device *hwmon_dev;
 311        struct max127_data *data;
 312        struct device *dev = &client->dev;
 313
 314        data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
 315        if (!data)
 316                return -ENOMEM;
 317
 318        data->client = client;
 319        mutex_init(&data->lock);
 320        for (i = 0; i < ARRAY_SIZE(data->ctrl_byte); i++)
 321                data->ctrl_byte[i] = (MAX127_CTRL_START |
 322                                      MAX127_SET_CHANNEL(i));
 323
 324        hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
 325                                                         data,
 326                                                         &max127_chip_info,
 327                                                         NULL);
 328
 329        return PTR_ERR_OR_ZERO(hwmon_dev);
 330}
 331
 332static const struct i2c_device_id max127_id[] = {
 333        { "max127", 0 },
 334        { }
 335};
 336MODULE_DEVICE_TABLE(i2c, max127_id);
 337
 338static struct i2c_driver max127_driver = {
 339        .class          = I2C_CLASS_HWMON,
 340        .driver = {
 341                .name   = "max127",
 342        },
 343        .probe          = max127_probe,
 344        .id_table       = max127_id,
 345};
 346
 347module_i2c_driver(max127_driver);
 348
 349MODULE_LICENSE("GPL");
 350MODULE_AUTHOR("Mike Choi <mikechoi@fb.com>");
 351MODULE_AUTHOR("Tao Ren <rentao.bupt@gmail.com>");
 352MODULE_DESCRIPTION("MAX127 Hardware Monitoring driver");
 353