130efbf33SFabien Chouteau /* 22e30ccb4SBin Meng * SiFive System-on-Chip general purpose input/output register definition 330efbf33SFabien Chouteau * 430efbf33SFabien Chouteau * Copyright 2019 AdaCore 530efbf33SFabien Chouteau * 630efbf33SFabien Chouteau * Base on nrf51_gpio.c: 730efbf33SFabien Chouteau * 830efbf33SFabien Chouteau * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de> 930efbf33SFabien Chouteau * 1030efbf33SFabien Chouteau * This code is licensed under the GPL version 2 or later. See 1130efbf33SFabien Chouteau * the COPYING file in the top-level directory. 1230efbf33SFabien Chouteau */ 132e30ccb4SBin Meng 1430efbf33SFabien Chouteau #ifndef SIFIVE_GPIO_H 1530efbf33SFabien Chouteau #define SIFIVE_GPIO_H 1630efbf33SFabien Chouteau 1730efbf33SFabien Chouteau #include "hw/sysbus.h" 18ac900edeSEduardo Habkost #include "qom/object.h" 192e30ccb4SBin Meng 2030efbf33SFabien Chouteau #define TYPE_SIFIVE_GPIO "sifive_soc.gpio" 21ac900edeSEduardo Habkost typedef struct SIFIVEGPIOState SIFIVEGPIOState; 22*e38d3c5cSEduardo Habkost DECLARE_INSTANCE_CHECKER(SIFIVEGPIOState, SIFIVE_GPIO, 23*e38d3c5cSEduardo Habkost TYPE_SIFIVE_GPIO) 2430efbf33SFabien Chouteau 2530efbf33SFabien Chouteau #define SIFIVE_GPIO_PINS 32 2630efbf33SFabien Chouteau 2730efbf33SFabien Chouteau #define SIFIVE_GPIO_SIZE 0x100 2830efbf33SFabien Chouteau 2930efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_VALUE 0x000 3030efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_INPUT_EN 0x004 3130efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_OUTPUT_EN 0x008 3230efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_PORT 0x00C 3330efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_PUE 0x010 3430efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_DS 0x014 3530efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_RISE_IE 0x018 3630efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_RISE_IP 0x01C 3730efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_FALL_IE 0x020 3830efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_FALL_IP 0x024 3930efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_HIGH_IE 0x028 4030efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_HIGH_IP 0x02C 4130efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_LOW_IE 0x030 4230efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_LOW_IP 0x034 4330efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_IOF_EN 0x038 4430efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_IOF_SEL 0x03C 4530efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_OUT_XOR 0x040 4630efbf33SFabien Chouteau 47ac900edeSEduardo Habkost struct SIFIVEGPIOState { 4830efbf33SFabien Chouteau SysBusDevice parent_obj; 4930efbf33SFabien Chouteau 5030efbf33SFabien Chouteau MemoryRegion mmio; 5130efbf33SFabien Chouteau 5230efbf33SFabien Chouteau qemu_irq irq[SIFIVE_GPIO_PINS]; 5330efbf33SFabien Chouteau qemu_irq output[SIFIVE_GPIO_PINS]; 5430efbf33SFabien Chouteau 5530efbf33SFabien Chouteau uint32_t value; /* Actual value of the pin */ 5630efbf33SFabien Chouteau uint32_t input_en; 5730efbf33SFabien Chouteau uint32_t output_en; 5830efbf33SFabien Chouteau uint32_t port; /* Pin value requested by the user */ 5930efbf33SFabien Chouteau uint32_t pue; 6030efbf33SFabien Chouteau uint32_t ds; 6130efbf33SFabien Chouteau uint32_t rise_ie; 6230efbf33SFabien Chouteau uint32_t rise_ip; 6330efbf33SFabien Chouteau uint32_t fall_ie; 6430efbf33SFabien Chouteau uint32_t fall_ip; 6530efbf33SFabien Chouteau uint32_t high_ie; 6630efbf33SFabien Chouteau uint32_t high_ip; 6730efbf33SFabien Chouteau uint32_t low_ie; 6830efbf33SFabien Chouteau uint32_t low_ip; 6930efbf33SFabien Chouteau uint32_t iof_en; 7030efbf33SFabien Chouteau uint32_t iof_sel; 7130efbf33SFabien Chouteau uint32_t out_xor; 7230efbf33SFabien Chouteau uint32_t in; 7330efbf33SFabien Chouteau uint32_t in_mask; 744bb216f6SBin Meng 754bb216f6SBin Meng /* config */ 764bb216f6SBin Meng uint32_t ngpio; 77ac900edeSEduardo Habkost }; 7830efbf33SFabien Chouteau 792e30ccb4SBin Meng #endif /* SIFIVE_GPIO_H */ 80