Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux-2.6-microblaze.git] / drivers / rapidio / rio-driver.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * RapidIO driver support
4  *
5  * Copyright 2005 MontaVista Software, Inc.
6  * Matt Porter <mporter@kernel.crashing.org>
7  */
8
9 #include <linux/init.h>
10 #include <linux/module.h>
11 #include <linux/rio.h>
12 #include <linux/rio_ids.h>
13
14 #include "rio.h"
15
16 /**
17  *  rio_match_device - Tell if a RIO device has a matching RIO device id structure
18  *  @id: the RIO device id structure to match against
19  *  @rdev: the RIO device structure to match against
20  *
21  *  Used from driver probe and bus matching to check whether a RIO device
22  *  matches a device id structure provided by a RIO driver. Returns the
23  *  matching &struct rio_device_id or %NULL if there is no match.
24  */
25 static const struct rio_device_id *rio_match_device(const struct rio_device_id
26                                                     *id,
27                                                     const struct rio_dev *rdev)
28 {
29         while (id->vid || id->asm_vid) {
30                 if (((id->vid == RIO_ANY_ID) || (id->vid == rdev->vid)) &&
31                     ((id->did == RIO_ANY_ID) || (id->did == rdev->did)) &&
32                     ((id->asm_vid == RIO_ANY_ID)
33                      || (id->asm_vid == rdev->asm_vid))
34                     && ((id->asm_did == RIO_ANY_ID)
35                         || (id->asm_did == rdev->asm_did)))
36                         return id;
37                 id++;
38         }
39         return NULL;
40 }
41
42 /**
43  * rio_dev_get - Increments the reference count of the RIO device structure
44  *
45  * @rdev: RIO device being referenced
46  *
47  * Each live reference to a device should be refcounted.
48  *
49  * Drivers for RIO devices should normally record such references in
50  * their probe() methods, when they bind to a device, and release
51  * them by calling rio_dev_put(), in their disconnect() methods.
52  */
53 struct rio_dev *rio_dev_get(struct rio_dev *rdev)
54 {
55         if (rdev)
56                 get_device(&rdev->dev);
57
58         return rdev;
59 }
60
61 /**
62  * rio_dev_put - Release a use of the RIO device structure
63  *
64  * @rdev: RIO device being disconnected
65  *
66  * Must be called when a user of a device is finished with it.
67  * When the last user of the device calls this function, the
68  * memory of the device is freed.
69  */
70 void rio_dev_put(struct rio_dev *rdev)
71 {
72         if (rdev)
73                 put_device(&rdev->dev);
74 }
75
76 /**
77  *  rio_device_probe - Tell if a RIO device structure has a matching RIO device id structure
78  *  @dev: the RIO device structure to match against
79  *
80  * return 0 and set rio_dev->driver when drv claims rio_dev, else error
81  */
82 static int rio_device_probe(struct device *dev)
83 {
84         struct rio_driver *rdrv = to_rio_driver(dev->driver);
85         struct rio_dev *rdev = to_rio_dev(dev);
86         int error = -ENODEV;
87         const struct rio_device_id *id;
88
89         if (!rdev->driver && rdrv->probe) {
90                 if (!rdrv->id_table)
91                         return error;
92                 id = rio_match_device(rdrv->id_table, rdev);
93                 rio_dev_get(rdev);
94                 if (id)
95                         error = rdrv->probe(rdev, id);
96                 if (error >= 0) {
97                         rdev->driver = rdrv;
98                         error = 0;
99                 } else
100                         rio_dev_put(rdev);
101         }
102         return error;
103 }
104
105 /**
106  *  rio_device_remove - Remove a RIO device from the system
107  *
108  *  @dev: the RIO device structure to match against
109  *
110  * Remove a RIO device from the system. If it has an associated
111  * driver, then run the driver remove() method.  Then update
112  * the reference count.
113  */
114 static int rio_device_remove(struct device *dev)
115 {
116         struct rio_dev *rdev = to_rio_dev(dev);
117         struct rio_driver *rdrv = rdev->driver;
118
119         if (rdrv) {
120                 if (rdrv->remove)
121                         rdrv->remove(rdev);
122                 rdev->driver = NULL;
123         }
124
125         rio_dev_put(rdev);
126
127         return 0;
128 }
129
130 static void rio_device_shutdown(struct device *dev)
131 {
132         struct rio_dev *rdev = to_rio_dev(dev);
133         struct rio_driver *rdrv = rdev->driver;
134
135         dev_dbg(dev, "RIO: %s\n", __func__);
136
137         if (rdrv && rdrv->shutdown)
138                 rdrv->shutdown(rdev);
139 }
140
141 /**
142  *  rio_register_driver - register a new RIO driver
143  *  @rdrv: the RIO driver structure to register
144  *
145  *  Adds a &struct rio_driver to the list of registered drivers.
146  *  Returns a negative value on error, otherwise 0. If no error
147  *  occurred, the driver remains registered even if no device
148  *  was claimed during registration.
149  */
150 int rio_register_driver(struct rio_driver *rdrv)
151 {
152         /* initialize common driver fields */
153         rdrv->driver.name = rdrv->name;
154         rdrv->driver.bus = &rio_bus_type;
155
156         /* register with core */
157         return driver_register(&rdrv->driver);
158 }
159
160 /**
161  *  rio_unregister_driver - unregister a RIO driver
162  *  @rdrv: the RIO driver structure to unregister
163  *
164  *  Deletes the &struct rio_driver from the list of registered RIO
165  *  drivers, gives it a chance to clean up by calling its remove()
166  *  function for each device it was responsible for, and marks those
167  *  devices as driverless.
168  */
169 void rio_unregister_driver(struct rio_driver *rdrv)
170 {
171         driver_unregister(&rdrv->driver);
172 }
173
174 void rio_attach_device(struct rio_dev *rdev)
175 {
176         rdev->dev.bus = &rio_bus_type;
177 }
178 EXPORT_SYMBOL_GPL(rio_attach_device);
179
180 /**
181  *  rio_match_bus - Tell if a RIO device structure has a matching RIO driver device id structure
182  *  @dev: the standard device structure to match against
183  *  @drv: the standard driver structure containing the ids to match against
184  *
185  *  Used by a driver to check whether a RIO device present in the
186  *  system is in its list of supported devices. Returns 1 if
187  *  there is a matching &struct rio_device_id or 0 if there is
188  *  no match.
189  */
190 static int rio_match_bus(struct device *dev, struct device_driver *drv)
191 {
192         struct rio_dev *rdev = to_rio_dev(dev);
193         struct rio_driver *rdrv = to_rio_driver(drv);
194         const struct rio_device_id *id = rdrv->id_table;
195         const struct rio_device_id *found_id;
196
197         if (!id)
198                 goto out;
199
200         found_id = rio_match_device(id, rdev);
201
202         if (found_id)
203                 return 1;
204
205       out:return 0;
206 }
207
208 static int rio_uevent(struct device *dev, struct kobj_uevent_env *env)
209 {
210         struct rio_dev *rdev;
211
212         if (!dev)
213                 return -ENODEV;
214
215         rdev = to_rio_dev(dev);
216         if (!rdev)
217                 return -ENODEV;
218
219         if (add_uevent_var(env, "MODALIAS=rapidio:v%04Xd%04Xav%04Xad%04X",
220                            rdev->vid, rdev->did, rdev->asm_vid, rdev->asm_did))
221                 return -ENOMEM;
222         return 0;
223 }
224
225 struct class rio_mport_class = {
226         .name           = "rapidio_port",
227         .owner          = THIS_MODULE,
228         .dev_groups     = rio_mport_groups,
229 };
230 EXPORT_SYMBOL_GPL(rio_mport_class);
231
232 struct bus_type rio_bus_type = {
233         .name = "rapidio",
234         .match = rio_match_bus,
235         .dev_groups = rio_dev_groups,
236         .bus_groups = rio_bus_groups,
237         .probe = rio_device_probe,
238         .remove = rio_device_remove,
239         .shutdown = rio_device_shutdown,
240         .uevent = rio_uevent,
241 };
242
243 /**
244  *  rio_bus_init - Register the RapidIO bus with the device model
245  *
246  *  Registers the RIO mport device class and RIO bus type with the Linux
247  *  device model.
248  */
249 static int __init rio_bus_init(void)
250 {
251         int ret;
252
253         ret = class_register(&rio_mport_class);
254         if (!ret) {
255                 ret = bus_register(&rio_bus_type);
256                 if (ret)
257                         class_unregister(&rio_mport_class);
258         }
259         return ret;
260 }
261
262 postcore_initcall(rio_bus_init);
263
264 EXPORT_SYMBOL_GPL(rio_register_driver);
265 EXPORT_SYMBOL_GPL(rio_unregister_driver);
266 EXPORT_SYMBOL_GPL(rio_bus_type);
267 EXPORT_SYMBOL_GPL(rio_dev_get);
268 EXPORT_SYMBOL_GPL(rio_dev_put);