xref: /linux/drivers/vfio/mdev/mdev_driver.c (revision 29e31a8ee811f5d85274f0381f13cd6fe650aea4)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * MDEV driver
4  *
5  * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
6  *     Author: Neo Jia <cjia@nvidia.com>
7  *             Kirti Wankhede <kwankhede@nvidia.com>
8  */
9 
10 #include <linux/iommu.h>
11 #include <linux/mdev.h>
12 
13 #include "mdev_private.h"
14 
15 static int mdev_probe(struct device *dev)
16 {
17 	struct mdev_driver *drv =
18 		container_of(dev->driver, struct mdev_driver, driver);
19 
20 	if (!drv->probe)
21 		return 0;
22 	return drv->probe(to_mdev_device(dev));
23 }
24 
25 static void mdev_remove(struct device *dev)
26 {
27 	struct mdev_driver *drv =
28 		container_of(dev->driver, struct mdev_driver, driver);
29 
30 	if (drv->remove)
31 		drv->remove(to_mdev_device(dev));
32 }
33 
34 static int mdev_match(struct device *dev, struct device_driver *drv)
35 {
36 	/*
37 	 * No drivers automatically match. Drivers are only bound by explicit
38 	 * device_driver_attach()
39 	 */
40 	return 0;
41 }
42 
43 struct bus_type mdev_bus_type = {
44 	.name		= "mdev",
45 	.probe		= mdev_probe,
46 	.remove		= mdev_remove,
47 	.match		= mdev_match,
48 };
49 
50 /**
51  * mdev_register_driver - register a new MDEV driver
52  * @drv: the driver to register
53  *
54  * Returns a negative value on error, otherwise 0.
55  **/
56 int mdev_register_driver(struct mdev_driver *drv)
57 {
58 	if (!drv->device_api)
59 		return -EINVAL;
60 
61 	/* initialize common driver fields */
62 	drv->driver.bus = &mdev_bus_type;
63 	return driver_register(&drv->driver);
64 }
65 EXPORT_SYMBOL(mdev_register_driver);
66 
67 /*
68  * mdev_unregister_driver - unregister MDEV driver
69  * @drv: the driver to unregister
70  */
71 void mdev_unregister_driver(struct mdev_driver *drv)
72 {
73 	driver_unregister(&drv->driver);
74 }
75 EXPORT_SYMBOL(mdev_unregister_driver);
76