[PATCH v4 2/7] mux: Add helper functions for getting optional and selected mux-state

Josua Mayer josua at solid-run.com
Wed Jan 7 23:42:39 PST 2026


On Wednesday, 31 December 2025 21:18:51 IST kernel test robot wrote:
> Hi Josua,
> 
> kernel test robot noticed the following build errors:
> 
> [auto build test ERROR on 8f0b4cce4481fb22653697cced8d0d04027cb1e8]
> 
> url:   
> https://github.com/intel-lab-lkp/linux/commits/Josua-Mayer/phy-can-transcei
> ver-rename-temporary-helper-function-to-avoid-conflict/20251229-223153 base:
>   8f0b4cce4481fb22653697cced8d0d04027cb1e8
> patch link:   
> https://lore.kernel.org/r/20251229-rz-sdio-mux-v4-2-a023e55758fe%40solid-ru
> n.com patch subject: [PATCH v4 2/7] mux: Add helper functions for getting
> optional and selected mux-state config: parisc-randconfig-002-20260101
> (https://download.01.org/0day-ci/archive/20260101/202601010305.tpY47HE4-lkp
> @intel.com/config) compiler: hppa-linux-gcc (GCC) 10.5.0
> reproduce (this is a W=1 build):
> (https://download.01.org/0day-ci/archive/20260101/202601010305.tpY47HE4-lkp
> @intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version
> of the same patch/commit), kindly add following tags
> 
> | Reported-by: kernel test robot <lkp at intel.com>
> | Closes:
> | https://lore.kernel.org/oe-kbuild-all/202601010305.tpY47HE4-lkp@intel.com
> | /
> All error/warnings (new ones prefixed by >>):
> 
>    In file included from drivers/mux/core.c:19:
> 
>    include/linux/mux/consumer.h: In function 'mux_control_put':
> >> include/linux/mux/consumer.h:138:9: warning: 'return' with a value, in
> >> function returning void [-Wreturn-type]
>      138 |  return -EOPNOTSUPP;
> 
>          |         ^
> 
To be fixed in next version

>    include/linux/mux/consumer.h:136:20: note: declared here
>      136 | static inline void mux_control_put(struct mux_control *mux)
> 
>          |                    ^~~~~~~~~~~~~~~
> 
>    drivers/mux/core.c: At top level:
> >> drivers/mux/core.c:302:14: error: redefinition of 'mux_control_states'
> 
>      302 | unsigned int mux_control_states(struct mux_control *mux)
> 
>          |              ^~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:70:28: note: previous definition of
> 'mux_control_states' was here 70 | static inline unsigned int
> mux_control_states(struct mux_control *mux)
>          |                            ^~~~~~~~~~~~~~~~~~

I don't understand how this is possible.
In the header file line 136 the inline declaration for mux_control_states is 
gated by ifdef CONFIG_MULTIPLEXER else case.

The build of mux/core.c itself is gated in Makefile by CONFIG_MULTIPLEXER.

So mux/core.c is not being built when CONFIG_MULTIPLEXER is not set.
If it is set, we hit in the header file the non-inline declaration near start
of the file.

