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
This commit is contained in:
Stephen Boyd 2020-06-19 17:07:55 -07:00
commit f93ac080f5
5 changed files with 31 additions and 8 deletions

View File

@ -11,6 +11,7 @@
* Maxime Ripard <maxime.ripard@free-electrons.com> * Maxime Ripard <maxime.ripard@free-electrons.com>
*/ */
#include <linux/delay.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/io.h> #include <linux/io.h>
@ -18,10 +19,9 @@
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/reset-controller.h> #include <linux/reset-controller.h>
#include <linux/reset/reset-simple.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include "reset-simple.h"
static inline struct reset_simple_data * static inline struct reset_simple_data *
to_reset_simple_data(struct reset_controller_dev *rcdev) 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); 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, static int reset_simple_status(struct reset_controller_dev *rcdev,
unsigned long id) 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 = { const struct reset_control_ops reset_simple_ops = {
.assert = reset_simple_assert, .assert = reset_simple_assert,
.deassert = reset_simple_deassert, .deassert = reset_simple_deassert,
.reset = reset_simple_reset,
.status = reset_simple_status, .status = reset_simple_status,
}; };
EXPORT_SYMBOL_GPL(reset_simple_ops); EXPORT_SYMBOL_GPL(reset_simple_ops);

View File

@ -11,13 +11,12 @@
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/reset-controller.h> #include <linux/reset-controller.h>
#include <linux/reset/reset-simple.h>
#include <linux/reset/socfpga.h> #include <linux/reset/socfpga.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/types.h> #include <linux/types.h>
#include "reset-simple.h"
#define SOCFPGA_NR_BANKS 8 #define SOCFPGA_NR_BANKS 8
static int a10_reset_init(struct device_node *np) static int a10_reset_init(struct device_node *np)

View File

@ -14,13 +14,12 @@
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/reset-controller.h> #include <linux/reset-controller.h>
#include <linux/reset/reset-simple.h>
#include <linux/reset/sunxi.h> #include <linux/reset/sunxi.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/types.h> #include <linux/types.h>
#include "reset-simple.h"
static int sunxi_reset_init(struct device_node *np) static int sunxi_reset_init(struct device_node *np)
{ {
struct reset_simple_data *data; struct reset_simple_data *data;

View File

@ -9,8 +9,7 @@
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/reset.h> #include <linux/reset.h>
#include <linux/reset/reset-simple.h>
#include "reset-simple.h"
#define MAX_CLKS 2 #define MAX_CLKS 2
#define MAX_RSTS 2 #define MAX_RSTS 2

View File

@ -27,6 +27,12 @@
* @status_active_low: if true, bits read back as cleared while the reset is * @status_active_low: if true, bits read back as cleared while the reset is
* asserted. Otherwise, bits read back as set while the * asserted. Otherwise, bits read back as set while the
* reset is asserted. * 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 { struct reset_simple_data {
spinlock_t lock; spinlock_t lock;
@ -34,6 +40,7 @@ struct reset_simple_data {
struct reset_controller_dev rcdev; struct reset_controller_dev rcdev;
bool active_low; bool active_low;
bool status_active_low; bool status_active_low;
unsigned int reset_us;
}; };
extern const struct reset_control_ops reset_simple_ops; extern const struct reset_control_ops reset_simple_ops;