Commit f93ac080 authored by Stephen Boyd's avatar Stephen Boyd
Browse files

Merge branch 'reset/simple' of git://git.pengutronix.de/git/pza/linux into clk-bcm

Pull immutable reset branch to get reset-simple header.

* 'reset/simple' of git://git.pengutronix.de/git/pza/linux:
  reset: simple: Add reset callback
  reset: Move reset-simple header out of drivers/reset
parents e244d205 a9701376
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
 * Maxime Ripard <maxime.ripard@free-electrons.com>
 */

#include <linux/delay.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/io.h>
@@ -18,10 +19,9 @@
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/reset-controller.h>
#include <linux/reset/reset-simple.h>
#include <linux/spinlock.h>

#include "reset-simple.h"

static inline struct reset_simple_data *
to_reset_simple_data(struct reset_controller_dev *rcdev)
{
@@ -64,6 +64,24 @@ static int reset_simple_deassert(struct reset_controller_dev *rcdev,
	return reset_simple_update(rcdev, id, false);
}

static int reset_simple_reset(struct reset_controller_dev *rcdev,
			      unsigned long id)
{
	struct reset_simple_data *data = to_reset_simple_data(rcdev);
	int ret;

	if (!data->reset_us)
		return -ENOTSUPP;

	ret = reset_simple_assert(rcdev, id);
	if (ret)
		return ret;

	usleep_range(data->reset_us, data->reset_us * 2);

	return reset_simple_deassert(rcdev, id);
}

static int reset_simple_status(struct reset_controller_dev *rcdev,
			       unsigned long id)
{
@@ -81,6 +99,7 @@ static int reset_simple_status(struct reset_controller_dev *rcdev,
const struct reset_control_ops reset_simple_ops = {
	.assert		= reset_simple_assert,
	.deassert	= reset_simple_deassert,
	.reset		= reset_simple_reset,
	.status		= reset_simple_status,
};
EXPORT_SYMBOL_GPL(reset_simple_ops);
+1 −2
Original line number Diff line number Diff line
@@ -11,13 +11,12 @@
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/reset-controller.h>
#include <linux/reset/reset-simple.h>
#include <linux/reset/socfpga.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/types.h>

#include "reset-simple.h"

#define SOCFPGA_NR_BANKS	8

static int a10_reset_init(struct device_node *np)
+1 −2
Original line number Diff line number Diff line
@@ -14,13 +14,12 @@
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/reset-controller.h>
#include <linux/reset/reset-simple.h>
#include <linux/reset/sunxi.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/types.h>

#include "reset-simple.h"

static int sunxi_reset_init(struct device_node *np)
{
	struct reset_simple_data *data;
+1 −2
Original line number Diff line number Diff line
@@ -9,8 +9,7 @@
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/reset.h>

#include "reset-simple.h"
#include <linux/reset/reset-simple.h>

#define MAX_CLKS	2
#define MAX_RSTS	2
+7 −0
Original line number Diff line number Diff line
@@ -27,6 +27,12 @@
 * @status_active_low: if true, bits read back as cleared while the reset is
 *                     asserted. Otherwise, bits read back as set while the
 *                     reset is asserted.
 * @reset_us: Minimum delay in microseconds needed that needs to be
 *            waited for between an assert and a deassert to reset the
 *            device. If multiple consumers with different delay
 *            requirements are connected to this controller, it must
 *            be the largest minimum delay. 0 means that such a delay is
 *            unknown and the reset operation is unsupported.
 */
struct reset_simple_data {
	spinlock_t			lock;
@@ -34,6 +40,7 @@ struct reset_simple_data {
	struct reset_controller_dev	rcdev;
	bool				active_low;
	bool				status_active_low;
	unsigned int			reset_us;
};

extern const struct reset_control_ops reset_simple_ops;