1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * arch/arm/common/bL_switcher_dummy_if.c -- b.L switcher dummy interface 4 * 5 * Created by: Nicolas Pitre, November 2012 6 * Copyright: (C) 2012-2013 Linaro Limited 7 * 8 * Dummy interface to user space for debugging purpose only. 9 */ 10 11 #include <linux/init.h> 12 #include <linux/module.h> 13 #include <linux/fs.h> 14 #include <linux/miscdevice.h> 15 #include <linux/uaccess.h> 16 #include <asm/bL_switcher.h> 17 18 static ssize_t bL_switcher_write(struct file *file, const char __user *buf, 19 size_t len, loff_t *pos) 20 { 21 unsigned char val[3]; 22 unsigned int cpu, cluster; 23 int ret; 24 25 pr_debug("%s\n", __func__); 26 27 if (len < 3) 28 return -EINVAL; 29 30 if (copy_from_user(val, buf, 3)) 31 return -EFAULT; 32 33 /* format: <cpu#>,<cluster#> */ 34 if (val[0] < '0' || val[0] > '9' || 35 val[1] != ',' || 36 val[2] < '0' || val[2] > '1') 37 return -EINVAL; 38 39 cpu = val[0] - '0'; 40 cluster = val[2] - '0'; 41 ret = bL_switch_request(cpu, cluster); 42 43 return ret ? : len; 44 } 45 46 static const struct file_operations bL_switcher_fops = { 47 .write = bL_switcher_write, 48 .owner = THIS_MODULE, 49 }; 50 51 static struct miscdevice bL_switcher_device = { 52 MISC_DYNAMIC_MINOR, 53 "b.L_switcher", 54 &bL_switcher_fops 55 }; 56 module_misc_device(bL_switcher_device); 57 58 MODULE_AUTHOR("Nicolas Pitre <nico@linaro.org>"); 59 MODULE_LICENSE("GPL v2"); 60 MODULE_DESCRIPTION("big.LITTLE switcher dummy user interface"); 61