1 /* 2 * arch/arm/common/bL_switcher_dummy_if.c -- b.L switcher dummy interface 3 * 4 * Created by: Nicolas Pitre, November 2012 5 * Copyright: (C) 2012-2013 Linaro Limited 6 * 7 * Dummy interface to user space for debugging purpose only. 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14 #include <linux/init.h> 15 #include <linux/module.h> 16 #include <linux/fs.h> 17 #include <linux/miscdevice.h> 18 #include <asm/uaccess.h> 19 #include <asm/bL_switcher.h> 20 21 static ssize_t bL_switcher_write(struct file *file, const char __user *buf, 22 size_t len, loff_t *pos) 23 { 24 unsigned char val[3]; 25 unsigned int cpu, cluster; 26 int ret; 27 28 pr_debug("%s\n", __func__); 29 30 if (len < 3) 31 return -EINVAL; 32 33 if (copy_from_user(val, buf, 3)) 34 return -EFAULT; 35 36 /* format: <cpu#>,<cluster#> */ 37 if (val[0] < '0' || val[0] > '9' || 38 val[1] != ',' || 39 val[2] < '0' || val[2] > '1') 40 return -EINVAL; 41 42 cpu = val[0] - '0'; 43 cluster = val[2] - '0'; 44 ret = bL_switch_request(cpu, cluster); 45 46 return ret ? : len; 47 } 48 49 static const struct file_operations bL_switcher_fops = { 50 .write = bL_switcher_write, 51 .owner = THIS_MODULE, 52 }; 53 54 static struct miscdevice bL_switcher_device = { 55 MISC_DYNAMIC_MINOR, 56 "b.L_switcher", 57 &bL_switcher_fops 58 }; 59 60 static int __init bL_switcher_dummy_if_init(void) 61 { 62 return misc_register(&bL_switcher_device); 63 } 64 65 static void __exit bL_switcher_dummy_if_exit(void) 66 { 67 misc_deregister(&bL_switcher_device); 68 } 69 70 module_init(bL_switcher_dummy_if_init); 71 module_exit(bL_switcher_dummy_if_exit); 72