1 | // SPDX-License-Identifier: GPL-2.0-or-later |
---|---|
2 | /* |
3 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> |
4 | */ |
5 | /* |
6 | * infrastructure for devices connected via I2C |
7 | */ |
8 | |
9 | #include <linux/slab.h> |
10 | #include "via_aux.h" |
11 | |
12 | |
13 | struct via_aux_bus *via_aux_probe(struct i2c_adapter *adap) |
14 | { |
15 | struct via_aux_bus *bus; |
16 | |
17 | if (!adap) |
18 | return NULL; |
19 | |
20 | bus = kmalloc(size: sizeof(*bus), GFP_KERNEL); |
21 | if (!bus) |
22 | return NULL; |
23 | |
24 | bus->adap = adap; |
25 | INIT_LIST_HEAD(list: &bus->drivers); |
26 | |
27 | via_aux_edid_probe(bus); |
28 | via_aux_vt1636_probe(bus); |
29 | via_aux_vt1632_probe(bus); |
30 | via_aux_vt1631_probe(bus); |
31 | via_aux_vt1625_probe(bus); |
32 | via_aux_vt1622_probe(bus); |
33 | via_aux_vt1621_probe(bus); |
34 | via_aux_sii164_probe(bus); |
35 | via_aux_ch7301_probe(bus); |
36 | |
37 | return bus; |
38 | } |
39 | |
40 | void via_aux_free(struct via_aux_bus *bus) |
41 | { |
42 | struct via_aux_drv *pos, *n; |
43 | |
44 | if (!bus) |
45 | return; |
46 | |
47 | list_for_each_entry_safe(pos, n, &bus->drivers, chain) { |
48 | if (pos->cleanup) |
49 | pos->cleanup(pos); |
50 | |
51 | list_del(entry: &pos->chain); |
52 | kfree(objp: pos->data); |
53 | kfree(objp: pos); |
54 | } |
55 | |
56 | kfree(objp: bus); |
57 | } |
58 | |
59 | const struct fb_videomode *via_aux_get_preferred_mode(struct via_aux_bus *bus) |
60 | { |
61 | struct via_aux_drv *pos; |
62 | const struct fb_videomode *mode = NULL; |
63 | |
64 | if (!bus) |
65 | return NULL; |
66 | |
67 | list_for_each_entry(pos, &bus->drivers, chain) { |
68 | if (pos->get_preferred_mode) |
69 | mode = pos->get_preferred_mode(pos); |
70 | } |
71 | |
72 | return mode; |
73 | } |
74 |