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