Lines Matching full:rstc
159 static void k230_rst_clear_done(struct k230_rst *rstc, unsigned long id, in k230_rst_clear_done() argument
165 guard(spinlock_irqsave)(&rstc->lock); in k230_rst_clear_done()
167 reg = readl(rstc->base + rmap->offset); in k230_rst_clear_done()
171 writel(reg, rstc->base + rmap->offset); in k230_rst_clear_done()
174 static int k230_rst_wait_and_clear_done(struct k230_rst *rstc, unsigned long id, in k230_rst_wait_and_clear_done() argument
181 ret = readl_poll_timeout(rstc->base + rmap->offset, reg, in k230_rst_wait_and_clear_done()
184 dev_err(rstc->rcdev.dev, "Wait for reset done timeout\n"); in k230_rst_wait_and_clear_done()
188 k230_rst_clear_done(rstc, id, write_en); in k230_rst_wait_and_clear_done()
193 static void k230_rst_update(struct k230_rst *rstc, unsigned long id, in k230_rst_update() argument
199 guard(spinlock_irqsave)(&rstc->lock); in k230_rst_update()
201 reg = readl(rstc->base + rmap->offset); in k230_rst_update()
208 writel(reg, rstc->base + rmap->offset); in k230_rst_update()
213 struct k230_rst *rstc = to_k230_rst(rcdev); in k230_rst_assert() local
217 k230_rst_update(rstc, id, true, true, false); in k230_rst_assert()
220 k230_rst_update(rstc, id, true, false, in k230_rst_assert()
242 struct k230_rst *rstc = to_k230_rst(rcdev); in k230_rst_deassert() local
247 k230_rst_update(rstc, id, false, true, false); in k230_rst_deassert()
248 ret = k230_rst_wait_and_clear_done(rstc, id, true); in k230_rst_deassert()
251 k230_rst_update(rstc, id, false, false, in k230_rst_deassert()
272 struct k230_rst *rstc = to_k230_rst(rcdev); in k230_rst_reset() local
279 k230_rst_clear_done(rstc, id, true); in k230_rst_reset()
280 k230_rst_update(rstc, id, true, true, false); in k230_rst_reset()
281 ret = k230_rst_wait_and_clear_done(rstc, id, true); in k230_rst_reset()
292 k230_rst_update(rstc, id, true, true, false); in k230_rst_reset()
295 ret = readl_poll_timeout(rstc->base + rmap->offset, reg, in k230_rst_reset()
302 k230_rst_clear_done(rstc, id, false); in k230_rst_reset()
303 k230_rst_update(rstc, id, true, false, false); in k230_rst_reset()
304 ret = k230_rst_wait_and_clear_done(rstc, id, false); in k230_rst_reset()
333 struct k230_rst *rstc; in k230_rst_probe() local
335 rstc = devm_kzalloc(dev, sizeof(*rstc), GFP_KERNEL); in k230_rst_probe()
336 if (!rstc) in k230_rst_probe()
339 rstc->base = devm_platform_ioremap_resource(pdev, 0); in k230_rst_probe()
340 if (IS_ERR(rstc->base)) in k230_rst_probe()
341 return PTR_ERR(rstc->base); in k230_rst_probe()
343 spin_lock_init(&rstc->lock); in k230_rst_probe()
345 rstc->rcdev.dev = dev; in k230_rst_probe()
346 rstc->rcdev.owner = THIS_MODULE; in k230_rst_probe()
347 rstc->rcdev.ops = &k230_rst_ops; in k230_rst_probe()
348 rstc->rcdev.nr_resets = ARRAY_SIZE(k230_resets); in k230_rst_probe()
349 rstc->rcdev.of_node = dev->of_node; in k230_rst_probe()
351 return devm_reset_controller_register(dev, &rstc->rcdev); in k230_rst_probe()