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