1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (c) 2019-2020 Intel Corporation
4 *
5 * Please see Documentation/driver-api/auxiliary_bus.rst for more information.
6 */
7
8#ifndef _AUXILIARY_BUS_H_
9#define _AUXILIARY_BUS_H_
10
11#include <linux/device.h>
12#include <linux/mod_devicetable.h>
13
14/**
15 * DOC: DEVICE_LIFESPAN
16 *
17 * The registering driver is the entity that allocates memory for the
18 * auxiliary_device and registers it on the auxiliary bus.  It is important to
19 * note that, as opposed to the platform bus, the registering driver is wholly
20 * responsible for the management of the memory used for the device object.
21 *
22 * To be clear the memory for the auxiliary_device is freed in the release()
23 * callback defined by the registering driver.  The registering driver should
24 * only call auxiliary_device_delete() and then auxiliary_device_uninit() when
25 * it is done with the device.  The release() function is then automatically
26 * called if and when other code releases their reference to the devices.
27 *
28 * A parent object, defined in the shared header file, contains the
29 * auxiliary_device.  It also contains a pointer to the shared object(s), which
30 * also is defined in the shared header.  Both the parent object and the shared
31 * object(s) are allocated by the registering driver.  This layout allows the
32 * auxiliary_driver's registering module to perform a container_of() call to go
33 * from the pointer to the auxiliary_device, that is passed during the call to
34 * the auxiliary_driver's probe function, up to the parent object, and then
35 * have access to the shared object(s).
36 *
37 * The memory for the shared object(s) must have a lifespan equal to, or
38 * greater than, the lifespan of the memory for the auxiliary_device.  The
39 * auxiliary_driver should only consider that the shared object is valid as
40 * long as the auxiliary_device is still registered on the auxiliary bus.  It
41 * is up to the registering driver to manage (e.g. free or keep available) the
42 * memory for the shared object beyond the life of the auxiliary_device.
43 *
44 * The registering driver must unregister all auxiliary devices before its own
45 * driver.remove() is completed.  An easy way to ensure this is to use the
46 * devm_add_action_or_reset() call to register a function against the parent
47 * device which unregisters the auxiliary device object(s).
48 *
49 * Finally, any operations which operate on the auxiliary devices must continue
50 * to function (if only to return an error) after the registering driver
51 * unregisters the auxiliary device.
52 */
53
54/**
55 * struct auxiliary_device - auxiliary device object.
56 * @dev: Device,
57 *       The release and parent fields of the device structure must be filled
58 *       in
59 * @name: Match name found by the auxiliary device driver,
60 * @id: unique identitier if multiple devices of the same name are exported,
61 *
62 * An auxiliary_device represents a part of its parent device's functionality.
63 * It is given a name that, combined with the registering drivers
64 * KBUILD_MODNAME, creates a match_name that is used for driver binding, and an
65 * id that combined with the match_name provide a unique name to register with
66 * the bus subsystem.  For example, a driver registering an auxiliary device is
67 * named 'foo_mod.ko' and the subdevice is named 'foo_dev'.  The match name is
68 * therefore 'foo_mod.foo_dev'.
69 *
70 * Registering an auxiliary_device is a three-step process.
71 *
72 * First, a 'struct auxiliary_device' needs to be defined or allocated for each
73 * sub-device desired.  The name, id, dev.release, and dev.parent fields of
74 * this structure must be filled in as follows.
75 *
76 * The 'name' field is to be given a name that is recognized by the auxiliary
77 * driver.  If two auxiliary_devices with the same match_name, eg
78 * "foo_mod.foo_dev", are registered onto the bus, they must have unique id
79 * values (e.g. "x" and "y") so that the registered devices names are
80 * "foo_mod.foo_dev.x" and "foo_mod.foo_dev.y".  If match_name + id are not
81 * unique, then the device_add fails and generates an error message.
82 *
83 * The auxiliary_device.dev.type.release or auxiliary_device.dev.release must
84 * be populated with a non-NULL pointer to successfully register the
85 * auxiliary_device.  This release call is where resources associated with the
86 * auxiliary device must be free'ed.  Because once the device is placed on the
87 * bus the parent driver can not tell what other code may have a reference to
88 * this data.
89 *
90 * The auxiliary_device.dev.parent should be set.  Typically to the registering
91 * drivers device.
92 *
93 * Second, call auxiliary_device_init(), which checks several aspects of the
94 * auxiliary_device struct and performs a device_initialize().  After this step
95 * completes, any error state must have a call to auxiliary_device_uninit() in
96 * its resolution path.
97 *
98 * The third and final step in registering an auxiliary_device is to perform a
99 * call to auxiliary_device_add(), which sets the name of the device and adds
100 * the device to the bus.
101 *
102 * .. code-block:: c
103 *
104 *      #define MY_DEVICE_NAME "foo_dev"
105 *
106 *      ...
107 *
108 *	struct auxiliary_device *my_aux_dev = my_aux_dev_alloc(xxx);
109 *
110 *	// Step 1:
111 *	my_aux_dev->name = MY_DEVICE_NAME;
112 *	my_aux_dev->id = my_unique_id_alloc(xxx);
113 *	my_aux_dev->dev.release = my_aux_dev_release;
114 *	my_aux_dev->dev.parent = my_dev;
115 *
116 *	// Step 2:
117 *	if (auxiliary_device_init(my_aux_dev))
118 *		goto fail;
119 *
120 *	// Step 3:
121 *	if (auxiliary_device_add(my_aux_dev)) {
122 *		auxiliary_device_uninit(my_aux_dev);
123 *		goto fail;
124 *	}
125 *
126 *	...
127 *
128 *
129 * Unregistering an auxiliary_device is a two-step process to mirror the
130 * register process.  First call auxiliary_device_delete(), then call
131 * auxiliary_device_uninit().
132 *
133 * .. code-block:: c
134 *
135 *         auxiliary_device_delete(my_dev->my_aux_dev);
136 *         auxiliary_device_uninit(my_dev->my_aux_dev);
137 */
138struct auxiliary_device {
139	struct device dev;
140	const char *name;
141	u32 id;
142};
143
144/**
145 * struct auxiliary_driver - Definition of an auxiliary bus driver
146 * @probe: Called when a matching device is added to the bus.
147 * @remove: Called when device is removed from the bus.
148 * @shutdown: Called at shut-down time to quiesce the device.
149 * @suspend: Called to put the device to sleep mode. Usually to a power state.
150 * @resume: Called to bring a device from sleep mode.
151 * @name: Driver name.
152 * @driver: Core driver structure.
153 * @id_table: Table of devices this driver should match on the bus.
154 *
155 * Auxiliary drivers follow the standard driver model convention, where
156 * discovery/enumeration is handled by the core, and drivers provide probe()
157 * and remove() methods. They support power management and shutdown
158 * notifications using the standard conventions.
159 *
160 * Auxiliary drivers register themselves with the bus by calling
161 * auxiliary_driver_register(). The id_table contains the match_names of
162 * auxiliary devices that a driver can bind with.
163 *
164 * .. code-block:: c
165 *
166 *         static const struct auxiliary_device_id my_auxiliary_id_table[] = {
167 *		   { .name = "foo_mod.foo_dev" },
168 *                 {},
169 *         };
170 *
171 *         MODULE_DEVICE_TABLE(auxiliary, my_auxiliary_id_table);
172 *
173 *         struct auxiliary_driver my_drv = {
174 *                 .name = "myauxiliarydrv",
175 *                 .id_table = my_auxiliary_id_table,
176 *                 .probe = my_drv_probe,
177 *                 .remove = my_drv_remove
178 *         };
179 */
180struct auxiliary_driver {
181	int (*probe)(struct auxiliary_device *auxdev, const struct auxiliary_device_id *id);
182	void (*remove)(struct auxiliary_device *auxdev);
183	void (*shutdown)(struct auxiliary_device *auxdev);
184	int (*suspend)(struct auxiliary_device *auxdev, pm_message_t state);
185	int (*resume)(struct auxiliary_device *auxdev);
186	const char *name;
187	struct device_driver driver;
188	const struct auxiliary_device_id *id_table;
189};
190
191static inline void *auxiliary_get_drvdata(struct auxiliary_device *auxdev)
192{
193	return dev_get_drvdata(&auxdev->dev);
194}
195
196static inline void auxiliary_set_drvdata(struct auxiliary_device *auxdev, void *data)
197{
198	dev_set_drvdata(&auxdev->dev, data);
199}
200
201static inline struct auxiliary_device *to_auxiliary_dev(struct device *dev)
202{
203	return container_of(dev, struct auxiliary_device, dev);
204}
205
206static inline struct auxiliary_driver *to_auxiliary_drv(struct device_driver *drv)
207{
208	return container_of(drv, struct auxiliary_driver, driver);
209}
210
211int auxiliary_device_init(struct auxiliary_device *auxdev);
212int __auxiliary_device_add(struct auxiliary_device *auxdev, const char *modname);
213#define auxiliary_device_add(auxdev) __auxiliary_device_add(auxdev, KBUILD_MODNAME)
214
215static inline void auxiliary_device_uninit(struct auxiliary_device *auxdev)
216{
217	put_device(&auxdev->dev);
218}
219
220static inline void auxiliary_device_delete(struct auxiliary_device *auxdev)
221{
222	device_del(&auxdev->dev);
223}
224
225int __auxiliary_driver_register(struct auxiliary_driver *auxdrv, struct module *owner,
226				const char *modname);
227#define auxiliary_driver_register(auxdrv) \
228	__auxiliary_driver_register(auxdrv, THIS_MODULE, KBUILD_MODNAME)
229
230void auxiliary_driver_unregister(struct auxiliary_driver *auxdrv);
231
232/**
233 * module_auxiliary_driver() - Helper macro for registering an auxiliary driver
234 * @__auxiliary_driver: auxiliary driver struct
235 *
236 * Helper macro for auxiliary drivers which do not do anything special in
237 * module init/exit. This eliminates a lot of boilerplate. Each module may only
238 * use this macro once, and calling it replaces module_init() and module_exit()
239 *
240 * .. code-block:: c
241 *
242 *	module_auxiliary_driver(my_drv);
243 */
244#define module_auxiliary_driver(__auxiliary_driver) \
245	module_driver(__auxiliary_driver, auxiliary_driver_register, auxiliary_driver_unregister)
246
247struct auxiliary_device *auxiliary_find_device(struct device *start,
248					       const void *data,
249					       int (*match)(struct device *dev, const void *data));
250
251#endif /* _AUXILIARY_BUS_H_ */
252