101 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Hardware monitoring driver for Maxim MAX153014 *5 * Copyright (c) 2021 Flextronics International Sweden AB6 *7 * Even though the specification does not specifically mention it,8 * extensive empirical testing has revealed that auto-detection of9 * limit-registers will fail in a random fashion unless the delay10 * parameter is set to above about 80us. The default delay is set11 * to 100us to include some safety margin.12 */13 14#include <linux/kernel.h>15#include <linux/module.h>16#include <linux/init.h>17#include <linux/err.h>18#include <linux/slab.h>19#include <linux/i2c.h>20#include <linux/ktime.h>21#include <linux/delay.h>22#include <linux/pmbus.h>23#include "pmbus.h"24 25static const struct i2c_device_id max15301_id[] = {26 { "bmr461" },27 { "max15301" },28 {}29};30MODULE_DEVICE_TABLE(i2c, max15301_id);31 32struct max15301_data {33 int id;34 struct pmbus_driver_info info;35};36 37#define to_max15301_data(x) container_of(x, struct max15301_data, info)38 39#define MAX15301_WAIT_TIME 100 /* us */40 41static ushort delay = MAX15301_WAIT_TIME;42module_param(delay, ushort, 0644);43MODULE_PARM_DESC(delay, "Delay between chip accesses in us");44 45static struct max15301_data max15301_data = {46 .info = {47 .pages = 1,48 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT49 | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT50 | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP251 | PMBUS_HAVE_STATUS_TEMP52 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT,53 }54};55 56static int max15301_probe(struct i2c_client *client)57{58 int status;59 u8 device_id[I2C_SMBUS_BLOCK_MAX + 1];60 const struct i2c_device_id *mid;61 struct pmbus_driver_info *info = &max15301_data.info;62 63 if (!i2c_check_functionality(client->adapter,64 I2C_FUNC_SMBUS_READ_BYTE_DATA65 | I2C_FUNC_SMBUS_BLOCK_DATA))66 return -ENODEV;67 68 status = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, device_id);69 if (status < 0) {70 dev_err(&client->dev, "Failed to read Device Id\n");71 return status;72 }73 for (mid = max15301_id; mid->name[0]; mid++) {74 if (!strncasecmp(mid->name, device_id, strlen(mid->name)))75 break;76 }77 if (!mid->name[0]) {78 dev_err(&client->dev, "Unsupported device\n");79 return -ENODEV;80 }81 82 info->access_delay = delay;83 84 return pmbus_do_probe(client, info);85}86 87static struct i2c_driver max15301_driver = {88 .driver = {89 .name = "max15301",90 },91 .probe = max15301_probe,92 .id_table = max15301_id,93};94 95module_i2c_driver(max15301_driver);96 97MODULE_AUTHOR("Erik Rosen <erik.rosen@metormote.com>");98MODULE_DESCRIPTION("PMBus driver for Maxim MAX15301");99MODULE_LICENSE("GPL");100MODULE_IMPORT_NS(PMBUS);101