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_bus_type
);