xref: /qemu/include/hw/misc/sifive_e_prci.h (revision e38d3c5ce5f6e69cf0d87a484d556be0d737d83d)
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
21ac900edeSEduardo Habkost #include "qom/object.h"
2256449d20SBin Meng 
2356449d20SBin Meng enum {
2456449d20SBin Meng     SIFIVE_E_PRCI_HFROSCCFG = 0x0,
2556449d20SBin Meng     SIFIVE_E_PRCI_HFXOSCCFG = 0x4,
2656449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG    = 0x8,
2756449d20SBin Meng     SIFIVE_E_PRCI_PLLOUTDIV = 0xC
2856449d20SBin Meng };
2956449d20SBin Meng 
3056449d20SBin Meng enum {
3156449d20SBin Meng     SIFIVE_E_PRCI_HFROSCCFG_RDY = (1 << 31),
3256449d20SBin Meng     SIFIVE_E_PRCI_HFROSCCFG_EN  = (1 << 30)
3356449d20SBin Meng };
3456449d20SBin Meng 
3556449d20SBin Meng enum {
3656449d20SBin Meng     SIFIVE_E_PRCI_HFXOSCCFG_RDY = (1 << 31),
3756449d20SBin Meng     SIFIVE_E_PRCI_HFXOSCCFG_EN  = (1 << 30)
3856449d20SBin Meng };
3956449d20SBin Meng 
4056449d20SBin Meng enum {
4156449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG_PLLSEL = (1 << 16),
4256449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG_REFSEL = (1 << 17),
4356449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG_BYPASS = (1 << 18),
4456449d20SBin Meng     SIFIVE_E_PRCI_PLLCFG_LOCK   = (1 << 31)
4556449d20SBin Meng };
4656449d20SBin Meng 
4756449d20SBin Meng enum {
4856449d20SBin Meng     SIFIVE_E_PRCI_PLLOUTDIV_DIV1 = (1 << 8)
4956449d20SBin Meng };
5056449d20SBin Meng 
51d0730344SBin Meng #define SIFIVE_E_PRCI_REG_SIZE  0x1000
52d0730344SBin Meng 
5356449d20SBin Meng #define TYPE_SIFIVE_E_PRCI      "riscv.sifive.e.prci"
5456449d20SBin Meng 
55ac900edeSEduardo Habkost typedef struct SiFiveEPRCIState SiFiveEPRCIState;
56*e38d3c5cSEduardo Habkost DECLARE_INSTANCE_CHECKER(SiFiveEPRCIState, SIFIVE_E_PRCI,
57*e38d3c5cSEduardo Habkost                          TYPE_SIFIVE_E_PRCI)
5856449d20SBin Meng 
59ac900edeSEduardo Habkost struct SiFiveEPRCIState {
6056449d20SBin Meng     /*< private >*/
6156449d20SBin Meng     SysBusDevice parent_obj;
6256449d20SBin Meng 
6356449d20SBin Meng     /*< public >*/
6456449d20SBin Meng     MemoryRegion mmio;
6556449d20SBin Meng     uint32_t hfrosccfg;
6656449d20SBin Meng     uint32_t hfxosccfg;
6756449d20SBin Meng     uint32_t pllcfg;
6856449d20SBin Meng     uint32_t plloutdiv;
69ac900edeSEduardo Habkost };
7056449d20SBin Meng 
7156449d20SBin Meng DeviceState *sifive_e_prci_create(hwaddr addr);
7256449d20SBin Meng 
7356449d20SBin Meng #endif
74