Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7eccfebf authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

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()
parents 31ade3b8 d1f15aa0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
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
+36 −15
Original line number Diff line number Diff line
@@ -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
 *
 * Returns a struct reset_control or IS_ERR() condition containing errno.
 * @index: index of the reset controller
 *
 * 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);

/**
+1 −3
Original line number Diff line number Diff line
@@ -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[] = {
+1 −2
Original line number Diff line number Diff line
@@ -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)
+2 −3
Original line number Diff line number Diff line
@@ -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 @@ static int sunxi_reset_init(struct device_node *np)
 * 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 */ },
};
Loading