xref: /qemu/include/hw/misc/sifive_e_prci.h (revision 7a5951f651ad5f158631a826070b24631e733763)
156449d20SBin Meng /*
256449d20SBin Meng  * QEMU SiFive E PRCI (Power, Reset, Clock, Interrupt) interface
356449d20SBin Meng  *
456449d20SBin Meng  * Copyright (c) 2017 SiFive, Inc.
556449d20SBin Meng  *
656449d20SBin Meng  * This program is free software; you can redistribute it and/or modify it
756449d20SBin Meng  * under the terms and conditions of the GNU General Public License,
856449d20SBin Meng  * version 2 or later, as published by the Free Software Foundation.
956449d20SBin Meng  *
1056449d20SBin Meng  * This program is distributed in the hope it will be useful, but WITHOUT
1156449d20SBin Meng  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1256449d20SBin Meng  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1356449d20SBin Meng  * more details.
1456449d20SBin Meng  *
1556449d20SBin Meng  * You should have received a copy of the GNU General Public License along with
1656449d20SBin Meng  * this program.  If not, see <http://www.gnu.org/licenses/>.
1756449d20SBin Meng  */
1856449d20SBin Meng 
1956449d20SBin Meng #ifndef HW_SIFIVE_E_PRCI_H
2056449d20SBin Meng #define HW_SIFIVE_E_PRCI_H
21*7a5951f6SMarkus Armbruster 
22*7a5951f6SMarkus Armbruster #include "hw/sysbus.h"
2356449d20SBin Meng 
2456449d20SBin Meng enum {
2556449d20SBin Meng     SIFIVE_E_PRCI_HFROSCCFG = 0x0,
2656449d20SBin Meng     SIFIVE_E_PRCI_HFXOSCCFG = 0x4,
2756449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG    = 0x8,
2856449d20SBin Meng     SIFIVE_E_PRCI_PLLOUTDIV = 0xC
2956449d20SBin Meng };
3056449d20SBin Meng 
3156449d20SBin Meng enum {
3256449d20SBin Meng     SIFIVE_E_PRCI_HFROSCCFG_RDY = (1 << 31),
3356449d20SBin Meng     SIFIVE_E_PRCI_HFROSCCFG_EN  = (1 << 30)
3456449d20SBin Meng };
3556449d20SBin Meng 
3656449d20SBin Meng enum {
3756449d20SBin Meng     SIFIVE_E_PRCI_HFXOSCCFG_RDY = (1 << 31),
3856449d20SBin Meng     SIFIVE_E_PRCI_HFXOSCCFG_EN  = (1 << 30)
3956449d20SBin Meng };
4056449d20SBin Meng 
4156449d20SBin Meng enum {
4256449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG_PLLSEL = (1 << 16),
4356449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG_REFSEL = (1 << 17),
4456449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG_BYPASS = (1 << 18),
4556449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG_LOCK   = (1 << 31)
4656449d20SBin Meng };
4756449d20SBin Meng 
4856449d20SBin Meng enum {
4956449d20SBin Meng     SIFIVE_E_PRCI_PLLOUTDIV_DIV1 = (1 << 8)
5056449d20SBin Meng };
5156449d20SBin Meng 
52d0730344SBin Meng #define SIFIVE_E_PRCI_REG_SIZE  0x1000
53d0730344SBin Meng 
5456449d20SBin Meng #define TYPE_SIFIVE_E_PRCI      "riscv.sifive.e.prci"
5556449d20SBin Meng 
56ac900edeSEduardo Habkost typedef struct SiFiveEPRCIState SiFiveEPRCIState;
57e38d3c5cSEduardo Habkost DECLARE_INSTANCE_CHECKER(SiFiveEPRCIState, SIFIVE_E_PRCI,
58e38d3c5cSEduardo Habkost                          TYPE_SIFIVE_E_PRCI)
5956449d20SBin Meng 
60ac900edeSEduardo Habkost struct SiFiveEPRCIState {
6156449d20SBin Meng     /*< private >*/
6256449d20SBin Meng     SysBusDevice parent_obj;
6356449d20SBin Meng 
6456449d20SBin Meng     /*< public >*/
6556449d20SBin Meng     MemoryRegion mmio;
6656449d20SBin Meng     uint32_t hfrosccfg;
6756449d20SBin Meng     uint32_t hfxosccfg;
6856449d20SBin Meng     uint32_t pllcfg;
6956449d20SBin Meng     uint32_t plloutdiv;
70ac900edeSEduardo Habkost };
7156449d20SBin Meng 
7256449d20SBin Meng DeviceState *sifive_e_prci_create(hwaddr addr);
7356449d20SBin Meng 
7456449d20SBin Meng #endif
75