lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20230824121750.1673566-3-aniketmaurya@google.com>
Date:   Thu, 24 Aug 2023 12:17:50 +0000
From:   Aniket <aniketmaurya@...gle.com>
To:     Peter Rosin <peda@...ntia.se>
Cc:     linux-kernel@...r.kernel.org, joychakr@...gle.com,
        Aniket <aniketmaurya@...gle.com>
Subject: [PATCH v1 2/2] mux: Introduce optional variant of consumer APIs

Add optional variant of get APIs for mux-control,
mux-state and mux-state-array.
These APIs allow client drivers to not fail in
case mux is not present on the platform.

Signed-off-by: Aniket <aniketmaurya@...gle.com>
---
 drivers/mux/core.c           | 24 ++++++++++++++++++++++++
 include/linux/mux/consumer.h | 22 ++++++++++++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/drivers/mux/core.c b/drivers/mux/core.c
index e4e57847e904..a6772f23ef6e 100644
--- a/drivers/mux/core.c
+++ b/drivers/mux/core.c
@@ -379,6 +379,9 @@ int mux_control_select_delay(struct mux_control *mux, unsigned int state,
 {
 	int ret;
 
+	if (!mux)
+		return 0;
+
 	ret = down_killable(&mux->lock);
 	if (ret < 0)
 		return ret;
@@ -414,6 +417,9 @@ EXPORT_SYMBOL_GPL(mux_control_select_delay);
  */
 int mux_state_select_delay(struct mux_state *mstate, unsigned int delay_us)
 {
+	if (!mstate)
+		return 0;
+
 	return mux_control_select_delay(mstate->mux, mstate->state, delay_us);
 }
 EXPORT_SYMBOL_GPL(mux_state_select_delay);
@@ -440,6 +446,9 @@ int mux_state_array_select(struct mux_state_array *mstates)
 {
 	int ret, i;
 
+	if (!mstates)
+		return 0;
+
 	for (i = 0; i < mstates->num; ++i) {
 		ret = mux_state_select(mstates->mstate[i]);
 		if (ret < 0)
@@ -477,6 +486,9 @@ int mux_control_try_select_delay(struct mux_control *mux, unsigned int state,
 {
 	int ret;
 
+	if (!mux)
+		return 0;
+
 	if (down_trylock(&mux->lock))
 		return -EBUSY;
 
@@ -508,6 +520,9 @@ EXPORT_SYMBOL_GPL(mux_control_try_select_delay);
  */
 int mux_state_try_select_delay(struct mux_state *mstate, unsigned int delay_us)
 {
+	if (!mstate)
+		return 0;
+
 	return mux_control_try_select_delay(mstate->mux, mstate->state, delay_us);
 }
 EXPORT_SYMBOL_GPL(mux_state_try_select_delay);
@@ -528,6 +543,9 @@ int mux_control_deselect(struct mux_control *mux)
 {
 	int ret = 0;
 
+	if (!mux)
+		return 0;
+
 	if (mux->idle_state != MUX_IDLE_AS_IS &&
 	    mux->idle_state != mux->cached_state)
 		ret = mux_control_set(mux, mux->idle_state);
@@ -552,6 +570,9 @@ EXPORT_SYMBOL_GPL(mux_control_deselect);
  */
 int mux_state_deselect(struct mux_state *mstate)
 {
+	if (!mstate)
+		return 0;
+
 	return mux_control_deselect(mstate->mux);
 }
 EXPORT_SYMBOL_GPL(mux_state_deselect);
@@ -569,6 +590,9 @@ int mux_state_array_deselect(struct mux_state_array *mstates)
 {
 	int ret, i;
 
+	if (!mstates)
+		return 0;
+
 	for (i = 0; i < mstates->num; ++i) {
 		ret = mux_state_deselect(mstates->mstate[i]);
 		if (ret < 0)
diff --git a/include/linux/mux/consumer.h b/include/linux/mux/consumer.h
index da15d0542008..397b1c5848c7 100644
--- a/include/linux/mux/consumer.h
+++ b/include/linux/mux/consumer.h
@@ -63,9 +63,31 @@ void mux_control_put(struct mux_control *mux);
 
 struct mux_control *devm_mux_control_get(struct device *dev,
 					 const char *mux_name);
+static inline struct mux_control *
+devm_mux_control_get_optional(struct device *dev, const char *mux_name)
+{
+	struct mux_control *mux = devm_mux_control_get(dev, mux_name);
+
+	return (PTR_ERR(mux) == -ENOENT) ? NULL : mux;
+}
+
 struct mux_state *devm_mux_state_get(struct device *dev,
 				     const char *mux_name);
+static inline struct mux_state *
+devm_mux_state_get_optional(struct device *dev, const char *mux_name)
+{
+	struct mux_state *mstate = devm_mux_state_get(dev, mux_name);
+
+	return (PTR_ERR(mstate) == -ENOENT) ? NULL : mstate;
+}
 
 struct mux_state_array *devm_mux_state_array_get(struct device *dev);
+static inline struct mux_state_array *
+devm_mux_state_array_get_optional(struct device *dev)
+{
+	struct mux_state_array *mstates = devm_mux_state_array_get(dev);
+
+	return (PTR_ERR(mstates) == -ENOENT) ? NULL : mstates;
+}
 
 #endif /* _LINUX_MUX_CONSUMER_H */
-- 
2.42.0.rc1.204.g551eb34607-goog

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