1*17b9730fSStrahinja Jankovic /* 2*17b9730fSStrahinja Jankovic * Allwinner Watchdog emulation 3*17b9730fSStrahinja Jankovic * 4*17b9730fSStrahinja Jankovic * Copyright (C) 2023 Strahinja Jankovic <strahinja.p.jankovic@gmail.com> 5*17b9730fSStrahinja Jankovic * 6*17b9730fSStrahinja Jankovic * This file is derived from Allwinner RTC, 7*17b9730fSStrahinja Jankovic * by Niek Linnenbank. 8*17b9730fSStrahinja Jankovic * 9*17b9730fSStrahinja Jankovic * This program is free software: you can redistribute it and/or modify 10*17b9730fSStrahinja Jankovic * it under the terms of the GNU General Public License as published by 11*17b9730fSStrahinja Jankovic * the Free Software Foundation, either version 2 of the License, or 12*17b9730fSStrahinja Jankovic * (at your option) any later version. 13*17b9730fSStrahinja Jankovic * 14*17b9730fSStrahinja Jankovic * This program is distributed in the hope that it will be useful, 15*17b9730fSStrahinja Jankovic * but WITHOUT ANY WARRANTY; without even the implied warranty of 16*17b9730fSStrahinja Jankovic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17*17b9730fSStrahinja Jankovic * GNU General Public License for more details. 18*17b9730fSStrahinja Jankovic * 19*17b9730fSStrahinja Jankovic * You should have received a copy of the GNU General Public License 20*17b9730fSStrahinja Jankovic * along with this program. If not, see <http://www.gnu.org/licenses/>. 21*17b9730fSStrahinja Jankovic */ 22*17b9730fSStrahinja Jankovic 23*17b9730fSStrahinja Jankovic #ifndef HW_WATCHDOG_ALLWINNER_WDT_H 24*17b9730fSStrahinja Jankovic #define HW_WATCHDOG_ALLWINNER_WDT_H 25*17b9730fSStrahinja Jankovic 26*17b9730fSStrahinja Jankovic #include "qom/object.h" 27*17b9730fSStrahinja Jankovic #include "hw/ptimer.h" 28*17b9730fSStrahinja Jankovic #include "hw/sysbus.h" 29*17b9730fSStrahinja Jankovic 30*17b9730fSStrahinja Jankovic /* 31*17b9730fSStrahinja Jankovic * This is a model of the Allwinner watchdog. 32*17b9730fSStrahinja Jankovic * Since watchdog registers belong to the timer module (and are shared with the 33*17b9730fSStrahinja Jankovic * RTC module), the interrupt line from watchdog is not handled right now. 34*17b9730fSStrahinja Jankovic * In QEMU, we just wire up the watchdog reset to watchdog_perform_action(), 35*17b9730fSStrahinja Jankovic * at least for the moment. 36*17b9730fSStrahinja Jankovic */ 37*17b9730fSStrahinja Jankovic 38*17b9730fSStrahinja Jankovic #define TYPE_AW_WDT "allwinner-wdt" 39*17b9730fSStrahinja Jankovic 40*17b9730fSStrahinja Jankovic /** Allwinner WDT sun4i family (A10, A12), also sun7i (A20) */ 41*17b9730fSStrahinja Jankovic #define TYPE_AW_WDT_SUN4I TYPE_AW_WDT "-sun4i" 42*17b9730fSStrahinja Jankovic 43*17b9730fSStrahinja Jankovic /** Allwinner WDT sun6i family and newer (A31, H2+, H3, etc) */ 44*17b9730fSStrahinja Jankovic #define TYPE_AW_WDT_SUN6I TYPE_AW_WDT "-sun6i" 45*17b9730fSStrahinja Jankovic 46*17b9730fSStrahinja Jankovic /** Number of WDT registers */ 47*17b9730fSStrahinja Jankovic #define AW_WDT_REGS_NUM (5) 48*17b9730fSStrahinja Jankovic 49*17b9730fSStrahinja Jankovic OBJECT_DECLARE_TYPE(AwWdtState, AwWdtClass, AW_WDT) 50*17b9730fSStrahinja Jankovic 51*17b9730fSStrahinja Jankovic /** 52*17b9730fSStrahinja Jankovic * Allwinner WDT object instance state. 53*17b9730fSStrahinja Jankovic */ 54*17b9730fSStrahinja Jankovic struct AwWdtState { 55*17b9730fSStrahinja Jankovic /*< private >*/ 56*17b9730fSStrahinja Jankovic SysBusDevice parent_obj; 57*17b9730fSStrahinja Jankovic 58*17b9730fSStrahinja Jankovic /*< public >*/ 59*17b9730fSStrahinja Jankovic MemoryRegion iomem; 60*17b9730fSStrahinja Jankovic struct ptimer_state *timer; 61*17b9730fSStrahinja Jankovic 62*17b9730fSStrahinja Jankovic uint32_t regs[AW_WDT_REGS_NUM]; 63*17b9730fSStrahinja Jankovic }; 64*17b9730fSStrahinja Jankovic 65*17b9730fSStrahinja Jankovic /** 66*17b9730fSStrahinja Jankovic * Allwinner WDT class-level struct. 67*17b9730fSStrahinja Jankovic * 68*17b9730fSStrahinja Jankovic * This struct is filled by each sunxi device specific code 69*17b9730fSStrahinja Jankovic * such that the generic code can use this struct to support 70*17b9730fSStrahinja Jankovic * all devices. 71*17b9730fSStrahinja Jankovic */ 72*17b9730fSStrahinja Jankovic struct AwWdtClass { 73*17b9730fSStrahinja Jankovic /*< private >*/ 74*17b9730fSStrahinja Jankovic SysBusDeviceClass parent_class; 75*17b9730fSStrahinja Jankovic /*< public >*/ 76*17b9730fSStrahinja Jankovic 77*17b9730fSStrahinja Jankovic /** Defines device specific register map */ 78*17b9730fSStrahinja Jankovic const uint8_t *regmap; 79*17b9730fSStrahinja Jankovic 80*17b9730fSStrahinja Jankovic /** Size of the regmap in bytes */ 81*17b9730fSStrahinja Jankovic size_t regmap_size; 82*17b9730fSStrahinja Jankovic 83*17b9730fSStrahinja Jankovic /** 84*17b9730fSStrahinja Jankovic * Read device specific register 85*17b9730fSStrahinja Jankovic * 86*17b9730fSStrahinja Jankovic * @offset: register offset to read 87*17b9730fSStrahinja Jankovic * @return true if register read successful, false otherwise 88*17b9730fSStrahinja Jankovic */ 89*17b9730fSStrahinja Jankovic bool (*read)(AwWdtState *s, uint32_t offset); 90*17b9730fSStrahinja Jankovic 91*17b9730fSStrahinja Jankovic /** 92*17b9730fSStrahinja Jankovic * Write device specific register 93*17b9730fSStrahinja Jankovic * 94*17b9730fSStrahinja Jankovic * @offset: register offset to write 95*17b9730fSStrahinja Jankovic * @data: value to set in register 96*17b9730fSStrahinja Jankovic * @return true if register write successful, false otherwise 97*17b9730fSStrahinja Jankovic */ 98*17b9730fSStrahinja Jankovic bool (*write)(AwWdtState *s, uint32_t offset, uint32_t data); 99*17b9730fSStrahinja Jankovic 100*17b9730fSStrahinja Jankovic /** 101*17b9730fSStrahinja Jankovic * Check if watchdog can generate system reset 102*17b9730fSStrahinja Jankovic * 103*17b9730fSStrahinja Jankovic * @return true if watchdog can generate system reset 104*17b9730fSStrahinja Jankovic */ 105*17b9730fSStrahinja Jankovic bool (*can_reset_system)(AwWdtState *s); 106*17b9730fSStrahinja Jankovic 107*17b9730fSStrahinja Jankovic /** 108*17b9730fSStrahinja Jankovic * Check if provided key is valid 109*17b9730fSStrahinja Jankovic * 110*17b9730fSStrahinja Jankovic * @value: value written to register 111*17b9730fSStrahinja Jankovic * @return true if key is valid, false otherwise 112*17b9730fSStrahinja Jankovic */ 113*17b9730fSStrahinja Jankovic bool (*is_key_valid)(AwWdtState *s, uint32_t val); 114*17b9730fSStrahinja Jankovic 115*17b9730fSStrahinja Jankovic /** 116*17b9730fSStrahinja Jankovic * Get current INTV_VALUE setting 117*17b9730fSStrahinja Jankovic * 118*17b9730fSStrahinja Jankovic * @return current INTV_VALUE (0-15) 119*17b9730fSStrahinja Jankovic */ 120*17b9730fSStrahinja Jankovic uint8_t (*get_intv_value)(AwWdtState *s); 121*17b9730fSStrahinja Jankovic }; 122*17b9730fSStrahinja Jankovic 123*17b9730fSStrahinja Jankovic #endif /* HW_WATCHDOG_ALLWINNER_WDT_H */ 124