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 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 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 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 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 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 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