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 DIO device id structure
 
  20  *  @ids: array of DIO device id structures to search in
 
  21  *  @d: the DIO device structure to match against
 
  23  *  Used by a driver to check whether a DIO device present in the
 
  24  *  system is in its list of supported devices. Returns the matching
 
  25  *  dio_device_id structure or %NULL if there is no match.
 
  28 const struct dio_device_id *
 
  29 dio_match_device(const struct dio_device_id *ids,
 
  30                    const struct dio_dev *d)
 
  33                 if (ids->id == DIO_WILDCARD)
 
  35                 if (DIO_NEEDSSECID(ids->id & 0xff)) {
 
  39                         if ((ids->id & 0xff) == (d->id & 0xff))
 
  47 static int dio_device_probe(struct device *dev)
 
  50         struct dio_driver *drv = to_dio_driver(dev->driver);
 
  51         struct dio_dev *d = to_dio_dev(dev);
 
  53         if (!d->driver && drv->probe) {
 
  54                 const struct dio_device_id *id;
 
  56                 id = dio_match_device(drv->id_table, d);
 
  58                         error = drv->probe(d, id);
 
  69  *  dio_register_driver - register a new DIO driver
 
  70  *  @drv: the driver structure to register
 
  72  *  Adds the driver structure to the list of registered drivers
 
  73  *  Returns zero or a negative error value.
 
  76 int dio_register_driver(struct dio_driver *drv)
 
  78         /* initialize common driver fields */
 
  79         drv->driver.name = drv->name;
 
  80         drv->driver.bus = &dio_bus_type;
 
  82         /* register with core */
 
  83         return driver_register(&drv->driver);
 
  88  *  dio_unregister_driver - unregister a DIO driver
 
  89  *  @drv: the driver structure to unregister
 
  91  *  Deletes the driver structure from the list of registered DIO drivers,
 
  92  *  gives it a chance to clean up by calling its remove() function for
 
  93  *  each device it was responsible for, and marks those devices as
 
  97 void dio_unregister_driver(struct dio_driver *drv)
 
  99         driver_unregister(&drv->driver);
 
 104  *  dio_bus_match - Tell if a DIO device structure has a matching DIO device id structure
 
 105  *  @dev: the DIO device structure to match against
 
 106  *  @drv: the &device_driver that points to the array of DIO device id structures to search
 
 108  *  Used by a driver to check whether a DIO device present in the
 
 109  *  system is in its list of supported devices. Returns the matching
 
 110  *  dio_device_id structure or %NULL if there is no match.
 
 113 static int dio_bus_match(struct device *dev, struct device_driver *drv)
 
 115         struct dio_dev *d = to_dio_dev(dev);
 
 116         struct dio_driver *dio_drv = to_dio_driver(drv);
 
 117         const struct dio_device_id *ids = dio_drv->id_table;
 
 122         return dio_match_device(ids, d) ? 1 : 0;
 
 126 struct bus_type dio_bus_type = {
 
 128         .match  = dio_bus_match,
 
 129         .probe  = dio_device_probe,
 
 133 static int __init dio_driver_init(void)
 
 135         return bus_register(&dio_bus_type);
 
 138 postcore_initcall(dio_driver_init);
 
 140 EXPORT_SYMBOL(dio_match_device);
 
 141 EXPORT_SYMBOL(dio_register_driver);
 
 142 EXPORT_SYMBOL(dio_unregister_driver);
 
 143 EXPORT_SYMBOL(dio_dev_driver);
 
 144 EXPORT_SYMBOL(dio_bus_type);