FILE
max15301.c
File preview with syntax highlighting.
linux-6.19.14/drivers/hwmon/pmbus/max15301.c
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Hardware monitoring driver for Maxim MAX15301 4 * 5 * Copyright (c) 2021 Flextronics International Sweden AB 6 * 7 * Even though the specification does not specifically mention it, 8 * extensive empirical testing has revealed that auto-detection of 9 * limit-registers will fail in a random fashion unless the delay 10 * parameter is set to above about 80us. The default delay is set 11 * 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 { "max15303" }, 29 {} 30}; 31MODULE_DEVICE_TABLE(i2c, max15301_id); 32 33struct max15301_data { 34 int id; 35 struct pmbus_driver_info info; 36}; 37 38#define to_max15301_data(x) container_of(x, struct max15301_data, info) 39 40#define MAX15301_WAIT_TIME 100 /* us */ 41 42static ushort delay = MAX15301_WAIT_TIME; 43module_param(delay, ushort, 0644); 44MODULE_PARM_DESC(delay, "Delay between chip accesses in us"); 45 46static struct max15301_data max15301_data = { 47 .info = { 48 .pages = 1, 49 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 50 | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT 51 | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 52 | PMBUS_HAVE_STATUS_TEMP 53 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 54 } 55}; 56 57static int max15301_probe(struct i2c_client *client) 58{ 59 int status; 60 u8 device_id[I2C_SMBUS_BLOCK_MAX + 1]; 61 const struct i2c_device_id *mid; 62 struct pmbus_driver_info *info = &max15301_data.info; 63 64 if (!i2c_check_functionality(client->adapter, 65 I2C_FUNC_SMBUS_READ_BYTE_DATA 66 | I2C_FUNC_SMBUS_BLOCK_DATA)) 67 return -ENODEV; 68 69 status = i2c_smbus_read_block_data(client, PMBUS_IC_DEVICE_ID, device_id); 70 if (status < 0) { 71 dev_err(&client->dev, "Failed to read Device Id\n"); 72 return status; 73 } 74 for (mid = max15301_id; mid->name[0]; mid++) { 75 if (!strncasecmp(mid->name, device_id, strlen(mid->name))) 76 break; 77 } 78 if (!mid->name[0]) { 79 dev_err(&client->dev, "Unsupported device\n"); 80 return -ENODEV; 81 } 82 83 info->access_delay = delay; 84 85 return pmbus_do_probe(client, info); 86} 87 88static struct i2c_driver max15301_driver = { 89 .driver = { 90 .name = "max15301", 91 }, 92 .probe = max15301_probe, 93 .id_table = max15301_id, 94}; 95 96module_i2c_driver(max15301_driver); 97 98MODULE_AUTHOR("Erik Rosen <erik.rosen@metormote.com>"); 99MODULE_DESCRIPTION("PMBus driver for Maxim MAX15301"); 100MODULE_LICENSE("GPL"); 101MODULE_IMPORT_NS("PMBUS");
~/
Read-only file preview.