1*85fdd74fSHavard Skinnemoen /* 2*85fdd74fSHavard Skinnemoen * Nuvoton NPCM7xx Timer Controller 3*85fdd74fSHavard Skinnemoen * 4*85fdd74fSHavard Skinnemoen * Copyright 2020 Google LLC 5*85fdd74fSHavard Skinnemoen * 6*85fdd74fSHavard Skinnemoen * This program is free software; you can redistribute it and/or modify it 7*85fdd74fSHavard Skinnemoen * under the terms of the GNU General Public License as published by the 8*85fdd74fSHavard Skinnemoen * Free Software Foundation; either version 2 of the License, or 9*85fdd74fSHavard Skinnemoen * (at your option) any later version. 10*85fdd74fSHavard Skinnemoen * 11*85fdd74fSHavard Skinnemoen * This program is distributed in the hope that it will be useful, but WITHOUT 12*85fdd74fSHavard Skinnemoen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*85fdd74fSHavard Skinnemoen * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*85fdd74fSHavard Skinnemoen * for more details. 15*85fdd74fSHavard Skinnemoen */ 16*85fdd74fSHavard Skinnemoen #ifndef NPCM7XX_TIMER_H 17*85fdd74fSHavard Skinnemoen #define NPCM7XX_TIMER_H 18*85fdd74fSHavard Skinnemoen 19*85fdd74fSHavard Skinnemoen #include "exec/memory.h" 20*85fdd74fSHavard Skinnemoen #include "hw/sysbus.h" 21*85fdd74fSHavard Skinnemoen #include "qemu/timer.h" 22*85fdd74fSHavard Skinnemoen 23*85fdd74fSHavard Skinnemoen /* Each Timer Module (TIM) instance holds five 25 MHz timers. */ 24*85fdd74fSHavard Skinnemoen #define NPCM7XX_TIMERS_PER_CTRL (5) 25*85fdd74fSHavard Skinnemoen 26*85fdd74fSHavard Skinnemoen /* 27*85fdd74fSHavard Skinnemoen * Number of registers in our device state structure. Don't change this without 28*85fdd74fSHavard Skinnemoen * incrementing the version_id in the vmstate. 29*85fdd74fSHavard Skinnemoen */ 30*85fdd74fSHavard Skinnemoen #define NPCM7XX_TIMER_NR_REGS (0x54 / sizeof(uint32_t)) 31*85fdd74fSHavard Skinnemoen 32*85fdd74fSHavard Skinnemoen typedef struct NPCM7xxTimerCtrlState NPCM7xxTimerCtrlState; 33*85fdd74fSHavard Skinnemoen 34*85fdd74fSHavard Skinnemoen /** 35*85fdd74fSHavard Skinnemoen * struct NPCM7xxTimer - Individual timer state. 36*85fdd74fSHavard Skinnemoen * @irq: GIC interrupt line to fire on expiration (if enabled). 37*85fdd74fSHavard Skinnemoen * @qtimer: QEMU timer that notifies us on expiration. 38*85fdd74fSHavard Skinnemoen * @expires_ns: Absolute virtual expiration time. 39*85fdd74fSHavard Skinnemoen * @remaining_ns: Remaining time until expiration if timer is paused. 40*85fdd74fSHavard Skinnemoen * @tcsr: The Timer Control and Status Register. 41*85fdd74fSHavard Skinnemoen * @ticr: The Timer Initial Count Register. 42*85fdd74fSHavard Skinnemoen */ 43*85fdd74fSHavard Skinnemoen typedef struct NPCM7xxTimer { 44*85fdd74fSHavard Skinnemoen NPCM7xxTimerCtrlState *ctrl; 45*85fdd74fSHavard Skinnemoen 46*85fdd74fSHavard Skinnemoen qemu_irq irq; 47*85fdd74fSHavard Skinnemoen QEMUTimer qtimer; 48*85fdd74fSHavard Skinnemoen int64_t expires_ns; 49*85fdd74fSHavard Skinnemoen int64_t remaining_ns; 50*85fdd74fSHavard Skinnemoen 51*85fdd74fSHavard Skinnemoen uint32_t tcsr; 52*85fdd74fSHavard Skinnemoen uint32_t ticr; 53*85fdd74fSHavard Skinnemoen } NPCM7xxTimer; 54*85fdd74fSHavard Skinnemoen 55*85fdd74fSHavard Skinnemoen /** 56*85fdd74fSHavard Skinnemoen * struct NPCM7xxTimerCtrlState - Timer Module device state. 57*85fdd74fSHavard Skinnemoen * @parent: System bus device. 58*85fdd74fSHavard Skinnemoen * @iomem: Memory region through which registers are accessed. 59*85fdd74fSHavard Skinnemoen * @tisr: The Timer Interrupt Status Register. 60*85fdd74fSHavard Skinnemoen * @wtcr: The Watchdog Timer Control Register. 61*85fdd74fSHavard Skinnemoen * @timer: The five individual timers managed by this module. 62*85fdd74fSHavard Skinnemoen */ 63*85fdd74fSHavard Skinnemoen struct NPCM7xxTimerCtrlState { 64*85fdd74fSHavard Skinnemoen SysBusDevice parent; 65*85fdd74fSHavard Skinnemoen 66*85fdd74fSHavard Skinnemoen MemoryRegion iomem; 67*85fdd74fSHavard Skinnemoen 68*85fdd74fSHavard Skinnemoen uint32_t tisr; 69*85fdd74fSHavard Skinnemoen uint32_t wtcr; 70*85fdd74fSHavard Skinnemoen 71*85fdd74fSHavard Skinnemoen NPCM7xxTimer timer[NPCM7XX_TIMERS_PER_CTRL]; 72*85fdd74fSHavard Skinnemoen }; 73*85fdd74fSHavard Skinnemoen 74*85fdd74fSHavard Skinnemoen #define TYPE_NPCM7XX_TIMER "npcm7xx-timer" 75*85fdd74fSHavard Skinnemoen #define NPCM7XX_TIMER(obj) \ 76*85fdd74fSHavard Skinnemoen OBJECT_CHECK(NPCM7xxTimerCtrlState, (obj), TYPE_NPCM7XX_TIMER) 77*85fdd74fSHavard Skinnemoen 78*85fdd74fSHavard Skinnemoen #endif /* NPCM7XX_TIMER_H */ 79