1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0
24dd99d14SStephen Warren /*
34dd99d14SStephen Warren  * Copyright (c) 2016, NVIDIA CORPORATION.
44dd99d14SStephen Warren  */
54dd99d14SStephen Warren 
64dd99d14SStephen Warren #include <common.h>
74dd99d14SStephen Warren #include <dm.h>
84dd99d14SStephen Warren #include <misc.h>
94dd99d14SStephen Warren #include <reset-uclass.h>
104dd99d14SStephen Warren #include <asm/arch-tegra/bpmp_abi.h>
114dd99d14SStephen Warren 
tegra186_reset_request(struct reset_ctl * reset_ctl)124dd99d14SStephen Warren static int tegra186_reset_request(struct reset_ctl *reset_ctl)
134dd99d14SStephen Warren {
144dd99d14SStephen Warren 	debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
154dd99d14SStephen Warren 	      reset_ctl->dev, reset_ctl->id);
164dd99d14SStephen Warren 
174dd99d14SStephen Warren 	return 0;
184dd99d14SStephen Warren }
194dd99d14SStephen Warren 
tegra186_reset_free(struct reset_ctl * reset_ctl)204dd99d14SStephen Warren static int tegra186_reset_free(struct reset_ctl *reset_ctl)
214dd99d14SStephen Warren {
224dd99d14SStephen Warren 	debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
234dd99d14SStephen Warren 	      reset_ctl->dev, reset_ctl->id);
244dd99d14SStephen Warren 
254dd99d14SStephen Warren 	return 0;
264dd99d14SStephen Warren }
274dd99d14SStephen Warren 
tegra186_reset_common(struct reset_ctl * reset_ctl,enum mrq_reset_commands cmd)284dd99d14SStephen Warren static int tegra186_reset_common(struct reset_ctl *reset_ctl,
294dd99d14SStephen Warren 				 enum mrq_reset_commands cmd)
304dd99d14SStephen Warren {
314dd99d14SStephen Warren 	struct mrq_reset_request req;
324dd99d14SStephen Warren 	int ret;
334dd99d14SStephen Warren 
344dd99d14SStephen Warren 	req.cmd = cmd;
354dd99d14SStephen Warren 	req.reset_id = reset_ctl->id;
364dd99d14SStephen Warren 
374dd99d14SStephen Warren 	ret = misc_call(reset_ctl->dev->parent, MRQ_RESET, &req, sizeof(req),
384dd99d14SStephen Warren 			NULL, 0);
394dd99d14SStephen Warren 	if (ret < 0)
404dd99d14SStephen Warren 		return ret;
414dd99d14SStephen Warren 
424dd99d14SStephen Warren 	return 0;
434dd99d14SStephen Warren }
444dd99d14SStephen Warren 
tegra186_reset_assert(struct reset_ctl * reset_ctl)454dd99d14SStephen Warren static int tegra186_reset_assert(struct reset_ctl *reset_ctl)
464dd99d14SStephen Warren {
474dd99d14SStephen Warren 	debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
484dd99d14SStephen Warren 	      reset_ctl->dev, reset_ctl->id);
494dd99d14SStephen Warren 
504dd99d14SStephen Warren 	return tegra186_reset_common(reset_ctl, CMD_RESET_ASSERT);
514dd99d14SStephen Warren }
524dd99d14SStephen Warren 
tegra186_reset_deassert(struct reset_ctl * reset_ctl)534dd99d14SStephen Warren static int tegra186_reset_deassert(struct reset_ctl *reset_ctl)
544dd99d14SStephen Warren {
554dd99d14SStephen Warren 	debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
564dd99d14SStephen Warren 	      reset_ctl->dev, reset_ctl->id);
574dd99d14SStephen Warren 
584dd99d14SStephen Warren 	return tegra186_reset_common(reset_ctl, CMD_RESET_DEASSERT);
594dd99d14SStephen Warren }
604dd99d14SStephen Warren 
614dd99d14SStephen Warren struct reset_ops tegra186_reset_ops = {
624dd99d14SStephen Warren 	.request = tegra186_reset_request,
634dd99d14SStephen Warren 	.free = tegra186_reset_free,
644dd99d14SStephen Warren 	.rst_assert = tegra186_reset_assert,
654dd99d14SStephen Warren 	.rst_deassert = tegra186_reset_deassert,
664dd99d14SStephen Warren };
674dd99d14SStephen Warren 
tegra186_reset_probe(struct udevice * dev)684dd99d14SStephen Warren static int tegra186_reset_probe(struct udevice *dev)
694dd99d14SStephen Warren {
704dd99d14SStephen Warren 	debug("%s(dev=%p)\n", __func__, dev);
714dd99d14SStephen Warren 
724dd99d14SStephen Warren 	return 0;
734dd99d14SStephen Warren }
744dd99d14SStephen Warren 
754dd99d14SStephen Warren U_BOOT_DRIVER(tegra186_reset) = {
764dd99d14SStephen Warren 	.name		= "tegra186_reset",
774dd99d14SStephen Warren 	.id		= UCLASS_RESET,
784dd99d14SStephen Warren 	.probe		= tegra186_reset_probe,
794dd99d14SStephen Warren 	.ops = &tegra186_reset_ops,
804dd99d14SStephen Warren };
81