162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * user_space.c - A simple user space Thermal events notifier 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2012 Intel Corp 662306a36Sopenharmony_ci * Copyright (C) 2012 Durgadoss R <durgadoss.r@intel.com> 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/slab.h> 1462306a36Sopenharmony_ci#include <linux/thermal.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include "thermal_core.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic int user_space_bind(struct thermal_zone_device *tz) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci pr_info_once("Consider using thermal netlink events interface\n"); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci return 0; 2362306a36Sopenharmony_ci} 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/** 2662306a36Sopenharmony_ci * notify_user_space - Notifies user space about thermal events 2762306a36Sopenharmony_ci * @tz: thermal_zone_device 2862306a36Sopenharmony_ci * @trip: trip point index 2962306a36Sopenharmony_ci * 3062306a36Sopenharmony_ci * This function notifies the user space through UEvents. 3162306a36Sopenharmony_ci */ 3262306a36Sopenharmony_cistatic int notify_user_space(struct thermal_zone_device *tz, int trip) 3362306a36Sopenharmony_ci{ 3462306a36Sopenharmony_ci char *thermal_prop[5]; 3562306a36Sopenharmony_ci int i; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci lockdep_assert_held(&tz->lock); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci thermal_prop[0] = kasprintf(GFP_KERNEL, "NAME=%s", tz->type); 4062306a36Sopenharmony_ci thermal_prop[1] = kasprintf(GFP_KERNEL, "TEMP=%d", tz->temperature); 4162306a36Sopenharmony_ci thermal_prop[2] = kasprintf(GFP_KERNEL, "TRIP=%d", trip); 4262306a36Sopenharmony_ci thermal_prop[3] = kasprintf(GFP_KERNEL, "EVENT=%d", tz->notify_event); 4362306a36Sopenharmony_ci thermal_prop[4] = NULL; 4462306a36Sopenharmony_ci kobject_uevent_env(&tz->device.kobj, KOBJ_CHANGE, thermal_prop); 4562306a36Sopenharmony_ci for (i = 0; i < 4; ++i) 4662306a36Sopenharmony_ci kfree(thermal_prop[i]); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci return 0; 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic struct thermal_governor thermal_gov_user_space = { 5262306a36Sopenharmony_ci .name = "user_space", 5362306a36Sopenharmony_ci .throttle = notify_user_space, 5462306a36Sopenharmony_ci .bind_to_tz = user_space_bind, 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ciTHERMAL_GOVERNOR_DECLARE(thermal_gov_user_space); 57