Lines Matching +full:rst +full:- +full:syscon

1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Inspired by mach-imx/src.c
15 #include <linux/mfd/syscon.h>
17 #include "reset-syscfg.h"
20 * struct syscfg_reset_channel - Reset channel regmap configuration
31 * struct syscfg_reset_controller - A reset controller which groups together
35 * @rst: base reset controller structure.
41 struct reset_controller_dev rst; member
47 container_of(_rst, struct syscfg_reset_controller, rst)
52 struct syscfg_reset_controller *rst = to_syscfg_reset_controller(rcdev); in syscfg_reset_program_hw() local
54 u32 ctrl_val = rst->active_low ? !assert : !!assert; in syscfg_reset_program_hw()
57 if (idx >= rcdev->nr_resets) in syscfg_reset_program_hw()
58 return -EINVAL; in syscfg_reset_program_hw()
60 ch = &rst->channels[idx]; in syscfg_reset_program_hw()
62 err = regmap_field_write(ch->reset, ctrl_val); in syscfg_reset_program_hw()
66 if (ch->ack) { in syscfg_reset_program_hw()
69 err = regmap_field_read_poll_timeout(ch->ack, ack_val, (ack_val == ctrl_val), in syscfg_reset_program_hw()
105 struct syscfg_reset_controller *rst = to_syscfg_reset_controller(rcdev); in syscfg_reset_status() local
110 if (idx >= rcdev->nr_resets) in syscfg_reset_status()
111 return -EINVAL; in syscfg_reset_status()
113 ch = &rst->channels[idx]; in syscfg_reset_status()
114 if (ch->ack) in syscfg_reset_status()
115 err = regmap_field_read(ch->ack, &ret_val); in syscfg_reset_status()
117 err = regmap_field_read(ch->reset, &ret_val); in syscfg_reset_status()
121 return rst->active_low ? !ret_val : !!ret_val; in syscfg_reset_status()
139 return -ENOMEM; in syscfg_reset_controller_register()
141 rc->channels = devm_kcalloc(dev, data->nr_channels, in syscfg_reset_controller_register()
142 sizeof(*rc->channels), GFP_KERNEL); in syscfg_reset_controller_register()
143 if (!rc->channels) in syscfg_reset_controller_register()
144 return -ENOMEM; in syscfg_reset_controller_register()
146 rc->rst.ops = &syscfg_reset_ops; in syscfg_reset_controller_register()
147 rc->rst.of_node = dev->of_node; in syscfg_reset_controller_register()
148 rc->rst.nr_resets = data->nr_channels; in syscfg_reset_controller_register()
149 rc->active_low = data->active_low; in syscfg_reset_controller_register()
151 for (i = 0; i < data->nr_channels; i++) { in syscfg_reset_controller_register()
154 const char *compatible = data->channels[i].compatible; in syscfg_reset_controller_register()
160 f = devm_regmap_field_alloc(dev, map, data->channels[i].reset); in syscfg_reset_controller_register()
164 rc->channels[i].reset = f; in syscfg_reset_controller_register()
166 if (!data->wait_for_ack) in syscfg_reset_controller_register()
169 f = devm_regmap_field_alloc(dev, map, data->channels[i].ack); in syscfg_reset_controller_register()
173 rc->channels[i].ack = f; in syscfg_reset_controller_register()
176 err = reset_controller_register(&rc->rst); in syscfg_reset_controller_register()
185 struct device *dev = pdev ? &pdev->dev : NULL; in syscfg_reset_probe()
188 if (!dev || !dev->driver) in syscfg_reset_probe()
189 return -ENODEV; in syscfg_reset_probe()
191 match = of_match_device(dev->driver->of_match_table, dev); in syscfg_reset_probe()
192 if (!match || !match->data) in syscfg_reset_probe()
193 return -EINVAL; in syscfg_reset_probe()
195 return syscfg_reset_controller_register(dev, match->data); in syscfg_reset_probe()