@ -875,6 +875,102 @@ emul_temp_store(struct device *dev, struct device_attribute *attr,
static DEVICE_ATTR ( emul_temp , S_IWUSR , NULL , emul_temp_store ) ;
# endif /*CONFIG_THERMAL_EMULATION*/
static ssize_t
sustainable_power_show ( struct device * dev , struct device_attribute * devattr ,
char * buf )
{
struct thermal_zone_device * tz = to_thermal_zone ( dev ) ;
if ( tz - > tzp )
return sprintf ( buf , " %u \n " , tz - > tzp - > sustainable_power ) ;
else
return - EIO ;
}
static ssize_t
sustainable_power_store ( struct device * dev , struct device_attribute * devattr ,
const char * buf , size_t count )
{
struct thermal_zone_device * tz = to_thermal_zone ( dev ) ;
u32 sustainable_power ;
if ( ! tz - > tzp )
return - EIO ;
if ( kstrtou32 ( buf , 10 , & sustainable_power ) )
return - EINVAL ;
tz - > tzp - > sustainable_power = sustainable_power ;
return count ;
}
static DEVICE_ATTR ( sustainable_power , S_IWUSR | S_IRUGO , sustainable_power_show ,
sustainable_power_store ) ;
# define create_s32_tzp_attr(name) \
static ssize_t \
name # # _show ( struct device * dev , struct device_attribute * devattr , \
char * buf ) \
{ \
struct thermal_zone_device * tz = to_thermal_zone ( dev ) ; \
\
if ( tz - > tzp ) \
return sprintf ( buf , " %u \n " , tz - > tzp - > name ) ; \
else \
return - EIO ; \
} \
\
static ssize_t \
name # # _store ( struct device * dev , struct device_attribute * devattr , \
const char * buf , size_t count ) \
{ \
struct thermal_zone_device * tz = to_thermal_zone ( dev ) ; \
s32 value ; \
\
if ( ! tz - > tzp ) \
return - EIO ; \
\
if ( kstrtos32 ( buf , 10 , & value ) ) \
return - EINVAL ; \
\
tz - > tzp - > name = value ; \
\
return count ; \
} \
static DEVICE_ATTR ( name , S_IWUSR | S_IRUGO , name # # _show , name # # _store )
create_s32_tzp_attr ( k_po ) ;
create_s32_tzp_attr ( k_pu ) ;
create_s32_tzp_attr ( k_i ) ;
create_s32_tzp_attr ( k_d ) ;
create_s32_tzp_attr ( integral_cutoff ) ;
# undef create_s32_tzp_attr
static struct device_attribute * dev_tzp_attrs [ ] = {
& dev_attr_sustainable_power ,
& dev_attr_k_po ,
& dev_attr_k_pu ,
& dev_attr_k_i ,
& dev_attr_k_d ,
& dev_attr_integral_cutoff ,
} ;
static int create_tzp_attrs ( struct device * dev )
{
int i ;
for ( i = 0 ; i < ARRAY_SIZE ( dev_tzp_attrs ) ; i + + ) {
int ret ;
struct device_attribute * dev_attr = dev_tzp_attrs [ i ] ;
ret = device_create_file ( dev , dev_attr ) ;
if ( ret )
return ret ;
}
return 0 ;
}
/**
* power_actor_get_max_power ( ) - get the maximum power that a cdev can consume
* @ cdev : pointer to & thermal_cooling_device
@ -1712,6 +1808,11 @@ struct thermal_zone_device *thermal_zone_device_register(const char *type,
if ( result )
goto unregister ;
/* Add thermal zone params */
result = create_tzp_attrs ( & tz - > device ) ;
if ( result )
goto unregister ;
/* Update 'this' zone's governor information */
mutex_lock ( & thermal_governor_lock ) ;