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 | #ifndef __VIA_AUX_H__ |
10 | #define __VIA_AUX_H__ |
11 | |
12 | |
13 | #include <linux/list.h> |
14 | #include <linux/i2c.h> |
15 | #include <linux/fb.h> |
16 | |
17 | |
18 | struct via_aux_bus { |
19 | struct i2c_adapter *adap; /* the I2C device to access the bus */ |
20 | struct list_head drivers; /* drivers for devices on this bus */ |
21 | }; |
22 | |
23 | struct via_aux_drv { |
24 | struct list_head chain; /* chain to support multiple drivers */ |
25 | |
26 | struct via_aux_bus *bus; /* the I2C bus used */ |
27 | u8 addr; /* the I2C slave address */ |
28 | |
29 | const char *name; /* human readable name of the driver */ |
30 | void *data; /* private data of this driver */ |
31 | |
32 | void (*cleanup)(struct via_aux_drv *drv); |
33 | const struct fb_videomode* (*get_preferred_mode) |
34 | (struct via_aux_drv *drv); |
35 | }; |
36 | |
37 | |
38 | struct via_aux_bus *via_aux_probe(struct i2c_adapter *adap); |
39 | void via_aux_free(struct via_aux_bus *bus); |
40 | const struct fb_videomode *via_aux_get_preferred_mode(struct via_aux_bus *bus); |
41 | |
42 | |
43 | static inline bool via_aux_add(struct via_aux_drv *drv) |
44 | { |
45 | struct via_aux_drv *data = kmalloc(size: sizeof(*data), GFP_KERNEL); |
46 | |
47 | if (!data) |
48 | return false; |
49 | |
50 | *data = *drv; |
51 | list_add_tail(new: &data->chain, head: &data->bus->drivers); |
52 | return true; |
53 | } |
54 | |
55 | static inline bool via_aux_read(struct via_aux_drv *drv, u8 start, u8 *buf, |
56 | u8 len) |
57 | { |
58 | struct i2c_msg msg[2] = { |
59 | {.addr = drv->addr, .flags = 0, .len = 1, .buf = &start}, |
60 | {.addr = drv->addr, .flags = I2C_M_RD, .len = len, .buf = buf} }; |
61 | |
62 | return i2c_transfer(adap: drv->bus->adap, msgs: msg, num: 2) == 2; |
63 | } |
64 | |
65 | |
66 | /* probe functions of existing drivers - should only be called in via_aux.c */ |
67 | void via_aux_ch7301_probe(struct via_aux_bus *bus); |
68 | void via_aux_edid_probe(struct via_aux_bus *bus); |
69 | void via_aux_sii164_probe(struct via_aux_bus *bus); |
70 | void via_aux_vt1636_probe(struct via_aux_bus *bus); |
71 | void via_aux_vt1632_probe(struct via_aux_bus *bus); |
72 | void via_aux_vt1631_probe(struct via_aux_bus *bus); |
73 | void via_aux_vt1625_probe(struct via_aux_bus *bus); |
74 | void via_aux_vt1622_probe(struct via_aux_bus *bus); |
75 | void via_aux_vt1621_probe(struct via_aux_bus *bus); |
76 | |
77 | |
78 | #endif /* __VIA_AUX_H__ */ |
79 | |