2011-06-20 11:48:19 +04:00
/*
* ntc_thermistor . c - NTC Thermistors
*
* Copyright ( C ) 2010 Samsung Electronics
* MyungJoo Ham < myungjoo . ham @ samsung . com >
*
* 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 . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
*/
# include <linux/slab.h>
# include <linux/module.h>
# include <linux/pm_runtime.h>
# include <linux/math64.h>
# include <linux/platform_device.h>
# include <linux/err.h>
2013-03-13 08:08:20 +04:00
# include <linux/of.h>
# include <linux/of_device.h>
2011-06-20 11:48:19 +04:00
# include <linux/platform_data/ntc_thermistor.h>
2013-03-13 08:08:20 +04:00
# include <linux/iio/iio.h>
# include <linux/iio/machine.h>
# include <linux/iio/driver.h>
# include <linux/iio/consumer.h>
2011-06-20 11:48:19 +04:00
# include <linux/hwmon.h>
# include <linux/hwmon-sysfs.h>
2014-09-17 09:54:37 +04:00
# include <linux/thermal.h>
2011-06-20 11:48:19 +04:00
struct ntc_compensation {
2013-03-14 03:40:39 +04:00
int temp_c ;
2011-06-20 11:48:19 +04:00
unsigned int ohm ;
} ;
2014-05-25 19:23:08 +04:00
/* Order matters, ntc_match references the entries by index */
2013-03-13 08:08:20 +04:00
static const struct platform_device_id ntc_thermistor_id [ ] = {
{ " ncp15wb473 " , TYPE_NCPXXWB473 } ,
{ " ncp18wb473 " , TYPE_NCPXXWB473 } ,
{ " ncp21wb473 " , TYPE_NCPXXWB473 } ,
{ " ncp03wb473 " , TYPE_NCPXXWB473 } ,
{ " ncp15wl333 " , TYPE_NCPXXWL333 } ,
2014-07-01 10:05:52 +04:00
{ " b57330v2103 " , TYPE_B57330V2103 } ,
2015-04-30 07:07:43 +03:00
{ " ncp03wf104 " , TYPE_NCPXXWF104 } ,
2016-02-29 01:31:23 +03:00
{ " ncp15xh103 " , TYPE_NCPXXXH103 } ,
2013-03-13 08:08:20 +04:00
{ } ,
} ;
2011-06-20 11:48:19 +04:00
/*
* A compensation table should be sorted by the values of . ohm
* in descending order .
* The following compensation tables are from the specification of Murata NTC
* Thermistors Datasheet
*/
2013-02-19 13:37:34 +04:00
static const struct ntc_compensation ncpXXwb473 [ ] = {
2013-03-14 03:40:39 +04:00
{ . temp_c = - 40 , . ohm = 1747920 } ,
{ . temp_c = - 35 , . ohm = 1245428 } ,
{ . temp_c = - 30 , . ohm = 898485 } ,
{ . temp_c = - 25 , . ohm = 655802 } ,
{ . temp_c = - 20 , . ohm = 483954 } ,
{ . temp_c = - 15 , . ohm = 360850 } ,
{ . temp_c = - 10 , . ohm = 271697 } ,
{ . temp_c = - 5 , . ohm = 206463 } ,
{ . temp_c = 0 , . ohm = 158214 } ,
{ . temp_c = 5 , . ohm = 122259 } ,
{ . temp_c = 10 , . ohm = 95227 } ,
{ . temp_c = 15 , . ohm = 74730 } ,
{ . temp_c = 20 , . ohm = 59065 } ,
{ . temp_c = 25 , . ohm = 47000 } ,
{ . temp_c = 30 , . ohm = 37643 } ,
{ . temp_c = 35 , . ohm = 30334 } ,
{ . temp_c = 40 , . ohm = 24591 } ,
{ . temp_c = 45 , . ohm = 20048 } ,
{ . temp_c = 50 , . ohm = 16433 } ,
{ . temp_c = 55 , . ohm = 13539 } ,
{ . temp_c = 60 , . ohm = 11209 } ,
{ . temp_c = 65 , . ohm = 9328 } ,
{ . temp_c = 70 , . ohm = 7798 } ,
{ . temp_c = 75 , . ohm = 6544 } ,
{ . temp_c = 80 , . ohm = 5518 } ,
{ . temp_c = 85 , . ohm = 4674 } ,
{ . temp_c = 90 , . ohm = 3972 } ,
{ . temp_c = 95 , . ohm = 3388 } ,
{ . temp_c = 100 , . ohm = 2902 } ,
{ . temp_c = 105 , . ohm = 2494 } ,
{ . temp_c = 110 , . ohm = 2150 } ,
{ . temp_c = 115 , . ohm = 1860 } ,
{ . temp_c = 120 , . ohm = 1615 } ,
{ . temp_c = 125 , . ohm = 1406 } ,
2011-06-20 11:48:19 +04:00
} ;
2013-02-19 13:37:34 +04:00
static const struct ntc_compensation ncpXXwl333 [ ] = {
2013-03-14 03:40:39 +04:00
{ . temp_c = - 40 , . ohm = 1610154 } ,
{ . temp_c = - 35 , . ohm = 1130850 } ,
{ . temp_c = - 30 , . ohm = 802609 } ,
{ . temp_c = - 25 , . ohm = 575385 } ,
{ . temp_c = - 20 , . ohm = 416464 } ,
{ . temp_c = - 15 , . ohm = 304219 } ,
{ . temp_c = - 10 , . ohm = 224193 } ,
{ . temp_c = - 5 , . ohm = 166623 } ,
{ . temp_c = 0 , . ohm = 124850 } ,
{ . temp_c = 5 , . ohm = 94287 } ,
{ . temp_c = 10 , . ohm = 71747 } ,
{ . temp_c = 15 , . ohm = 54996 } ,
{ . temp_c = 20 , . ohm = 42455 } ,
{ . temp_c = 25 , . ohm = 33000 } ,
{ . temp_c = 30 , . ohm = 25822 } ,
{ . temp_c = 35 , . ohm = 20335 } ,
{ . temp_c = 40 , . ohm = 16115 } ,
{ . temp_c = 45 , . ohm = 12849 } ,
{ . temp_c = 50 , . ohm = 10306 } ,
{ . temp_c = 55 , . ohm = 8314 } ,
{ . temp_c = 60 , . ohm = 6746 } ,
{ . temp_c = 65 , . ohm = 5503 } ,
{ . temp_c = 70 , . ohm = 4513 } ,
{ . temp_c = 75 , . ohm = 3721 } ,
{ . temp_c = 80 , . ohm = 3084 } ,
{ . temp_c = 85 , . ohm = 2569 } ,
{ . temp_c = 90 , . ohm = 2151 } ,
{ . temp_c = 95 , . ohm = 1809 } ,
{ . temp_c = 100 , . ohm = 1529 } ,
{ . temp_c = 105 , . ohm = 1299 } ,
{ . temp_c = 110 , . ohm = 1108 } ,
{ . temp_c = 115 , . ohm = 949 } ,
{ . temp_c = 120 , . ohm = 817 } ,
{ . temp_c = 125 , . ohm = 707 } ,
2011-06-20 11:48:19 +04:00
} ;
2015-04-30 07:07:43 +03:00
static const struct ntc_compensation ncpXXwf104 [ ] = {
{ . temp_c = - 40 , . ohm = 4397119 } ,
{ . temp_c = - 35 , . ohm = 3088599 } ,
{ . temp_c = - 30 , . ohm = 2197225 } ,
{ . temp_c = - 25 , . ohm = 1581881 } ,
{ . temp_c = - 20 , . ohm = 1151037 } ,
{ . temp_c = - 15 , . ohm = 846579 } ,
{ . temp_c = - 10 , . ohm = 628988 } ,
{ . temp_c = - 5 , . ohm = 471632 } ,
{ . temp_c = 0 , . ohm = 357012 } ,
{ . temp_c = 5 , . ohm = 272500 } ,
{ . temp_c = 10 , . ohm = 209710 } ,
{ . temp_c = 15 , . ohm = 162651 } ,
{ . temp_c = 20 , . ohm = 127080 } ,
{ . temp_c = 25 , . ohm = 100000 } ,
{ . temp_c = 30 , . ohm = 79222 } ,
{ . temp_c = 35 , . ohm = 63167 } ,
{ . temp_c = 40 , . ohm = 50677 } ,
{ . temp_c = 45 , . ohm = 40904 } ,
{ . temp_c = 50 , . ohm = 33195 } ,
{ . temp_c = 55 , . ohm = 27091 } ,
{ . temp_c = 60 , . ohm = 22224 } ,
{ . temp_c = 65 , . ohm = 18323 } ,
{ . temp_c = 70 , . ohm = 15184 } ,
{ . temp_c = 75 , . ohm = 12635 } ,
{ . temp_c = 80 , . ohm = 10566 } ,
{ . temp_c = 85 , . ohm = 8873 } ,
{ . temp_c = 90 , . ohm = 7481 } ,
{ . temp_c = 95 , . ohm = 6337 } ,
{ . temp_c = 100 , . ohm = 5384 } ,
{ . temp_c = 105 , . ohm = 4594 } ,
{ . temp_c = 110 , . ohm = 3934 } ,
{ . temp_c = 115 , . ohm = 3380 } ,
{ . temp_c = 120 , . ohm = 2916 } ,
{ . temp_c = 125 , . ohm = 2522 } ,
} ;
2016-02-29 01:31:23 +03:00
static const struct ntc_compensation ncpXXxh103 [ ] = {
{ . temp_c = - 40 , . ohm = 247565 } ,
{ . temp_c = - 35 , . ohm = 181742 } ,
{ . temp_c = - 30 , . ohm = 135128 } ,
{ . temp_c = - 25 , . ohm = 101678 } ,
{ . temp_c = - 20 , . ohm = 77373 } ,
{ . temp_c = - 15 , . ohm = 59504 } ,
{ . temp_c = - 10 , . ohm = 46222 } ,
{ . temp_c = - 5 , . ohm = 36244 } ,
{ . temp_c = 0 , . ohm = 28674 } ,
{ . temp_c = 5 , . ohm = 22878 } ,
{ . temp_c = 10 , . ohm = 18399 } ,
{ . temp_c = 15 , . ohm = 14910 } ,
{ . temp_c = 20 , . ohm = 12169 } ,
{ . temp_c = 25 , . ohm = 10000 } ,
{ . temp_c = 30 , . ohm = 8271 } ,
{ . temp_c = 35 , . ohm = 6883 } ,
{ . temp_c = 40 , . ohm = 5762 } ,
{ . temp_c = 45 , . ohm = 4851 } ,
{ . temp_c = 50 , . ohm = 4105 } ,
{ . temp_c = 55 , . ohm = 3492 } ,
{ . temp_c = 60 , . ohm = 2985 } ,
{ . temp_c = 65 , . ohm = 2563 } ,
{ . temp_c = 70 , . ohm = 2211 } ,
{ . temp_c = 75 , . ohm = 1915 } ,
{ . temp_c = 80 , . ohm = 1666 } ,
{ . temp_c = 85 , . ohm = 1454 } ,
{ . temp_c = 90 , . ohm = 1275 } ,
{ . temp_c = 95 , . ohm = 1121 } ,
{ . temp_c = 100 , . ohm = 990 } ,
{ . temp_c = 105 , . ohm = 876 } ,
{ . temp_c = 110 , . ohm = 779 } ,
{ . temp_c = 115 , . ohm = 694 } ,
{ . temp_c = 120 , . ohm = 620 } ,
{ . temp_c = 125 , . ohm = 556 } ,
} ;
2014-07-01 10:05:52 +04:00
/*
* The following compensation table is from the specification of EPCOS NTC
* Thermistors Datasheet
*/
static const struct ntc_compensation b57330v2103 [ ] = {
{ . temp_c = - 40 , . ohm = 190030 } ,
{ . temp_c = - 35 , . ohm = 145360 } ,
{ . temp_c = - 30 , . ohm = 112060 } ,
{ . temp_c = - 25 , . ohm = 87041 } ,
{ . temp_c = - 20 , . ohm = 68104 } ,
{ . temp_c = - 15 , . ohm = 53665 } ,
{ . temp_c = - 10 , . ohm = 42576 } ,
{ . temp_c = - 5 , . ohm = 34001 } ,
{ . temp_c = 0 , . ohm = 27326 } ,
{ . temp_c = 5 , . ohm = 22096 } ,
{ . temp_c = 10 , . ohm = 17973 } ,
{ . temp_c = 15 , . ohm = 14703 } ,
{ . temp_c = 20 , . ohm = 12090 } ,
{ . temp_c = 25 , . ohm = 10000 } ,
{ . temp_c = 30 , . ohm = 8311 } ,
{ . temp_c = 35 , . ohm = 6941 } ,
{ . temp_c = 40 , . ohm = 5825 } ,
{ . temp_c = 45 , . ohm = 4911 } ,
{ . temp_c = 50 , . ohm = 4158 } ,
{ . temp_c = 55 , . ohm = 3536 } ,
{ . temp_c = 60 , . ohm = 3019 } ,
{ . temp_c = 65 , . ohm = 2588 } ,
{ . temp_c = 70 , . ohm = 2227 } ,
{ . temp_c = 75 , . ohm = 1924 } ,
{ . temp_c = 80 , . ohm = 1668 } ,
{ . temp_c = 85 , . ohm = 1451 } ,
{ . temp_c = 90 , . ohm = 1266 } ,
{ . temp_c = 95 , . ohm = 1108 } ,
{ . temp_c = 100 , . ohm = 973 } ,
{ . temp_c = 105 , . ohm = 857 } ,
{ . temp_c = 110 , . ohm = 757 } ,
{ . temp_c = 115 , . ohm = 671 } ,
{ . temp_c = 120 , . ohm = 596 } ,
{ . temp_c = 125 , . ohm = 531 } ,
} ;
2011-06-20 11:48:19 +04:00
struct ntc_data {
struct device * hwmon_dev ;
struct ntc_thermistor_platform_data * pdata ;
const struct ntc_compensation * comp ;
int n_comp ;
char name [ PLATFORM_NAME_SIZE ] ;
} ;
2014-05-25 19:23:08 +04:00
# if defined(CONFIG_OF) && IS_ENABLED(CONFIG_IIO)
2013-03-13 08:08:20 +04:00
static int ntc_adc_iio_read ( struct ntc_thermistor_platform_data * pdata )
{
struct iio_channel * channel = pdata - > chan ;
2015-06-01 19:27:37 +03:00
int raw , uv , ret ;
2013-03-13 08:08:20 +04:00
2015-06-01 19:27:37 +03:00
ret = iio_read_channel_raw ( channel , & raw ) ;
2013-03-13 08:08:20 +04:00
if ( ret < 0 ) {
pr_err ( " read channel() error: %d \n " , ret ) ;
return ret ;
}
2015-06-01 19:27:37 +03:00
ret = iio_convert_raw_to_processed ( channel , raw , & uv , 1000 ) ;
if ( ret < 0 ) {
/* Assume 12 bit ADC with vref at pullup_uv */
uv = ( pdata - > pullup_uv * ( s64 ) raw ) > > 12 ;
}
2013-03-13 08:08:20 +04:00
2015-06-01 19:27:37 +03:00
return uv ;
2013-03-13 08:08:20 +04:00
}
static const struct of_device_id ntc_match [ ] = {
2014-06-25 10:29:31 +04:00
{ . compatible = " murata,ncp15wb473 " ,
. data = & ntc_thermistor_id [ 0 ] } ,
{ . compatible = " murata,ncp18wb473 " ,
. data = & ntc_thermistor_id [ 1 ] } ,
{ . compatible = " murata,ncp21wb473 " ,
. data = & ntc_thermistor_id [ 2 ] } ,
{ . compatible = " murata,ncp03wb473 " ,
. data = & ntc_thermistor_id [ 3 ] } ,
{ . compatible = " murata,ncp15wl333 " ,
. data = & ntc_thermistor_id [ 4 ] } ,
2014-07-01 10:05:52 +04:00
{ . compatible = " epcos,b57330v2103 " ,
. data = & ntc_thermistor_id [ 5 ] } ,
2015-04-30 07:07:43 +03:00
{ . compatible = " murata,ncp03wf104 " ,
. data = & ntc_thermistor_id [ 6 ] } ,
2016-02-29 01:31:23 +03:00
{ . compatible = " murata,ncp15xh103 " ,
. data = & ntc_thermistor_id [ 7 ] } ,
2014-06-25 10:29:31 +04:00
/* Usage of vendor name "ntc" is deprecated */
2013-03-13 08:08:20 +04:00
{ . compatible = " ntc,ncp15wb473 " ,
2014-05-25 19:23:08 +04:00
. data = & ntc_thermistor_id [ 0 ] } ,
2013-03-13 08:08:20 +04:00
{ . compatible = " ntc,ncp18wb473 " ,
2014-05-25 19:23:08 +04:00
. data = & ntc_thermistor_id [ 1 ] } ,
2013-03-13 08:08:20 +04:00
{ . compatible = " ntc,ncp21wb473 " ,
2014-05-25 19:23:08 +04:00
. data = & ntc_thermistor_id [ 2 ] } ,
2013-03-13 08:08:20 +04:00
{ . compatible = " ntc,ncp03wb473 " ,
2014-05-25 19:23:08 +04:00
. data = & ntc_thermistor_id [ 3 ] } ,
2013-03-13 08:08:20 +04:00
{ . compatible = " ntc,ncp15wl333 " ,
2014-05-25 19:23:08 +04:00
. data = & ntc_thermistor_id [ 4 ] } ,
2013-03-13 08:08:20 +04:00
{ } ,
} ;
MODULE_DEVICE_TABLE ( of , ntc_match ) ;
static struct ntc_thermistor_platform_data *
2016-07-25 23:37:56 +03:00
ntc_thermistor_parse_dt ( struct device * dev )
2013-03-13 08:08:20 +04:00
{
struct iio_channel * chan ;
2015-05-26 23:40:44 +03:00
enum iio_chan_type type ;
2016-07-25 23:37:56 +03:00
struct device_node * np = dev - > of_node ;
2013-03-13 08:08:20 +04:00
struct ntc_thermistor_platform_data * pdata ;
2015-05-26 23:40:44 +03:00
int ret ;
2013-03-13 08:08:20 +04:00
if ( ! np )
return NULL ;
2016-07-25 23:37:56 +03:00
pdata = devm_kzalloc ( dev , sizeof ( * pdata ) , GFP_KERNEL ) ;
2013-03-13 08:08:20 +04:00
if ( ! pdata )
return ERR_PTR ( - ENOMEM ) ;
2016-07-25 23:37:56 +03:00
chan = devm_iio_channel_get ( dev , NULL ) ;
2013-03-13 08:08:20 +04:00
if ( IS_ERR ( chan ) )
return ERR_CAST ( chan ) ;
2015-05-26 23:40:44 +03:00
ret = iio_get_channel_type ( chan , & type ) ;
if ( ret < 0 )
return ERR_PTR ( ret ) ;
if ( type ! = IIO_VOLTAGE )
return ERR_PTR ( - EINVAL ) ;
2013-03-14 03:40:39 +04:00
if ( of_property_read_u32 ( np , " pullup-uv " , & pdata - > pullup_uv ) )
2013-03-13 08:08:20 +04:00
return ERR_PTR ( - ENODEV ) ;
if ( of_property_read_u32 ( np , " pullup-ohm " , & pdata - > pullup_ohm ) )
return ERR_PTR ( - ENODEV ) ;
if ( of_property_read_u32 ( np , " pulldown-ohm " , & pdata - > pulldown_ohm ) )
return ERR_PTR ( - ENODEV ) ;
if ( of_find_property ( np , " connected-positive " , NULL ) )
pdata - > connect = NTC_CONNECTED_POSITIVE ;
else /* status change should be possible if not always on. */
pdata - > connect = NTC_CONNECTED_GROUND ;
pdata - > chan = chan ;
2013-03-14 03:40:39 +04:00
pdata - > read_uv = ntc_adc_iio_read ;
2013-03-13 08:08:20 +04:00
return pdata ;
}
# else
static struct ntc_thermistor_platform_data *
2016-07-25 23:37:56 +03:00
ntc_thermistor_parse_dt ( struct device * dev )
2013-03-13 08:08:20 +04:00
{
return NULL ;
}
2014-05-25 19:23:08 +04:00
# define ntc_match NULL
2013-03-13 08:08:20 +04:00
# endif
2011-06-20 11:48:19 +04:00
static inline u64 div64_u64_safe ( u64 dividend , u64 divisor )
{
if ( divisor = = 0 & & dividend = = 0 )
return 0 ;
if ( divisor = = 0 )
return UINT_MAX ;
return div64_u64 ( dividend , divisor ) ;
}
2013-03-14 03:40:39 +04:00
static int get_ohm_of_thermistor ( struct ntc_data * data , unsigned int uv )
2011-06-20 11:48:19 +04:00
{
struct ntc_thermistor_platform_data * pdata = data - > pdata ;
2015-06-02 23:57:58 +03:00
u32 puv = pdata - > pullup_uv ;
2013-03-14 03:40:39 +04:00
u64 n , puo , pdo ;
puo = pdata - > pullup_ohm ;
pdo = pdata - > pulldown_ohm ;
2011-06-20 11:48:19 +04:00
2015-06-02 23:57:58 +03:00
if ( uv = = 0 )
return ( pdata - > connect = = NTC_CONNECTED_POSITIVE ) ?
INT_MAX : 0 ;
if ( uv > = puv )
2011-06-20 11:48:19 +04:00
return ( pdata - > connect = = NTC_CONNECTED_POSITIVE ) ?
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
0 : INT_MAX ;
2011-06-20 11:48:19 +04:00
2013-03-14 03:40:39 +04:00
if ( pdata - > connect = = NTC_CONNECTED_POSITIVE & & puo = = 0 )
2015-06-02 23:57:58 +03:00
n = div_u64 ( pdo * ( puv - uv ) , uv ) ;
2013-03-14 03:40:39 +04:00
else if ( pdata - > connect = = NTC_CONNECTED_GROUND & & pdo = = 0 )
2015-06-02 23:57:58 +03:00
n = div_u64 ( puo * uv , puv - uv ) ;
2011-06-20 11:48:19 +04:00
else if ( pdata - > connect = = NTC_CONNECTED_POSITIVE )
2015-06-02 23:57:58 +03:00
n = div64_u64_safe ( pdo * puo * ( puv - uv ) ,
puo * uv - pdo * ( puv - uv ) ) ;
2011-06-20 11:48:19 +04:00
else
2015-06-02 23:57:58 +03:00
n = div64_u64_safe ( pdo * puo * uv , pdo * ( puv - uv ) - puo * uv ) ;
2011-06-20 11:48:19 +04:00
2013-03-14 03:40:39 +04:00
if ( n > INT_MAX )
n = INT_MAX ;
return n ;
2011-06-20 11:48:19 +04:00
}
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
static void lookup_comp ( struct ntc_data * data , unsigned int ohm ,
int * i_low , int * i_high )
2011-06-20 11:48:19 +04:00
{
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
int start , end , mid ;
/*
* Handle special cases : Resistance is higher than or equal to
* resistance in first table entry , or resistance is lower or equal
* to resistance in last table entry .
* In these cases , return i_low = = i_high , either pointing to the
* beginning or to the end of the table depending on the condition .
*/
if ( ohm > = data - > comp [ 0 ] . ohm ) {
* i_low = 0 ;
* i_high = 0 ;
return ;
}
if ( ohm < = data - > comp [ data - > n_comp - 1 ] . ohm ) {
* i_low = data - > n_comp - 1 ;
* i_high = data - > n_comp - 1 ;
return ;
}
2011-06-20 11:48:19 +04:00
/* Do a binary search on compensation table */
start = 0 ;
end = data - > n_comp ;
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
while ( start < end ) {
2011-06-20 11:48:19 +04:00
mid = start + ( end - start ) / 2 ;
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
/*
* start < = mid < end
* data - > comp [ start ] . ohm > ohm > = data - > comp [ end ] . ohm
*
* We could check for " ohm == data->comp[mid].ohm " here , but
* that is a quite unlikely condition , and we would have to
* check again after updating start . Check it at the end instead
* for simplicity .
*/
if ( ohm > = data - > comp [ mid ] . ohm ) {
2011-06-20 11:48:19 +04:00
end = mid ;
} else {
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
start = mid + 1 ;
/*
* ohm > = data - > comp [ start ] . ohm might be true here ,
* since we set start to mid + 1. In that case , we are
* done . We could keep going , but the condition is quite
* likely to occur , so it is worth checking for it .
*/
if ( ohm > = data - > comp [ start ] . ohm )
end = start ;
2011-06-20 11:48:19 +04:00
}
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
/*
* start < = end
* data - > comp [ start ] . ohm > = ohm > = data - > comp [ end ] . ohm
*/
2011-06-20 11:48:19 +04:00
}
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
/*
* start = = end
* ohm > = data - > comp [ end ] . ohm
*/
* i_low = end ;
if ( ohm = = data - > comp [ end ] . ohm )
* i_high = end ;
else
* i_high = end - 1 ;
2011-06-20 11:48:19 +04:00
}
2013-03-14 03:40:39 +04:00
static int get_temp_mc ( struct ntc_data * data , unsigned int ohm )
2011-06-20 11:48:19 +04:00
{
int low , high ;
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
int temp ;
2011-06-20 11:48:19 +04:00
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
lookup_comp ( data , ohm , & low , & high ) ;
if ( low = = high ) {
2011-06-20 11:48:19 +04:00
/* Unable to use linear approximation */
2013-03-14 03:40:39 +04:00
temp = data - > comp [ low ] . temp_c * 1000 ;
2011-06-20 11:48:19 +04:00
} else {
2013-03-14 03:40:39 +04:00
temp = data - > comp [ low ] . temp_c * 1000 +
( ( data - > comp [ high ] . temp_c - data - > comp [ low ] . temp_c ) *
2011-06-20 11:48:19 +04:00
1000 * ( ( int ) ohm - ( int ) data - > comp [ low ] . ohm ) ) /
( ( int ) data - > comp [ high ] . ohm - ( int ) data - > comp [ low ] . ohm ) ;
}
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
return temp ;
2011-06-20 11:48:19 +04:00
}
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
static int ntc_thermistor_get_ohm ( struct ntc_data * data )
2011-06-20 11:48:19 +04:00
{
2013-03-14 03:40:39 +04:00
int read_uv ;
2011-06-20 11:48:19 +04:00
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
if ( data - > pdata - > read_ohm )
return data - > pdata - > read_ohm ( ) ;
2011-06-20 11:48:19 +04:00
2013-03-14 03:40:39 +04:00
if ( data - > pdata - > read_uv ) {
read_uv = data - > pdata - > read_uv ( data - > pdata ) ;
if ( read_uv < 0 )
return read_uv ;
return get_ohm_of_thermistor ( data , read_uv ) ;
2011-06-20 11:48:19 +04:00
}
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
return - EINVAL ;
2011-06-20 11:48:19 +04:00
}
2015-07-24 09:12:54 +03:00
static int ntc_read_temp ( void * dev , int * temp )
2014-09-17 09:54:37 +04:00
{
struct ntc_data * data = dev_get_drvdata ( dev ) ;
int ohm ;
ohm = ntc_thermistor_get_ohm ( data ) ;
if ( ohm < 0 )
return ohm ;
* temp = get_temp_mc ( data , ohm ) ;
return 0 ;
}
2011-06-20 11:48:19 +04:00
static ssize_t ntc_show_name ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
struct ntc_data * data = dev_get_drvdata ( dev ) ;
return sprintf ( buf , " %s \n " , data - > name ) ;
}
static ssize_t ntc_show_type ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
return sprintf ( buf , " 4 \n " ) ;
}
static ssize_t ntc_show_temp ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
struct ntc_data * data = dev_get_drvdata ( dev ) ;
hwmon: (ntc_thermistor) Optimize and fix build warning
The following build warning is seen in some configurations:
drivers/hwmon/ntc_thermistor.c: In function 'ntc_show_temp':
drivers/hwmon/ntc_thermistor.c:293: warning: 'temp' may be used uninitialized in this function
Fix the problem by re-arranging the code to overload return values with error
codes, and by avoiding error returns whenever possible.
Specifically,
Simplify lookup_comp() to not return an error. Instead, return i_low == i_high
if there is an exact match, or if the ohm value is outside the lookup table
range.
Modify get_temp_mC() to not return an error. Since it only returns an error
after lookup_comp() returned an error, this is quite straightforward after above
change.
Separate ntc_thermistor_read() into a function to read the resistor value (which
can return an error), and the call to get_temp_mC() which doesn't. Call the
functions directly from ntc_show_temp().
Code was tested using a test program, comparing the result of the old and new
versions of get_temp_mC() for resistor values between 0 and 2,000,000 ohm.
As a side effect, this patch reduces code size by approximately 400 bytes on
x86_64.
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Cc: Donggeun Kim <dg77.kim@samsung.com>
Reviewed-by: Robert Coulson <robert.coulson@ericsson.com>
2012-04-23 07:58:51 +04:00
int ohm ;
ohm = ntc_thermistor_get_ohm ( data ) ;
if ( ohm < 0 )
return ohm ;
2011-06-20 11:48:19 +04:00
2013-03-14 03:40:39 +04:00
return sprintf ( buf , " %d \n " , get_temp_mc ( data , ohm ) ) ;
2011-06-20 11:48:19 +04:00
}
static SENSOR_DEVICE_ATTR ( temp1_type , S_IRUGO , ntc_show_type , NULL , 0 ) ;
static SENSOR_DEVICE_ATTR ( temp1_input , S_IRUGO , ntc_show_temp , NULL , 0 ) ;
static DEVICE_ATTR ( name , S_IRUGO , ntc_show_name , NULL ) ;
static struct attribute * ntc_attributes [ ] = {
& dev_attr_name . attr ,
& sensor_dev_attr_temp1_type . dev_attr . attr ,
& sensor_dev_attr_temp1_input . dev_attr . attr ,
NULL ,
} ;
static const struct attribute_group ntc_attr_group = {
. attrs = ntc_attributes ,
} ;
2014-11-08 04:24:39 +03:00
static const struct thermal_zone_of_device_ops ntc_of_thermal_ops = {
. get_temp = ntc_read_temp ,
} ;
2012-11-19 22:22:35 +04:00
static int ntc_thermistor_probe ( struct platform_device * pdev )
2011-06-20 11:48:19 +04:00
{
2016-03-10 00:02:22 +03:00
struct thermal_zone_device * tz ;
2016-07-25 23:37:56 +03:00
struct device * dev = & pdev - > dev ;
2013-03-13 08:08:20 +04:00
const struct of_device_id * of_id =
2016-07-25 23:37:56 +03:00
of_match_device ( of_match_ptr ( ntc_match ) , dev ) ;
2013-03-13 08:08:20 +04:00
const struct platform_device_id * pdev_id ;
struct ntc_thermistor_platform_data * pdata ;
2011-06-20 11:48:19 +04:00
struct ntc_data * data ;
2013-03-13 08:08:20 +04:00
int ret ;
2016-07-25 23:37:56 +03:00
pdata = ntc_thermistor_parse_dt ( dev ) ;
2013-03-13 08:08:20 +04:00
if ( IS_ERR ( pdata ) )
return PTR_ERR ( pdata ) ;
else if ( pdata = = NULL )
2016-07-25 23:37:56 +03:00
pdata = dev_get_platdata ( dev ) ;
2011-06-20 11:48:19 +04:00
if ( ! pdata ) {
2016-07-25 23:37:56 +03:00
dev_err ( dev , " No platform init data supplied. \n " ) ;
2011-06-20 11:48:19 +04:00
return - ENODEV ;
}
/* Either one of the two is required. */
2013-03-14 03:40:39 +04:00
if ( ! pdata - > read_uv & & ! pdata - > read_ohm ) {
2016-07-25 23:37:56 +03:00
dev_err ( dev ,
2013-03-14 03:40:39 +04:00
" Both read_uv and read_ohm missing. Need either one of the two. \n " ) ;
2011-06-20 11:48:19 +04:00
return - EINVAL ;
}
2013-03-14 03:40:39 +04:00
if ( pdata - > read_uv & & pdata - > read_ohm ) {
2016-07-25 23:37:56 +03:00
dev_warn ( dev ,
2013-03-14 03:40:39 +04:00
" Only one of read_uv and read_ohm is needed; ignoring read_uv. \n " ) ;
pdata - > read_uv = NULL ;
2011-06-20 11:48:19 +04:00
}
2013-03-14 03:40:39 +04:00
if ( pdata - > read_uv & & ( pdata - > pullup_uv = = 0 | |
2011-06-20 11:48:19 +04:00
( pdata - > pullup_ohm = = 0 & & pdata - > connect = =
NTC_CONNECTED_GROUND ) | |
( pdata - > pulldown_ohm = = 0 & & pdata - > connect = =
NTC_CONNECTED_POSITIVE ) | |
( pdata - > connect ! = NTC_CONNECTED_POSITIVE & &
pdata - > connect ! = NTC_CONNECTED_GROUND ) ) ) {
2016-07-25 23:37:56 +03:00
dev_err ( dev , " Required data to use read_uv not supplied. \n " ) ;
2011-06-20 11:48:19 +04:00
return - EINVAL ;
}
2016-07-25 23:37:56 +03:00
data = devm_kzalloc ( dev , sizeof ( struct ntc_data ) , GFP_KERNEL ) ;
2011-06-20 11:48:19 +04:00
if ( ! data )
return - ENOMEM ;
2013-03-13 08:08:20 +04:00
pdev_id = of_id ? of_id - > data : platform_get_device_id ( pdev ) ;
2011-06-20 11:48:19 +04:00
data - > pdata = pdata ;
2013-03-13 08:08:20 +04:00
strlcpy ( data - > name , pdev_id - > name , sizeof ( data - > name ) ) ;
2011-06-20 11:48:19 +04:00
2013-03-13 08:08:20 +04:00
switch ( pdev_id - > driver_data ) {
2011-06-20 11:48:19 +04:00
case TYPE_NCPXXWB473 :
data - > comp = ncpXXwb473 ;
data - > n_comp = ARRAY_SIZE ( ncpXXwb473 ) ;
break ;
case TYPE_NCPXXWL333 :
data - > comp = ncpXXwl333 ;
data - > n_comp = ARRAY_SIZE ( ncpXXwl333 ) ;
break ;
2014-07-01 10:05:52 +04:00
case TYPE_B57330V2103 :
data - > comp = b57330v2103 ;
data - > n_comp = ARRAY_SIZE ( b57330v2103 ) ;
break ;
2015-04-30 07:07:43 +03:00
case TYPE_NCPXXWF104 :
data - > comp = ncpXXwf104 ;
data - > n_comp = ARRAY_SIZE ( ncpXXwf104 ) ;
break ;
2016-02-29 01:31:23 +03:00
case TYPE_NCPXXXH103 :
data - > comp = ncpXXxh103 ;
data - > n_comp = ARRAY_SIZE ( ncpXXxh103 ) ;
break ;
2011-06-20 11:48:19 +04:00
default :
2016-07-25 23:37:56 +03:00
dev_err ( dev , " Unknown device type: %lu(%s) \n " ,
2013-03-13 08:08:20 +04:00
pdev_id - > driver_data , pdev_id - > name ) ;
2012-04-23 21:39:00 +04:00
return - EINVAL ;
2011-06-20 11:48:19 +04:00
}
platform_set_drvdata ( pdev , data ) ;
2016-07-25 23:37:56 +03:00
ret = sysfs_create_group ( & dev - > kobj , & ntc_attr_group ) ;
2011-06-20 11:48:19 +04:00
if ( ret ) {
2016-07-25 23:37:56 +03:00
dev_err ( dev , " unable to create sysfs files \n " ) ;
2012-04-23 21:39:00 +04:00
return ret ;
2011-06-20 11:48:19 +04:00
}
2016-07-25 23:37:56 +03:00
data - > hwmon_dev = hwmon_device_register ( dev ) ;
2012-04-23 21:41:03 +04:00
if ( IS_ERR ( data - > hwmon_dev ) ) {
2016-07-25 23:37:56 +03:00
dev_err ( dev , " unable to register as hwmon device. \n " ) ;
2012-04-23 21:41:03 +04:00
ret = PTR_ERR ( data - > hwmon_dev ) ;
2011-06-20 11:48:19 +04:00
goto err_after_sysfs ;
}
2016-07-25 23:37:56 +03:00
dev_info ( dev , " Thermistor type: %s successfully probed. \n " ,
pdev_id - > name ) ;
2013-03-13 08:08:20 +04:00
2016-07-25 23:37:56 +03:00
tz = devm_thermal_zone_of_sensor_register ( dev , 0 , dev ,
2016-03-10 00:02:22 +03:00
& ntc_of_thermal_ops ) ;
if ( IS_ERR ( tz ) )
2016-07-25 23:37:56 +03:00
dev_dbg ( dev , " Failed to register to thermal fw. \n " ) ;
2014-09-17 09:54:37 +04:00
2011-06-20 11:48:19 +04:00
return 0 ;
err_after_sysfs :
2016-07-25 23:37:56 +03:00
sysfs_remove_group ( & dev - > kobj , & ntc_attr_group ) ;
2011-06-20 11:48:19 +04:00
return ret ;
}
2012-11-19 22:25:51 +04:00
static int ntc_thermistor_remove ( struct platform_device * pdev )
2011-06-20 11:48:19 +04:00
{
struct ntc_data * data = platform_get_drvdata ( pdev ) ;
hwmon_device_unregister ( data - > hwmon_dev ) ;
2016-07-25 23:37:56 +03:00
sysfs_remove_group ( & pdev - > dev . kobj , & ntc_attr_group ) ;
2011-06-20 11:48:19 +04:00
return 0 ;
}
static struct platform_driver ntc_thermistor_driver = {
. driver = {
. name = " ntc-thermistor " ,
2013-03-13 08:08:20 +04:00
. of_match_table = of_match_ptr ( ntc_match ) ,
2011-06-20 11:48:19 +04:00
} ,
. probe = ntc_thermistor_probe ,
2012-11-19 22:21:20 +04:00
. remove = ntc_thermistor_remove ,
2011-06-20 11:48:19 +04:00
. id_table = ntc_thermistor_id ,
} ;
2011-11-25 11:31:00 +04:00
module_platform_driver ( ntc_thermistor_driver ) ;
2011-06-20 11:48:19 +04:00
2014-07-01 10:05:52 +04:00
MODULE_DESCRIPTION ( " NTC Thermistor Driver " ) ;
2011-06-20 11:48:19 +04:00
MODULE_AUTHOR ( " MyungJoo Ham <myungjoo.ham@samsung.com> " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_ALIAS ( " platform:ntc-thermistor " ) ;