mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 20:18:18 +00:00 
			
		
		
		
	The function prototypes that are defined in the header most likely has to be marked as static inline. This helps avoiding the compiler warnings: include/mux.h:120:14: warning: no previous prototype for ‘mux_control_states’ [-Wmissing-prototypes] include/mux.h:125:18: warning: no previous prototype for ‘mux_control_select’ [-Wmissing-prototypes] include/mux.h:133:5: warning: no previous prototype for ‘mux_control_deselect’ [-Wmissing-prototypes] include/mux.h:138:21: warning: no previous prototype for ‘mux_control_get’ [-Wmissing-prototypes] include/mux.h:143:6: warning: no previous prototype for ‘mux_control_put’ [-Wmissing-prototypes] include/mux.h:147:21: warning: no previous prototype for ‘devm_mux_control_get’ [-Wmissing-prototypes] include/mux.h:153:5: warning: no previous prototype for ‘dm_mux_init’ [-Wmissing-prototype ] Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
		
			
				
	
	
		
			160 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0+ */
 | |
| /*
 | |
|  * Based on the linux multiplexer framework
 | |
|  *
 | |
|  * At its core, a multiplexer (or mux), also known as a data selector, is a
 | |
|  * device that selects between several analog or digital input signals and
 | |
|  * forwards it to a single output line. This notion can be extended to work
 | |
|  * with buses, like a I2C bus multiplexer for example.
 | |
|  *
 | |
|  * Copyright (C) 2017 Axentia Technologies AB
 | |
|  * Author: Peter Rosin <peda@axentia.se>
 | |
|  *
 | |
|  * Copyright (C) 2017-2018 Texas Instruments Incorporated - https://www.ti.com/
 | |
|  * Jean-Jacques Hiblot <jjhiblot@ti.com>
 | |
|  */
 | |
| 
 | |
| #ifndef _MUX_H_
 | |
| #define _MUX_H_
 | |
| 
 | |
| #include <linux/errno.h>
 | |
| #include <linux/types.h>
 | |
| 
 | |
| struct udevice;
 | |
| struct mux_control;
 | |
| 
 | |
| #if IS_ENABLED(CONFIG_MULTIPLEXER)
 | |
| /**
 | |
|  * mux_control_states() - Query the number of multiplexer states.
 | |
|  * @mux: The mux-control to query.
 | |
|  *
 | |
|  * Return: The number of multiplexer states.
 | |
|  */
 | |
| unsigned int mux_control_states(struct mux_control *mux);
 | |
| 
 | |
| /**
 | |
|  * mux_control_select() - Select the given multiplexer state.
 | |
|  * @mux: The mux-control to request a change of state from.
 | |
|  * @state: The new requested state.
 | |
|  *
 | |
|  * On successfully selecting the mux-control state, it will be locked until
 | |
|  * there is a call to mux_control_deselect(). If the mux-control is already
 | |
|  * selected when mux_control_select() is called, the function will indicate
 | |
|  * -EBUSY
 | |
|  *
 | |
|  * Therefore, make sure to call mux_control_deselect() when the operation is
 | |
|  * complete and the mux-control is free for others to use, but do not call
 | |
|  * mux_control_deselect() if mux_control_select() fails.
 | |
|  *
 | |
|  * Return: 0 when the mux-control state has the requested state or a negative
 | |
|  * errno on error.
 | |
|  */
 | |
| int __must_check mux_control_select(struct mux_control *mux,
 | |
| 				    unsigned int state);
 | |
| #define mux_control_try_select(mux, state) mux_control_select(mux, state)
 | |
| 
 | |
| /**
 | |
|  * mux_control_deselect() - Deselect the previously selected multiplexer state.
 | |
|  * @mux: The mux-control to deselect.
 | |
|  *
 | |
|  * It is required that a single call is made to mux_control_deselect() for
 | |
|  * each and every successful call made to either of mux_control_select() or
 | |
|  * mux_control_try_select().
 | |
|  *
 | |
|  * Return: 0 on success and a negative errno on error. An error can only
 | |
|  * occur if the mux has an idle state. Note that even if an error occurs, the
 | |
|  * mux-control is unlocked and is thus free for the next access.
 | |
|  */
 | |
