linux/drivers/zorro/zorro-driver.c
<<
>>
Prefs
   1/*
   2 *  Zorro Driver Services
   3 *
   4 *  Copyright (C) 2003 Geert Uytterhoeven
   5 *
   6 *  Loosely based on drivers/pci/pci-driver.c
   7 *
   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
  10 *  for more details.
  11 */
  12
  13#include <linux/init.h>
  14#include <linux/module.h>
  15#include <linux/zorro.h>
  16
  17#include "zorro.h"
  18
  19
  20    /**
  21     *  zorro_match_device - Tell if a Zorro device structure has a matching
  22     *                       Zorro device id structure
  23     *  @ids: array of Zorro device id structures to search in
  24     *  @dev: the Zorro device structure to match against
  25     *
  26     *  Used by a driver to check whether a Zorro device present in the
  27     *  system is in its list of supported devices. Returns the matching
  28     *  zorro_device_id structure or %NULL if there is no match.
  29     */
  30
  31static const struct zorro_device_id *
  32zorro_match_device(const struct zorro_device_id *ids,
  33                   const struct zorro_dev *z)
  34{
  35        while (ids->id) {
  36                if (ids->id == ZORRO_WILDCARD || ids->id == z->id)
  37                        return ids;
  38                ids++;
  39        }
  40        return NULL;
  41}
  42
  43
  44static int zorro_device_probe(struct device *dev)
  45{
  46        int error = 0;
  47        struct zorro_driver *drv = to_zorro_driver(dev->driver);
  48        struct zorro_dev *z = to_zorro_dev(dev);
  49
  50        if (!z->driver && drv->probe) {
  51                const struct zorro_device_id *id;
  52
  53                id = zorro_match_device(drv->id_table, z);
  54                if (id)
  55                        error = drv->probe(z, id);
  56                if (error >= 0) {
  57                        z->driver = drv;
  58                        error = 0;
  59                }
  60        }
  61        return error;
  62}
  63
  64
  65static int zorro_device_remove(struct device *dev)
  66{
  67        struct zorro_dev *z = to_zorro_dev(dev);
  68        struct zorro_driver *drv = to_zorro_driver(dev->driver);
  69
  70        if (drv) {
  71                if (drv->remove)
  72                        drv->remove(z);
  73                z->driver = NULL;
  74        }
  75        return 0;
  76}
  77
  78
  79    /**
  80     *  zorro_register_driver - register a new Zorro driver
  81     *  @drv: the driver structure to register
  82     *
  83     *  Adds the driver structure to the list of registered drivers
  84     *  Returns zero or a negative error value.
  85     */
  86
  87int zorro_register_driver(struct zorro_driver *drv)
  88{
  89        /* initialize common driver fields */
  90        drv->driver.name = drv->name;
  91        drv->driver.bus = &zorro_bus_type;
  92
  93        /* register with core */
  94        return driver_register(&drv->driver);
  95}
  96EXPORT_SYMBOL(zorro_register_driver);
  97
  98
  99    /**
 100     *  zorro_unregister_driver - unregister a zorro driver
 101     *  @drv: the driver structure to unregister
 102     *
 103     *  Deletes the driver structure from the list of registered Zorro drivers,
 104     *  gives it a chance to clean up by calling its remove() function for
 105     *  each device it was responsible for, and marks those devices as
 106     *  driverless.
 107     */
 108
 109void zorro_unregister_driver(struct zorro_driver *drv)
 110{
 111        driver_unregister(&drv->driver);
 112}
 113EXPORT_SYMBOL(zorro_unregister_driver);
 114
 115
 116    /**
 117     *  zorro_bus_match - Tell if a Zorro device structure has a matching Zorro
 118     *                    device id structure
 119     *  @ids: array of Zorro device id structures to search in
 120     *  @dev: the Zorro device structure to match against
 121     *
 122     *  Used by the driver core to check whether a Zorro device present in the
 123     *  system is in a driver's list of supported devices.  Returns 1 if
 124     *  supported, and 0 if there is no match.
 125     */
 126
 127static int zorro_bus_match(struct device *dev, struct device_driver *drv)
 128{
 129        struct zorro_dev *z = to_zorro_dev(dev);
 130        struct zorro_driver *zorro_drv = to_zorro_driver(drv);
 131        const struct zorro_device_id *ids = zorro_drv->id_table;
 132
 133        if (!ids)
 134                return 0;
 135
 136        return !!zorro_match_device(ids, z);
 137}
 138
 139static int zorro_uevent(struct device *dev, struct kobj_uevent_env *env)
 140{
 141        struct zorro_dev *z;
 142
 143        if (!dev)
 144                return -ENODEV;
 145
 146        z = to_zorro_dev(dev);
 147        if (!z)
 148                return -ENODEV;
 149
 150        if (add_uevent_var(env, "ZORRO_ID=%08X", z->id) ||
 151            add_uevent_var(env, "ZORRO_SLOT_NAME=%s", dev_name(dev)) ||
 152            add_uevent_var(env, "ZORRO_SLOT_ADDR=%04X", z->slotaddr) ||
 153            add_uevent_var(env, "MODALIAS=" ZORRO_DEVICE_MODALIAS_FMT, z->id))
 154                return -ENOMEM;
 155
 156        return 0;
 157}
 158
 159struct bus_type zorro_bus_type = {
 160        .name           = "zorro",
 161        .dev_name       = "zorro",
 162        .dev_groups     = zorro_device_attribute_groups,
 163        .match          = zorro_bus_match,
 164        .uevent         = zorro_uevent,
 165        .probe          = zorro_device_probe,
 166        .remove         = zorro_device_remove,
 167};
 168EXPORT_SYMBOL(zorro_bus_type);
 169
 170
 171static int __init zorro_driver_init(void)
 172{
 173        return bus_register(&zorro_bus_type);
 174}
 175
 176postcore_initcall(zorro_driver_init);
 177
 178