Merge branch 'reset/for_v3.15' of git://git.pengutronix.de/git/pza/linux into next/drivers
Merge "reset controller fixes and updates" from Philipp Zabel: * 'reset/for_v3.15' of git://git.pengutronix.de/git/pza/linux: reset: Add optional resets and stubs reset: Add of_reset_control_get reset: Mark function as static and remove unused function in core.c reset: allow drivers to request probe deferral Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
463e8474af
2 changed files with 96 additions and 40 deletions
|
@ -43,7 +43,7 @@ struct reset_control {
|
||||||
* This simple translation function should be used for reset controllers
|
* This simple translation function should be used for reset controllers
|
||||||
* with 1:1 mapping, where reset lines can be indexed by number without gaps.
|
* with 1:1 mapping, where reset lines can be indexed by number without gaps.
|
||||||
*/
|
*/
|
||||||
int of_reset_simple_xlate(struct reset_controller_dev *rcdev,
|
static int of_reset_simple_xlate(struct reset_controller_dev *rcdev,
|
||||||
const struct of_phandle_args *reset_spec)
|
const struct of_phandle_args *reset_spec)
|
||||||
{
|
{
|
||||||
if (WARN_ON(reset_spec->args_count != rcdev->of_reset_n_cells))
|
if (WARN_ON(reset_spec->args_count != rcdev->of_reset_n_cells))
|
||||||
|
@ -54,7 +54,6 @@ int of_reset_simple_xlate(struct reset_controller_dev *rcdev,
|
||||||
|
|
||||||
return reset_spec->args[0];
|
return reset_spec->args[0];
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(of_reset_simple_xlate);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* reset_controller_register - register a reset controller device
|
* reset_controller_register - register a reset controller device
|
||||||
|
@ -127,15 +126,16 @@ int reset_control_deassert(struct reset_control *rstc)
|
||||||
EXPORT_SYMBOL_GPL(reset_control_deassert);
|
EXPORT_SYMBOL_GPL(reset_control_deassert);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* reset_control_get - Lookup and obtain a reference to a reset controller.
|
* of_reset_control_get - Lookup and obtain a reference to a reset controller.
|
||||||
* @dev: device to be reset by the controller
|
* @node: device to be reset by the controller
|
||||||
* @id: reset line name
|
* @id: reset line name
|
||||||
*
|
*
|
||||||
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
||||||
*
|
*
|
||||||
* Use of id names is optional.
|
* Use of id names is optional.
|
||||||
*/
|
*/
|
||||||
struct reset_control *reset_control_get(struct device *dev, const char *id)
|
struct reset_control *of_reset_control_get(struct device_node *node,
|
||||||
|
const char *id)
|
||||||
{
|
{
|
||||||
struct reset_control *rstc = ERR_PTR(-EPROBE_DEFER);
|
struct reset_control *rstc = ERR_PTR(-EPROBE_DEFER);
|
||||||
struct reset_controller_dev *r, *rcdev;
|
struct reset_controller_dev *r, *rcdev;
|
||||||
|
@ -144,13 +144,10 @@ struct reset_control *reset_control_get(struct device *dev, const char *id)
|
||||||
int rstc_id;
|
int rstc_id;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!dev)
|
|
||||||
return ERR_PTR(-EINVAL);
|
|
||||||
|
|
||||||
if (id)
|
if (id)
|
||||||
index = of_property_match_string(dev->of_node,
|
index = of_property_match_string(node,
|
||||||
"reset-names", id);
|
"reset-names", id);
|
||||||
ret = of_parse_phandle_with_args(dev->of_node, "resets", "#reset-cells",
|
ret = of_parse_phandle_with_args(node, "resets", "#reset-cells",
|
||||||
index, &args);
|
index, &args);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ERR_PTR(ret);
|
return ERR_PTR(ret);
|
||||||
|
@ -167,7 +164,7 @@ struct reset_control *reset_control_get(struct device *dev, const char *id)
|
||||||
|
|
||||||
if (!rcdev) {
|
if (!rcdev) {
|
||||||
mutex_unlock(&reset_controller_list_mutex);
|
mutex_unlock(&reset_controller_list_mutex);
|
||||||
return ERR_PTR(-ENODEV);
|
return ERR_PTR(-EPROBE_DEFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
rstc_id = rcdev->of_xlate(rcdev, &args);
|
rstc_id = rcdev->of_xlate(rcdev, &args);
|
||||||
|
@ -185,12 +182,35 @@ struct reset_control *reset_control_get(struct device *dev, const char *id)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
rstc->dev = dev;
|
|
||||||
rstc->rcdev = rcdev;
|
rstc->rcdev = rcdev;
|
||||||
rstc->id = rstc_id;
|
rstc->id = rstc_id;
|
||||||
|
|
||||||
return rstc;
|
return rstc;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(of_reset_control_get);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* reset_control_get - Lookup and obtain a reference to a reset controller.
|
||||||
|
* @dev: device to be reset by the controller
|
||||||
|
* @id: reset line name
|
||||||
|
*
|
||||||
|
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
||||||
|
*
|
||||||
|
* Use of id names is optional.
|
||||||
|
*/
|
||||||
|
struct reset_control *reset_control_get(struct device *dev, const char *id)
|
||||||
|
{
|
||||||
|
struct reset_control *rstc;
|
||||||
|
|
||||||
|
if (!dev)
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
|
rstc = of_reset_control_get(dev->of_node, id);
|
||||||
|
if (!IS_ERR(rstc))
|
||||||
|
rstc->dev = dev;
|
||||||
|
|
||||||
|
return rstc;
|
||||||
|
}
|
||||||
EXPORT_SYMBOL_GPL(reset_control_get);
|
EXPORT_SYMBOL_GPL(reset_control_get);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -243,33 +263,6 @@ struct reset_control *devm_reset_control_get(struct device *dev, const char *id)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(devm_reset_control_get);
|
EXPORT_SYMBOL_GPL(devm_reset_control_get);
|
||||||
|
|
||||||
static int devm_reset_control_match(struct device *dev, void *res, void *data)
|
|
||||||
{
|
|
||||||
struct reset_control **rstc = res;
|
|
||||||
if (WARN_ON(!rstc || !*rstc))
|
|
||||||
return 0;
|
|
||||||
return *rstc == data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* devm_reset_control_put - resource managed reset_control_put()
|
|
||||||
* @rstc: reset controller to free
|
|
||||||
*
|
|
||||||
* Deallocate a reset control allocated withd devm_reset_control_get().
|
|
||||||
* This function will not need to be called normally, as devres will take
|
|
||||||
* care of freeing the resource.
|
|
||||||
*/
|
|
||||||
void devm_reset_control_put(struct reset_control *rstc)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = devres_release(rstc->dev, devm_reset_control_release,
|
|
||||||
devm_reset_control_match, rstc);
|
|
||||||
if (ret)
|
|
||||||
WARN_ON(ret);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(devm_reset_control_put);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* device_reset - find reset controller associated with the device
|
* device_reset - find reset controller associated with the device
|
||||||
* and perform reset
|
* and perform reset
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
struct device;
|
struct device;
|
||||||
struct reset_control;
|
struct reset_control;
|
||||||
|
|
||||||
|
#ifdef CONFIG_RESET_CONTROLLER
|
||||||
|
|
||||||
int reset_control_reset(struct reset_control *rstc);
|
int reset_control_reset(struct reset_control *rstc);
|
||||||
int reset_control_assert(struct reset_control *rstc);
|
int reset_control_assert(struct reset_control *rstc);
|
||||||
int reset_control_deassert(struct reset_control *rstc);
|
int reset_control_deassert(struct reset_control *rstc);
|
||||||
|
@ -12,6 +14,67 @@ struct reset_control *reset_control_get(struct device *dev, const char *id);
|
||||||
void reset_control_put(struct reset_control *rstc);
|
void reset_control_put(struct reset_control *rstc);
|
||||||
struct reset_control *devm_reset_control_get(struct device *dev, const char *id);
|
struct reset_control *devm_reset_control_get(struct device *dev, const char *id);
|
||||||
|
|
||||||
int device_reset(struct device *dev);
|
int __must_check device_reset(struct device *dev);
|
||||||
|
|
||||||
|
static inline int device_reset_optional(struct device *dev)
|
||||||
|
{
|
||||||
|
return device_reset(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct reset_control *reset_control_get_optional(
|
||||||
|
struct device *dev, const char *id)
|
||||||
|
{
|
||||||
|
return reset_control_get(dev, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct reset_control *devm_reset_control_get_optional(
|
||||||
|
struct device *dev, const char *id)
|
||||||
|
{
|
||||||
|
return devm_reset_control_get(dev, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static inline int reset_control_reset(struct reset_control *rstc)
|
||||||
|
{
|
||||||
|
WARN_ON(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int reset_control_assert(struct reset_control *rstc)
|
||||||
|
{
|
||||||
|
WARN_ON(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int reset_control_deassert(struct reset_control *rstc)
|
||||||
|
{
|
||||||
|
WARN_ON(1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void reset_control_put(struct reset_control *rstc)
|
||||||
|
{
|
||||||
|
WARN_ON(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int device_reset_optional(struct device *dev)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct reset_control *reset_control_get_optional(
|
||||||
|
struct device *dev, const char *id)
|
||||||
|
{
|
||||||
|
return ERR_PTR(-ENOSYS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct reset_control *devm_reset_control_get_optional(
|
||||||
|
struct device *dev, const char *id)
|
||||||
|
{
|
||||||
|
return ERR_PTR(-ENOSYS);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_RESET_CONTROLLER */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue