Reset controller changes for v4.5

- oftree support for getting reset devices by index
 - fixed return value consistency of of_reset_control_get
 - added support for STi co-processor resets
 - added STi status callback
 - various fixes
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJWSgYwAAoJEFDCiBxwnmDr8LsQAIYRPl0Vf5q/gAiC5XL+glUN
 AWY5F+1RfoSVOlEQ4cogWPG6urwP/NVUn+7vmyV5r0EWG/QxOEV6QXhr+VWcdct7
 oJyVN57wDUIA8VIG4GPWOsNzk9eJhIypRZTVuD/4a3g4Za36eM0uPJ7RD67MrGqN
 q2YB4L/wufOuBVTuw4ZQtaD3ZpzR4cbtbjk73+3g3XTMrerNrkVDCgP7jU3vCGED
 6Zhw8h18v4RgBI4ZWhstK8XGY97ExpfWAwzGD+TF0HRz/Uu+k4QK4DxPEENvDf+N
 Pb6Qto2171RUY3IfBUO6aVREYA50b+Y6S8rSc73egMsk/aqnDYcsDB+AEjHyd6sC
 UCVt/lIj6Y+XMfnxfton32ECdNgrq696oDrfDoqOacvATeIb8jgpas5oUP9sr9B/
 fbX3K76q39nWzMO68IYT14AXa+QmQc13BxkWzxMdK+fpagd0ZoX4ZiH+eFnsAS/o
 3h25MPbp0rq8D06g+ioL5SftnsrTT12GjdmvwqZ0ZZfHXmx3tmJ5SDV0ssXY6R/r
 8JBfWpoD4GyZDQXbXmAaoTscuNfMVS7Uu2pMhLzJVIhrsRHNGqig0QRVmQAvYoAO
 IXYnsru2lAkhtFyUim+wGjcTc5QPjZjvGE8HWrvqWT69nOBoFtyvdfkZYJDfb2u/
 AAbuIk+Dc6b0DWkmZEK6
 =MAay
 -----END PGP SIGNATURE-----

Merge tag 'reset-for-4.5' of git://git.pengutronix.de/git/pza/linux into next/drivers

Merge "Reset controller changes for v4.5" from Philipp Zabel:

- oftree support for getting reset devices by index
- fixed return value consistency of of_reset_control_get
- added support for STi co-processor resets
- added STi status callback
- various fixes

* tag 'reset-for-4.5' of git://git.pengutronix.de/git/pza/linux:
  reset: check return value of reset_controller_register()
  reset: remove redundant $(CONFIG_RESET_CONTROLLER) from Makefile
  reset: use ENOTSUPP instead of ENOSYS
  reset: sunxi: mark the of_device_id array as __initconst
  reset: sti: add a missing blank line after declaration
  reset: sti: Provide ops .status() call-back
  reset: sti: Add support for resetting co-processors
  ARM: STi: Add DT defines for co-processor reset lines
  reset: Fix of_reset_control_get() for consistent return values
  reset: add of_reset_control_get_by_index()
This commit is contained in:
Arnd Bergmann 2015-12-10 17:23:48 +01:00
commit 7eccfebf65
10 changed files with 90 additions and 31 deletions

View file

@ -1,4 +1,4 @@
obj-$(CONFIG_RESET_CONTROLLER) += core.o
obj-y += core.o
obj-$(CONFIG_ARCH_LPC18XX) += reset-lpc18xx.o
obj-$(CONFIG_ARCH_SOCFPGA) += reset-socfpga.o
obj-$(CONFIG_ARCH_BERLIN) += reset-berlin.o

View file

