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 25 static const struct i2c_device_id max15301_id[] = { 26 { "bmr461" }, 27 { "max15301" }, 28 {} 29 }; 30 MODULE_DEVICE_TABLE(i2c, max15301_id); 31 32 struct 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 41 static ushort delay = MAX15301_WAIT_TIME; 42 module_param(delay, ushort, 0644); 43 MODULE_PARM_DESC(delay, "Delay between chip accesses in us"); 44 45 static struct max15301_data max15301_data = { 46 .info = { 47 .pages = 1, 48 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT 49 | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT 50 | PMBUS_HAVE_TEMP | PMBUS_HAVE_TEMP2 51 | PMBUS_HAVE_STATUS_TEMP 52 | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT, 53 } 54 }; 55 56 static 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_DATA 65 | 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 87 static struct i2c_driver max15301_driver = { 88 .driver = { 89 .name = "max15301", 90 }, 91 .probe = max15301_probe, 92 .id_table = max15301_id, 93 }; 94 95 module_i2c_driver(max15301_driver); 96 97 MODULE_AUTHOR("Erik Rosen <erik.rosen@metormote.com>"); 98 MODULE_DESCRIPTION("PMBus driver for Maxim MAX15301"); 99 MODULE_LICENSE("GPL"); 100 MODULE_IMPORT_NS(PMBUS); 101