Commit | Line | Data |
---|---|---|
16216333 | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
0826374b ML |
2 | /* |
3 | * | |
4 | * i2c-mux.h - functions for the i2c-bus mux support | |
5 | * | |
6 | * Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it> | |
7 | * Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it> | |
8 | * Michael Lawnick <michael.lawnick.ext@nsn.com> | |
0826374b ML |
9 | */ |
10 | ||
11 | #ifndef _LINUX_I2C_MUX_H | |
12 | #define _LINUX_I2C_MUX_H | |
13 | ||
14 | #ifdef __KERNEL__ | |
15 | ||
6ef91fcc PR |
16 | #include <linux/bitops.h> |
17 | ||
a7ab7239 PR |
18 | struct i2c_mux_core { |
19 | struct i2c_adapter *parent; | |
20 | struct device *dev; | |
b2d57b56 PR |
21 | unsigned int mux_locked:1; |
22 | unsigned int arbitrator:1; | |
23 | unsigned int gate:1; | |
a7ab7239 PR |
24 | |
25 | void *priv; | |
26 | ||
27 | int (*select)(struct i2c_mux_core *, u32 chan_id); | |
28 | int (*deselect)(struct i2c_mux_core *, u32 chan_id); | |
29 | ||
30 | int num_adapters; | |
31 | int max_adapters; | |
8695e0b1 | 32 | struct i2c_adapter *adapter[]; |
a7ab7239 PR |
33 | }; |
34 | ||
35 | struct i2c_mux_core *i2c_mux_alloc(struct i2c_adapter *parent, | |
36 | struct device *dev, int max_adapters, | |
37 | int sizeof_priv, u32 flags, | |
38 | int (*select)(struct i2c_mux_core *, u32), | |
39 | int (*deselect)(struct i2c_mux_core *, u32)); | |
40 | ||
6ef91fcc | 41 | /* flags for i2c_mux_alloc */ |
b2d57b56 PR |
42 | #define I2C_MUX_LOCKED BIT(0) |
43 | #define I2C_MUX_ARBITRATOR BIT(1) | |
44 | #define I2C_MUX_GATE BIT(2) | |
6ef91fcc | 45 | |
a7ab7239 PR |
46 | static inline void *i2c_mux_priv(struct i2c_mux_core *muxc) |
47 | { | |
48 | return muxc->priv; | |
49 | } | |
50 | ||
6ef91fcc PR |
51 | struct i2c_adapter *i2c_root_adapter(struct device *dev); |
52 | ||
a7ab7239 PR |
53 | /* |
54 | * Called to create an i2c bus on a multiplexed bus segment. | |
55 | * The chan_id parameter is passed to the select and deselect | |
56 | * callback functions to perform hardware-specific mux control. | |
57 | */ | |
58 | int i2c_mux_add_adapter(struct i2c_mux_core *muxc, | |
59 | u32 force_nr, u32 chan_id, | |
60 | unsigned int class); | |
0826374b | 61 | |
a7ab7239 | 62 | void i2c_mux_del_adapters(struct i2c_mux_core *muxc); |
0826374b ML |
63 | |
64 | #endif /* __KERNEL__ */ | |
65 | ||
66 | #endif /* _LINUX_I2C_MUX_H */ |