blob: cbb1c331db834a0f5ee24ccf850cbff9daab1fbc [file] [log] [blame]
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +05301/* 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 *
Nishanth Menoneaa39c62023-11-01 15:56:03 -050013 * Copyright (C) 2017-2018 Texas Instruments Incorporated - https://www.ti.com/
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +053014 * 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
23struct udevice;
24struct mux_control;
25
Simon Glasse287b672023-02-22 09:33:49 -070026#if IS_ENABLED(CONFIG_MULTIPLEXER)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +053027/**
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 */
33unsigned 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 */
52int __must_check mux_control_select(struct mux_control *mux,
53 unsigned int state);
Patrick Wildt5d073ca2021-07-13 23:02:18 +020054#define mux_control_try_select(mux, state) mux_control_select(mux, state)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +053055
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 */
68int 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 */
81int 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 */
91int 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 */
100void 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 */
110struct mux_control *devm_mux_control_get(struct udevice *dev,
111 const char *mux_name);
Jean-Jacques Hiblot0c1b5572020-10-16 16:16:31 +0530112/**
113 * dm_mux_init() - Initialize the multiplexer controls to their default state.
114 *
115 * Return: 0 if OK, -errno otherwise.
116 */
117int dm_mux_init(void);
118
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530119#else
Andy Shevchenkof284eb02024-10-21 17:20:45 +0300120static inline unsigned int mux_control_states(struct mux_control *mux)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530121{
122 return -ENOSYS;
123}
124
Andy Shevchenkof284eb02024-10-21 17:20:45 +0300125static inline int __must_check mux_control_select(struct mux_control *mux,
126 unsigned int state)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530127{
128 return -ENOSYS;
129}
130
Patrick Wildt5d073ca2021-07-13 23:02:18 +0200131#define mux_control_try_select(mux, state) mux_control_select(mux, state)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530132
Andy Shevchenkof284eb02024-10-21 17:20:45 +0300133static inline int mux_control_deselect(struct mux_control *mux)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530134{
135 return -ENOSYS;
136}
137
Andy Shevchenkof284eb02024-10-21 17:20:45 +0300138static inline struct mux_control *mux_control_get(struct udevice *dev, const char *mux_name)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530139{
140 return NULL;
141}
142
Andy Shevchenkof284eb02024-10-21 17:20:45 +0300143static inline void mux_control_put(struct mux_control *mux)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530144{
145}
146
Andy Shevchenkof284eb02024-10-21 17:20:45 +0300147static inline struct mux_control *devm_mux_control_get(struct udevice *dev,
148 const char *mux_name)
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530149{
150 return NULL;
151}
Jean-Jacques Hiblot0c1b5572020-10-16 16:16:31 +0530152
Andy Shevchenkof284eb02024-10-21 17:20:45 +0300153static inline int dm_mux_init(void)
Jean-Jacques Hiblot0c1b5572020-10-16 16:16:31 +0530154{
155 return -ENOSYS;
156}
Jean-Jacques Hiblotf4f90562020-10-16 16:16:30 +0530157#endif
158
159#endif