xref: /qemu/include/hw/timer/aspeed_timer.h (revision fadefada4d07a3a77c4171244cded0e9af81331c)
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"
3172d96f8eSCédric Le Goater #define TYPE_ASPEED_2400_TIMER TYPE_ASPEED_TIMER "-ast2400"
3272d96f8eSCédric Le Goater #define TYPE_ASPEED_2500_TIMER TYPE_ASPEED_TIMER "-ast2500"
33c20375ddSCédric Le Goater #define TYPE_ASPEED_2600_TIMER TYPE_ASPEED_TIMER "-ast2600"
3472d96f8eSCédric Le Goater 
35c04bd47dSAndrew Jeffery #define ASPEED_TIMER_NR_TIMERS 8
36c04bd47dSAndrew Jeffery 
37c04bd47dSAndrew Jeffery typedef struct AspeedTimer {
38c04bd47dSAndrew Jeffery     qemu_irq irq;
39c04bd47dSAndrew Jeffery 
40c04bd47dSAndrew Jeffery     uint8_t id;
411d3e65aaSAndrew Jeffery     QEMUTimer timer;
42c04bd47dSAndrew Jeffery 
43c04bd47dSAndrew Jeffery     /**
44c04bd47dSAndrew Jeffery      * Track the line level as the ASPEED timers implement edge triggered
45c04bd47dSAndrew Jeffery      * interrupts, signalling with both the rising and falling edge.
46c04bd47dSAndrew Jeffery      */
47c04bd47dSAndrew Jeffery     int32_t level;
48c04bd47dSAndrew Jeffery     uint32_t reload;
49c04bd47dSAndrew Jeffery     uint32_t match[2];
501d3e65aaSAndrew Jeffery     uint64_t start;
51c04bd47dSAndrew Jeffery } AspeedTimer;
52c04bd47dSAndrew Jeffery 
53c04bd47dSAndrew Jeffery typedef struct AspeedTimerCtrlState {
54c04bd47dSAndrew Jeffery     /*< private >*/
55c04bd47dSAndrew Jeffery     SysBusDevice parent;
56c04bd47dSAndrew Jeffery 
57c04bd47dSAndrew Jeffery     /*< public >*/
58c04bd47dSAndrew Jeffery     MemoryRegion iomem;
59c04bd47dSAndrew Jeffery 
60c04bd47dSAndrew Jeffery     uint32_t ctrl;
61c04bd47dSAndrew Jeffery     uint32_t ctrl2;
62d85c87c1SCédric Le Goater     uint32_t ctrl3;
63*fadefadaSCédric Le Goater     uint32_t irq_sts;
64c04bd47dSAndrew Jeffery     AspeedTimer timers[ASPEED_TIMER_NR_TIMERS];
659b945a9eSCédric Le Goater 
669b945a9eSCédric Le Goater     AspeedSCUState *scu;
67c04bd47dSAndrew Jeffery } AspeedTimerCtrlState;
68c04bd47dSAndrew Jeffery 
6972d96f8eSCédric Le Goater #define ASPEED_TIMER_CLASS(klass) \
7072d96f8eSCédric Le Goater      OBJECT_CLASS_CHECK(AspeedTimerClass, (klass), TYPE_ASPEED_TIMER)
7172d96f8eSCédric Le Goater #define ASPEED_TIMER_GET_CLASS(obj) \
7272d96f8eSCédric Le Goater      OBJECT_GET_CLASS(AspeedTimerClass, (obj), TYPE_ASPEED_TIMER)
7372d96f8eSCédric Le Goater 
7472d96f8eSCédric Le Goater typedef struct AspeedTimerClass {
7572d96f8eSCédric Le Goater     SysBusDeviceClass parent_class;
7672d96f8eSCédric Le Goater 
7772d96f8eSCédric Le Goater     uint64_t (*read)(AspeedTimerCtrlState *s, hwaddr offset);
7872d96f8eSCédric Le Goater     void (*write)(AspeedTimerCtrlState *s, hwaddr offset, uint64_t value);
7972d96f8eSCédric Le Goater } AspeedTimerClass;
8072d96f8eSCédric Le Goater 
81c04bd47dSAndrew Jeffery #endif /* ASPEED_TIMER_H */
82