2019-05-27 08:55:15 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2012-09-18 11:05:03 +05:30
/*
* user_space . c - A simple user space Thermal events notifier
*
* Copyright ( C ) 2012 Intel Corp
* Copyright ( C ) 2012 Durgadoss R < durgadoss . r @ intel . com >
*
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*/
2016-08-26 16:21:17 -07:00
# include <linux/slab.h>
2020-05-11 17:55:00 +05:30
# include <linux/thermal.h>
2017-06-24 14:06:03 +01:00
2012-09-18 11:05:03 +05:30
# include "thermal_core.h"
2021-10-19 18:35:05 +02:00
static int user_space_bind ( struct thermal_zone_device * tz )
{
2022-04-22 16:10:29 +02:00
pr_info_once ( " Consider using thermal netlink events interface \n " ) ;
2021-10-19 18:35:05 +02:00
return 0 ;
}
2012-09-18 11:05:03 +05:30
/**
* notify_user_space - Notifies user space about thermal events
2019-11-20 21:15:12 +05:30
* @ tz : thermal_zone_device
2023-10-12 20:34:50 +02:00
* @ trip : trip point
2024-04-10 19:03:10 +02:00
* @ crossed_up : whether or not the trip has been crossed on the way up
2012-09-18 11:05:03 +05:30
*
* This function notifies the user space through UEvents .
*/
2024-04-10 19:03:10 +02:00
static void notify_user_space ( struct thermal_zone_device * tz ,
const struct thermal_trip * trip ,
bool crossed_up )
2012-09-18 11:05:03 +05:30
{
2016-08-26 16:21:17 -07:00
char * thermal_prop [ 5 ] ;
int i ;
2022-08-30 20:15:38 +02:00
lockdep_assert_held ( & tz - > lock ) ;
2016-08-26 16:21:17 -07:00
thermal_prop [ 0 ] = kasprintf ( GFP_KERNEL , " NAME=%s " , tz - > type ) ;
thermal_prop [ 1 ] = kasprintf ( GFP_KERNEL , " TEMP=%d " , tz - > temperature ) ;
2023-10-12 20:34:50 +02:00
thermal_prop [ 2 ] = kasprintf ( GFP_KERNEL , " TRIP=%d " ,
thermal_zone_trip_id ( tz , trip ) ) ;
2016-08-26 16:21:17 -07:00
thermal_prop [ 3 ] = kasprintf ( GFP_KERNEL , " EVENT=%d " , tz - > notify_event ) ;
thermal_prop [ 4 ] = NULL ;
kobject_uevent_env ( & tz - > device . kobj , KOBJ_CHANGE , thermal_prop ) ;
for ( i = 0 ; i < 4 ; + + i )
kfree ( thermal_prop [ i ] ) ;
2012-09-18 11:05:03 +05:30
}
2012-09-27 16:57:54 +05:30
static struct thermal_governor thermal_gov_user_space = {
2012-09-18 11:05:03 +05:30
. name = " user_space " ,
2024-04-10 19:03:10 +02:00
. trip_crossed = notify_user_space ,
2021-10-19 18:35:05 +02:00
. bind_to_tz = user_space_bind ,
2012-09-18 11:05:03 +05:30
} ;
2019-06-12 22:13:25 +02:00
THERMAL_GOVERNOR_DECLARE ( thermal_gov_user_space ) ;