| int mux_control_deselect(struct mux_control *mux);
 | |
| 
 | |
| /**
 | |
|  * mux_get_by_index() = Get a mux by integer index.
 | |
|  * @dev: The client device.
 | |
|  * @index: The index of the mux to get.
 | |
|  * @mux: A pointer to the 'mux_control' struct to initialize.
 | |
|  *
 | |
|  * This looks up and initializes a mux. The index is relative to the client
 | |
|  * device.
 | |
|  *
 | |
|  * Return: 0 if OK, or a negative error code.
 | |
|  */
 | |
| int mux_get_by_index(struct udevice *dev, int index, struct mux_control **mux);
 | |
| 
 | |
| /**
 | |
|  * mux_control_get() - Get the mux-control for a device.
 | |
|  * @dev: The device that needs a mux-control.
 | |
|  * @mux_name: The name identifying the mux-control.
 | |
|  * @mux: A pointer to the mux-control pointer.
 | |
|  *
 | |
|  * Return: 0 of OK, or a negative error code.
 | |
|  */
 | |
| int mux_control_get(struct udevice *dev, const char *name,
 | |
| 		    struct mux_control **mux);
 | |
| 
 | |
| /**
 | |
|  * mux_control_put() - Put away the mux-control for good.
 | |
|  * @mux: The mux-control to put away.
 | |
|  *
 | |
|  * mux_control_put() reverses the effects of mux_control_get().
 | |
|  */
 | |
| void mux_control_put(struct mux_control *mux);
 | |
| 
 | |
| /**
 | |
|  * devm_mux_control_get() - Get the mux-control for a device, with resource
 | |
|  *			    management.
 | |
|  * @dev: The device that needs a mux-control.
 | |
|  * @mux_name: The name identifying the mux-control.
 | |
|  *
 | |
|  * Return: Pointer to the mux-control, or an ERR_PTR with a negative errno.
 | |
|  */
 | |
| struct mux_control *devm_mux_control_get(struct udevice *dev,
 | |
| 					 const char *mux_name);
 | |
| /**
 | |
|  * dm_mux_init() - Initialize the multiplexer controls to their default state.
 | |
|  *
 | |
|  * Return: 0 if OK, -errno otherwise.
 | |
|  */
 | |
| int dm_mux_init(void);
 | |
| 
 | |
| #else
 | |
| static inline unsigned int mux_control_states(struct mux_control *mux)
 | |
| {
 | |
| 	return -ENOSYS;
 | |
| }
 | |
| 
 | |
| static inline int __must_check mux_control_select(struct mux_control *mux,
 | |
| 						  unsigned int state)
 | |
| {
 | |
| 	return -ENOSYS;
 | |
| }
 | |
| 
 | |
| #define mux_control_try_select(mux, state) mux_control_select(mux, state)
 | |
| 
 | |
| static inline int mux_control_deselect(struct mux_control *mux)
 | |
| {
 | |
| 	return -ENOSYS;
 | |
| }
 | |
| 
 | |
| static inline struct mux_control *mux_control_get(struct udevice *dev, const char *mux_name)
 | |
| {
 | |
| 	return NULL;
 | |
| }
 | |
| 
 | |
| static inline void mux_control_put(struct mux_control *mux)
 | |
| {
 | |
| }
 | |
| 
 | |
| static inline struct mux_control *devm_mux_control_get(struct udevice *dev,
 | |
| 						       const char *mux_name)
 | |
| {
 | |
| 	return NULL;
 | |
| }
 | |
| 
 | |
| static inline int dm_mux_init(void)
 | |
| {
 | |
| 	return -ENOSYS;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 |