Files
linux-stable-mirror/include/linux/mux/consumer.h
T
Frank LiandLinus Walleij 05e58da46d mux: add devm_mux_state_get_from_np() to get mux from child node
Add new API devm_mux_state_get_from_np() to retrieve a mux control from
a specified child device node.

Make devm_mux_state_get() call devm_mux_state_get_from_np() with a NULL
node parameter, which defaults to using the device's own of_node.

Support the following DT schema:

pinctrl@0 {
    uart-func {
            mux-state = <&mux_chip 0>;
    };

    spi-func {
            mux-state = <&mux_chip 1>;
    };
};

Signed-off-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Linus Walleij <linusw@kernel.org>
2026-05-05 14:48:12 +02:00

171 lines
4.7 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* mux/consumer.h - definitions for the multiplexer consumer interface
*
* Copyright (C) 2017 Axentia Technologies AB
*
* Author: Peter Rosin <peda@axentia.se>
*/
#ifndef _LINUX_MUX_CONSUMER_H
#define _LINUX_MUX_CONSUMER_H
#include <linux/compiler.h>
struct device;
struct mux_control;
struct mux_state;
#if IS_ENABLED(CONFIG_MULTIPLEXER)
unsigned int mux_control_states(struct mux_control *mux);
int __must_check mux_control_select_delay(struct mux_control *mux,
unsigned int state,
unsigned int delay_us);
int __must_check mux_state_select_delay(struct mux_state *mstate,
unsigned int delay_us);
int __must_check mux_control_try_select_delay(struct mux_control *mux,
unsigned int state,
unsigned int delay_us);
int __must_check mux_state_try_select_delay(struct mux_state *mstate,
unsigned int delay_us);
static inline int __must_check mux_control_select(struct mux_control *mux,
unsigned int state)
{
return mux_control_select_delay(mux, state, 0);
}
static inline int __must_check mux_state_select(struct mux_state *mstate)
{
return mux_state_select_delay(mstate, 0);
}
static inline int __must_check mux_control_try_select(struct mux_control *mux,
unsigned int state)
{
return mux_control_try_select_delay(mux, state, 0);
}
static inline int __must_check mux_state_try_select(struct mux_state *mstate)
{
return mux_state_try_select_delay(mstate, 0);
}
int mux_control_deselect(struct mux_control *mux);
int mux_state_deselect(struct mux_state *mstate);
struct mux_control *mux_control_get(struct device *dev, const char *mux_name);
struct mux_control *mux_control_get_optional(struct device *dev, const char *mux_name);
void mux_control_put(struct mux_control *mux);
struct mux_control *devm_mux_control_get(struct device *dev, const char *mux_name);
struct mux_state *
devm_mux_state_get_from_np(struct device *dev, const char *mux_name, struct device_node *np);
struct mux_state *devm_mux_state_get_optional(struct device *dev, const char *mux_name);
struct mux_state *devm_mux_state_get_selected(struct device *dev, const char *mux_name);
struct mux_state *devm_mux_state_get_optional_selected(struct device *dev, const char *mux_name);
#else
static inline unsigned int mux_control_states(struct mux_control *mux)
{
return 0;
}
static inline int __must_check mux_control_select_delay(struct mux_control *mux,
unsigned int state, unsigned int delay_us)
{
return -EOPNOTSUPP;
}
static inline int __must_check mux_state_select_delay(struct mux_state *mstate,
unsigned int delay_us)
{
return -EOPNOTSUPP;
}
static inline int __must_check mux_control_try_select_delay(struct mux_control *mux,
unsigned int state,
unsigned int delay_us)
{
return -EOPNOTSUPP;
}
static inline int __must_check mux_state_try_select_delay(struct mux_state *mstate,
unsigned int delay_us)
{
return -EOPNOTSUPP;
}
static inline int __must_check mux_control_select(struct mux_control *mux,
unsigned int state)
{
return -EOPNOTSUPP;
}
static inline int __must_check mux_state_select(struct mux_state *mstate)
{
return -EOPNOTSUPP;
}
static inline int __must_check mux_control_try_select(struct mux_control *mux,
unsigned int state)
{
return -EOPNOTSUPP;
}
static inline int __must_check mux_state_try_select(struct mux_state *mstate)
{
return -EOPNOTSUPP;
}
static inline int mux_control_deselect(struct mux_control *mux)
{
return -EOPNOTSUPP;
}
static inline int mux_state_deselect(struct mux_state *mstate)
{
return -EOPNOTSUPP;
}
static inline struct mux_control *mux_control_get(struct device *dev, const char *mux_name)
{
return ERR_PTR(-EOPNOTSUPP);
}
static inline struct mux_control *mux_control_get_optional(struct device *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 device *dev, const char *mux_name)
{
return ERR_PTR(-EOPNOTSUPP);
}
static inline struct mux_state *devm_mux_state_get(struct device *dev, const char *mux_name)
{
return ERR_PTR(-EOPNOTSUPP);
}
static inline struct mux_state *devm_mux_state_get_optional(struct device *dev,
const char *mux_name)
{
return NULL;
}
static inline struct mux_state *devm_mux_state_get_selected(struct device *dev,
const char *mux_name)
{
return ERR_PTR(-EOPNOTSUPP);
}
static inline struct mux_state *devm_mux_state_get_optional_selected(struct device *dev,
const char *mux_name)
{
return NULL;
}
#endif /* CONFIG_MULTIPLEXER */
#define devm_mux_state_get(dev, mux_name) \
devm_mux_state_get_from_np(dev, mux_name, NULL)
#endif /* _LINUX_MUX_CONSUMER_H */