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/device.h> 11 #include <linux/iommu.h> 12 #include <linux/mdev.h> 13 14 #include "mdev_private.h" 15 16 static int mdev_probe(struct device *dev) 17 { 18 struct mdev_driver *drv = 19 container_of(dev->driver, struct mdev_driver, driver); 20 21 if (!drv->probe) 22 return 0; 23 return drv->probe(to_mdev_device(dev)); 24 } 25 26 static void mdev_remove(struct device *dev) 27 { 28 struct mdev_driver *drv = 29 container_of(dev->driver, struct mdev_driver, driver); 30 31 if (drv->remove) 32 drv->remove(to_mdev_device(dev)); 33 } 34 35 static int mdev_match(struct device *dev, struct device_driver *drv) 36 { 37 /* 38 * No drivers automatically match. Drivers are only bound by explicit 39 * device_driver_attach() 40 */ 41 return 0; 42 } 43 44 struct bus_type mdev_bus_type = { 45 .name = "mdev", 46 .probe = mdev_probe, 47 .remove = mdev_remove, 48 .match = mdev_match, 49 }; 50 EXPORT_SYMBOL_GPL(mdev_bus_type); 51 52 /** 53 * mdev_register_driver - register a new MDEV driver 54 * @drv: the driver to register 55 * 56 * Returns a negative value on error, otherwise 0. 57 **/ 58 int mdev_register_driver(struct mdev_driver *drv) 59 { 60 /* initialize common driver fields */ 61 drv->driver.bus = &mdev_bus_type; 62 63 /* register with core */ 64 return driver_register(&drv->driver); 65 } 66 EXPORT_SYMBOL(mdev_register_driver); 67 68 /* 69 * mdev_unregister_driver - unregister MDEV driver 70 * @drv: the driver to unregister 71 */ 72 void mdev_unregister_driver(struct mdev_driver *drv) 73 { 74 driver_unregister(&drv->driver); 75 } 76 EXPORT_SYMBOL(mdev_unregister_driver); 77 78 int mdev_bus_register(void) 79 { 80 return bus_register(&mdev_bus_type); 81 } 82 83 void mdev_bus_unregister(void) 84 { 85 bus_unregister(&mdev_bus_type); 86 } 87