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.shevche...@linux.intel.com> > Cc: Andy Shevchenko <andriy.shevche...@linux.intel.com> > Cc: Ramiro Oliveira <ramiro.olive...@synopsys.com> > Signed-off-by: Philipp Zabel <p.za...@pengutronix.de>
Tested-by: Andy Shevchenko <andriy.shevche...@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.shevche...@linux.intel.com> Intel Finland Oy