* [PATCH] reset: add exported __reset_control_get, return NULL if optional
@ 2017-04-04 8:18 Philipp Zabel
2017-04-04 10:34 ` Andy Shevchenko
0 siblings, 1 reply; 2+ messages in thread
From: Philipp Zabel @ 2017-04-04 8:18 UTC (permalink / raw)
To: linux-kernel; +Cc: Philipp Zabel, Andy Shevchenko, Ramiro Oliveira
Rename the internal __reset_control_get/put functions to
__reset_control_get/put_internal and add an exported
__reset_control_get equivalent to __of_reset_control_get
that takes a struct device parameter.
This avoids the confusing call to __of_reset_control_get in
the non-DT case and fixes the devm_reset_control_get_optional
function to return NULL if RESET_CONTROLLER is enabled but
dev->of_node == NULL.
Fixes: bb475230b8e5 ("reset: make optional functions really optional")
Reported-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Ramiro Oliveira <Ramiro.Oliveira@synopsys.com>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
---
drivers/reset/core.c | 22 ++++++++++++++++------
include/linux/reset.h | 22 ++++++++++++++--------
2 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index f1e5e65388bb5..cd739d2fa1603 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -275,7 +275,7 @@ int reset_control_status(struct reset_control *rstc)
}
EXPORT_SYMBOL_GPL(reset_control_status);
-static struct reset_control *__reset_control_get(
+static struct reset_control *__reset_control_get_internal(
struct reset_controller_dev *rcdev,
unsigned int index, bool shared)
{
@@ -308,7 +308,7 @@ static struct reset_control *__reset_control_get(
return rstc;
}
-static void __reset_control_put(struct reset_control *rstc)
+static void __reset_control_put_internal(struct reset_control *rstc)
{
lockdep_assert_held(&reset_list_mutex);
@@ -377,7 +377,7 @@ struct reset_control *__of_reset_control_get(struct device_node *node,
}
/* reset_list_mutex also protects the rcdev's reset_control list */
- rstc = __reset_control_get(rcdev, rstc_id, shared);
+ rstc = __reset_control_get_internal(rcdev, rstc_id, shared);
mutex_unlock(&reset_list_mutex);
@@ -385,6 +385,17 @@ struct reset_control *__of_reset_control_get(struct device_node *node,
}
EXPORT_SYMBOL_GPL(__of_reset_control_get);
+struct reset_control *__reset_control_get(struct device *dev, const char *id,
+ int index, bool shared, bool optional)
+{
+ if (dev->of_node)
+ return __of_reset_control_get(dev->of_node, id, index, shared,
+ optional);
+
+ return optional ? NULL : ERR_PTR(-EINVAL);
+}
+EXPORT_SYMBOL_GPL(__reset_control_get);
+
/**
* reset_control_put - free the reset controller
* @rstc: reset controller
@@ -396,7 +407,7 @@ void reset_control_put(struct reset_control *rstc)
return;
mutex_lock(&reset_list_mutex);
- __reset_control_put(rstc);
+ __reset_control_put_internal(rstc);
mutex_unlock(&reset_list_mutex);
}
EXPORT_SYMBOL_GPL(reset_control_put);
@@ -417,8 +428,7 @@ struct reset_control *__devm_reset_control_get(struct device *dev,
if (!ptr)
return ERR_PTR(-ENOMEM);
- rstc = __of_reset_control_get(dev ? dev->of_node : NULL,
- id, index, shared, optional);
+ rstc = __reset_control_get(dev, id, index, shared, optional);
if (!IS_ERR(rstc)) {
*ptr = rstc;
devres_add(dev, ptr);
diff --git a/include/linux/reset.h b/include/linux/reset.h
index 96fb139bdd08f..13d8681210d54 100644
--- a/include/linux/reset.h
+++ b/include/linux/reset.h
@@ -15,6 +15,9 @@ int reset_control_status(struct reset_control *rstc);
struct reset_control *__of_reset_control_get(struct device_node *node,
const char *id, int index, bool shared,
bool optional);
+struct reset_control *__reset_control_get(struct device *dev, const char *id,
+ int index, bool shared,
+ bool optional);
void reset_control_put(struct reset_control *rstc);
struct reset_control *__devm_reset_control_get(struct device *dev,
const char *id, int index, bool shared,
@@ -72,6 +75,13 @@ static inline struct reset_control *__of_reset_control_get(
return optional ? NULL : ERR_PTR(-ENOTSUPP);
}
+static inline struct reset_control *__reset_control_get(
+ struct device *dev, const char *id,
+ int index, bool shared, bool optional)
+{
+ return optional ? NULL : ERR_PTR(-ENOTSUPP);
+}
+
static inline struct reset_control *__devm_reset_control_get(
struct device *dev, const char *id,
int index, bool shared, bool optional)
@@ -102,8 +112,7 @@ __must_check reset_control_get_exclusive(struct device *dev, const char *id)
#ifndef CONFIG_RESET_CONTROLLER
WARN_ON(1);
#endif
- return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, false,
- false);
+ return __reset_control_get(dev, id, 0, false, false);
}
/**
@@ -131,22 +140,19 @@ __must_check reset_control_get_exclusive(struct device *dev, const char *id)
static inline struct reset_control *reset_control_get_shared(
struct device *dev, const char *id)
{
- return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, true,
- false);
+ return __reset_control_get(dev, id, 0, true, false);
}
static inline struct reset_control *reset_control_get_optional_exclusive(
struct device *dev, const char *id)
{
- return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, false,
- true);
+ return __reset_control_get(dev, id, 0, false, true);
}
static inline struct reset_control *reset_control_get_optional_shared(
struct device *dev, const char *id)
{
- return __of_reset_control_get(dev ? dev->of_node : NULL, id, 0, true,
- true);
+ return __reset_control_get(dev, id, 0, true, true);
}
/**
--
2.11.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] reset: add exported __reset_control_get, return NULL if optional
2017-04-04 8:18 [PATCH] reset: add exported __reset_control_get, return NULL if optional Philipp Zabel
@ 2017-04-04 10:34 ` Andy Shevchenko
0 siblings, 0 replies; 2+ messages in thread
From: Andy Shevchenko @ 2017-04-04 10:34 UTC (permalink / raw)
To: Philipp Zabel, linux-kernel; +Cc: Ramiro Oliveira
On Tue, 2017-04-04 at 10:18 +0200, Philipp Zabel wrote:
> Rename the internal __reset_control_get/put functions to
> __reset_control_get/put_internal and add an exported
> __reset_control_get equivalent to __of_reset_control_get
> that takes a struct device parameter.
> This avoids the confusing call to __of_reset_control_get in
> the non-DT case and fixes the devm_reset_control_get_optional
> function to return NULL if RESET_CONTROLLER is enabled but
> dev->of_node == NULL.
>
> Fixes: bb475230b8e5 ("reset: make optional functions really optional")
> Reported-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: Ramiro Oliveira <Ramiro.Oliveira@synopsys.com>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Tested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
(At least if fixes serial console on x86 boards with no legacy UART)
> ---
> drivers/reset/core.c | 22 ++++++++++++++++------
> include/linux/reset.h | 22 ++++++++++++++--------
> 2 files changed, 30 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/reset/core.c b/drivers/reset/core.c
> index f1e5e65388bb5..cd739d2fa1603 100644
> --- a/drivers/reset/core.c
> +++ b/drivers/reset/core.c
> @@ -275,7 +275,7 @@ int reset_control_status(struct reset_control
> *rstc)
> }
> EXPORT_SYMBOL_GPL(reset_control_status);
>
> -static struct reset_control *__reset_control_get(
> +static struct reset_control *__reset_control_get_internal(
> struct reset_controller_dev *rcdev,
> unsigned int index, bool shared)
> {
> @@ -308,7 +308,7 @@ static struct reset_control *__reset_control_get(
> return rstc;
> }
>
> -static void __reset_control_put(struct reset_control *rstc)
> +static void __reset_control_put_internal(struct reset_control *rstc)
> {
> lockdep_assert_held(&reset_list_mutex);
>
> @@ -377,7 +377,7 @@ struct reset_control
> *__of_reset_control_get(struct device_node *node,
> }
>
> /* reset_list_mutex also protects the rcdev's reset_control
> list */
> - rstc = __reset_control_get(rcdev, rstc_id, shared);
> + rstc = __reset_control_get_internal(rcdev, rstc_id, shared);
>
> mutex_unlock(&reset_list_mutex);
>
> @@ -385,6 +385,17 @@ struct reset_control
> *__of_reset_control_get(struct device_node *node,
> }
> EXPORT_SYMBOL_GPL(__of_reset_control_get);
>
> +struct reset_control *__reset_control_get(struct device *dev, const
> char *id,
> + int index, bool shared,
> bool optional)
> +{
> + if (dev->of_node)
> + return __of_reset_control_get(dev->of_node, id,
> index, shared,
> + optional);
> +
> + return optional ? NULL : ERR_PTR(-EINVAL);
> +}
> +EXPORT_SYMBOL_GPL(__reset_control_get);
> +
> /**
> * reset_control_put - free the reset controller
> * @rstc: reset controller
> @@ -396,7 +407,7 @@ void reset_control_put(struct reset_control *rstc)
> return;
>
> mutex_lock(&reset_list_mutex);
> - __reset_control_put(rstc);
> + __reset_control_put_internal(rstc);
> mutex_unlock(&reset_list_mutex);
> }
> EXPORT_SYMBOL_GPL(reset_control_put);
> @@ -417,8 +428,7 @@ struct reset_control
> *__devm_reset_control_get(struct device *dev,
> if (!ptr)
> return ERR_PTR(-ENOMEM);
>
> - rstc = __of_reset_control_get(dev ? dev->of_node : NULL,
> - id, index, shared, optional);
> + rstc = __reset_control_get(dev, id, index, shared, optional);
> if (!IS_ERR(rstc)) {
> *ptr = rstc;
> devres_add(dev, ptr);
> diff --git a/include/linux/reset.h b/include/linux/reset.h
> index 96fb139bdd08f..13d8681210d54 100644
> --- a/include/linux/reset.h
> +++ b/include/linux/reset.h
> @@ -15,6 +15,9 @@ int reset_control_status(struct reset_control
> *rstc);
> struct reset_control *__of_reset_control_get(struct device_node
> *node,
> const char *id, int index, bool
> shared,
> bool optional);
> +struct reset_control *__reset_control_get(struct device *dev, const
> char *id,
> + int index, bool shared,
> + bool optional);
> void reset_control_put(struct reset_control *rstc);
> struct reset_control *__devm_reset_control_get(struct device *dev,
> const char *id, int index, bool
> shared,
> @@ -72,6 +75,13 @@ static inline struct reset_control
> *__of_reset_control_get(
> return optional ? NULL : ERR_PTR(-ENOTSUPP);
> }
>
> +static inline struct reset_control *__reset_control_get(
> + struct device *dev, const
> char *id,
> + int index, bool shared, bool
> optional)
> +{
> + return optional ? NULL : ERR_PTR(-ENOTSUPP);
> +}
> +
> static inline struct reset_control *__devm_reset_control_get(
> struct device *dev, const
> char *id,
> int index, bool shared, bool
> optional)
> @@ -102,8 +112,7 @@ __must_check reset_control_get_exclusive(struct
> device *dev, const char *id)
> #ifndef CONFIG_RESET_CONTROLLER
> WARN_ON(1);
> #endif
> - return __of_reset_control_get(dev ? dev->of_node : NULL, id,
> 0, false,
> -
> false);
> + return __reset_control_get(dev, id, 0, false, false);
> }
>
> /**
> @@ -131,22 +140,19 @@ __must_check reset_control_get_exclusive(struct
> device *dev, const char *id)
> static inline struct reset_control *reset_control_get_shared(
> struct device *dev, const
> char *id)
> {
> - return __of_reset_control_get(dev ? dev->of_node : NULL, id,
> 0, true,
> -
> false);
> + return __reset_control_get(dev, id, 0, true, false);
> }
>
> static inline struct reset_control
> *reset_control_get_optional_exclusive(
> struct device *dev, const
> char *id)
> {
> - return __of_reset_control_get(dev ? dev->of_node : NULL, id,
> 0, false,
> -
> true);
> + return __reset_control_get(dev, id, 0, false, true);
> }
>
> static inline struct reset_control
> *reset_control_get_optional_shared(
> struct device *dev, const
> char *id)
> {
> - return __of_reset_control_get(dev ? dev->of_node : NULL, id,
> 0, true,
> -
> true);
> + return __reset_control_get(dev, id, 0, true, true);
> }
>
> /**
--
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-04-04 10:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-04-04 8:18 [PATCH] reset: add exported __reset_control_get, return NULL if optional Philipp Zabel
2017-04-04 10:34 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).