1*fe60f06dSStephen Warren /* 2*fe60f06dSStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION. 3*fe60f06dSStephen Warren * 4*fe60f06dSStephen Warren * SPDX-License-Identifier: GPL-2.0 5*fe60f06dSStephen Warren */ 6*fe60f06dSStephen Warren 7*fe60f06dSStephen Warren #include <common.h> 8*fe60f06dSStephen Warren #include <dm.h> 9*fe60f06dSStephen Warren #include <reset-uclass.h> 10*fe60f06dSStephen Warren #include <asm/arch/clock.h> 11*fe60f06dSStephen Warren #include <asm/arch-tegra/clk_rst.h> 12*fe60f06dSStephen Warren 13*fe60f06dSStephen Warren static int tegra_car_reset_request(struct reset_ctl *reset_ctl) 14*fe60f06dSStephen Warren { 15*fe60f06dSStephen Warren debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 16*fe60f06dSStephen Warren reset_ctl->dev, reset_ctl->id); 17*fe60f06dSStephen Warren 18*fe60f06dSStephen Warren /* PERIPH_ID_COUNT varies per SoC */ 19*fe60f06dSStephen Warren if (reset_ctl->id >= PERIPH_ID_COUNT) 20*fe60f06dSStephen Warren return -EINVAL; 21*fe60f06dSStephen Warren 22*fe60f06dSStephen Warren return 0; 23*fe60f06dSStephen Warren } 24*fe60f06dSStephen Warren 25*fe60f06dSStephen Warren static int tegra_car_reset_free(struct reset_ctl *reset_ctl) 26*fe60f06dSStephen Warren { 27*fe60f06dSStephen Warren debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 28*fe60f06dSStephen Warren reset_ctl->dev, reset_ctl->id); 29*fe60f06dSStephen Warren 30*fe60f06dSStephen Warren return 0; 31*fe60f06dSStephen Warren } 32*fe60f06dSStephen Warren 33*fe60f06dSStephen Warren static int tegra_car_reset_assert(struct reset_ctl *reset_ctl) 34*fe60f06dSStephen Warren { 35*fe60f06dSStephen Warren debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 36*fe60f06dSStephen Warren reset_ctl->dev, reset_ctl->id); 37*fe60f06dSStephen Warren 38*fe60f06dSStephen Warren reset_set_enable(reset_ctl->id, 1); 39*fe60f06dSStephen Warren 40*fe60f06dSStephen Warren return 0; 41*fe60f06dSStephen Warren } 42*fe60f06dSStephen Warren 43*fe60f06dSStephen Warren static int tegra_car_reset_deassert(struct reset_ctl *reset_ctl) 44*fe60f06dSStephen Warren { 45*fe60f06dSStephen Warren debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl, 46*fe60f06dSStephen Warren reset_ctl->dev, reset_ctl->id); 47*fe60f06dSStephen Warren 48*fe60f06dSStephen Warren reset_set_enable(reset_ctl->id, 0); 49*fe60f06dSStephen Warren 50*fe60f06dSStephen Warren return 0; 51*fe60f06dSStephen Warren } 52*fe60f06dSStephen Warren 53*fe60f06dSStephen Warren struct reset_ops tegra_car_reset_ops = { 54*fe60f06dSStephen Warren .request = tegra_car_reset_request, 55*fe60f06dSStephen Warren .free = tegra_car_reset_free, 56*fe60f06dSStephen Warren .rst_assert = tegra_car_reset_assert, 57*fe60f06dSStephen Warren .rst_deassert = tegra_car_reset_deassert, 58*fe60f06dSStephen Warren }; 59*fe60f06dSStephen Warren 60*fe60f06dSStephen Warren static int tegra_car_reset_probe(struct udevice *dev) 61*fe60f06dSStephen Warren { 62*fe60f06dSStephen Warren debug("%s(dev=%p)\n", __func__, dev); 63*fe60f06dSStephen Warren 64*fe60f06dSStephen Warren return 0; 65*fe60f06dSStephen Warren } 66*fe60f06dSStephen Warren 67*fe60f06dSStephen Warren U_BOOT_DRIVER(tegra_car_reset) = { 68*fe60f06dSStephen Warren .name = "tegra_car_reset", 69*fe60f06dSStephen Warren .id = UCLASS_RESET, 70*fe60f06dSStephen Warren .probe = tegra_car_reset_probe, 71*fe60f06dSStephen Warren .ops = &tegra_car_reset_ops, 72*fe60f06dSStephen Warren }; 73