2011-01-26 20:14:26 -08:00
/*
* 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 0213 9 , USA .
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/init.h>
# include <linux/err.h>
# include <linux/i2c.h>
# include "pmbus.h"
2011-07-09 13:10:19 -07:00
# 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 ;
}
2011-01-26 20:14:26 -08:00
static struct pmbus_driver_info max16064_info = {
. pages = 4 ,
2011-06-25 11:21:49 -07:00
. format [ PSC_VOLTAGE_IN ] = direct ,
. format [ PSC_VOLTAGE_OUT ] = direct ,
. format [ PSC_TEMPERATURE ] = direct ,
2011-01-26 20:14:26 -08:00
. 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 ,
2011-07-09 13:10:19 -07:00
. read_word_data = max16064_read_word_data ,
. write_word_data = max16064_write_word_data ,
2011-01-26 20:14:26 -08:00
} ;
static int max16064_probe ( struct i2c_client * client ,
const struct i2c_device_id * id )
{
return pmbus_do_probe ( client , id , & max16064_info ) ;
}
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 ,
2012-02-22 08:56:44 -08:00
. remove = pmbus_do_remove ,
2011-01-26 20:14:26 -08:00
. id_table = max16064_id ,
} ;
2012-01-20 15:38:18 +08:00
module_i2c_driver ( max16064_driver ) ;
2011-01-26 20:14:26 -08:00
MODULE_AUTHOR ( " Guenter Roeck " ) ;
MODULE_DESCRIPTION ( " PMBus driver for Maxim MAX16064 " ) ;
MODULE_LICENSE ( " GPL " ) ;