79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* arch/arm/mach-msm/htc_set_perflock.c
 | |
|  *
 | |
|  * Copyright (C) 2008 HTC Corporation
 | |
|  * Author: Eiven Peng <eiven_peng@htc.com>
 | |
|  *
 | |
|  * This software is licensed under the terms of the GNU General Public
 | |
|  * License version 2, as published by the Free Software Foundation, and
 | |
|  * may be copied, distributed, and modified under those terms.
 | |
|  *
 | |
|  * 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.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <linux/fs.h>
 | |
| #include <linux/module.h>
 | |
| #include <linux/miscdevice.h>
 | |
| #include <linux/mutex.h>
 | |
| #include <linux/sched.h>
 | |
| #include <linux/wait.h>
 | |
| #include <linux/uaccess.h>
 | |
| #include <mach/perflock.h>
 | |
| 
 | |
| static	struct mutex lock;
 | |
| static 	struct perf_lock media_perf_lock;
 | |
| static	uint32_t num = 0;
 | |
| 
 | |
| static int perflock_open(struct inode *inode, struct file *file)
 | |
| {
 | |
| 	mutex_lock(&lock);
 | |
| 	if (num == 0) {
 | |
| 		perf_lock(&media_perf_lock);
 | |
| 		printk(KERN_DEBUG "[perflock] Perflock enabled.\n");
 | |
| 	}
 | |
| 	num++;
 | |
| 	printk(KERN_DEBUG "[perflock] Perflock node is opened by [%s]/[PID=%d],numbers of opened nodes = [%d].\n",
 | |
| 		current->comm, current->pid, num);
 | |
| 	mutex_unlock(&lock);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static int perflock_release(struct inode *inode, struct file *file)
 | |
| {
 | |
| 	mutex_lock(&lock);
 | |
| 	num--;
 | |
| 	printk(KERN_DEBUG "[perflock] Perflock node is closed by [%s]/[PID=%d], numbers of opened nodes = [%d].\n",
 | |
| 		current->comm, current->pid, num);
 | |
| 	if (num == 0) {
 | |
| 		perf_unlock(&media_perf_lock);
 | |
| 		printk(KERN_DEBUG "[perflock] Perflock disabled.\n");
 | |
| 	}
 | |
| 	mutex_unlock(&lock);
 | |
| 
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static struct file_operations perflock_fops = {
 | |
| 	.owner		= THIS_MODULE,
 | |
| 	.open		= perflock_open,
 | |
| 	.release	= perflock_release,
 | |
| };
 | |
| 
 | |
| struct miscdevice perflock_misc = {
 | |
| 	.minor	= MISC_DYNAMIC_MINOR,
 | |
| 	.name	= "perflock",
 | |
| 	.fops	= &perflock_fops,
 | |
| };
 | |
| 
 | |
| static int __init set_perflock_init(void) {
 | |
| 	mutex_init(&lock);
 | |
| 	perf_lock_init(&media_perf_lock, PERF_LOCK_HIGHEST, "media");
 | |
| 	return misc_register(&perflock_misc);
 | |
| }
 | |
| 
 | |
| device_initcall(set_perflock_init);
 |