tc-driver.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. #include <linux/init.h>
  15. #include <linux/module.h>
  16. #include <linux/tc.h>
  17. /**
  18. * tc_register_driver - register a new TC driver
  19. * @drv: the driver structure to register
  20. *
  21. * Adds the driver structure to the list of registered drivers
  22. * Returns a negative value on error, otherwise 0.
  23. * If no error occurred, the driver remains registered even if
  24. * no device was claimed during registration.
  25. */
  26. int tc_register_driver(struct tc_driver *tdrv)
  27. {
  28. return driver_register(&tdrv->driver);
  29. }
  30. EXPORT_SYMBOL(tc_register_driver);
  31. /**
  32. * tc_unregister_driver - unregister a TC driver
  33. * @drv: the driver structure to unregister
  34. *
  35. * Deletes the driver structure from the list of registered TC drivers,
  36. * gives it a chance to clean up by calling its remove() function for
  37. * each device it was responsible for, and marks those devices as
  38. * driverless.
  39. */
  40. void tc_unregister_driver(struct tc_driver *tdrv)
  41. {
  42. driver_unregister(&tdrv->driver);
  43. }
  44. EXPORT_SYMBOL(tc_unregister_driver);
  45. /**
  46. * tc_match_device - tell if a TC device structure has a matching
  47. * TC device ID structure
  48. * @tdrv: the TC driver to earch for matching TC device ID strings
  49. * @tdev: the TC device structure to match against
  50. *
  51. * Used by a driver to check whether a TC device present in the
  52. * system is in its list of supported devices. Returns the matching
  53. * tc_device_id structure or %NULL if there is no match.
  54. */
  55. static const struct tc_device_id *tc_match_device(struct tc_driver *tdrv,
  56. struct tc_dev *tdev)
  57. {
  58. const struct tc_device_id *id = tdrv->id_table;
  59. if (id) {
  60. while (id->name[0] || id->vendor[0]) {
  61. if (strcmp(tdev->name, id->name) == 0 &&
  62. strcmp(tdev->vendor, id->vendor) == 0)
  63. return id;
  64. id++;
  65. }
  66. }
  67. return NULL;
  68. }
  69. /**
  70. * tc_bus_match - Tell if a device structure has a matching
  71. * TC device ID structure
  72. * @dev: the device structure to match against
  73. * @drv: the device driver to search for matching TC device ID strings
  74. *
  75. * Used by a driver to check whether a TC device present in the
  76. * system is in its list of supported devices. Returns 1 if there
  77. * is a match or 0 otherwise.
  78. */
  79. static int tc_bus_match(struct device *dev, struct device_driver *drv)
  80. {
  81. struct tc_dev *tdev = to_tc_dev(dev);
  82. struct tc_driver *tdrv = to_tc_driver(drv);
  83. const struct tc_device_id *id;
  84. id = tc_match_device(tdrv, tdev);
  85. if (id)
  86. return 1;
  87. return 0;
  88. }
  89. struct bus_type tc_bus_type = {
  90. .name = "tc",
  91. .match = tc_bus_match,
  92. };
  93. EXPORT_SYMBOL(tc_bus_type);
  94. static int __init tc_driver_init(void)
  95. {
  96. return bus_register(&tc_bus_type);
  97. }
  98. postcore_initcall(tc_driver_init);