xref: /rk3399_rockchip-uboot/drivers/reset/sandbox-reset.c (revision 1a4f6af8bfd44c8ae6e87a81ff125eed47042cc5)
14581b717SStephen Warren /*
24581b717SStephen Warren  * Copyright (c) 2016, NVIDIA CORPORATION.
34581b717SStephen Warren  *
44581b717SStephen Warren  * SPDX-License-Identifier: GPL-2.0
54581b717SStephen Warren  */
64581b717SStephen Warren 
74581b717SStephen Warren #include <common.h>
84581b717SStephen Warren #include <dm.h>
94581b717SStephen Warren #include <reset-uclass.h>
104581b717SStephen Warren #include <asm/io.h>
114581b717SStephen Warren #include <asm/reset.h>
124581b717SStephen Warren 
13*f7a4178dSNeil Armstrong #define SANDBOX_RESET_SIGNALS 101
144581b717SStephen Warren 
154581b717SStephen Warren struct sandbox_reset_signal {
164581b717SStephen Warren 	bool asserted;
174581b717SStephen Warren };
184581b717SStephen Warren 
194581b717SStephen Warren struct sandbox_reset {
204581b717SStephen Warren 	struct sandbox_reset_signal signals[SANDBOX_RESET_SIGNALS];
214581b717SStephen Warren };
224581b717SStephen Warren 
sandbox_reset_request(struct reset_ctl * reset_ctl)234581b717SStephen Warren static int sandbox_reset_request(struct reset_ctl *reset_ctl)
244581b717SStephen Warren {
254581b717SStephen Warren 	debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
264581b717SStephen Warren 
274581b717SStephen Warren 	if (reset_ctl->id >= SANDBOX_RESET_SIGNALS)
284581b717SStephen Warren 		return -EINVAL;
294581b717SStephen Warren 
304581b717SStephen Warren 	return 0;
314581b717SStephen Warren }
324581b717SStephen Warren 
sandbox_reset_free(struct reset_ctl * reset_ctl)334581b717SStephen Warren static int sandbox_reset_free(struct reset_ctl *reset_ctl)
344581b717SStephen Warren {
354581b717SStephen Warren 	debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
364581b717SStephen Warren 
374581b717SStephen Warren 	return 0;
384581b717SStephen Warren }
394581b717SStephen Warren 
sandbox_reset_assert(struct reset_ctl * reset_ctl)404581b717SStephen Warren static int sandbox_reset_assert(struct reset_ctl *reset_ctl)
414581b717SStephen Warren {
424581b717SStephen Warren 	struct sandbox_reset *sbr = dev_get_priv(reset_ctl->dev);
434581b717SStephen Warren 
444581b717SStephen Warren 	debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
454581b717SStephen Warren 
464581b717SStephen Warren 	sbr->signals[reset_ctl->id].asserted = true;
474581b717SStephen Warren 
484581b717SStephen Warren 	return 0;
494581b717SStephen Warren }
504581b717SStephen Warren 
sandbox_reset_deassert(struct reset_ctl * reset_ctl)514581b717SStephen Warren static int sandbox_reset_deassert(struct reset_ctl *reset_ctl)
524581b717SStephen Warren {
534581b717SStephen Warren 	struct sandbox_reset *sbr = dev_get_priv(reset_ctl->dev);
544581b717SStephen Warren 
554581b717SStephen Warren 	debug("%s(reset_ctl=%p)\n", __func__, reset_ctl);
564581b717SStephen Warren 
574581b717SStephen Warren 	sbr->signals[reset_ctl->id].asserted = false;
584581b717SStephen Warren 
594581b717SStephen Warren 	return 0;
604581b717SStephen Warren }
614581b717SStephen Warren 
sandbox_reset_bind(struct udevice * dev)624581b717SStephen Warren static int sandbox_reset_bind(struct udevice *dev)
634581b717SStephen Warren {
644581b717SStephen Warren 	debug("%s(dev=%p)\n", __func__, dev);
654581b717SStephen Warren 
664581b717SStephen Warren 	return 0;
674581b717SStephen Warren }
684581b717SStephen Warren 
sandbox_reset_probe(struct udevice * dev)694581b717SStephen Warren static int sandbox_reset_probe(struct udevice *dev)
704581b717SStephen Warren {
714581b717SStephen Warren 	debug("%s(dev=%p)\n", __func__, dev);
724581b717SStephen Warren 
734581b717SStephen Warren 	return 0;
744581b717SStephen Warren }
754581b717SStephen Warren 
764581b717SStephen Warren static const struct udevice_id sandbox_reset_ids[] = {
774581b717SStephen Warren 	{ .compatible = "sandbox,reset-ctl" },
784581b717SStephen Warren 	{ }
794581b717SStephen Warren };
804581b717SStephen Warren 
814581b717SStephen Warren struct reset_ops sandbox_reset_reset_ops = {
824581b717SStephen Warren 	.request = sandbox_reset_request,
834581b717SStephen Warren 	.free = sandbox_reset_free,
844581b717SStephen Warren 	.rst_assert = sandbox_reset_assert,
854581b717SStephen Warren 	.rst_deassert = sandbox_reset_deassert,
864581b717SStephen Warren };
874581b717SStephen Warren 
884581b717SStephen Warren U_BOOT_DRIVER(sandbox_reset) = {
894581b717SStephen Warren 	.name = "sandbox_reset",
904581b717SStephen Warren 	.id = UCLASS_RESET,
914581b717SStephen Warren 	.of_match = sandbox_reset_ids,
924581b717SStephen Warren 	.bind = sandbox_reset_bind,
934581b717SStephen Warren 	.probe = sandbox_reset_probe,
944581b717SStephen Warren 	.priv_auto_alloc_size = sizeof(struct sandbox_reset),
954581b717SStephen Warren 	.ops = &sandbox_reset_reset_ops,
964581b717SStephen Warren };
974581b717SStephen Warren 
sandbox_reset_query(struct udevice * dev,unsigned long id)984581b717SStephen Warren int sandbox_reset_query(struct udevice *dev, unsigned long id)
994581b717SStephen Warren {
1004581b717SStephen Warren 	struct sandbox_reset *sbr = dev_get_priv(dev);
1014581b717SStephen Warren 
1024581b717SStephen Warren 	debug("%s(dev=%p, id=%ld)\n", __func__, dev, id);
1034581b717SStephen Warren 
1044581b717SStephen Warren 	if (id >= SANDBOX_RESET_SIGNALS)
1054581b717SStephen Warren 		return -EINVAL;
1064581b717SStephen Warren 
1074581b717SStephen Warren 	return sbr->signals[id].asserted;
1084581b717SStephen Warren }
109