/* * SPI debugfs interface for spidev register * * Copyright (C) 2014, Intel Corporation * Authors: Huiquan Zhong * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include #include #include #include #include #include static struct spi_board_info spidev_info = { .modalias = "spidev", .max_speed_hz = 1000000, .bus_num = 1, .chip_select = 0, .mode = SPI_MODE_0, }; static int spidev_debug_open(struct inode *inode, struct file *filp) { filp->private_data = inode->i_private; return 0; } static ssize_t spidev_debug_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *ppos) { char buf[32]; ssize_t buf_size; char *start = buf; unsigned int bus_num, cs_num; if (*ppos < 0 || !cnt) return -EINVAL; buf_size = min(cnt, (sizeof(buf)-1)); if (copy_from_user(buf, ubuf, buf_size)) return -EFAULT; buf[buf_size] = 0; while (*start == ' ') start++; bus_num = simple_strtoul(start, &start, 10); while (*start == ' ') start++; if (kstrtouint(start, 10, &cs_num)) return -EINVAL; spidev_info.bus_num = bus_num; spidev_info.chip_select = cs_num; spi_register_board_info(&spidev_info, 1); return buf_size; } static const struct file_operations spidev_debug_fops = { .open = spidev_debug_open, .write = spidev_debug_write, .llseek = generic_file_llseek, }; struct dentry *spidev_node; static __init int spidev_debug_init(void) { spidev_node = debugfs_create_file("spidev_node", S_IFREG | S_IWUSR, NULL, NULL, &spidev_debug_fops); if (!spidev_node) { pr_err("Failed to create spidev_node debug file\n"); return -ENOMEM; } return 0; } static __exit void spidev_debug_exit(void) { debugfs_remove(spidev_node); } module_init(spidev_debug_init); module_exit(spidev_debug_exit);