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