1*4dd99d14SStephen Warren /* 2*4dd99d14SStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION. 3*4dd99d14SStephen Warren * 4*4dd99d14SStephen Warren * SPDX-License-Identifier: GPL-2.0 5*4dd99d14SStephen Warren */ 6*4dd99d14SStephen Warren 7*4dd99d14SStephen Warren #include <common.h> 8*4dd99d14SStephen Warren #include <dm.h> 9*4dd99d14SStephen Warren #include <misc.h> 10*4dd99d14SStephen Warren #include <reset-uclass.h> 11*4dd99d14SStephen Warren #include <asm/arch-tegra/bpmp_abi.h> 12*4dd99d14SStephen Warren 13*4dd99d14SStephen Warren static int tegra186_reset_request(struct reset_ctl *reset_ctl) 14*4dd99d14SStephen Warren { 15*4dd99d14SStephen Warren debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 16*4dd99d14SStephen Warren reset_ctl->dev, reset_ctl->id); 17*4dd99d14SStephen Warren 18*4dd99d14SStephen Warren return 0; 19*4dd99d14SStephen Warren } 20*4dd99d14SStephen Warren 21*4dd99d14SStephen Warren static int tegra186_reset_free(struct reset_ctl *reset_ctl) 22*4dd99d14SStephen Warren { 23*4dd99d14SStephen Warren debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 24*4dd99d14SStephen Warren reset_ctl->dev, reset_ctl->id); 25*4dd99d14SStephen Warren 26*4dd99d14SStephen Warren return 0; 27*4dd99d14SStephen Warren } 28*4dd99d14SStephen Warren 29*4dd99d14SStephen Warren static int tegra186_reset_common(struct reset_ctl *reset_ctl, 30*4dd99d14SStephen Warren enum mrq_reset_commands cmd) 31*4dd99d14SStephen Warren { 32*4dd99d14SStephen Warren struct mrq_reset_request req; 33*4dd99d14SStephen Warren int ret; 34*4dd99d14SStephen Warren 35*4dd99d14SStephen Warren req.cmd = cmd; 36*4dd99d14SStephen Warren req.reset_id = reset_ctl->id; 37*4dd99d14SStephen Warren 38*4dd99d14SStephen Warren ret = misc_call(reset_ctl->dev->parent, MRQ_RESET, &req, sizeof(req), 39*4dd99d14SStephen Warren NULL, 0); 40*4dd99d14SStephen Warren if (ret < 0) 41*4dd99d14SStephen Warren return ret; 42*4dd99d14SStephen Warren 43*4dd99d14SStephen Warren return 0; 44*4dd99d14SStephen Warren } 45*4dd99d14SStephen Warren 46*4dd99d14SStephen Warren static int tegra186_reset_assert(struct reset_ctl *reset_ctl) 47*4dd99d14SStephen Warren { 48*4dd99d14SStephen Warren debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 49*4dd99d14SStephen Warren reset_ctl->dev, reset_ctl->id); 50*4dd99d14SStephen Warren 51*4dd99d14SStephen Warren return tegra186_reset_common(reset_ctl, CMD_RESET_ASSERT); 52*4dd99d14SStephen Warren } 53*4dd99d14SStephen Warren 54*4dd99d14SStephen Warren static int tegra186_reset_deassert(struct reset_ctl *reset_ctl) 55*4dd99d14SStephen Warren { 56*4dd99d14SStephen Warren debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 57*4dd99d14SStephen Warren reset_ctl->dev, reset_ctl->id); 58*4dd99d14SStephen Warren 59*4dd99d14SStephen Warren return tegra186_reset_common(reset_ctl, CMD_RESET_DEASSERT); 60*4dd99d14SStephen Warren } 61*4dd99d14SStephen Warren 62*4dd99d14SStephen Warren struct reset_ops tegra186_reset_ops = { 63*4dd99d14SStephen Warren .request = tegra186_reset_request, 64*4dd99d14SStephen Warren .free = tegra186_reset_free, 65*4dd99d14SStephen Warren .rst_assert = tegra186_reset_assert, 66*4dd99d14SStephen Warren .rst_deassert = tegra186_reset_deassert, 67*4dd99d14SStephen Warren }; 68*4dd99d14SStephen Warren 69*4dd99d14SStephen Warren static int tegra186_reset_probe(struct udevice *dev) 70*4dd99d14SStephen Warren { 71*4dd99d14SStephen Warren debug("%s(dev=%p)\n", __func__, dev); 72*4dd99d14SStephen Warren 73*4dd99d14SStephen Warren return 0; 74*4dd99d14SStephen Warren } 75*4dd99d14SStephen Warren 76*4dd99d14SStephen Warren U_BOOT_DRIVER(tegra186_reset) = { 77*4dd99d14SStephen Warren .name = "tegra186_reset", 78*4dd99d14SStephen Warren .id = UCLASS_RESET, 79*4dd99d14SStephen Warren .probe = tegra186_reset_probe, 80*4dd99d14SStephen Warren .ops = &tegra186_reset_ops, 81*4dd99d14SStephen Warren }; 82