Loading drivers/reset/reset-simple.c +21 −2 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -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); Loading drivers/reset/reset-socfpga.c +1 −2 Original line number Diff line number Diff line Loading @@ -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) Loading drivers/reset/reset-sunxi.c +1 −2 Original line number Diff line number Diff line Loading @@ -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; Loading drivers/reset/reset-uniphier-glue.c +1 −2 Original line number Diff line number Diff line Loading @@ -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 Loading drivers/reset/reset-simple.h→include/linux/reset/reset-simple.h +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading
drivers/reset/reset-simple.c +21 −2 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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) { Loading Loading @@ -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) { Loading @@ -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); Loading
drivers/reset/reset-socfpga.c +1 −2 Original line number Diff line number Diff line Loading @@ -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) Loading
drivers/reset/reset-sunxi.c +1 −2 Original line number Diff line number Diff line Loading @@ -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; Loading
drivers/reset/reset-uniphier-glue.c +1 −2 Original line number Diff line number Diff line Loading @@ -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 Loading
drivers/reset/reset-simple.h→include/linux/reset/reset-simple.h +7 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading