0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/kernel.h>
0009 #include <linux/module.h>
0010 #include <linux/init.h>
0011 #include <linux/err.h>
0012 #include <linux/i2c.h>
0013 #include "pmbus.h"
0014
0015 #define MAX16064_MFR_VOUT_PEAK 0xd4
0016 #define MAX16064_MFR_TEMPERATURE_PEAK 0xd6
0017
0018 static int max16064_read_word_data(struct i2c_client *client, int page,
0019 int phase, int reg)
0020 {
0021 int ret;
0022
0023 switch (reg) {
0024 case PMBUS_VIRT_READ_VOUT_MAX:
0025 ret = pmbus_read_word_data(client, page, phase,
0026 MAX16064_MFR_VOUT_PEAK);
0027 break;
0028 case PMBUS_VIRT_READ_TEMP_MAX:
0029 ret = pmbus_read_word_data(client, page, phase,
0030 MAX16064_MFR_TEMPERATURE_PEAK);
0031 break;
0032 case PMBUS_VIRT_RESET_VOUT_HISTORY:
0033 case PMBUS_VIRT_RESET_TEMP_HISTORY:
0034 ret = 0;
0035 break;
0036 default:
0037 ret = -ENODATA;
0038 break;
0039 }
0040 return ret;
0041 }
0042
0043 static int max16064_write_word_data(struct i2c_client *client, int page,
0044 int reg, u16 word)
0045 {
0046 int ret;
0047
0048 switch (reg) {
0049 case PMBUS_VIRT_RESET_VOUT_HISTORY:
0050 ret = pmbus_write_word_data(client, page,
0051 MAX16064_MFR_VOUT_PEAK, 0);
0052 break;
0053 case PMBUS_VIRT_RESET_TEMP_HISTORY:
0054 ret = pmbus_write_word_data(client, page,
0055 MAX16064_MFR_TEMPERATURE_PEAK,
0056 0xffff);
0057 break;
0058 default:
0059 ret = -ENODATA;
0060 break;
0061 }
0062 return ret;
0063 }
0064
0065 static struct pmbus_driver_info max16064_info = {
0066 .pages = 4,
0067 .format[PSC_VOLTAGE_IN] = direct,
0068 .format[PSC_VOLTAGE_OUT] = direct,
0069 .format[PSC_TEMPERATURE] = direct,
0070 .m[PSC_VOLTAGE_IN] = 19995,
0071 .b[PSC_VOLTAGE_IN] = 0,
0072 .R[PSC_VOLTAGE_IN] = -1,
0073 .m[PSC_VOLTAGE_OUT] = 19995,
0074 .b[PSC_VOLTAGE_OUT] = 0,
0075 .R[PSC_VOLTAGE_OUT] = -1,
0076 .m[PSC_TEMPERATURE] = -7612,
0077 .b[PSC_TEMPERATURE] = 335,
0078 .R[PSC_TEMPERATURE] = -3,
0079 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_TEMP
0080 | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_TEMP,
0081 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0082 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0083 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT,
0084 .read_word_data = max16064_read_word_data,
0085 .write_word_data = max16064_write_word_data,
0086 };
0087
0088 static int max16064_probe(struct i2c_client *client)
0089 {
0090 return pmbus_do_probe(client, &max16064_info);
0091 }
0092
0093 static const struct i2c_device_id max16064_id[] = {
0094 {"max16064", 0},
0095 {}
0096 };
0097
0098 MODULE_DEVICE_TABLE(i2c, max16064_id);
0099
0100
0101 static struct i2c_driver max16064_driver = {
0102 .driver = {
0103 .name = "max16064",
0104 },
0105 .probe_new = max16064_probe,
0106 .id_table = max16064_id,
0107 };
0108
0109 module_i2c_driver(max16064_driver);
0110
0111 MODULE_AUTHOR("Guenter Roeck");
0112 MODULE_DESCRIPTION("PMBus driver for Maxim MAX16064");
0113 MODULE_LICENSE("GPL");
0114 MODULE_IMPORT_NS(PMBUS);