2019-05-24 12:04:09 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2012-08-12 18:15:49 +02:00
/*
2013-03-12 11:38:46 +01:00
* ADT7410 / ADT7420 digital temperature sensor driver
2012-08-12 18:15:49 +02:00
*
2013-03-12 11:38:46 +01:00
* Copyright 2012 - 2013 Analog Devices Inc .
* Author : Lars - Peter Clausen < lars @ metafoo . de >
2012-08-12 18:15:49 +02:00
*/
# include <linux/module.h>
# include <linux/init.h>
# include <linux/i2c.h>
2021-12-23 10:32:05 -08:00
# include <linux/regmap.h>
2012-08-12 18:15:49 +02:00
2013-03-12 11:38:46 +01:00
# include "adt7x10.h"
2012-08-12 18:15:49 +02:00
2021-12-23 10:32:05 -08:00
static bool adt7410_regmap_is_volatile ( struct device * dev , unsigned int reg )
2012-08-12 18:15:49 +02:00
{
2021-12-23 10:32:05 -08:00
switch ( reg ) {
case ADT7X10_TEMPERATURE :
case ADT7X10_STATUS :
return true ;
default :
return false ;
}
2012-08-12 18:15:49 +02:00
}
2021-12-23 10:32:05 -08:00
static int adt7410_reg_read ( void * context , unsigned int reg , unsigned int * val )
2012-08-12 18:15:49 +02:00
{
2021-12-23 10:32:05 -08:00
struct i2c_client * client = context ;
int regval ;
2012-08-12 18:15:49 +02:00
2021-12-23 10:32:05 -08:00
switch ( reg ) {
case ADT7X10_TEMPERATURE :
case ADT7X10_T_ALARM_HIGH :
case ADT7X10_T_ALARM_LOW :
case ADT7X10_T_CRIT :
regval = i2c_smbus_read_word_swapped ( client , reg ) ;
break ;
default :
regval = i2c_smbus_read_byte_data ( client , reg ) ;
break ;
}
if ( regval < 0 )
return regval ;
* val = regval ;
return 0 ;
2012-08-12 18:15:49 +02:00
}
2021-12-23 10:32:05 -08:00
static int adt7410_reg_write ( void * context , unsigned int reg , unsigned int val )
2012-08-12 18:15:49 +02:00
{
2021-12-23 10:32:05 -08:00
struct i2c_client * client = context ;
int ret ;
switch ( reg ) {
case ADT7X10_TEMPERATURE :
case ADT7X10_T_ALARM_HIGH :
case ADT7X10_T_ALARM_LOW :
case ADT7X10_T_CRIT :
ret = i2c_smbus_write_word_swapped ( client , reg , val ) ;
break ;
default :
ret = i2c_smbus_write_byte_data ( client , reg , val ) ;
break ;
}
return ret ;
2012-08-12 18:15:49 +02:00
}
2021-12-23 10:32:05 -08:00
static const struct regmap_config adt7410_regmap_config = {
. reg_bits = 8 ,
. val_bits = 16 ,
. max_register = ADT7X10_ID ,
. cache_type = REGCACHE_RBTREE ,
. volatile_reg = adt7410_regmap_is_volatile ,
. reg_read = adt7410_reg_read ,
. reg_write = adt7410_reg_write ,
2012-08-12 18:15:49 +02:00
} ;
2020-08-13 18:02:22 +02:00
static int adt7410_i2c_probe ( struct i2c_client * client )
2012-08-12 18:15:49 +02:00
{
2021-12-23 10:32:05 -08:00
struct regmap * regmap ;
regmap = devm_regmap_init ( & client - > dev , NULL , client ,
& adt7410_regmap_config ) ;
if ( IS_ERR ( regmap ) )
return PTR_ERR ( regmap ) ;
2012-08-12 18:15:49 +02:00
2021-12-21 23:58:37 +02:00
return adt7x10_probe ( & client - > dev , client - > name , client - > irq , regmap ) ;
2012-08-12 18:15:49 +02:00
}
static const struct i2c_device_id adt7410_ids [ ] = {
2013-03-12 11:38:46 +01:00
{ " adt7410 " , 0 } ,
{ " adt7420 " , 0 } ,
{ }
2012-08-12 18:15:49 +02:00
} ;
MODULE_DEVICE_TABLE ( i2c , adt7410_ids ) ;
static struct i2c_driver adt7410_driver = {
. class = I2C_CLASS_HWMON ,
. driver = {
. name = " adt7410 " ,
2022-09-25 18:27:45 +01:00
. pm = pm_sleep_ptr ( & adt7x10_dev_pm_ops ) ,
2012-08-12 18:15:49 +02:00
} ,
2020-08-13 18:02:22 +02:00
. probe_new = adt7410_i2c_probe ,
2012-08-12 18:15:49 +02:00
. id_table = adt7410_ids ,
2013-02-15 17:57:13 +01:00
. address_list = I2C_ADDRS ( 0x48 , 0x49 , 0x4a , 0x4b ) ,
2012-08-12 18:15:49 +02:00
} ;
module_i2c_driver ( adt7410_driver ) ;
2013-03-12 11:38:46 +01:00
MODULE_AUTHOR ( " Lars-Peter Clausen <lars@metafoo.de> " ) ;
MODULE_DESCRIPTION ( " ADT7410/AD7420 driver " ) ;
2012-08-12 18:15:49 +02:00
MODULE_LICENSE ( " GPL " ) ;