1 /* 2 * TURBOchannel driver services. 3 * 4 * Copyright (c) 2005 James Simmons 5 * Copyright (c) 2006 Maciej W. Rozycki 6 * 7 * Loosely based on drivers/dio/dio-driver.c and 8 * drivers/pci/pci-driver.c. 9 * 10 * This file is subject to the terms and conditions of the GNU 11 * General Public License. See the file "COPYING" in the main 12 * directory of this archive for more details. 13 */ 14 15 #include <linux/init.h> 16 #include <linux/module.h> 17 #include <linux/tc.h> 18 19 /** 20 * tc_register_driver - register a new TC driver 21 * @drv: the driver structure to register 22 * 23 * Adds the driver structure to the list of registered drivers 24 * Returns a negative value on error, otherwise 0. 25 * If no error occurred, the driver remains registered even if 26 * no device was claimed during registration. 27 */ 28 int tc_register_driver(struct tc_driver *tdrv) 29 { 30 return driver_register(&tdrv->driver); 31 } 32 EXPORT_SYMBOL(tc_register_driver); 33 34 /** 35 * tc_unregister_driver - unregister a TC driver 36 * @drv: the driver structure to unregister 37 * 38 * Deletes the driver structure from the list of registered TC drivers, 39 * gives it a chance to clean up by calling its remove() function for 40 * each device it was responsible for, and marks those devices as 41 * driverless. 42 */ 43 void tc_unregister_driver(struct tc_driver *tdrv) 44 { 45 driver_unregister(&tdrv->driver); 46 } 47 EXPORT_SYMBOL(tc_unregister_driver); 48 49 /** 50 * tc_match_device - tell if a TC device structure has a matching 51 * TC device ID structure 52 * @tdrv: the TC driver to earch for matching TC device ID strings 53 * @tdev: the TC device structure to match against 54 * 55 * Used by a driver to check whether a TC device present in the 56 * system is in its list of supported devices. Returns the matching 57 * tc_device_id structure or %NULL if there is no match. 58 */ 59 static const struct tc_device_id *tc_match_device(const struct tc_driver *tdrv, 60 struct tc_dev *tdev) 61 { 62 const struct tc_device_id *id = tdrv->id_table; 63 64 if (id) { 65 while (id->name[0] || id->vendor[0]) { 66 if (strcmp(tdev->name, id->name) == 0 && 67 strcmp(tdev->vendor, id->vendor) == 0) 68 return id; 69 id++; 70 } 71 } 72 return NULL; 73 } 74 75 /** 76 * tc_bus_match - Tell if a device structure has a matching 77 * TC device ID structure 78 * @dev: the device structure to match against 79 * @drv: the device driver to search for matching TC device ID strings 80 * 81 * Used by a driver to check whether a TC device present in the 82 * system is in its list of supported devices. Returns 1 if there 83 * is a match or 0 otherwise. 84 */ 85 static int tc_bus_match(struct device *dev, const struct device_driver *drv) 86 { 87 struct tc_dev *tdev = to_tc_dev(dev); 88 const struct tc_driver *tdrv = to_tc_driver(drv); 89 const struct tc_device_id *id; 90 91 id = tc_match_device(tdrv, tdev); 92 if (id) 93 return 1; 94 95 return 0; 96 } 97 98 const struct bus_type tc_bus_type = { 99 .name = "tc", 100 .match = tc_bus_match, 101 }; 102 EXPORT_SYMBOL(tc_bus_type); 103 104 static int __init tc_driver_init(void) 105 { 106 return bus_register(&tc_bus_type); 107 } 108 109 postcore_initcall(tc_driver_init); 110