blob: cda132cdcfb352852e888ad42cd8a7a2130133ad [file] [log] [blame]
From fd830d0ff53aa70488a69e4eaf3fb0de9205c39f Mon Sep 17 00:00:00 2001
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date: Fri, 4 Dec 2020 09:46:22 +0100
Subject: [PATCH] driver core: aux test code
try to test out the aux bus code
---
drivers/base/Kconfig | 2
drivers/base/Makefile | 1
drivers/base/aux_test.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++
drivers/base/auxiliary.c | 1
4 files changed, 143 insertions(+), 1 deletion(-)
create mode 100644 drivers/base/aux_test.c
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -2,7 +2,7 @@
menu "Generic Driver Options"
config AUXILIARY_BUS
- bool
+ tristate "aux bus"
config UEVENT_HELPER
bool "Support for uevent helper"
--- a/drivers/base/Makefile
+++ b/drivers/base/Makefile
@@ -8,6 +8,7 @@ obj-y := component.o core.o bus.o dd.o
topology.o container.o property.o cacheinfo.o \
swnode.o
obj-$(CONFIG_AUXILIARY_BUS) += auxiliary.o
+obj-$(CONFIG_AUXILIARY_BUS) += aux_test.o
obj-$(CONFIG_DEVTMPFS) += devtmpfs.o
obj-y += power/
obj-$(CONFIG_ISA_BUS_API) += isa.o
--- /dev/null
+++ b/drivers/base/aux_test.c
@@ -0,0 +1,140 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/auxiliary_bus.h>
+#include <linux/platform_device.h>
+
+
+struct aux_test_device {
+ struct auxiliary_device auxdev;
+ int foo;
+ void *data;
+};
+
+#define aux_dev_to_test_device(auxdev) \
+ container_of(auxdev, struct aux_test_device, auxdev)
+
+static void aux_test_dev_release(struct device *dev)
+{
+ struct auxiliary_device *auxdev = to_auxiliary_dev(dev);
+ struct aux_test_device *test_dev = aux_dev_to_test_device(auxdev);
+
+ kfree(test_dev);
+}
+
+static struct aux_test_device *test_device_alloc(struct device *parent,
+ const char *name, u32 id)
+{
+ struct aux_test_device *test_dev;
+ struct auxiliary_device *auxdev;
+ int retval;
+
+ test_dev = kzalloc(sizeof(*test_dev), GFP_KERNEL);
+ if (!test_dev)
+ return NULL;
+
+ auxdev= &test_dev->auxdev;
+ auxdev->name = name;
+ auxdev->dev.parent = parent;
+ auxdev->dev.release = aux_test_dev_release;
+ auxdev->id = id;
+
+ retval = auxiliary_device_init(auxdev);
+ if (retval) {
+ dev_err(parent, "aux device failed to init\n");
+ kfree(test_dev);
+ return NULL;
+ }
+
+ return test_dev;
+}
+
+static struct aux_test_device *test_device_create(struct device *parent,
+ const char *name, u32 id)
+{
+ struct aux_test_device *test_dev;
+ int retval;
+
+ test_dev = test_device_alloc(parent, name, id);
+ if (!test_dev) {
+ dev_err(parent, "aux device %s failed to be created\n", name);
+ return NULL;
+ }
+
+ retval = auxiliary_device_add(&test_dev->auxdev);
+ if (retval) {
+ dev_err(parent, "aux device %s failed to be added, error %d\n",
+ name, retval);
+ auxiliary_device_uninit(&test_dev->auxdev);
+ return NULL;
+ }
+
+ return test_dev;
+}
+
+static void test_dev_del(struct aux_test_device *test_dev)
+{
+ if (!test_dev)
+ return;
+
+ auxiliary_device_delete(&test_dev->auxdev);
+ auxiliary_device_uninit(&test_dev->auxdev);
+}
+
+
+static struct aux_test_device *tdev1, *tdev2, *tdev3;
+
+/* Make a random device to be the "parent" of our tests */
+static struct platform_device *root_device;
+
+static void root_device_release(struct device *dev)
+{
+ struct platform_device *pdev = to_platform_device(dev);
+ kfree(pdev);
+}
+
+static int __init aux_test_init(void)
+{
+ int retval;
+
+ root_device = kzalloc(sizeof(*root_device), GFP_KERNEL);
+ if (!root_device)
+ return -ENOMEM;
+
+ root_device->name = "aux_test_root";
+ root_device->dev.release = root_device_release;
+
+ retval = platform_device_register(root_device);
+ if (retval) {
+ kfree(root_device);
+ return retval;
+ }
+
+ /* Allocate 3 test devices as a child of this parent */
+ tdev1 = test_device_create(&root_device->dev, "test_dev_1", 21);
+ tdev2 = test_device_create(&root_device->dev, "test_dev_2", 32);
+ tdev3 = test_device_create(&root_device->dev, "test_dev_3", 43);
+
+ return 0;
+}
+
+static void __exit aux_test_exit(void)
+{
+ test_dev_del(tdev1);
+ test_dev_del(tdev2);
+ test_dev_del(tdev3);
+ platform_device_unregister(root_device);
+
+}
+
+
+
+module_init(aux_test_init);
+module_exit(aux_test_exit);
+
+
+MODULE_LICENSE("GPL v2");
--- a/drivers/base/auxiliary.c
+++ b/drivers/base/auxiliary.c
@@ -11,6 +11,7 @@
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/module.h>
+#include <linux/slab.h>
#include <linux/pm_domain.h>
#include <linux/pm_runtime.h>
#include <linux/string.h>