4  *  Copyright (C) 2004 Jochen Friedrich
 
   6  *  Loosely based on drivers/pci/pci-driver.c and drivers/zorro/zorro-driver.c
 
   8  *  This file is subject to the terms and conditions of the GNU General Public
 
   9  *  License.  See the file COPYING in the main directory of this archive
 
  13 #include <linux/init.h>
 
  14 #include <linux/module.h>
 
  15 #include <linux/dio.h>
 
  19          *  dio_match_device - Tell if a DIO device structure has a matching
 
  20          *                     DIO device id structure
 
  21          *  @ids: array of DIO device id structures to search in
 
  22          *  @dev: the DIO device structure to match against
 
  24          *  Used by a driver to check whether a DIO device present in the
 
  25          *  system is in its list of supported devices. Returns the matching
 
  26          *  dio_device_id structure or %NULL if there is no match.
 
  29 const struct dio_device_id *
 
  30 dio_match_device(const struct dio_device_id *ids,
 
  31                    const struct dio_dev *d)
 
  34                 if (ids->id == DIO_WILDCARD)
 
  36                 if (DIO_NEEDSSECID(ids->id & 0xff)) {
 
  40                         if ((ids->id & 0xff) == (d->id & 0xff))
 
  48 static int dio_device_probe(struct device *dev)
 
  51         struct dio_driver *drv = to_dio_driver(dev->driver);
 
  52         struct dio_dev *d = to_dio_dev(dev);
 
  54         if (!d->driver && drv->probe) {
 
  55                 const struct dio_device_id *id;
 
  57                 id = dio_match_device(drv->id_table, d);
 
  59                         error = drv->probe(d, id);
 
  70          *  dio_register_driver - register a new DIO driver
 
  71          *  @drv: the driver structure to register
 
  73          *  Adds the driver structure to the list of registered drivers
 
  74          *  Returns zero or a negative error value.
 
  77 int dio_register_driver(struct dio_driver *drv)
 
  79         /* initialize common driver fields */
 
  80         drv->driver.name = drv->name;
 
  81         drv->driver.bus = &dio_bus_type;
 
  83         /* register with core */
 
  84         return driver_register(&drv->driver);
 
  89          *  dio_unregister_driver - unregister a DIO driver
 
  90          *  @drv: the driver structure to unregister
 
  92          *  Deletes the driver structure from the list of registered DIO drivers,
 
  93          *  gives it a chance to clean up by calling its remove() function for
 
  94          *  each device it was responsible for, and marks those devices as
 
  98 void dio_unregister_driver(struct dio_driver *drv)
 
 100         driver_unregister(&drv->driver);
 
 105          *  dio_bus_match - Tell if a DIO device structure has a matching DIO
 
 106          *                  device id structure
 
 107          *  @ids: array of DIO device id structures to search in
 
 108          *  @dev: the DIO device structure to match against
 
 110          *  Used by a driver to check whether a DIO device present in the
 
 111          *  system is in its list of supported devices. Returns the matching
 
 112          *  dio_device_id structure or %NULL if there is no match.
 
 115 static int dio_bus_match(struct device *dev, struct device_driver *drv)
 
 117         struct dio_dev *d = to_dio_dev(dev);
 
 118         struct dio_driver *dio_drv = to_dio_driver(drv);
 
 119         const struct dio_device_id *ids = dio_drv->id_table;
 
 125                 if (ids->id == DIO_WILDCARD)
 
 127                 if (DIO_NEEDSSECID(ids->id & 0xff)) {
 
 128                         if (ids->id == d->id)
 
 131                         if ((ids->id & 0xff) == (d->id & 0xff))
 
 140 struct bus_type dio_bus_type = {
 
 142         .match  = dio_bus_match,
 
 143         .probe  = dio_device_probe,
 
 147 static int __init dio_driver_init(void)
 
 149         return bus_register(&dio_bus_type);
 
 152 postcore_initcall(dio_driver_init);
 
 154 EXPORT_SYMBOL(dio_match_device);
 
 155 EXPORT_SYMBOL(dio_register_driver);
 
 156 EXPORT_SYMBOL(dio_unregister_driver);
 
 157 EXPORT_SYMBOL(dio_dev_driver);
 
 158 EXPORT_SYMBOL(dio_bus_type);