Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+31 -8
+21 -2
drivers/reset/reset-simple.c
··· 11 11 * Maxime Ripard <maxime.ripard@free-electrons.com> 12 12 */ 13 13 14 + #include <linux/delay.h> 14 15 #include <linux/device.h> 15 16 #include <linux/err.h> 16 17 #include <linux/io.h> ··· 19 18 #include <linux/of_device.h> 20 19 #include <linux/platform_device.h> 21 20 #include <linux/reset-controller.h> 21 + #include <linux/reset/reset-simple.h> 22 22 #include <linux/spinlock.h> 23 - 24 - #include "reset-simple.h" 25 23 26 24 static inline struct reset_simple_data * 27 25 to_reset_simple_data(struct reset_controller_dev *rcdev) ··· 64 64 return reset_simple_update(rcdev, id, false); 65 65 } 66 66 67 + static int reset_simple_reset(struct reset_controller_dev *rcdev, 68 + unsigned long id) 69 + { 70 + struct reset_simple_data *data = to_reset_simple_data(rcdev); 71 + int ret; 72 + 73 + if (!data->reset_us) 74 + return -ENOTSUPP; 75 + 76 + ret = reset_simple_assert(rcdev, id); 77 + if (ret) 78 + return ret; 79 + 80 + usleep_range(data->reset_us, data->reset_us * 2); 81 + 82 + return reset_simple_deassert(rcdev, id); 83 + } 84 + 67 85 static int reset_simple_status(struct reset_controller_dev *rcdev, 68 86 unsigned long id) 69 87 { ··· 99 81 const struct reset_control_ops reset_simple_ops = { 100 82 .assert = reset_simple_assert, 101 83 .deassert = reset_simple_deassert, 84 + .reset = reset_simple_reset, 102 85 .status = reset_simple_status, 103 86 }; 104 87 EXPORT_SYMBOL_GPL(reset_simple_ops);
+7
drivers/reset/reset-simple.h include/linux/reset/reset-simple.h
··· 27 27 * @status_active_low: if true, bits read back as cleared while the reset is 28 28 * asserted. Otherwise, bits read back as set while the 29 29 * reset is asserted. 30 + * @reset_us: Minimum delay in microseconds needed that needs to be 31 + * waited for between an assert and a deassert to reset the 32 + * device. If multiple consumers with different delay 33 + * requirements are connected to this controller, it must 34 + * be the largest minimum delay. 0 means that such a delay is 35 + * unknown and the reset operation is unsupported. 30 36 */ 31 37 struct reset_simple_data { 32 38 spinlock_t lock; ··· 40 34 struct reset_controller_dev rcdev; 41 35 bool active_low; 42 36 bool status_active_low; 37 + unsigned int reset_us; 43 38 }; 44 39 45 40 extern const struct reset_control_ops reset_simple_ops;
+1 -2
drivers/reset/reset-socfpga.c
··· 11 11 #include <linux/of_address.h> 12 12 #include <linux/platform_device.h> 13 13 #include <linux/reset-controller.h> 14 + #include <linux/reset/reset-simple.h> 14 15 #include <linux/reset/socfpga.h> 15 16 #include <linux/slab.h> 16 17 #include <linux/spinlock.h> 17 18 #include <linux/types.h> 18 - 19 - #include "reset-simple.h" 20 19 21 20 #define SOCFPGA_NR_BANKS 8 22 21
+1 -2
drivers/reset/reset-sunxi.c
··· 14 14 #include <linux/of_address.h> 15 15 #include <linux/platform_device.h> 16 16 #include <linux/reset-controller.h> 17 + #include <linux/reset/reset-simple.h> 17 18 #include <linux/reset/sunxi.h> 18 19 #include <linux/slab.h> 19 20 #include <linux/spinlock.h> 20 21 #include <linux/types.h> 21 - 22 - #include "reset-simple.h" 23 22 24 23 static int sunxi_reset_init(struct device_node *np) 25 24 {
+1 -2
drivers/reset/reset-uniphier-glue.c
··· 9 9 #include <linux/of_device.h> 10 10 #include <linux/platform_device.h> 11 11 #include <linux/reset.h> 12 - 13 - #include "reset-simple.h" 12 + #include <linux/reset/reset-simple.h> 14 13 15 14 #define MAX_CLKS 2 16 15 #define MAX_RSTS 2