1*4581b717SStephen Warren /* 2*4581b717SStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION. 3*4581b717SStephen Warren * 4*4581b717SStephen Warren * SPDX-License-Identifier: GPL-2.0 5*4581b717SStephen Warren */ 6*4581b717SStephen Warren 7*4581b717SStephen Warren #include <common.h> 8*4581b717SStephen Warren #include <dm.h> 9*4581b717SStephen Warren #include <reset-uclass.h> 10*4581b717SStephen Warren #include <asm/io.h> 11*4581b717SStephen Warren #include <asm/reset.h> 12*4581b717SStephen Warren 13*4581b717SStephen Warren #define SANDBOX_RESET_SIGNALS 3 14*4581b717SStephen Warren 15*4581b717SStephen Warren struct sandbox_reset_signal { 16*4581b717SStephen Warren bool asserted; 17*4581b717SStephen Warren }; 18*4581b717SStephen Warren 19*4581b717SStephen Warren struct sandbox_reset { 20*4581b717SStephen Warren struct sandbox_reset_signal signals[SANDBOX_RESET_SIGNALS]; 21*4581b717SStephen Warren }; 22*4581b717SStephen Warren 23*4581b717SStephen Warren static int sandbox_reset_request(struct reset_ctl *reset_ctl) 24*4581b717SStephen Warren { 25*4581b717SStephen Warren debug("%s(reset_ctl=%p)\n", __func__, reset_ctl); 26*4581b717SStephen Warren 27*4581b717SStephen Warren if (reset_ctl->id >= SANDBOX_RESET_SIGNALS) 28*4581b717SStephen Warren return -EINVAL; 29*4581b717SStephen Warren 30*4581b717SStephen Warren return 0; 31*4581b717SStephen Warren } 32*4581b717SStephen Warren 33*4581b717SStephen Warren static int sandbox_reset_free(struct reset_ctl *reset_ctl) 34*4581b717SStephen Warren { 35*4581b717SStephen Warren debug("%s(reset_ctl=%p)\n", __func__, reset_ctl); 36*4581b717SStephen Warren 37*4581b717SStephen Warren return 0; 38*4581b717SStephen Warren } 39*4581b717SStephen Warren 40*4581b717SStephen Warren static int sandbox_reset_assert(struct reset_ctl *reset_ctl) 41*4581b717SStephen Warren { 42*4581b717SStephen Warren struct sandbox_reset *sbr = dev_get_priv(reset_ctl->dev); 43*4581b717SStephen Warren 44*4581b717SStephen Warren debug("%s(reset_ctl=%p)\n", __func__, reset_ctl); 45*4581b717SStephen Warren 46*4581b717SStephen Warren sbr->signals[reset_ctl->id].asserted = true; 47*4581b717SStephen Warren 48*4581b717SStephen Warren return 0; 49*4581b717SStephen Warren } 50*4581b717SStephen Warren 51*4581b717SStephen Warren static int sandbox_reset_deassert(struct reset_ctl *reset_ctl) 52*4581b717SStephen Warren { 53*4581b717SStephen Warren struct sandbox_reset *sbr = dev_get_priv(reset_ctl->dev); 54*4581b717SStephen Warren 55*4581b717SStephen Warren debug("%s(reset_ctl=%p)\n", __func__, reset_ctl); 56*4581b717SStephen Warren 57*4581b717SStephen Warren sbr->signals[reset_ctl->id].asserted = false; 58*4581b717SStephen Warren 59*4581b717SStephen Warren return 0; 60*4581b717SStephen Warren } 61*4581b717SStephen Warren 62*4581b717SStephen Warren static int sandbox_reset_bind(struct udevice *dev) 63*4581b717SStephen Warren { 64*4581b717SStephen Warren debug("%s(dev=%p)\n", __func__, dev); 65*4581b717SStephen Warren 66*4581b717SStephen Warren return 0; 67*4581b717SStephen Warren } 68*4581b717SStephen Warren 69*4581b717SStephen Warren static int sandbox_reset_probe(struct udevice *dev) 70*4581b717SStephen Warren { 71*4581b717SStephen Warren debug("%s(dev=%p)\n", __func__, dev); 72*4581b717SStephen Warren 73*4581b717SStephen Warren return 0; 74*4581b717SStephen Warren } 75*4581b717SStephen Warren 76*4581b717SStephen Warren static const struct udevice_id sandbox_reset_ids[] = { 77*4581b717SStephen Warren { .compatible = "sandbox,reset-ctl" }, 78*4581b717SStephen Warren { } 79*4581b717SStephen Warren }; 80*4581b717SStephen Warren 81*4581b717SStephen Warren struct reset_ops sandbox_reset_reset_ops = { 82*4581b717SStephen Warren .request = sandbox_reset_request, 83*4581b717SStephen Warren .free = sandbox_reset_free, 84*4581b717SStephen Warren .rst_assert = sandbox_reset_assert, 85*4581b717SStephen Warren .rst_deassert = sandbox_reset_deassert, 86*4581b717SStephen Warren }; 87*4581b717SStephen Warren 88*4581b717SStephen Warren U_BOOT_DRIVER(sandbox_reset) = { 89*4581b717SStephen Warren .name = "sandbox_reset", 90*4581b717SStephen Warren .id = UCLASS_RESET, 91*4581b717SStephen Warren .of_match = sandbox_reset_ids, 92*4581b717SStephen Warren .bind = sandbox_reset_bind, 93*4581b717SStephen Warren .probe = sandbox_reset_probe, 94*4581b717SStephen Warren .priv_auto_alloc_size = sizeof(struct sandbox_reset), 95*4581b717SStephen Warren .ops = &sandbox_reset_reset_ops, 96*4581b717SStephen Warren }; 97*4581b717SStephen Warren 98*4581b717SStephen Warren int sandbox_reset_query(struct udevice *dev, unsigned long id) 99*4581b717SStephen Warren { 100*4581b717SStephen Warren struct sandbox_reset *sbr = dev_get_priv(dev); 101*4581b717SStephen Warren 102*4581b717SStephen Warren debug("%s(dev=%p, id=%ld)\n", __func__, dev, id); 103*4581b717SStephen Warren 104*4581b717SStephen Warren if (id >= SANDBOX_RESET_SIGNALS) 105*4581b717SStephen Warren return -EINVAL; 106*4581b717SStephen Warren 107*4581b717SStephen Warren return sbr->signals[id].asserted; 108*4581b717SStephen Warren } 109