> >> 
> >> drivers/mux/core.c:365:5: error: redefinition of
> >> 'mux_control_select_delay'
> 
>      365 | int mux_control_select_delay(struct mux_control *mux, unsigned
> int state,
>          |     ^~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:74:32: note: previous definition of
> 'mux_control_select_delay' was here 74 | static inline int __must_check
> mux_control_select_delay(struct mux_control *mux,
>          |                                ^~~~~~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:403:5: error: redefinition of 'mux_state_select_delay'
> 
>      403 | int mux_state_select_delay(struct mux_state *mstate, unsigned int
> delay_us)
>          |     ^~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:79:32: note: previous definition of
> 'mux_state_select_delay' was here 79 | static inline int __must_check
> mux_state_select_delay(struct mux_state *mstate,
>          |                                ^~~~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:425:5: error: redefinition of
> >> 'mux_control_try_select_delay'
>      425 | int mux_control_try_select_delay(struct mux_control *mux,
> unsigned int state,
>          |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:84:32: note: previous definition of
> 'mux_control_try_select_delay' was here 84 | static inline int __must_check
> mux_control_try_select_delay(struct mux_control *mux,
>          |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:459:5: error: redefinition of
> >> 'mux_state_try_select_delay'
>      459 | int mux_state_try_select_delay(struct mux_state *mstate, unsigned
> int delay_us)
>          |     ^~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:90:32: note: previous definition of
> 'mux_state_try_select_delay' was here 90 | static inline int __must_check
> mux_state_try_select_delay(struct mux_state *mstate,
>          |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:477:5: error: redefinition of 'mux_control_deselect'
> 
>      477 | int mux_control_deselect(struct mux_control *mux)
> 
>          |     ^~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:118:19: note: previous definition of
> 'mux_control_deselect' was here 118 | static inline int
> mux_control_deselect(struct mux_control *mux)
>          |                   ^~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:503:5: error: redefinition of 'mux_state_deselect'
> 
>      503 | int mux_state_deselect(struct mux_state *mstate)
> 
>          |     ^~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:122:19: note: previous definition of
> 'mux_state_deselect' was here 122 | static inline int
> mux_state_deselect(struct mux_state *mstate)
>          |                   ^~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:625:21: error: redefinition of 'mux_control_get'
> 
>      625 | struct mux_control *mux_control_get(struct device *dev, const
> char *mux_name)
>          |                     ^~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:127:35: note: previous definition of
> 'mux_control_get' was here 127 | static inline struct mux_control
> *mux_control_get(struct device *dev, const char *mux_name)
>          |                                   ^~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:638:21: error: redefinition of
> >> 'mux_control_get_optional'
>      638 | struct mux_control *mux_control_get_optional(struct device *dev,
> const char *mux_name)
>          |                     ^~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:131:35: note: previous definition of
> 'mux_control_get_optional' was here 131 | static inline struct mux_control
> *mux_control_get_optional(struct device *dev,
>          |                                   ^~~~~~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:650:6: error: redefinition of 'mux_control_put'
> 
>      650 | void mux_control_put(struct mux_control *mux)
> 
>          |      ^~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:136:20: note: previous definition of
> 'mux_control_put' was here 136 | static inline void mux_control_put(struct
> mux_control *mux)
>          |                    ^~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:671:21: error: redefinition of 'devm_mux_control_get'
> 
>      671 | struct mux_control *devm_mux_control_get(struct device *dev,
> 
>          |                     ^~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:141:35: note: previous definition of
> 'devm_mux_control_get' was here 141 | static inline struct mux_control
> *devm_mux_control_get(struct device *dev, const char *mux_name)
>          |                                   ^~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:774:19: error: redefinition of 'devm_mux_state_get'
> 
>      774 | struct mux_state *devm_mux_state_get(struct device *dev, const
> char *mux_name)
>          |                   ^~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:145:33: note: previous definition of
> 'devm_mux_state_get' was here 145 | static inline struct mux_state
> *devm_mux_state_get(struct device *dev, const char *mux_name)
>          |                                 ^~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:788:19: error: redefinition of
> >> 'devm_mux_state_get_optional'
>      788 | struct mux_state *devm_mux_state_get_optional(struct device *dev,
> const char *mux_name)
>          |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:149:33: note: previous definition of
> 'devm_mux_state_get_optional' was here 149 | static inline struct mux_state
> *devm_mux_state_get_optional(struct device *dev,
>          |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:838:19: error: redefinition of
> >> 'devm_mux_state_get_selected'
>      838 | struct mux_state *devm_mux_state_get_selected(struct device *dev,
> const char *mux_name)
>          |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:154:33: note: previous definition of
> 'devm_mux_state_get_selected' was here 154 | static inline struct mux_state
> *devm_mux_state_get_selected(struct device *dev,
>          |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> 
> >> drivers/mux/core.c:854:19: error: redefinition of
> >> 'devm_mux_state_get_optional_selected'
>      854 | struct mux_state *devm_mux_state_get_optional_selected(struct
> device *dev,
>          |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from drivers/mux/core.c:19:
>    include/linux/mux/consumer.h:159:33: note: previous definition of
> 'devm_mux_state_get_optional_selected' was here 159 | static inline struct
> mux_state *devm_mux_state_get_optional_selected(struct device *dev,
>          |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>          |                                 ~~~
> 
> --
>    In file included from core.c:19:
> 
>    include/linux/mux/consumer.h: In function 'mux_control_put':
> >> include/linux/mux/consumer.h:138:9: warning: 'return' with a value, in
> >> function returning void [-Wreturn-type]
>      138 |  return -EOPNOTSUPP;
> 
>          |         ^
> 
>    include/linux/mux/consumer.h:136:20: note: declared here
>      136 | static inline void mux_control_put(struct mux_control *mux)
> 
>          |                    ^~~~~~~~~~~~~~~
> 
>    core.c: At top level:
>    core.c:302:14: error: redefinition of 'mux_control_states'
>      302 | unsigned int mux_control_states(struct mux_control *mux)
> 
>          |              ^~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:70:28: note: previous definition of
> 'mux_control_states' was here 70 | static inline unsigned int
> mux_control_states(struct mux_control *mux)
>          |                            ^~~~~~~~~~~~~~~~~~
> 
>    core.c:365:5: error: redefinition of 'mux_control_select_delay'
>      365 | int mux_control_select_delay(struct mux_control *mux, unsigned
> int state,
>          |     ^~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:74:32: note: previous definition of
> 'mux_control_select_delay' was here 74 | static inline int __must_check
> mux_control_select_delay(struct mux_control *mux,
>          |                                ^~~~~~~~~~~~~~~~~~~~~~~~
> 
>    core.c:403:5: error: redefinition of 'mux_state_select_delay'
>      403 | int mux_state_select_delay(struct mux_state *mstate, unsigned int
> delay_us)
>          |     ^~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:79:32: note: previous definition of
> 'mux_state_select_delay' was here 79 | static inline int __must_check
> mux_state_select_delay(struct mux_state *mstate,
>          |                                ^~~~~~~~~~~~~~~~~~~~~~
> 
>    core.c:425:5: error: redefinition of 'mux_control_try_select_delay'
>      425 | int mux_control_try_select_delay(struct mux_control *mux,
> unsigned int state,
>          |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:84:32: note: previous definition of
> 'mux_control_try_select_delay' was here 84 | static inline int __must_check
> mux_control_try_select_delay(struct mux_control *mux,
>          |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    core.c:459:5: error: redefinition of 'mux_state_try_select_delay'
>      459 | int mux_state_try_select_delay(struct mux_state *mstate, unsigned
> int delay_us)
>          |     ^~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:90:32: note: previous definition of
> 'mux_state_try_select_delay' was here 90 | static inline int __must_check
> mux_state_try_select_delay(struct mux_state *mstate,
>          |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    core.c:477:5: error: redefinition of 'mux_control_deselect'
>      477 | int mux_control_deselect(struct mux_control *mux)
> 
>          |     ^~~~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:118:19: note: previous definition of
> 'mux_control_deselect' was here 118 | static inline int
> mux_control_deselect(struct mux_control *mux)
>          |                   ^~~~~~~~~~~~~~~~~~~~
> 
>    core.c:503:5: error: redefinition of 'mux_state_deselect'
>      503 | int mux_state_deselect(struct mux_state *mstate)
> 
>          |     ^~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:122:19: note: previous definition of
> 'mux_state_deselect' was here 122 | static inline int
> mux_state_deselect(struct mux_state *mstate)
>          |                   ^~~~~~~~~~~~~~~~~~
> 
>    core.c:625:21: error: redefinition of 'mux_control_get'
>      625 | struct mux_control *mux_control_get(struct device *dev, const
> char *mux_name)
>          |                     ^~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:127:35: note: previous definition of
> 'mux_control_get' was here 127 | static inline struct mux_control
> *mux_control_get(struct device *dev, const char *mux_name)
>          |                                   ^~~~~~~~~~~~~~~
> 
>    core.c:638:21: error: redefinition of 'mux_control_get_optional'
>      638 | struct mux_control *mux_control_get_optional(struct device *dev,
> const char *mux_name)
>          |                     ^~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:131:35: note: previous definition of
> 'mux_control_get_optional' was here 131 | static inline struct mux_control
> *mux_control_get_optional(struct device *dev,
>          |                                   ^~~~~~~~~~~~~~~~~~~~~~~~
> 
>    core.c:650:6: error: redefinition of 'mux_control_put'
>      650 | void mux_control_put(struct mux_control *mux)
> 
>          |      ^~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:136:20: note: previous definition of
> 'mux_control_put' was here 136 | static inline void mux_control_put(struct
> mux_control *mux)
>          |                    ^~~~~~~~~~~~~~~
> 
>    core.c:671:21: error: redefinition of 'devm_mux_control_get'
>      671 | struct mux_control *devm_mux_control_get(struct device *dev,
> 
>          |                     ^~~~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:141:35: note: previous definition of
> 'devm_mux_control_get' was here 141 | static inline struct mux_control
> *devm_mux_control_get(struct device *dev, const char *mux_name)
>          |                                   ^~~~~~~~~~~~~~~~~~~~
> 
>    core.c:774:19: error: redefinition of 'devm_mux_state_get'
>      774 | struct mux_state *devm_mux_state_get(struct device *dev, const
> char *mux_name)
>          |                   ^~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:145:33: note: previous definition of
> 'devm_mux_state_get' was here 145 | static inline struct mux_state
> *devm_mux_state_get(struct device *dev, const char *mux_name)
>          |                                 ^~~~~~~~~~~~~~~~~~
> 
>    core.c:788:19: error: redefinition of 'devm_mux_state_get_optional'
>      788 | struct mux_state *devm_mux_state_get_optional(struct device *dev,
> const char *mux_name)
>          |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    In file included from core.c:19:
>    include/linux/mux/consumer.h:149:33: note: previous definition of
> 'devm_mux_state_get_optional' was here 149 | static inline struct mux_state
> *devm_mux_state_get_optional(struct device *dev,
>          |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
>    core.c:838:19: error: redefinition of 'devm_mux_state_get_selected'
>      838 | struct mux_state *devm_mux_state_get_selected(struct device *dev,
> const char *mux_name)
>          |                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> 
> vim +/mux_control_states +302 drivers/mux/core.c
> 
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  295
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  296 
> /** a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14 
> 297   * mux_control_states() - Query the number of multiplexer states.
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  298  
> * @mux: The mux-control to query. a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  299   * a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  300   * Return: The
> number of multiplexer states. a3b02a9c6591ce drivers/mux/mux-core.c Peter
> Rosin        2017-05-14  301   */ a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14 @302  unsigned int mux_control_states(struct
> mux_control *mux) a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  303  { a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  304  	return mux->states; a3b02a9c6591ce drivers/mux/mux-
core.c
> Peter Rosin        2017-05-14  305  } a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  306  EXPORT_SYMBOL_GPL(mux_control_states);
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  307
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  308 
> /* a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  309
>   * The mux->lock must be down when calling this function. a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  310   */
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  311 
> static int __mux_control_select(struct mux_control *mux, int state)
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  312  {
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  313 
> 	int ret; a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  314 a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  315  	if (WARN_ON(state < 0 || state >= mux->states))
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  316 
> 		return -EINVAL; a3b02a9c6591ce drivers/mux/mux-core.c 
Peter Rosin       
> 2017-05-14  317 a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  318  	if (mux->cached_state == state) a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  319  		
return 0;
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  320
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  321 
> 	ret = mux_control_set(mux, state); a3b02a9c6591ce drivers/mux/mux-
core.c
> Peter Rosin        2017-05-14  322  	if (ret >= 0) a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  323  		
return 0;
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  324
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  325 
> 	/* The mux update failed, try to revert if appropriate... */
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  326 
> 	if (mux->idle_state != MUX_IDLE_AS_IS) a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  327 
> 		mux_control_set(mux, mux->idle_state); a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  328 a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  329  	return ret;
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  330  }
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  331
> 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch 2021-10-07  332 
> static void mux_control_delay(struct mux_control *mux, unsigned int
> delay_us) 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch
> 2021-10-07  333  { 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch
> 2021-10-07  334  	ktime_t delayend; 17b5b576ff5faf drivers/mux/core.c    
> Vincent Whitchurch 2021-10-07  335  	s64 remaining; 17b5b576ff5faf
> drivers/mux/core.c     Vincent Whitchurch 2021-10-07  336 17b5b576ff5faf
> drivers/mux/core.c     Vincent Whitchurch 2021-10-07  337  	if (!
delay_us)
> 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch 2021-10-07  338 
> 		return; 17b5b576ff5faf drivers/mux/core.c     Vincent 
Whitchurch
> 2021-10-07  339 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch
> 2021-10-07  340  	delayend = ktime_add_us(mux->last_change, delay_us);
> 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch 2021-10-07  341 
> 	remaining = ktime_us_delta(delayend, ktime_get()); 17b5b576ff5faf
> drivers/mux/core.c     Vincent Whitchurch 2021-10-07  342  	if (remaining 
>
> 0) 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch 2021-10-07  343
>  		fsleep(remaining); 17b5b576ff5faf drivers/mux/core.c     
Vincent
> Whitchurch 2021-10-07  344  } 17b5b576ff5faf drivers/mux/core.c     Vincent
> Whitchurch 2021-10-07  345 a3b02a9c6591ce drivers/mux/mux-core.c Peter
> Rosin        2017-05-14  346  /** 17b5b576ff5faf drivers/mux/core.c    
> Vincent Whitchurch 2021-10-07  347   * mux_control_select_delay() - Select
> the given multiplexer state. a3b02a9c6591ce drivers/mux/mux-core.c Peter
> Rosin        2017-05-14  348   * @mux: The mux-control to request a change
> of state from. a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  349   * @state: The new requested state. 17b5b576ff5faf
> drivers/mux/core.c     Vincent Whitchurch 2021-10-07  350   * @delay_us:
> The time to delay (in microseconds) if the mux state is changed.
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  351  
> * a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  352 
>  * On successfully selecting the mux-control state, it will be locked until
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  353  
> * there is a call to mux_control_deselect(). If the mux-control is already
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  354  
> * selected when mux_control_select() is called, the caller will be blocked
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  355  
> * until mux_control_deselect() or mux_state_deselect() is called (by
> someone 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07
>  356   * else). a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  357   * a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin      
>  2017-05-14  358   * Therefore, make sure to call mux_control_deselect()
> when the operation is a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin    
>    2017-05-14  359   * complete and the mux-control is free for others to
> use, but do not call a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin     
>   2017-05-14  360   * mux_control_deselect() if mux_control_select() fails.
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  361  
> * a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  362 
>  * Return: 0 when the mux-control state has the requested state or a
> negative a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  363   * errno on error. a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  364   */ 17b5b576ff5faf drivers/mux/core.c  
>   Vincent Whitchurch 2021-10-07 @365  int mux_control_select_delay(struct
> mux_control *mux, unsigned int state, 17b5b576ff5faf drivers/mux/core.c    
> Vincent Whitchurch 2021-10-07  366  			     unsigned int 
delay_us)
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  367  {
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  368 
> 	int ret; a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  369 a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  370  	ret = down_killable(&mux->lock); a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  371  	if (ret < 0)
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  372 
> 		return ret; a3b02a9c6591ce drivers/mux/mux-core.c Peter 
Rosin       
> 2017-05-14  373 a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  374  	ret = __mux_control_select(mux, state); 17b5b576ff5faf
> drivers/mux/core.c     Vincent Whitchurch 2021-10-07  375  	if (ret >= 0)
> 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch 2021-10-07  376 
> 		mux_control_delay(mux, delay_us); a3b02a9c6591ce 
drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  377 a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  378  	if (ret < 0) a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  379 
> 		up(&mux->lock); a3b02a9c6591ce drivers/mux/mux-core.c 
Peter Rosin       
> 2017-05-14  380 a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  381  	return ret; a3b02a9c6591ce drivers/mux/mux-core.c 
Peter
> Rosin        2017-05-14  382  } 17b5b576ff5faf drivers/mux/core.c    
> Vincent Whitchurch 2021-10-07  383 
> EXPORT_SYMBOL_GPL(mux_control_select_delay); a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  384 84564481bc4520
> drivers/mux/core.c     Aswath Govindraju  2022-01-07  385  /**
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  386  
> * mux_state_select_delay() - Select the given multiplexer state.
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  387  
> * @mstate: The mux-state to select. 84564481bc4520 drivers/mux/core.c    
> Aswath Govindraju  2022-01-07  388   * @delay_us: The time to delay (in
> microseconds) if the mux state is changed. 84564481bc4520
> drivers/mux/core.c     Aswath Govindraju  2022-01-07  389   *
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  390  
> * On successfully selecting the mux-state, its mux-control will be locked
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  391  
> * until there is a call to mux_state_deselect(). If the mux-control is
> already 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07
>  392   * selected when mux_state_select() is called, the caller will be
> blocked 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07
>  393   * until mux_state_deselect() or mux_control_deselect() is called (by
> someone 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07
>  394   * else). 84564481bc4520 drivers/mux/core.c     Aswath Govindraju 
> 2022-01-07  395   * 84564481bc4520 drivers/mux/core.c     Aswath Govindraju
>  2022-01-07  396   * Therefore, make sure to call mux_state_deselect() when
> the operation is 84564481bc4520 drivers/mux/core.c     Aswath Govindraju 
> 2022-01-07  397   * complete and the mux-control is free for others to use,
> but do not call 84564481bc4520 drivers/mux/core.c     Aswath Govindraju 
> 2022-01-07  398   * mux_state_deselect() if mux_state_select() fails.
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  399  
> * 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  400 
>  * Return: 0 when the mux-state has been selected or a negative
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  401  
> * errno on error. 84564481bc4520 drivers/mux/core.c     Aswath Govindraju 
> 2022-01-07  402   */ 84564481bc4520 drivers/mux/core.c     Aswath
> Govindraju  2022-01-07 @403  int mux_state_select_delay(struct mux_state
> *mstate, unsigned int delay_us) 84564481bc4520 drivers/mux/core.c    
> Aswath Govindraju  2022-01-07  404  { 84564481bc4520 drivers/mux/core.c    
> Aswath Govindraju  2022-01-07  405  	return
> mux_control_select_delay(mstate->mux, mstate->state, delay_us);
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  406  }
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  407 
> EXPORT_SYMBOL_GPL(mux_state_select_delay); 84564481bc4520
> drivers/mux/core.c     Aswath Govindraju  2022-01-07  408 a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  409  /**
> 17b5b576ff5faf drivers/mux/core.c     Vincent Whitchurch 2021-10-07  410  
> * mux_control_try_select_delay() - Try to select the given multiplexer
> state. a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14 
> 411   * @mux: The mux-control to request a change of state from.
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  412  
> * @state: The new requested state. 17b5b576ff5faf drivers/mux/core.c    
> Vincent Whitchurch 2021-10-07  413   * @delay_us: The time to delay (in
> microseconds) if the mux state is changed. a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  414   *
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  415  
> * On successfully selecting the mux-control state, it will be locked until
> f22d1117b9c3e2 drivers/mux/core.c     Peter Rosin        2022-01-07  416  
> * mux_control_deselect() is called. a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  417   * a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  418   * Therefore,
> make sure to call mux_control_deselect() when the operation is
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  419  
> * complete and the mux-control is free for others to use, but do not call
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  420  
> * mux_control_deselect() if mux_control_try_select() fails. a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  421   *
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  422  
> * Return: 0 when the mux-control state has the requested state or a
> negative a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  423   * errno on error. Specifically -EBUSY if the mux-control
> is contended. a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  424   */ 17b5b576ff5faf drivers/mux/core.c     Vincent
> Whitchurch 2021-10-07 @425  int mux_control_try_select_delay(struct
> mux_control *mux, unsigned int state, 17b5b576ff5faf drivers/mux/core.c    
> Vincent Whitchurch 2021-10-07  426  				 
unsigned int delay_us)
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  427  {
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  428 
> 	int ret; a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  429 a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  430  	if (down_trylock(&mux->lock)) a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  431  		
return -EBUSY;
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  432
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  433 
> 	ret = __mux_control_select(mux, state); 17b5b576ff5faf drivers/mux/
core.c 
>    Vincent Whitchurch 2021-10-07  434  	if (ret >= 0) 17b5b576ff5faf
> drivers/mux/core.c     Vincent Whitchurch 2021-10-07  435 
> 		mux_control_delay(mux, delay_us); a3b02a9c6591ce 
drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  436 a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  437  	if (ret < 0) a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  438 
> 		up(&mux->lock); a3b02a9c6591ce drivers/mux/mux-core.c 
Peter Rosin       
> 2017-05-14  439 a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  440  	return ret; a3b02a9c6591ce drivers/mux/mux-core.c 
Peter
> Rosin        2017-05-14  441  } 17b5b576ff5faf drivers/mux/core.c    
> Vincent Whitchurch 2021-10-07  442 
> EXPORT_SYMBOL_GPL(mux_control_try_select_delay); a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  443 84564481bc4520
> drivers/mux/core.c     Aswath Govindraju  2022-01-07  444  /**
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  445  
> * mux_state_try_select_delay() - Try to select the given multiplexer state.
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  446  
> * @mstate: The mux-state to select. 84564481bc4520 drivers/mux/core.c    
> Aswath Govindraju  2022-01-07  447   * @delay_us: The time to delay (in
> microseconds) if the mux state is changed. 84564481bc4520
> drivers/mux/core.c     Aswath Govindraju  2022-01-07  448   *
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  449  
> * On successfully selecting the mux-state, its mux-control will be locked
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  450  
> * until mux_state_deselect() is called. 84564481bc4520 drivers/mux/core.c  
>   Aswath Govindraju  2022-01-07  451   * 84564481bc4520 drivers/mux/core.c 
>    Aswath Govindraju  2022-01-07  452   * Therefore, make sure to call
> mux_state_deselect() when the operation is 84564481bc4520
> drivers/mux/core.c     Aswath Govindraju  2022-01-07  453   * complete and
> the mux-control is free for others to use, but do not call 84564481bc4520
> drivers/mux/core.c     Aswath Govindraju  2022-01-07  454   *
> mux_state_deselect() if mux_state_try_select() fails. 84564481bc4520
> drivers/mux/core.c     Aswath Govindraju  2022-01-07  455   *
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  456  
> * Return: 0 when the mux-state has been selected or a negative errno on
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  457  
> * error. Specifically -EBUSY if the mux-control is contended.
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  458  
> */ 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07 @459
>  int mux_state_try_select_delay(struct mux_state *mstate, unsigned int
> delay_us) 84564481bc4520 drivers/mux/core.c     Aswath Govindraju 
> 2022-01-07  460  { 84564481bc4520 drivers/mux/core.c     Aswath Govindraju 
> 2022-01-07  461  	return mux_control_try_select_delay(mstate->mux,
> mstate->state, delay_us); 84564481bc4520 drivers/mux/core.c     Aswath
> Govindraju  2022-01-07  462  } 84564481bc4520 drivers/mux/core.c     Aswath
> Govindraju  2022-01-07  463  EXPORT_SYMBOL_GPL(mux_state_try_select_delay);
> 84564481bc4520 drivers/mux/core.c     Aswath Govindraju  2022-01-07  464
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  465 
> /** a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14 
> 466   * mux_control_deselect() - Deselect the previously selected
> multiplexer state. a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  467   * @mux: The mux-control to deselect. a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  468   *
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  469  
> * It is required that a single call is made to mux_control_deselect() for
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  470  
> * each and every successful call made to either of mux_control_select() or
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  471  
> * mux_control_try_select(). a3b02a9c6591ce drivers/mux/mux-core.c Peter
> Rosin        2017-05-14  472   * a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  473   * Return: 0 on success and a negative
> errno on error. An error can only a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  474   * occur if the mux has an idle state.
> Note that even if an error occurs, the a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  475   * mux-control
> is unlocked and is thus free for the next access. a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  476   */
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14 @477 
> int mux_control_deselect(struct mux_control *mux) a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  478  { a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  479  	int ret = 0;
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  480
> a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin        2017-05-14  481 
> 	if (mux->idle_state != MUX_IDLE_AS_IS && a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  482  	   
> mux->idle_state != mux->cached_state) a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  483  		ret = 
mux_control_set(mux,
> mux->idle_state); a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  484 a3b02a9c6591ce drivers/mux/mux-core.c Peter Rosin       
> 2017-05-14  485  	up(&mux->lock); a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  486 a3b02a9c6591ce drivers/mux/mux-core.c
> Peter Rosin        2017-05-14  487  	return ret; a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  488  } a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  489 
> EXPORT_SYMBOL_GPL(mux_control_deselect); a3b02a9c6591ce
> drivers/mux/mux-core.c Peter Rosin        2017-05-14  490







More information about the linux-phy mailing list