185fdd74fSHavard Skinnemoen /* 285fdd74fSHavard Skinnemoen * Nuvoton NPCM7xx Timer Controller 385fdd74fSHavard Skinnemoen * 485fdd74fSHavard Skinnemoen * Copyright 2020 Google LLC 585fdd74fSHavard Skinnemoen * 685fdd74fSHavard Skinnemoen * This program is free software; you can redistribute it and/or modify it 785fdd74fSHavard Skinnemoen * under the terms of the GNU General Public License as published by the 885fdd74fSHavard Skinnemoen * Free Software Foundation; either version 2 of the License, or 985fdd74fSHavard Skinnemoen * (at your option) any later version. 1085fdd74fSHavard Skinnemoen * 1185fdd74fSHavard Skinnemoen * This program is distributed in the hope that it will be useful, but WITHOUT 1285fdd74fSHavard Skinnemoen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1385fdd74fSHavard Skinnemoen * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1485fdd74fSHavard Skinnemoen * for more details. 1585fdd74fSHavard Skinnemoen */ 1685fdd74fSHavard Skinnemoen #ifndef NPCM7XX_TIMER_H 1785fdd74fSHavard Skinnemoen #define NPCM7XX_TIMER_H 1885fdd74fSHavard Skinnemoen 1985fdd74fSHavard Skinnemoen #include "exec/memory.h" 2085fdd74fSHavard Skinnemoen #include "hw/sysbus.h" 2185fdd74fSHavard Skinnemoen #include "qemu/timer.h" 2285fdd74fSHavard Skinnemoen 2385fdd74fSHavard Skinnemoen /* Each Timer Module (TIM) instance holds five 25 MHz timers. */ 2485fdd74fSHavard Skinnemoen #define NPCM7XX_TIMERS_PER_CTRL (5) 2585fdd74fSHavard Skinnemoen 2685fdd74fSHavard Skinnemoen /* 2785fdd74fSHavard Skinnemoen * Number of registers in our device state structure. Don't change this without 2885fdd74fSHavard Skinnemoen * incrementing the version_id in the vmstate. 2985fdd74fSHavard Skinnemoen */ 3085fdd74fSHavard Skinnemoen #define NPCM7XX_TIMER_NR_REGS (0x54 / sizeof(uint32_t)) 3185fdd74fSHavard Skinnemoen 32*7d378ed6SHao Wu /* The basic watchdog timer period is 2^14 clock cycles. */ 33*7d378ed6SHao Wu #define NPCM7XX_WATCHDOG_BASETIME_SHIFT 14 34*7d378ed6SHao Wu 35*7d378ed6SHao Wu #define NPCM7XX_WATCHDOG_RESET_GPIO_OUT "npcm7xx-clk-watchdog-reset-gpio-out" 36*7d378ed6SHao Wu 3785fdd74fSHavard Skinnemoen typedef struct NPCM7xxTimerCtrlState NPCM7xxTimerCtrlState; 3885fdd74fSHavard Skinnemoen 3985fdd74fSHavard Skinnemoen /** 40*7d378ed6SHao Wu * struct NPCM7xxBaseTimer - Basic functionality that both regular timer and 41*7d378ed6SHao Wu * watchdog timer use. 4285fdd74fSHavard Skinnemoen * @qtimer: QEMU timer that notifies us on expiration. 4385fdd74fSHavard Skinnemoen * @expires_ns: Absolute virtual expiration time. 4485fdd74fSHavard Skinnemoen * @remaining_ns: Remaining time until expiration if timer is paused. 45*7d378ed6SHao Wu */ 46*7d378ed6SHao Wu typedef struct NPCM7xxBaseTimer { 47*7d378ed6SHao Wu QEMUTimer qtimer; 48*7d378ed6SHao Wu int64_t expires_ns; 49*7d378ed6SHao Wu int64_t remaining_ns; 50*7d378ed6SHao Wu } NPCM7xxBaseTimer; 51*7d378ed6SHao Wu 52*7d378ed6SHao Wu /** 53*7d378ed6SHao Wu * struct NPCM7xxTimer - Individual timer state. 54*7d378ed6SHao Wu * @ctrl: The timer module that owns this timer. 55*7d378ed6SHao Wu * @irq: GIC interrupt line to fire on expiration (if enabled). 56*7d378ed6SHao Wu * @base_timer: The basic timer functionality for this timer. 5785fdd74fSHavard Skinnemoen * @tcsr: The Timer Control and Status Register. 5885fdd74fSHavard Skinnemoen * @ticr: The Timer Initial Count Register. 5985fdd74fSHavard Skinnemoen */ 6085fdd74fSHavard Skinnemoen typedef struct NPCM7xxTimer { 6185fdd74fSHavard Skinnemoen NPCM7xxTimerCtrlState *ctrl; 6285fdd74fSHavard Skinnemoen 6385fdd74fSHavard Skinnemoen qemu_irq irq; 64*7d378ed6SHao Wu NPCM7xxBaseTimer base_timer; 6585fdd74fSHavard Skinnemoen 6685fdd74fSHavard Skinnemoen uint32_t tcsr; 6785fdd74fSHavard Skinnemoen uint32_t ticr; 6885fdd74fSHavard Skinnemoen } NPCM7xxTimer; 6985fdd74fSHavard Skinnemoen 7085fdd74fSHavard Skinnemoen /** 71*7d378ed6SHao Wu * struct NPCM7xxWatchdogTimer - The watchdog timer state. 72*7d378ed6SHao Wu * @ctrl: The timer module that owns this timer. 73*7d378ed6SHao Wu * @irq: GIC interrupt line to fire on expiration (if enabled). 74*7d378ed6SHao Wu * @reset_signal: The GPIO used to send a reset signal. 75*7d378ed6SHao Wu * @base_timer: The basic timer functionality for this timer. 76*7d378ed6SHao Wu * @wtcr: The Watchdog Timer Control Register. 77*7d378ed6SHao Wu */ 78*7d378ed6SHao Wu typedef struct NPCM7xxWatchdogTimer { 79*7d378ed6SHao Wu NPCM7xxTimerCtrlState *ctrl; 80*7d378ed6SHao Wu 81*7d378ed6SHao Wu qemu_irq irq; 82*7d378ed6SHao Wu qemu_irq reset_signal; 83*7d378ed6SHao Wu NPCM7xxBaseTimer base_timer; 84*7d378ed6SHao Wu 85*7d378ed6SHao Wu uint32_t wtcr; 86*7d378ed6SHao Wu } NPCM7xxWatchdogTimer; 87*7d378ed6SHao Wu 88*7d378ed6SHao Wu /** 8985fdd74fSHavard Skinnemoen * struct NPCM7xxTimerCtrlState - Timer Module device state. 9085fdd74fSHavard Skinnemoen * @parent: System bus device. 9185fdd74fSHavard Skinnemoen * @iomem: Memory region through which registers are accessed. 92*7d378ed6SHao Wu * @index: The index of this timer module. 9385fdd74fSHavard Skinnemoen * @tisr: The Timer Interrupt Status Register. 9485fdd74fSHavard Skinnemoen * @timer: The five individual timers managed by this module. 95*7d378ed6SHao Wu * @watchdog_timer: The watchdog timer managed by this module. 9685fdd74fSHavard Skinnemoen */ 9785fdd74fSHavard Skinnemoen struct NPCM7xxTimerCtrlState { 9885fdd74fSHavard Skinnemoen SysBusDevice parent; 9985fdd74fSHavard Skinnemoen 10085fdd74fSHavard Skinnemoen MemoryRegion iomem; 10185fdd74fSHavard Skinnemoen 10285fdd74fSHavard Skinnemoen uint32_t tisr; 10385fdd74fSHavard Skinnemoen 10485fdd74fSHavard Skinnemoen NPCM7xxTimer timer[NPCM7XX_TIMERS_PER_CTRL]; 105*7d378ed6SHao Wu NPCM7xxWatchdogTimer watchdog_timer; 10685fdd74fSHavard Skinnemoen }; 10785fdd74fSHavard Skinnemoen 10885fdd74fSHavard Skinnemoen #define TYPE_NPCM7XX_TIMER "npcm7xx-timer" 10985fdd74fSHavard Skinnemoen #define NPCM7XX_TIMER(obj) \ 11085fdd74fSHavard Skinnemoen OBJECT_CHECK(NPCM7xxTimerCtrlState, (obj), TYPE_NPCM7XX_TIMER) 11185fdd74fSHavard Skinnemoen 11285fdd74fSHavard Skinnemoen #endif /* NPCM7XX_TIMER_H */ 113