Hi, On Fri, Mar 06, 2020 at 04:03:41PM +0300, Sergey.Semin@baikalelectronics.ru wrote: > From: Serge Semin > > 'Reboot-mode'-type of devices are supposed to work in conjunction with > 'reboot'-type devices. In particular Baikal-T1 SoC provides a special > CCU_WDT_RCR register, which is preserved during any type of the CPU > reset (standard and caused by a watchdog one). Since both of them are > responsible for the system-wide operation and related with each other > it would be better to place them at the same place in the dt hierarchy. > In particular the best location would be the dt root node. Currently > 'syscon-reboot' device node can be placed anywhere in a dtb as long as > the corresponding device is created at the system boot-up procedure. > While according to the corresponding bindings file 'system-boot-mode' > should be represented as a sub-node of a "syscon", "simple-mfd" node. > This isn't always suitable especially when the reboot-preserved > register is provided by some device, which we don't want to declared > as MFD. In this case it would be good to have the 'syscon-reboot-mode' > node accepting the 'regmap' property with a phandle reference to the > 'syscon' dt-node, in the same way the 'syscon-reboot' driver does. > This is what this patch provides - it makes the driver to handle the > optional 'regmap' property. In case if one isn't provided the > previously implemented scheme is expected to be found in dtb. > > Moreover seeing current dt-interface implementation of the > 'syscon-reboot', 'syscon-poweroff' and 'syscon-reboot-mode' drivers, > they look more or less similar. All of them handle 'offset' and > 'mask' dt-properties. While 'value' property is only acceptable > by the 'syscon-reboot' and 'syscon-poweroff' driver, the 'mode-*' > properties of 'syscon-reboot-mode' serve to the similar purpose. > The only strong difference between them is the ability to get the > syscon regmap from the 'regmap' property. By having this patch merged > we'll have that difference eliminated, so the interfaces would look > unified. > > Signed-off-by: Serge Semin > Signed-off-by: Alexey Malahov > Cc: Thomas Bogendoerfer > Cc: Paul Burton > Cc: Ralf Baechle > --- Acked-by: Sebastian Reichel -- Sebastian > drivers/power/reset/syscon-reboot-mode.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/drivers/power/reset/syscon-reboot-mode.c b/drivers/power/reset/syscon-reboot-mode.c > index e0772c9f70f7..f8f8218ae3ee 100644 > --- a/drivers/power/reset/syscon-reboot-mode.c > +++ b/drivers/power/reset/syscon-reboot-mode.c > @@ -40,6 +40,7 @@ static int syscon_reboot_mode_probe(struct platform_device *pdev) > { > int ret; > struct syscon_reboot_mode *syscon_rbm; > + struct regmap *map; > > syscon_rbm = devm_kzalloc(&pdev->dev, sizeof(*syscon_rbm), GFP_KERNEL); > if (!syscon_rbm) > @@ -49,9 +50,13 @@ static int syscon_reboot_mode_probe(struct platform_device *pdev) > syscon_rbm->reboot.write = syscon_reboot_mode_write; > syscon_rbm->mask = 0xffffffff; > > - syscon_rbm->map = syscon_node_to_regmap(pdev->dev.parent->of_node); > - if (IS_ERR(syscon_rbm->map)) > - return PTR_ERR(syscon_rbm->map); > + map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, "regmap"); > + if (IS_ERR(map)) { > + map = syscon_node_to_regmap(pdev->dev.parent->of_node); > + if (IS_ERR(map)) > + return PTR_ERR(map); > + } > + syscon_rbm->map = map; > > if (of_property_read_u32(pdev->dev.of_node, "offset", > &syscon_rbm->offset)) > -- > 2.25.1 >