diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 15:08:05 +0200 | 
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 15:08:18 +0200 | 
| commit | e060c38434b2caa78efe7cedaff4191040b65a15 (patch) | |
| tree | 407361230bf6733f63d8e788e4b5e6566ee04818 /drivers/hwmon/pmbus/max16064.c | |
| parent | 10e4ac572eeffe5317019bd7330b6058a400dfc2 (diff) | |
| parent | cc39c6a9bbdebfcf1a7dee64d83bf302bc38d941 (diff) | |
| download | olio-linux-3.10-e060c38434b2caa78efe7cedaff4191040b65a15.tar.xz olio-linux-3.10-e060c38434b2caa78efe7cedaff4191040b65a15.zip  | |
Merge branch 'master' into for-next
Fast-forward merge with Linus to be able to merge patches
based on more recent version of the tree.
Diffstat (limited to 'drivers/hwmon/pmbus/max16064.c')
| -rw-r--r-- | drivers/hwmon/pmbus/max16064.c | 142 | 
1 files changed, 142 insertions, 0 deletions
diff --git a/drivers/hwmon/pmbus/max16064.c b/drivers/hwmon/pmbus/max16064.c new file mode 100644 index 00000000000..e50b296e8db --- /dev/null +++ b/drivers/hwmon/pmbus/max16064.c @@ -0,0 +1,142 @@ +/* + * Hardware monitoring driver for Maxim MAX16064 + * + * Copyright (c) 2011 Ericsson AB. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/init.h> +#include <linux/err.h> +#include <linux/i2c.h> +#include "pmbus.h" + +#define MAX16064_MFR_VOUT_PEAK		0xd4 +#define MAX16064_MFR_TEMPERATURE_PEAK	0xd6 + +static int max16064_read_word_data(struct i2c_client *client, int page, int reg) +{ +	int ret; + +	switch (reg) { +	case PMBUS_VIRT_READ_VOUT_MAX: +		ret = pmbus_read_word_data(client, page, +					   MAX16064_MFR_VOUT_PEAK); +		break; +	case PMBUS_VIRT_READ_TEMP_MAX: +		ret = pmbus_read_word_data(client, page, +					   MAX16064_MFR_TEMPERATURE_PEAK); +		break; +	case PMBUS_VIRT_RESET_VOUT_HISTORY: +	case PMBUS_VIRT_RESET_TEMP_HISTORY: +		ret = 0; +		break; +	default: +		ret = -ENODATA; +		break; +	} +	return ret; +} + +static int max16064_write_word_data(struct i2c_client *client, int page, +				    int reg, u16 word) +{ +	int ret; + +	switch (reg) { +	case PMBUS_VIRT_RESET_VOUT_HISTORY: +		ret = pmbus_write_word_data(client, page, +					    MAX16064_MFR_VOUT_PEAK, 0); +		break; +	case PMBUS_VIRT_RESET_TEMP_HISTORY: +		ret = pmbus_write_word_data(client, page, +					    MAX16064_MFR_TEMPERATURE_PEAK, +					    0xffff); +		break; +	default: +		ret = -ENODATA; +		break; +	} +	return ret; +} + +static struct pmbus_driver_info max16064_info = { +	.pages = 4, +	.format[PSC_VOLTAGE_IN] = direct, +	.format[PSC_VOLTAGE_OUT] = direct, +	.format[PSC_TEMPERATURE] = direct, +	.m[PSC_VOLTAGE_IN] = 19995, +	.b[PSC_VOLTAGE_IN] = 0, +	.R[PSC_VOLTAGE_IN] = -1, +	.m[PSC_VOLTAGE_OUT] = 19995, +	.b[PSC_VOLTAGE_OUT] = 0, +	.R[PSC_VOLTAGE_OUT] = -1, +	.m[PSC_TEMPERATURE] = -7612, +	.b[PSC_TEMPERATURE] = 335, +	.R[PSC_TEMPERATURE] = -3, +	.func[0] = PMBUS_HAVE_VOUT | PMBUS_HAVE_TEMP +		| PMBUS_HAVE_STATUS_VOUT | PMBUS_HAVE_STATUS_TEMP, +	.func[1] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, +	.func[2] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, +	.func[3] = PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT, +	.read_word_data = max16064_read_word_data, +	.write_word_data = max16064_write_word_data, +}; + +static int max16064_probe(struct i2c_client *client, +			  const struct i2c_device_id *id) +{ +	return pmbus_do_probe(client, id, &max16064_info); +} + +static int max16064_remove(struct i2c_client *client) +{ +	return pmbus_do_remove(client); +} + +static const struct i2c_device_id max16064_id[] = { +	{"max16064", 0}, +	{} +}; + +MODULE_DEVICE_TABLE(i2c, max16064_id); + +/* This is the driver that will be inserted */ +static struct i2c_driver max16064_driver = { +	.driver = { +		   .name = "max16064", +		   }, +	.probe = max16064_probe, +	.remove = max16064_remove, +	.id_table = max16064_id, +}; + +static int __init max16064_init(void) +{ +	return i2c_add_driver(&max16064_driver); +} + +static void __exit max16064_exit(void) +{ +	i2c_del_driver(&max16064_driver); +} + +MODULE_AUTHOR("Guenter Roeck"); +MODULE_DESCRIPTION("PMBus driver for Maxim MAX16064"); +MODULE_LICENSE("GPL"); +module_init(max16064_init); +module_exit(max16064_exit);  |