1 /* 2 * Copyright (C) 2017 IBM Corp. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 */ 9 10 #include <linux/kernel.h> 11 #include <linux/module.h> 12 #include <linux/init.h> 13 #include <linux/err.h> 14 #include <linux/i2c.h> 15 #include "pmbus.h" 16 17 enum max31785_regs { 18 MFR_REVISION = 0x9b, 19 }; 20 21 #define MAX31785_NR_PAGES 23 22 23 #define MAX31785_FAN_FUNCS \ 24 (PMBUS_HAVE_FAN12 | PMBUS_HAVE_STATUS_FAN12) 25 26 #define MAX31785_TEMP_FUNCS \ 27 (PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP) 28 29 #define MAX31785_VOUT_FUNCS \ 30 (PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT) 31 32 static const struct pmbus_driver_info max31785_info = { 33 .pages = MAX31785_NR_PAGES, 34 35 /* RPM */ 36 .format[PSC_FAN] = direct, 37 .m[PSC_FAN] = 1, 38 .b[PSC_FAN] = 0, 39 .R[PSC_FAN] = 0, 40 .func[0] = MAX31785_FAN_FUNCS, 41 .func[1] = MAX31785_FAN_FUNCS, 42 .func[2] = MAX31785_FAN_FUNCS, 43 .func[3] = MAX31785_FAN_FUNCS, 44 .func[4] = MAX31785_FAN_FUNCS, 45 .func[5] = MAX31785_FAN_FUNCS, 46 47 .format[PSC_TEMPERATURE] = direct, 48 .m[PSC_TEMPERATURE] = 1, 49 .b[PSC_TEMPERATURE] = 0, 50 .R[PSC_TEMPERATURE] = 2, 51 .func[6] = MAX31785_TEMP_FUNCS, 52 .func[7] = MAX31785_TEMP_FUNCS, 53 .func[8] = MAX31785_TEMP_FUNCS, 54 .func[9] = MAX31785_TEMP_FUNCS, 55 .func[10] = MAX31785_TEMP_FUNCS, 56 .func[11] = MAX31785_TEMP_FUNCS, 57 .func[12] = MAX31785_TEMP_FUNCS, 58 .func[13] = MAX31785_TEMP_FUNCS, 59 .func[14] = MAX31785_TEMP_FUNCS, 60 .func[15] = MAX31785_TEMP_FUNCS, 61 .func[16] = MAX31785_TEMP_FUNCS, 62 63 .format[PSC_VOLTAGE_OUT] = direct, 64 .m[PSC_VOLTAGE_OUT] = 1, 65 .b[PSC_VOLTAGE_OUT] = 0, 66 .R[PSC_VOLTAGE_OUT] = 0, 67 .func[17] = MAX31785_VOUT_FUNCS, 68 .func[18] = MAX31785_VOUT_FUNCS, 69 .func[19] = MAX31785_VOUT_FUNCS, 70 .func[20] = MAX31785_VOUT_FUNCS, 71 .func[21] = MAX31785_VOUT_FUNCS, 72 .func[22] = MAX31785_VOUT_FUNCS, 73 }; 74 75 static int max31785_probe(struct i2c_client *client, 76 const struct i2c_device_id *id) 77 { 78 struct device *dev = &client->dev; 79 struct pmbus_driver_info *info; 80 s64 ret; 81 82 info = devm_kzalloc(dev, sizeof(struct pmbus_driver_info), GFP_KERNEL); 83 if (!info) 84 return -ENOMEM; 85 86 *info = max31785_info; 87 88 ret = i2c_smbus_write_byte_data(client, PMBUS_PAGE, 255); 89 if (ret < 0) 90 return ret; 91 92 return pmbus_do_probe(client, id, info); 93 } 94 95 static const struct i2c_device_id max31785_id[] = { 96 { "max31785", 0 }, 97 { "max31785a", 0 }, 98 { }, 99 }; 100 101 MODULE_DEVICE_TABLE(i2c, max31785_id); 102 103 static struct i2c_driver max31785_driver = { 104 .driver = { 105 .name = "max31785", 106 }, 107 .probe = max31785_probe, 108 .remove = pmbus_do_remove, 109 .id_table = max31785_id, 110 }; 111 112 module_i2c_driver(max31785_driver); 113 114 MODULE_AUTHOR("Andrew Jeffery <andrew@aj.id.au>"); 115 MODULE_DESCRIPTION("PMBus driver for the Maxim MAX31785"); 116 MODULE_LICENSE("GPL"); 117