1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright 2026 Nexthop Systems. 4 */ 5 6 #include <linux/i2c.h> 7 #include <linux/of.h> 8 #include <linux/module.h> 9 #include <linux/pmbus.h> 10 #include <linux/string.h> 11 12 #include "pmbus.h" 13 14 static const struct i2c_device_id d1u74t_id[] = { 15 { "d1u74t" }, 16 {}, 17 }; 18 MODULE_DEVICE_TABLE(i2c, d1u74t_id); 19 20 static struct pmbus_driver_info d1u74t_info = { 21 .pages = 1, 22 /* PSU uses default linear data format. */ 23 .func[0] = PMBUS_HAVE_PIN | PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT | 24 PMBUS_HAVE_IIN | PMBUS_HAVE_VIN | PMBUS_HAVE_STATUS_INPUT | 25 PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_TEMP | 26 PMBUS_HAVE_TEMP2 | PMBUS_HAVE_TEMP3 | 27 PMBUS_HAVE_STATUS_TEMP | PMBUS_HAVE_FAN12 | 28 PMBUS_HAVE_STATUS_FAN12, 29 }; 30 31 static int d1u74t_probe(struct i2c_client *client) 32 { 33 char buf[I2C_SMBUS_BLOCK_MAX + 2] = { 0 }; 34 struct device *dev = &client->dev; 35 int rc; 36 37 rc = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, buf); 38 if (rc < 0) 39 return dev_err_probe(dev, rc, "Failed to read PMBUS_MFR_ID\n"); 40 41 if (rc != 9 || strncmp(buf, "Murata-PS", 9)) { 42 buf[rc] = '\0'; 43 return dev_err_probe(dev, -ENODEV, 44 "Unsupported Manufacturer ID '%s'\n", 45 buf); 46 } 47 48 rc = i2c_smbus_read_block_data(client, PMBUS_MFR_MODEL, buf); 49 if (rc < 0) 50 return dev_err_probe(dev, rc, 51 "Failed to read PMBUS_MFR_MODEL\n"); 52 53 if (rc < 8 || strncmp(buf, "D1U74T-W", 8)) { 54 buf[rc] = '\0'; 55 return dev_err_probe(dev, -ENODEV, "Model '%s' not supported\n", 56 buf); 57 } 58 59 rc = pmbus_do_probe(client, &d1u74t_info); 60 if (rc) 61 return dev_err_probe(dev, rc, "Failed to probe\n"); 62 63 return 0; 64 } 65 66 static const struct of_device_id d1u74t_of_match[] = { 67 { 68 .compatible = "murata,d1u74t", 69 }, 70 {}, 71 }; 72 MODULE_DEVICE_TABLE(of, d1u74t_of_match); 73 74 static struct i2c_driver d1u74t_driver = { 75 .driver = { 76 .name = "d1u74t", 77 .of_match_table = d1u74t_of_match, 78 }, 79 .probe = d1u74t_probe, 80 .id_table = d1u74t_id, 81 }; 82 83 module_i2c_driver(d1u74t_driver); 84 85 MODULE_AUTHOR("Abdurrahman Hussain"); 86 MODULE_DESCRIPTION("PMBus driver for Murata D1U74T-W power supplies"); 87 MODULE_LICENSE("GPL"); 88 MODULE_IMPORT_NS("PMBUS"); 89