From 9fffe2a41d0aa2b47c589db2523707a9e14ab5a1 Mon Sep 17 00:00:00 2001 From: John Ogness Date: Fri, 15 Feb 2019 13:14:36 +0106 Subject: schulung_tools: hellodriver: relocate and minimize kernel build patch There is no reason the the kernel build patch needs to duplicate the entire hello driver. Just show the parts relating to kbuild integration. Signed-off-by: John Ogness --- .../modules/hellodriver/patch-kernel-build.diff | 32 +++ schulung_tools/drivers/patch-kernel-hello.diff | 291 --------------------- 2 files changed, 32 insertions(+), 291 deletions(-) create mode 100644 schulung_tools/drivers/modules/hellodriver/patch-kernel-build.diff delete mode 100644 schulung_tools/drivers/patch-kernel-hello.diff diff --git a/schulung_tools/drivers/modules/hellodriver/patch-kernel-build.diff b/schulung_tools/drivers/modules/hellodriver/patch-kernel-build.diff new file mode 100644 index 0000000..8d43ca7 --- /dev/null +++ b/schulung_tools/drivers/modules/hellodriver/patch-kernel-build.diff @@ -0,0 +1,32 @@ +diff -urNp a/drivers/char/Kconfig b/drivers/char/Kconfig +--- a/drivers/char/Kconfig 2016-05-16 00:43:13.000000000 +0200 ++++ b/drivers/char/Kconfig 2016-06-08 20:41:14.047205734 +0200 +@@ -6,6 +6,16 @@ menu "Character devices" + + source "drivers/tty/Kconfig" + ++config HELLO ++ tristate "hello demo driver" ++ default n ++ help ++ This driver demonstrates how to create a platform device that is ++ specified in a device tree. ++ ++ It also create a character device to demonstrate how a character ++ device interface can be provided to userspace. ++ + config DEVMEM + bool "/dev/mem virtual device support" + default y +diff -urNp a/drivers/char/Makefile b/drivers/char/Makefile +--- a/drivers/char/Makefile 2016-05-16 00:43:13.000000000 +0200 ++++ b/drivers/char/Makefile 2016-06-08 14:16:44.897437533 +0200 +@@ -16,6 +16,8 @@ obj-$(CONFIG_IBM_BSR) += bsr.o + obj-$(CONFIG_SGI_MBCS) += mbcs.o + obj-$(CONFIG_BFIN_OTP) += bfin-otp.o + ++obj-$(CONFIG_HELLO) += hello.o ++ + obj-$(CONFIG_PRINTER) += lp.o + + obj-$(CONFIG_APM_EMULATION) += apm-emulation.o diff --git a/schulung_tools/drivers/patch-kernel-hello.diff b/schulung_tools/drivers/patch-kernel-hello.diff deleted file mode 100644 index d3605c4..0000000 --- a/schulung_tools/drivers/patch-kernel-hello.diff +++ /dev/null @@ -1,291 +0,0 @@ -diff -urNp a/drivers/char/hello.c b/drivers/char/hello.c ---- a/drivers/char/hello.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/drivers/char/hello.c 2016-06-08 20:46:01.991211855 +0200 -@@ -0,0 +1,255 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+struct hello_dev { -+ struct device *dev; -+ struct cdev cdev; -+ unsigned int minor; -+}; -+ -+#define HELLO_MAX_DEVICES 10 -+ -+static struct class *hello_class; -+static dev_t hello_devt; -+ -+static int hello_open(struct inode *node, struct file *f) -+{ -+ struct cdev *cd = node->i_cdev; -+ struct hello_dev *hello = container_of(cd, struct hello_dev, cdev); -+ dev_info(hello->dev, "%s\n", __func__); -+ f->private_data = hello; -+ return 0; -+} -+ -+static int hello_release(struct inode *node, struct file *f) -+{ -+ struct hello_dev *hello = f->private_data; -+ dev_info(hello->dev, "%s\n", __func__); -+ f->private_data = NULL; -+ return 0; -+} -+ -+static ssize_t hello_read(struct file *f, char __user *u, size_t s, loff_t *l) -+{ -+ struct hello_dev *hello = f->private_data; -+ char buf[10]; -+ size_t len; -+ -+ dev_info(hello->dev, "%s: size=%zu offset=%llu\n", __func__, s, *l); -+ -+ if (*l >= 40) -+ return 0; -+ -+ len = snprintf(buf, sizeof(buf), "hello:%d\n", hello->minor); -+ -+ if (s < len) -+ len = s; -+ -+ if (copy_to_user(u, buf, len) != 0) -+ return -EFAULT; -+ -+ *l += len; -+ -+ return len; -+} -+ -+static ssize_t hello_write(struct file *f, const char __user *u, size_t s, -+ loff_t *l) -+{ -+ struct hello_dev *hello = f->private_data; -+ dev_info(hello->dev, "%s: size=%zu offset=%llu\n", __func__, s, *l); -+ return s; -+} -+ -+static const struct file_operations hello_fops = { -+ .owner = THIS_MODULE, -+ .open = hello_open, -+ .release = hello_release, -+ .read = hello_read, -+ .write = hello_write, -+}; -+ -+static ssize_t major_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ return sprintf(buf, "%d\n", MAJOR(hello_devt)); -+} -+static DEVICE_ATTR_RO(major); -+ -+static ssize_t minor_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct platform_device *pdev = to_platform_device(dev); -+ struct hello_dev *hello = platform_get_drvdata(pdev); -+ -+ return sprintf(buf, "%d\n", hello->minor); -+} -+static DEVICE_ATTR_RO(minor); -+ -+static struct attribute *hello_device_attrs[] = { -+ &dev_attr_major.attr, -+ &dev_attr_minor.attr, -+ NULL, -+}; -+ATTRIBUTE_GROUPS(hello_device); -+ -+static int hello_probe(struct platform_device *pdev) -+{ -+ struct hello_dev *hello; -+ struct device *dev; -+ dev_t devt; -+ int ret; -+ -+ hello = devm_kzalloc(&pdev->dev, sizeof(*hello), GFP_KERNEL); -+ if (!hello) { -+ dev_err(&pdev->dev, "devm_kzalloc failed\n"); -+ return -ENOMEM; -+ } -+ -+#ifdef CONFIG_OF -+ ret = of_property_read_u32(pdev->dev.of_node, "index", &hello->minor); -+ if (ret < 0) { -+ dev_err(&pdev->dev, "no index specified\n"); -+ goto err_out1; -+ } -+#else -+ hello->minor = (unsigned)pdev->id; -+#endif -+ -+ if (hello->minor >= HELLO_MAX_DEVICES) { -+ dev_err(&pdev->dev, "invalid index: %u\n", hello->minor); -+ ret = -EINVAL; -+ goto err_out1; -+ } -+ -+ hello->dev = &pdev->dev; -+ platform_set_drvdata(pdev, hello); -+ -+ devt = MKDEV(MAJOR(hello_devt), hello->minor); -+ -+ cdev_init(&hello->cdev, &hello_fops); -+ hello->cdev.owner = THIS_MODULE; -+ ret = cdev_add(&hello->cdev, devt, 1); -+ if (ret != 0) { -+ dev_err(&pdev->dev, "cdev_add failed\n"); -+ goto err_out1; -+ } -+ -+ dev = device_create(hello_class, &pdev->dev, devt, hello, -+ "hello%d", hello->minor); -+ if (IS_ERR(dev)) { -+ dev_err(&pdev->dev, "device_create failed\n"); -+ ret = PTR_ERR(dev); -+ goto err_out2; -+ } -+ -+ dev_info(&pdev->dev, "HELLO! I am hello device %d!\n", hello->minor); -+ -+ return 0; -+ -+err_out2: -+ cdev_del(&hello->cdev); -+err_out1: -+ platform_set_drvdata(pdev, NULL); -+ return ret; -+} -+ -+static int hello_remove(struct platform_device *pdev) -+{ -+ struct hello_dev *hello = platform_get_drvdata(pdev); -+ -+ device_destroy(hello_class, MKDEV(MAJOR(hello_devt), hello->minor)); -+ cdev_del(&hello->cdev); -+ platform_set_drvdata(pdev, NULL); -+ -+ dev_info(&pdev->dev, "GOODBYE! I was hello device %d!\n", hello->minor); -+ -+ return 0; -+} -+ -+static const struct of_device_id hello_match[] = { -+ { .compatible = "virtual,hello", }, -+ { /* end of table */ } -+}; -+ -+static struct platform_driver hello_driver = { -+ .driver = { -+ .name = "hello", -+ .owner = THIS_MODULE, -+ .of_match_table = hello_match, -+ }, -+ .probe = hello_probe, -+ .remove = hello_remove, -+}; -+ -+#ifndef CONFIG_OF -+static struct platform_device *pdevs[3]; -+#endif -+ -+static int __init hello_init(void) -+{ -+ int ret; -+ -+ printk(KERN_INFO "%s\n", __func__); -+ -+ ret = alloc_chrdev_region(&hello_devt, 0, HELLO_MAX_DEVICES, "hello"); -+ if (ret < 0) -+ return ret; -+ -+ hello_class = class_create(THIS_MODULE, "hello"); -+ if (IS_ERR(hello_class)) { -+ printk(KERN_ERR "%s: failed to create class\n", __func__); -+ ret = PTR_ERR(hello_class); -+ goto err_out1; -+ } -+ -+ hello_class->dev_groups = hello_device_groups; -+ -+ ret = platform_driver_register(&hello_driver); -+ if (ret != 0) -+ goto err_out2; -+ -+#ifndef CONFIG_OF -+ pdevs[0] = platform_device_register_simple("hello", 1, NULL, 0); -+ pdevs[1] = platform_device_register_simple("hello", 3, NULL, 0); -+ pdevs[2] = platform_device_register_simple("hello", 5, NULL, 0); -+#endif -+ -+ return 0; -+ -+err_out2: -+ class_destroy(hello_class); -+err_out1: -+ unregister_chrdev_region(hello_devt, HELLO_MAX_DEVICES); -+ return ret; -+} -+ -+static void __exit hello_exit(void) -+{ -+ printk(KERN_INFO "%s\n", __func__); -+ -+#ifndef CONFIG_OF -+ platform_device_unregister(pdevs[0]); -+ platform_device_unregister(pdevs[1]); -+ platform_device_unregister(pdevs[2]); -+#endif -+ -+ platform_driver_unregister(&hello_driver); -+ class_destroy(hello_class); -+ unregister_chrdev_region(hello_devt, HELLO_MAX_DEVICES); -+} -+ -+module_init(hello_init); -+module_exit(hello_exit); -+ -+MODULE_AUTHOR("John Ogness "); -+MODULE_DESCRIPTION("a great module for hello-ing!"); -+MODULE_LICENSE("GPL v2"); -+MODULE_VERSION("20160607"); -diff -urNp a/drivers/char/Kconfig b/drivers/char/Kconfig ---- a/drivers/char/Kconfig 2016-05-16 00:43:13.000000000 +0200 -+++ b/drivers/char/Kconfig 2016-06-08 20:41:14.047205734 +0200 -@@ -6,6 +6,16 @@ menu "Character devices" - - source "drivers/tty/Kconfig" - -+config HELLO -+ tristate "hello demo driver" -+ default n -+ help -+ This driver demonstrates how to create a platform device that is -+ specified in a device tree. -+ -+ It also create a character device to demonstrate how a character -+ device interface can be provided to userspace. -+ - config DEVMEM - bool "/dev/mem virtual device support" - default y -diff -urNp a/drivers/char/Makefile b/drivers/char/Makefile ---- a/drivers/char/Makefile 2016-05-16 00:43:13.000000000 +0200 -+++ b/drivers/char/Makefile 2016-06-08 14:16:44.897437533 +0200 -@@ -16,6 +16,8 @@ obj-$(CONFIG_IBM_BSR) += bsr.o - obj-$(CONFIG_SGI_MBCS) += mbcs.o - obj-$(CONFIG_BFIN_OTP) += bfin-otp.o - -+obj-$(CONFIG_HELLO) += hello.o -+ - obj-$(CONFIG_PRINTER) += lp.o - - obj-$(CONFIG_APM_EMULATION) += apm-emulation.o -- cgit v1.2.3