]> asedeno.scripts.mit.edu Git - linux.git/blob - drivers/base/component.c
Merge tag 'for-linus-20181026' of git://git.kernel.dk/linux-block
[linux.git] / drivers / base / component.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Componentized device handling.
4  *
5  * This is work in progress.  We gather up the component devices into a list,
6  * and bind them when instructed.  At the moment, we're specific to the DRM
7  * subsystem, and only handles one master device, but this doesn't have to be
8  * the case.
9  */
10 #include <linux/component.h>
11 #include <linux/device.h>
12 #include <linux/kref.h>
13 #include <linux/list.h>
14 #include <linux/module.h>
15 #include <linux/mutex.h>
16 #include <linux/slab.h>
17 #include <linux/debugfs.h>
18
19 struct component;
20
21 struct component_match_array {
22         void *data;
23         int (*compare)(struct device *, void *);
24         void (*release)(struct device *, void *);
25         struct component *component;
26         bool duplicate;
27 };
28
29 struct component_match {
30         size_t alloc;
31         size_t num;
32         struct component_match_array *compare;
33 };
34
35 struct master {
36         struct list_head node;
37         bool bound;
38
39         const struct component_master_ops *ops;
40         struct device *dev;
41         struct component_match *match;
42         struct dentry *dentry;
43 };
44
45 struct component {
46         struct list_head node;
47         struct master *master;
48         bool bound;
49
50         const struct component_ops *ops;
51         struct device *dev;
52 };
53
54 static DEFINE_MUTEX(component_mutex);
55 static LIST_HEAD(component_list);
56 static LIST_HEAD(masters);
57
58 #ifdef CONFIG_DEBUG_FS
59
60 static struct dentry *component_debugfs_dir;
61
62 static int component_devices_show(struct seq_file *s, void *data)
63 {
64         struct master *m = s->private;
65         struct component_match *match = m->match;
66         size_t i;
67
68         mutex_lock(&component_mutex);
69         seq_printf(s, "%-40s %20s\n", "master name", "status");
70         seq_puts(s, "-------------------------------------------------------------\n");
71         seq_printf(s, "%-40s %20s\n\n",
72                    dev_name(m->dev), m->bound ? "bound" : "not bound");
73
74         seq_printf(s, "%-40s %20s\n", "device name", "status");
75         seq_puts(s, "-------------------------------------------------------------\n");
76         for (i = 0; i < match->num; i++) {
77                 struct device *d = (struct device *)match->compare[i].data;
78
79                 seq_printf(s, "%-40s %20s\n", dev_name(d),
80                            match->compare[i].component ?
81                            "registered" : "not registered");
82         }
83         mutex_unlock(&component_mutex);
84
85         return 0;
86 }
87
88 static int component_devices_open(struct inode *inode, struct file *file)
89 {
90         return single_open(file, component_devices_show, inode->i_private);
91 }
92
93 static const struct file_operations component_devices_fops = {
94         .open = component_devices_open,
95         .read = seq_read,
96         .llseek = seq_lseek,
97         .release = single_release,
98 };
99
100 static int __init component_debug_init(void)
101 {
102         component_debugfs_dir = debugfs_create_dir("device_component", NULL);
103
104         return 0;
105 }
106
107 core_initcall(component_debug_init);
108
109 static void component_master_debugfs_add(struct master *m)
110 {
111         m->dentry = debugfs_create_file(dev_name(m->dev), 0444,
112                                         component_debugfs_dir,
113                                         m, &component_devices_fops);
114 }
115
116 static void component_master_debugfs_del(struct master *m)
117 {
118         debugfs_remove(m->dentry);
119         m->dentry = NULL;
120 }
121
122 #else
123
124 static void component_master_debugfs_add(struct master *m)
125 { }
126
127 static void component_master_debugfs_del(struct master *m)
128 { }
129
130 #endif
131
132 static struct master *__master_find(struct device *dev,
133         const struct component_master_ops *ops)
134 {
135         struct master *m;
136
137         list_for_each_entry(m, &masters, node)
138                 if (m->dev == dev && (!ops || m->ops == ops))
139                         return m;
140
141         return NULL;
142 }
143
144 static struct component *find_component(struct master *master,
145         int (*compare)(struct device *, void *), void *compare_data)
146 {
147         struct component *c;
148
149         list_for_each_entry(c, &component_list, node) {
150                 if (c->master && c->master != master)
151                         continue;
152
153                 if (compare(c->dev, compare_data))
154                         return c;
155         }
156
157         return NULL;
158 }
159
160 static int find_components(struct master *master)
161 {
162         struct component_match *match = master->match;
163         size_t i;
164         int ret = 0;
165
166         /*
167          * Scan the array of match functions and attach
168          * any components which are found to this master.
169          */
170         for (i = 0; i < match->num; i++) {
171                 struct component_match_array *mc = &match->compare[i];
172                 struct component *c;
173
174                 dev_dbg(master->dev, "Looking for component %zu\n", i);
175
176                 if (match->compare[i].component)
177                         continue;
178
179                 c = find_component(master, mc->compare, mc->data);
180                 if (!c) {
181                         ret = -ENXIO;
182                         break;
183                 }
184
185                 dev_dbg(master->dev, "found component %s, duplicate %u\n", dev_name(c->dev), !!c->master);
186
187                 /* Attach this component to the master */
188                 match->compare[i].duplicate = !!c->master;
189                 match->compare[i].component = c;
190                 c->master = master;
191         }
192         return ret;
193 }
194
195 /* Detach component from associated master */
196 static void remove_component(struct master *master, struct component *c)
197 {
198         size_t i;
199
200         /* Detach the component from this master. */
201         for (i = 0; i < master->match->num; i++)
202                 if (master->match->compare[i].component == c)
203                         master->match->compare[i].component = NULL;
204 }
205
206 /*
207  * Try to bring up a master.  If component is NULL, we're interested in
208  * this master, otherwise it's a component which must be present to try
209  * and bring up the master.
210  *
211  * Returns 1 for successful bringup, 0 if not ready, or -ve errno.
212  */
213 static int try_to_bring_up_master(struct master *master,
214         struct component *component)
215 {
216         int ret;
217
218         dev_dbg(master->dev, "trying to bring up master\n");
219
220         if (find_components(master)) {
221                 dev_dbg(master->dev, "master has incomplete components\n");
222                 return 0;
223         }
224
225         if (component && component->master != master) {
226                 dev_dbg(master->dev, "master is not for this component (%s)\n",
227                         dev_name(component->dev));
228                 return 0;
229         }
230
231         if (!devres_open_group(master->dev, NULL, GFP_KERNEL))
232                 return -ENOMEM;
233
234         /* Found all components */
235         ret = master->ops->bind(master->dev);
236         if (ret < 0) {
237                 devres_release_group(master->dev, NULL);
238                 dev_info(master->dev, "master bind failed: %d\n", ret);
239                 return ret;
240         }
241
242         master->bound = true;
243         return 1;
244 }
245
246 static int try_to_bring_up_masters(struct component *component)
247 {
248         struct master *m;
249         int ret = 0;
250
251         list_for_each_entry(m, &masters, node) {
252                 if (!m->bound) {
253                         ret = try_to_bring_up_master(m, component);
254                         if (ret != 0)
255                                 break;
256                 }
257         }
258
259         return ret;
260 }
261
262 static void take_down_master(struct master *master)
263 {
264         if (master->bound) {
265                 master->ops->unbind(master->dev);
266                 devres_release_group(master->dev, NULL);
267                 master->bound = false;
268         }
269 }
270
271 static void component_match_release(struct device *master,
272         struct component_match *match)
273 {
274         unsigned int i;
275
276         for (i = 0; i < match->num; i++) {
277                 struct component_match_array *mc = &match->compare[i];
278
279                 if (mc->release)
280                         mc->release(master, mc->data);
281         }
282
283         kfree(match->compare);
284 }
285
286 static void devm_component_match_release(struct device *dev, void *res)
287 {
288         component_match_release(dev, res);
289 }
290
291 static int component_match_realloc(struct device *dev,
292         struct component_match *match, size_t num)
293 {
294         struct component_match_array *new;
295
296         if (match->alloc == num)
297                 return 0;
298
299         new = kmalloc_array(num, sizeof(*new), GFP_KERNEL);
300         if (!new)
301                 return -ENOMEM;
302
303         if (match->compare) {
304                 memcpy(new, match->compare, sizeof(*new) *
305                                             min(match->num, num));
306                 kfree(match->compare);
307         }
308         match->compare = new;
309         match->alloc = num;
310
311         return 0;
312 }
313
314 /*
315  * Add a component to be matched, with a release function.
316  *
317  * The match array is first created or extended if necessary.
318  */
319 void component_match_add_release(struct device *master,
320         struct component_match **matchptr,
321         void (*release)(struct device *, void *),
322         int (*compare)(struct device *, void *), void *compare_data)
323 {
324         struct component_match *match = *matchptr;
325
326         if (IS_ERR(match))
327                 return;
328
329         if (!match) {
330                 match = devres_alloc(devm_component_match_release,
331                                      sizeof(*match), GFP_KERNEL);
332                 if (!match) {
333                         *matchptr = ERR_PTR(-ENOMEM);
334                         return;
335                 }
336
337                 devres_add(master, match);
338
339                 *matchptr = match;
340         }
341
342         if (match->num == match->alloc) {
343                 size_t new_size = match->alloc + 16;
344                 int ret;
345
346                 ret = component_match_realloc(master, match, new_size);
347                 if (ret) {
348                         *matchptr = ERR_PTR(ret);
349                         return;
350                 }
351         }
352
353         match->compare[match->num].compare = compare;
354         match->compare[match->num].release = release;
355         match->compare[match->num].data = compare_data;
356         match->compare[match->num].component = NULL;
357         match->num++;
358 }
359 EXPORT_SYMBOL(component_match_add_release);
360
361 static void free_master(struct master *master)
362 {
363         struct component_match *match = master->match;
364         int i;
365
366         component_master_debugfs_del(master);
367         list_del(&master->node);
368
369         if (match) {
370                 for (i = 0; i < match->num; i++) {
371                         struct component *c = match->compare[i].component;
372                         if (c)
373                                 c->master = NULL;
374                 }
375         }
376
377         kfree(master);
378 }
379
380 int component_master_add_with_match(struct device *dev,
381         const struct component_master_ops *ops,
382         struct component_match *match)
383 {
384         struct master *master;
385         int ret;
386
387         /* Reallocate the match array for its true size */
388         ret = component_match_realloc(dev, match, match->num);
389         if (ret)
390                 return ret;
391
392         master = kzalloc(sizeof(*master), GFP_KERNEL);
393         if (!master)
394                 return -ENOMEM;
395
396         master->dev = dev;
397         master->ops = ops;
398         master->match = match;
399
400         component_master_debugfs_add(master);
401         /* Add to the list of available masters. */
402         mutex_lock(&component_mutex);
403         list_add(&master->node, &masters);
404
405         ret = try_to_bring_up_master(master, NULL);
406
407         if (ret < 0)
408                 free_master(master);
409
410         mutex_unlock(&component_mutex);
411
412         return ret < 0 ? ret : 0;
413 }
414 EXPORT_SYMBOL_GPL(component_master_add_with_match);
415
416 void component_master_del(struct device *dev,
417         const struct component_master_ops *ops)
418 {
419         struct master *master;
420
421         mutex_lock(&component_mutex);
422         master = __master_find(dev, ops);
423         if (master) {
424                 take_down_master(master);
425                 free_master(master);
426         }
427         mutex_unlock(&component_mutex);
428 }
429 EXPORT_SYMBOL_GPL(component_master_del);
430
431 static void component_unbind(struct component *component,
432         struct master *master, void *data)
433 {
434         WARN_ON(!component->bound);
435
436         component->ops->unbind(component->dev, master->dev, data);
437         component->bound = false;
438
439         /* Release all resources claimed in the binding of this component */
440         devres_release_group(component->dev, component);
441 }
442
443 void component_unbind_all(struct device *master_dev, void *data)
444 {
445         struct master *master;
446         struct component *c;
447         size_t i;
448
449         WARN_ON(!mutex_is_locked(&component_mutex));
450
451         master = __master_find(master_dev, NULL);
452         if (!master)
453                 return;
454
455         /* Unbind components in reverse order */
456         for (i = master->match->num; i--; )
457                 if (!master->match->compare[i].duplicate) {
458                         c = master->match->compare[i].component;
459                         component_unbind(c, master, data);
460                 }
461 }
462 EXPORT_SYMBOL_GPL(component_unbind_all);
463
464 static int component_bind(struct component *component, struct master *master,
465         void *data)
466 {
467         int ret;
468
469         /*
470          * Each component initialises inside its own devres group.
471          * This allows us to roll-back a failed component without
472          * affecting anything else.
473          */
474         if (!devres_open_group(master->dev, NULL, GFP_KERNEL))
475                 return -ENOMEM;
476
477         /*
478          * Also open a group for the device itself: this allows us
479          * to release the resources claimed against the sub-device
480          * at the appropriate moment.
481          */
482         if (!devres_open_group(component->dev, component, GFP_KERNEL)) {
483                 devres_release_group(master->dev, NULL);
484                 return -ENOMEM;
485         }
486
487         dev_dbg(master->dev, "binding %s (ops %ps)\n",
488                 dev_name(component->dev), component->ops);
489
490         ret = component->ops->bind(component->dev, master->dev, data);
491         if (!ret) {
492                 component->bound = true;
493
494                 /*
495                  * Close the component device's group so that resources
496                  * allocated in the binding are encapsulated for removal
497                  * at unbind.  Remove the group on the DRM device as we
498                  * can clean those resources up independently.
499                  */
500                 devres_close_group(component->dev, NULL);
501                 devres_remove_group(master->dev, NULL);
502
503                 dev_info(master->dev, "bound %s (ops %ps)\n",
504                          dev_name(component->dev), component->ops);
505         } else {
506                 devres_release_group(component->dev, NULL);
507                 devres_release_group(master->dev, NULL);
508
509                 dev_err(master->dev, "failed to bind %s (ops %ps): %d\n",
510                         dev_name(component->dev), component->ops, ret);
511         }
512
513         return ret;
514 }
515
516 int component_bind_all(struct device *master_dev, void *data)
517 {
518         struct master *master;
519         struct component *c;
520         size_t i;
521         int ret = 0;
522
523         WARN_ON(!mutex_is_locked(&component_mutex));
524
525         master = __master_find(master_dev, NULL);
526         if (!master)
527                 return -EINVAL;
528
529         /* Bind components in match order */
530         for (i = 0; i < master->match->num; i++)
531                 if (!master->match->compare[i].duplicate) {
532                         c = master->match->compare[i].component;
533                         ret = component_bind(c, master, data);
534                         if (ret)
535                                 break;
536                 }
537
538         if (ret != 0) {
539                 for (; i > 0; i--)
540                         if (!master->match->compare[i - 1].duplicate) {
541                                 c = master->match->compare[i - 1].component;
542                                 component_unbind(c, master, data);
543                         }
544         }
545
546         return ret;
547 }
548 EXPORT_SYMBOL_GPL(component_bind_all);
549
550 int component_add(struct device *dev, const struct component_ops *ops)
551 {
552         struct component *component;
553         int ret;
554
555         component = kzalloc(sizeof(*component), GFP_KERNEL);
556         if (!component)
557                 return -ENOMEM;
558
559         component->ops = ops;
560         component->dev = dev;
561
562         dev_dbg(dev, "adding component (ops %ps)\n", ops);
563
564         mutex_lock(&component_mutex);
565         list_add_tail(&component->node, &component_list);
566
567         ret = try_to_bring_up_masters(component);
568         if (ret < 0) {
569                 if (component->master)
570                         remove_component(component->master, component);
571                 list_del(&component->node);
572
573                 kfree(component);
574         }
575         mutex_unlock(&component_mutex);
576
577         return ret < 0 ? ret : 0;
578 }
579 EXPORT_SYMBOL_GPL(component_add);
580
581 void component_del(struct device *dev, const struct component_ops *ops)
582 {
583         struct component *c, *component = NULL;
584
585         mutex_lock(&component_mutex);
586         list_for_each_entry(c, &component_list, node)
587                 if (c->dev == dev && c->ops == ops) {
588                         list_del(&c->node);
589                         component = c;
590                         break;
591                 }
592
593         if (component && component->master) {
594                 take_down_master(component->master);
595                 remove_component(component->master, component);
596         }
597
598         mutex_unlock(&component_mutex);
599
600         WARN_ON(!component);
601         kfree(component);
602 }
603 EXPORT_SYMBOL_GPL(component_del);
604
605 MODULE_LICENSE("GPL v2");