@ -95,7 +95,7 @@ int reset_control_reset(struct reset_control *rstc)
if (rstc->rcdev->ops->reset)
return rstc->rcdev->ops->reset(rstc->rcdev, rstc->id);
return -ENOSYS;
return -ENOTSUPP;
}
EXPORT_SYMBOL_GPL(reset_control_reset);
@ -108,7 +108,7 @@ int reset_control_assert(struct reset_control *rstc)
if (rstc->rcdev->ops->assert)
return rstc->rcdev->ops->assert(rstc->rcdev, rstc->id);
return -ENOSYS;
return -ENOTSUPP;
}
EXPORT_SYMBOL_GPL(reset_control_assert);
@ -121,7 +121,7 @@ int reset_control_deassert(struct reset_control *rstc)
if (rstc->rcdev->ops->deassert)
return rstc->rcdev->ops->deassert(rstc->rcdev, rstc->id);
return -ENOSYS;
return -ENOTSUPP;
}
EXPORT_SYMBOL_GPL(reset_control_deassert);
@ -136,32 +136,29 @@ int reset_control_status(struct reset_control *rstc)
if (rstc->rcdev->ops->status)
return rstc->rcdev->ops->status(rstc->rcdev, rstc->id);
return -ENOSYS;
return -ENOTSUPP;
}
EXPORT_SYMBOL_GPL(reset_control_status);
/**
* of_reset_control_get - Lookup and obtain a reference to a reset controller.
* of_reset_control_get_by_index - Lookup and obtain a reference to a reset
* controller by index.
* @node: device to be reset by the controller
* @id: reset line name
* @index: index of the reset controller
*
* Returns a struct reset_control or IS_ERR() condition containing errno.
*
* Use of id names is optional.
* This is to be used to perform a list of resets for a device or power domain
* in whatever order. Returns a struct reset_control or IS_ERR() condition
* containing errno.
*/
struct reset_control *of_reset_control_get(struct device_node *node,
const char *id)
struct reset_control *of_reset_control_get_by_index(struct device_node *node,
int index)
{
struct reset_control *rstc = ERR_PTR(-EPROBE_DEFER);
struct reset_controller_dev *r, *rcdev;
struct of_phandle_args args;
int index = 0;
int rstc_id;
int ret;
if (id)
index = of_property_match_string(node,
"reset-names", id);
ret = of_parse_phandle_with_args(node, "resets", "#reset-cells",
index, &args);
if (ret)
@ -202,6 +199,30 @@ struct reset_control *of_reset_control_get(struct device_node *node,
return rstc;
}
EXPORT_SYMBOL_GPL(of_reset_control_get_by_index);
/**
* of_reset_control_get - Lookup and obtain a reference to a reset controller.
* @node: 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 *of_reset_control_get(struct device_node *node,
const char *id)
{
int index = 0;
if (id) {
index = of_property_match_string(node,
"reset-names", id);
if (index < 0)
return ERR_PTR(-ENOENT);
}
return of_reset_control_get_by_index(node, index);
}
EXPORT_SYMBOL_GPL(of_reset_control_get);
/**

View file

@ -87,9 +87,7 @@ static int berlin2_reset_probe(struct platform_device *pdev)
priv->rcdev.of_reset_n_cells = 2;
priv->rcdev.of_xlate = berlin_reset_xlate;
reset_controller_register(&priv->rcdev);
return 0;
return reset_controller_register(&priv->rcdev);
}
static const struct of_device_id berlin_reset_dt_match[] = {

View file

@ -133,9 +133,8 @@ static int socfpga_reset_probe(struct platform_device *pdev)
data->rcdev.nr_resets = NR_BANKS * BITS_PER_LONG;
data->rcdev.ops = &socfpga_reset_ops;
data->rcdev.of_node = pdev->dev.of_node;
reset_controller_register(&data->rcdev);
return 0;
return reset_controller_register(&data->rcdev);
}
static int socfpga_reset_remove(struct platform_device *pdev)

View file

@ -108,9 +108,8 @@ static int sunxi_reset_init(struct device_node *np)
data->rcdev.nr_resets = size * 32;
data->rcdev.ops = &sunxi_reset_ops;
data->rcdev.of_node = np;
reset_controller_register(&data->rcdev);
return 0;
return reset_controller_register(&data->rcdev);
err_alloc:
kfree(data);
@ -122,7 +121,7 @@ err_alloc:
* our system, before we can even think of using a regular device
* driver for it.
*/
static const struct of_device_id sunxi_early_reset_dt_ids[] __initdata = {
static const struct of_device_id sunxi_early_reset_dt_ids[] __initconst = {
{ .compatible = "allwinner,sun6i-a31-ahb1-reset", },
{ /* sentinel */ },
};

View file

@ -121,9 +121,8 @@ static int zynq_reset_probe(struct platform_device *pdev)
priv->rcdev.nr_resets = resource_size(res) / 4 * BITS_PER_LONG;
priv->rcdev.ops = &zynq_reset_ops;
priv->rcdev.of_node = pdev->dev.of_node;
reset_controller_register(&priv->rcdev);
return 0;
return reset_controller_register(&priv->rcdev);
}
static int zynq_reset_remove(struct platform_device *pdev)

View file

@ -52,6 +52,7 @@ static const struct syscfg_reset_channel_data stih407_powerdowns[] = {
};
/* Reset Generator control 0/1 */
#define SYSCFG_5128 0x200
#define SYSCFG_5131 0x20c
#define SYSCFG_5132 0x210
@ -96,6 +97,10 @@ static const struct syscfg_reset_channel_data stih407_softresets[] = {
[STIH407_ERAM_HVA_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 1),
[STIH407_LPM_SOFTRESET] = STIH407_SRST_SBC(SYSCFG_4002, 2),
[STIH407_KEYSCAN_SOFTRESET] = STIH407_SRST_LPM(LPM_SYSCFG_1, 8),
[STIH407_ST231_AUD_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 26),
[STIH407_ST231_DMU_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 27),
[STIH407_ST231_GP0_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 28),
[STIH407_ST231_GP1_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5128, 2),
};
/* PicoPHY reset/control */

View file

@ -103,17 +103,42 @@ static int syscfg_reset_deassert(struct reset_controller_dev *rcdev,
static int syscfg_reset_dev(struct reset_controller_dev *rcdev,
unsigned long idx)
{
int err = syscfg_reset_assert(rcdev, idx);
int err;
err = syscfg_reset_assert(rcdev, idx);
if (err)
return err;
return syscfg_reset_deassert(rcdev, idx);
}
static int syscfg_reset_status(struct reset_controller_dev *rcdev,
unsigned long idx)
{
struct syscfg_reset_controller *rst = to_syscfg_reset_controller(rcdev);
const struct syscfg_reset_channel *ch;
u32 ret_val = 0;
int err;
if (idx >= rcdev->nr_resets)
return -EINVAL;
ch = &rst->channels[idx];
if (ch->ack)
err = regmap_field_read(ch->ack, &ret_val);
else
err = regmap_field_read(ch->reset, &ret_val);
if (err)
return err;
return rst->active_low ? !ret_val : !!ret_val;
}
static struct reset_control_ops syscfg_reset_ops = {
.reset = syscfg_reset_dev,
.assert = syscfg_reset_assert,
.deassert = syscfg_reset_deassert,
.status = syscfg_reset_status,
};
static int syscfg_reset_controller_register(struct device *dev,

View file

@ -52,6 +52,10 @@
#define STIH407_KEYSCAN_SOFTRESET 26
#define STIH407_USB2_PORT0_SOFTRESET 27
#define STIH407_USB2_PORT1_SOFTRESET 28
#define STIH407_ST231_AUD_SOFTRESET 29
#define STIH407_ST231_DMU_SOFTRESET 30
#define STIH407_ST231_GP0_SOFTRESET 31
#define STIH407_ST231_GP1_SOFTRESET 32
/* Picophy reset defines */
#define STIH407_PICOPHY0_RESET 0

View file

@ -38,6 +38,9 @@ static inline struct reset_control *devm_reset_control_get_optional(
struct reset_control *of_reset_control_get(struct device_node *node,
const char *id);
struct reset_control *of_reset_control_get_by_index(
struct device_node *node, int index);
#else
static inline int reset_control_reset(struct reset_control *rstc)
@ -71,7 +74,7 @@ static inline void reset_control_put(struct reset_control *rstc)
static inline int device_reset_optional(struct device *dev)
{
return -ENOSYS;
return -ENOTSUPP;
}
static inline struct reset_control *__must_check reset_control_get(
@ -91,19 +94,25 @@ static inline struct reset_control *__must_check devm_reset_control_get(
static inline struct reset_control *reset_control_get_optional(
struct device *dev, const char *id)
{
return ERR_PTR(-ENOSYS);
return ERR_PTR(-ENOTSUPP);
}
static inline struct reset_control *devm_reset_control_get_optional(
struct device *dev, const char *id)
{
return ERR_PTR(-ENOSYS);
return ERR_PTR(-ENOTSUPP);
}
static inline struct reset_control *of_reset_control_get(
struct device_node *node, const char *id)
{
return ERR_PTR(-ENOSYS);
return ERR_PTR(-ENOTSUPP);
}
static inline struct reset_control *of_reset_control_get_by_index(
struct device_node *node, int index)
{
return ERR_PTR(-ENOTSUPP);
}
#endif /* CONFIG_RESET_CONTROLLER */