Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Hardware monitoring driver for Maxim MAX16064
0004  *
0005  * Copyright (c) 2011 Ericsson AB.
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 /* This is the driver that will be inserted */
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);