xref: /qemu/include/hw/timer/aspeed_timer.h (revision 72d96f8e2288e4bc7b31011c0c3f00448e2cef19)
1c04bd47dSAndrew Jeffery /*
2c04bd47dSAndrew Jeffery  *  ASPEED AST2400 Timer
3c04bd47dSAndrew Jeffery  *
4c04bd47dSAndrew Jeffery  *  Andrew Jeffery <andrew@aj.id.au>
5c04bd47dSAndrew Jeffery  *
6c04bd47dSAndrew Jeffery  *  Copyright (C) 2016 IBM Corp.
7c04bd47dSAndrew Jeffery  *
8c04bd47dSAndrew Jeffery  *  This program is free software; you can redistribute it and/or modify
9c04bd47dSAndrew Jeffery  *  it under the terms of the GNU General Public License as published by
10c04bd47dSAndrew Jeffery  *  the Free Software Foundation; either version 2 of the License, or
11c04bd47dSAndrew Jeffery  *  (at your option) any later version.
12c04bd47dSAndrew Jeffery  *
13c04bd47dSAndrew Jeffery  *  This program is distributed in the hope that it will be useful,
14c04bd47dSAndrew Jeffery  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15c04bd47dSAndrew Jeffery  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16c04bd47dSAndrew Jeffery  *  GNU General Public License for more details.
17c04bd47dSAndrew Jeffery  *
18c04bd47dSAndrew Jeffery  *  You should have received a copy of the GNU General Public License along
19c04bd47dSAndrew Jeffery  *  with this program; if not, write to the Free Software Foundation, Inc.,
20c04bd47dSAndrew Jeffery  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21c04bd47dSAndrew Jeffery  */
22c04bd47dSAndrew Jeffery #ifndef ASPEED_TIMER_H
23c04bd47dSAndrew Jeffery #define ASPEED_TIMER_H
24c04bd47dSAndrew Jeffery 
251d3e65aaSAndrew Jeffery #include "qemu/timer.h"
2603f1d720SCédric Le Goater #include "hw/misc/aspeed_scu.h"
279b945a9eSCédric Le Goater 
28c04bd47dSAndrew Jeffery #define ASPEED_TIMER(obj) \
29c04bd47dSAndrew Jeffery     OBJECT_CHECK(AspeedTimerCtrlState, (obj), TYPE_ASPEED_TIMER);
30c04bd47dSAndrew Jeffery #define TYPE_ASPEED_TIMER "aspeed.timer"
31*72d96f8eSCédric Le Goater #define TYPE_ASPEED_2400_TIMER TYPE_ASPEED_TIMER "-ast2400"
32*72d96f8eSCédric Le Goater #define TYPE_ASPEED_2500_TIMER TYPE_ASPEED_TIMER "-ast2500"
33*72d96f8eSCédric Le Goater 
34c04bd47dSAndrew Jeffery #define ASPEED_TIMER_NR_TIMERS 8
35c04bd47dSAndrew Jeffery 
36c04bd47dSAndrew Jeffery typedef struct AspeedTimer {
37c04bd47dSAndrew Jeffery     qemu_irq irq;
38c04bd47dSAndrew Jeffery 
39c04bd47dSAndrew Jeffery     uint8_t id;
401d3e65aaSAndrew Jeffery     QEMUTimer timer;
41c04bd47dSAndrew Jeffery 
42c04bd47dSAndrew Jeffery     /**
43c04bd47dSAndrew Jeffery      * Track the line level as the ASPEED timers implement edge triggered
44c04bd47dSAndrew Jeffery      * interrupts, signalling with both the rising and falling edge.
45c04bd47dSAndrew Jeffery      */
46c04bd47dSAndrew Jeffery     int32_t level;
47c04bd47dSAndrew Jeffery     uint32_t reload;
48c04bd47dSAndrew Jeffery     uint32_t match[2];
491d3e65aaSAndrew Jeffery     uint64_t start;
50c04bd47dSAndrew Jeffery } AspeedTimer;
51c04bd47dSAndrew Jeffery 
52c04bd47dSAndrew Jeffery typedef struct AspeedTimerCtrlState {
53c04bd47dSAndrew Jeffery     /*< private >*/
54c04bd47dSAndrew Jeffery     SysBusDevice parent;
55c04bd47dSAndrew Jeffery 
56c04bd47dSAndrew Jeffery     /*< public >*/
57c04bd47dSAndrew Jeffery     MemoryRegion iomem;
58c04bd47dSAndrew Jeffery 
59c04bd47dSAndrew Jeffery     uint32_t ctrl;
60c04bd47dSAndrew Jeffery     uint32_t ctrl2;
61c04bd47dSAndrew Jeffery     AspeedTimer timers[ASPEED_TIMER_NR_TIMERS];
629b945a9eSCédric Le Goater 
639b945a9eSCédric Le Goater     AspeedSCUState *scu;
64c04bd47dSAndrew Jeffery } AspeedTimerCtrlState;
65c04bd47dSAndrew Jeffery 
66*72d96f8eSCédric Le Goater #define ASPEED_TIMER_CLASS(klass) \
67*72d96f8eSCédric Le Goater      OBJECT_CLASS_CHECK(AspeedTimerClass, (klass), TYPE_ASPEED_TIMER)
68*72d96f8eSCédric Le Goater #define ASPEED_TIMER_GET_CLASS(obj) \
69*72d96f8eSCédric Le Goater      OBJECT_GET_CLASS(AspeedTimerClass, (obj), TYPE_ASPEED_TIMER)
70*72d96f8eSCédric Le Goater 
71*72d96f8eSCédric Le Goater typedef struct AspeedTimerClass {
72*72d96f8eSCédric Le Goater     SysBusDeviceClass parent_class;
73*72d96f8eSCédric Le Goater 
74*72d96f8eSCédric Le Goater     uint64_t (*read)(AspeedTimerCtrlState *s, hwaddr offset);
75*72d96f8eSCédric Le Goater     void (*write)(AspeedTimerCtrlState *s, hwaddr offset, uint64_t value);
76*72d96f8eSCédric Le Goater } AspeedTimerClass;
77*72d96f8eSCédric Le Goater 
78c04bd47dSAndrew Jeffery #endif /* ASPEED_TIMER_H */
79