1/* 2 * Hardware monitoring driver for Maxim MAX16064 3 * 4 * Copyright (c) 2011 Ericsson AB. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 */ 20 21#include <linux/kernel.h> 22#include <linux/module.h> 23#include <linux/init.h> 24#include <linux/err.h> 25#include <linux/i2c.h> 26#include "pmbus.h" 27 28#define MAX16064_MFR_VOUT_PEAK 0xd4 29#define MAX16064_MFR_TEMPERATURE_PEAK 0xd6 30 31static int max16064_read_word_data(struct i2c_client *client, int page, int reg) 32{ 33 int ret; 34 35 switch (reg) { 36 case PMBUS_VIRT_READ_VOUT_MAX: 37 ret = pmbus_read_word_data(client, page, 38 MAX16064_MFR_VOUT_PEAK); 39 break; 40 case PMBUS_VIRT_READ_TEMP_MAX: 41 ret = pmbus_read_word_data(client, page, 42 MAX16064_MFR_TEMPERATURE_PEAK); 43 break; 44 case PMBUS_VIRT_RESET_VOUT_HISTORY: 45 case PMBUS_VIRT_RESET_TEMP_HISTORY: 46 ret = 0; 47 break; 48 default: 49 ret = -ENODATA; 50 break; 51 } 52 return ret; 53} 54 55static int max16064_write_word_data(struct i2c_client *client, int page, 56 int reg, u16 word) 57{ 58 int ret; 59 60 switch (reg) { 61 case PMBUS_VIRT_RESET_VOUT_HISTORY: 62 ret = pmbus_write_word_data(client, page, 63 MAX16064_MFR_VOUT_PEAK, 0); 64 break; 65 case PMBUS_VIRT_RESET_TEMP_HISTORY: 66 ret = pmbus_write_word_data(client, page, 67 MAX16064_MFR_TEMPERATURE_PEAK, 68 0xffff); 69 break; 70 default: 71 ret = -ENODATA; 72 break; 73 } 74 return ret; 75} 76 77static struct pmbus_driver_info max16064_info = { 78 .pages = 4, 79 .format[PSC_VOLTAGE_IN] = direct, 80 .format[PSC_VOLTAGE_OUT] = direct, 81 .format[PSC_TEMPERATURE] = direct, 82 .m[PSC_VOLTAGE_IN] = 19995, 83 .b[PSC_VOLTAGE_IN] = 0, 84 .R[PSC_VOLTAGE_IN] = -1, 85 .m[PSC_VOLTAGE_OUT] = 19995, 86 .b[PSC_VOLTAGE_OUT] = 0, 87 .R[PSC_VOLTAGE_OUT] = -1, 88 .m[PSC_TEMPERATURE] = -7612, 89 .b[PSC_TEMPERATURE] = 335, 90 .R[PSC_TEMPERATURE] = -3, 91 .func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_TEMP 92 | PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_TEMP, 93 .func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 94 .func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 95 .func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, 96 .read_word_data = max16064_read_word_data, 97 .write_word_data = max16064_write_word_data, 98}; 99 100static int max16064_probe(struct i2c_client *client, 101 const struct i2c_device_id *id) 102{ 103 return pmbus_do_probe(client, id, &max16064_info); 104} 105 106static const struct i2c_device_id max16064_id[] = { 107 {"max16064", 0}, 108 {} 109}; 110 111MODULE_DEVICE_TABLE(i2c, max16064_id); 112 113/* This is the driver that will be inserted */ 114static struct i2c_driver max16064_driver = { 115 .driver = { 116 .name = "max16064", 117 }, 118 .probe = max16064_probe, 119 .remove = pmbus_do_remove, 120 .id_table = max16064_id, 121}; 122 123module_i2c_driver(max16064_driver); 124 125MODULE_AUTHOR("Guenter Roeck"); 126MODULE_DESCRIPTION("PMBus driver for Maxim MAX16064"); 127MODULE_LICENSE("GPL"); 128