Commit | Line | Data |
---|---|---|
0ad40b24 JJH |
1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* | |
3 | * Based on the linux multiplexer framework | |
4 | * | |
5 | * At its core, a multiplexer (or mux), also known as a data selector, is a | |
6 | * device that selects between several analog or digital input signals and | |
7 | * forwards it to a single output line. This notion can be extended to work | |
8 | * with buses, like a I2C bus multiplexer for example. | |
9 | * | |
10 | * Copyright (C) 2017 Axentia Technologies AB | |
11 | * Author: Peter Rosin <peda@axentia.se> | |
12 | * | |
13 | * Copyright (C) 2017-2018 Texas Instruments Incorporated - http://www.ti.com/ | |
14 | * Jean-Jacques Hiblot <jjhiblot@ti.com> | |
15 | */ | |
16 | ||
17 | #ifndef _MUX_H_ | |
18 | #define _MUX_H_ | |
19 | ||
20 | #include <linux/errno.h> | |
21 | #include <linux/types.h> | |
22 | ||
23 | struct udevice; | |
24 | struct mux_control; | |
25 | ||
26 | #if CONFIG_IS_ENABLED(MULTIPLEXER) | |
27 | /** | |
28 | * mux_control_states() - Query the number of multiplexer states. | |
29 | * @mux: The mux-control to query. | |
30 | * | |
31 | * Return: The number of multiplexer states. | |
32 | */ | |
33 | unsigned int mux_control_states(struct mux_control *mux); | |
34 | ||
35 | /** | |
36 | * mux_control_select() - Select the given multiplexer state. | |
37 | * @mux: The mux-control to request a change of state from. | |
38 | * @state: The new requested state. | |
39 | * | |
40 | * On successfully selecting the mux-control state, it will be locked until | |
41 | * there is a call to mux_control_deselect(). If the mux-control is already | |
42 | * selected when mux_control_select() is called, the function will indicate | |
43 | * -EBUSY | |
44 | * | |
45 | * Therefore, make sure to call mux_control_deselect() when the operation is | |
46 | * complete and the mux-control is free for others to use, but do not call | |
47 | * mux_control_deselect() if mux_control_select() fails. | |
48 | * | |
49 | * Return: 0 when the mux-control state has the requested state or a negative | |
50 | * errno on error. | |
51 | */ | |
52 | int __must_check mux_control_select(struct mux_control *mux, | |
53 | unsigned int state); | |
0523326a | 54 | #define mux_control_try_select(mux, state) mux_control_select(mux, state) |
0ad40b24 JJH |
55 | |
56 | /** | |
57 | * mux_control_deselect() - Deselect the previously selected multiplexer state. | |
58 | * @mux: The mux-control to deselect. | |
59 | * | |
60 | * It is required that a single call is made to mux_control_deselect() for | |
61 | * each and every successful call made to either of mux_control_select() or | |
62 | * mux_control_try_select(). | |
63 | * | |
64 | * Return: 0 on success and a negative errno on error. An error can only | |
65 | * occur if the mux has an idle state. Note that even if an error occurs, the | |
66 | * mux-control is unlocked and is thus free for the next access. | |
67 | */ | |
68 | int mux_control_deselect(struct mux_control *mux); | |
69 | ||
70 | /** | |
71 | * mux_get_by_index() = Get a mux by integer index. | |
72 | * @dev: The client device. | |
73 | * @index: The index of the mux to get. | |
74 | * @mux: A pointer to the 'mux_control' struct to initialize. | |
75 | * | |
76 | * This looks up and initializes a mux. The index is relative to the client | |
77 | * device. | |
78 | * | |
79 | * Return: 0 if OK, or a negative error code. | |
80 | */ | |
81 | int mux_get_by_index(struct udevice *dev, int index, struct mux_control **mux); | |
82 | ||
83 | /** | |
84 | * mux_control_get() - Get the mux-control for a device. | |
85 | * @dev: The device that needs a mux-control. | |
86 | * @mux_name: The name identifying the mux-control. | |
87 | * @mux: A pointer to the mux-control pointer. | |
88 | * | |
89 | * Return: 0 of OK, or a negative error code. | |
90 | */ | |
91 | int mux_control_get(struct udevice *dev, const char *name, | |
92 | struct mux_control **mux); | |
93 | ||
94 | /** | |
95 | * mux_control_put() - Put away the mux-control for good. | |
96 | * @mux: The mux-control to put away. | |
97 | * | |
98 | * mux_control_put() reverses the effects of mux_control_get(). | |
99 | */ | |
100 | void mux_control_put(struct mux_control *mux); | |
101 | ||
102 | /** | |
103 | * devm_mux_control_get() - Get the mux-control for a device, with resource | |
104 | * management. | |
105 | * @dev: The device that needs a mux-control. | |
106 | * @mux_name: The name identifying the mux-control. | |
107 | * | |
108 | * Return: Pointer to the mux-control, or an ERR_PTR with a negative errno. | |
109 | */ | |
110 | struct mux_control *devm_mux_control_get(struct udevice *dev, | |
111 | const char *mux_name); | |
90a979d7 JJH |
112 | /** |
113 | * dm_mux_init() - Initialize the multiplexer controls to their default state. | |
114 | * | |
115 | * Return: 0 if OK, -errno otherwise. | |
116 | */ | |
117 | int dm_mux_init(void); | |
118 | ||
0ad40b24 JJH |
119 | #else |
120 | unsigned int mux_control_states(struct mux_control *mux) | |
121 | { | |
122 | return -ENOSYS; | |
123 | } | |
124 | ||
125 | int __must_check mux_control_select(struct mux_control *mux, | |
126 | unsigned int state) | |
127 | { | |
128 | return -ENOSYS; | |
129 | } | |
130 | ||
0523326a | 131 | #define mux_control_try_select(mux, state) mux_control_select(mux, state) |
0ad40b24 JJH |
132 | |
133 | int mux_control_deselect(struct mux_control *mux) | |
134 | { | |
135 | return -ENOSYS; | |
136 | } | |
137 | ||
138 | struct mux_control *mux_control_get(struct udevice *dev, const char *mux_name) | |
139 | { | |
140 | return NULL; | |
141 | } | |
142 | ||
143 | void mux_control_put(struct mux_control *mux) | |
144 | { | |
145 | } | |
146 | ||
147 | struct mux_control *devm_mux_control_get(struct udevice *dev, | |
148 | const char *mux_name) | |
149 | { | |
150 | return NULL; | |
151 | } | |
90a979d7 JJH |
152 | |
153 | int dm_mux_init(void) | |
154 | { | |
155 | return -ENOSYS; | |
156 | } | |
0ad40b24 JJH |
157 | #endif |
158 | ||
159 | #endif |