2018-07-18 12:13:11 +05:30
// SPDX-License-Identifier: GPL-2.0
2016-05-05 14:21:44 +05:30
/*
* Copyright ( c ) 2015 , The Linux Foundation . All rights reserved .
2018-07-18 12:13:11 +05:30
* Copyright ( c ) 2018 , Linaro Limited
2016-05-05 14:21:44 +05:30
*/
# include <linux/regmap.h>
2018-07-26 16:03:10 +05:30
# include <linux/bitops.h>
2016-05-05 14:21:44 +05:30
# include "tsens.h"
2018-07-18 12:13:11 +05:30
# define STATUS_OFFSET 0xa0
# define LAST_TEMP_MASK 0xfff
2016-05-05 14:21:44 +05:30
# define STATUS_VALID_BIT BIT(21)
2018-07-18 12:13:11 +05:30
static int get_temp_tsens_v2 ( struct tsens_device * tmdev , int id , int * temp )
2016-05-05 14:21:44 +05:30
{
struct tsens_sensor * s = & tmdev - > sensor [ id ] ;
u32 code ;
2018-07-26 16:03:08 +05:30
unsigned int status_reg ;
2018-07-26 16:03:10 +05:30
u32 last_temp = 0 , last_temp2 = 0 , last_temp3 = 0 ;
int ret ;
2016-05-05 14:21:44 +05:30
2018-07-26 16:03:08 +05:30
status_reg = tmdev - > tm_offset + STATUS_OFFSET + s - > hw_id * 4 ;
2018-09-12 15:22:49 +05:30
ret = regmap_read ( tmdev - > tm_map , status_reg , & code ) ;
2016-05-05 14:21:44 +05:30
if ( ret )
return ret ;
last_temp = code & LAST_TEMP_MASK ;
if ( code & STATUS_VALID_BIT )
goto done ;
/* Try a second time */
2018-09-12 15:22:49 +05:30
ret = regmap_read ( tmdev - > tm_map , status_reg , & code ) ;
2016-05-05 14:21:44 +05:30
if ( ret )
return ret ;
if ( code & STATUS_VALID_BIT ) {
last_temp = code & LAST_TEMP_MASK ;
goto done ;
} else {
last_temp2 = code & LAST_TEMP_MASK ;
}
/* Try a third/last time */
2018-09-12 15:22:49 +05:30
ret = regmap_read ( tmdev - > tm_map , status_reg , & code ) ;
2016-05-05 14:21:44 +05:30
if ( ret )
return ret ;
if ( code & STATUS_VALID_BIT ) {
last_temp = code & LAST_TEMP_MASK ;
goto done ;
} else {
last_temp3 = code & LAST_TEMP_MASK ;
}
if ( last_temp = = last_temp2 )
last_temp = last_temp2 ;
else if ( last_temp2 = = last_temp3 )
last_temp = last_temp3 ;
done :
2018-07-26 16:03:10 +05:30
/* Convert temperature from deciCelsius to milliCelsius */
* temp = sign_extend32 ( last_temp , fls ( LAST_TEMP_MASK ) - 1 ) * 100 ;
2016-05-05 14:21:44 +05:30
return 0 ;
}
2018-07-18 12:13:11 +05:30
static const struct tsens_ops ops_generic_v2 = {
2016-05-05 14:21:44 +05:30
. init = init_common ,
2018-07-18 12:13:11 +05:30
. get_temp = get_temp_tsens_v2 ,
2016-05-05 14:21:44 +05:30
} ;
2018-07-18 12:13:12 +05:30
const struct tsens_data data_tsens_v2 = {
. ops = & ops_generic_v2 ,
2018-09-12 15:22:52 +05:30
. reg_offsets = { [ SROT_CTRL_OFFSET ] = 0x4 } ,
2018-07-18 12:13:12 +05:30
} ;
/* Kept around for backward compatibility with old msm8996.dtsi */
2016-05-05 14:21:44 +05:30
const struct tsens_data data_8996 = {
. num_sensors = 13 ,
2018-07-18 12:13:11 +05:30
. ops = & ops_generic_v2 ,
2018-09-12 15:22:52 +05:30
. reg_offsets = { [ SROT_CTRL_OFFSET ] = 0x4 } ,
2016-05-05 14:21:44 +05:30
} ;