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" 18*ac900edeSEduardo Habkost #include "qom/object.h" 192e30ccb4SBin Meng 2030efbf33SFabien Chouteau #define TYPE_SIFIVE_GPIO "sifive_soc.gpio" 21*ac900edeSEduardo Habkost typedef struct SIFIVEGPIOState SIFIVEGPIOState; 2230efbf33SFabien Chouteau #define SIFIVE_GPIO(obj) OBJECT_CHECK(SIFIVEGPIOState, (obj), TYPE_SIFIVE_GPIO) 2330efbf33SFabien Chouteau 2430efbf33SFabien Chouteau #define SIFIVE_GPIO_PINS 32 2530efbf33SFabien Chouteau 2630efbf33SFabien Chouteau #define SIFIVE_GPIO_SIZE 0x100 2730efbf33SFabien Chouteau 2830efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_VALUE 0x000 2930efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_INPUT_EN 0x004 3030efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_OUTPUT_EN 0x008 3130efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_PORT 0x00C 3230efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_PUE 0x010 3330efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_DS 0x014 3430efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_RISE_IE 0x018 3530efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_RISE_IP 0x01C 3630efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_FALL_IE 0x020 3730efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_FALL_IP 0x024 3830efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_HIGH_IE 0x028 3930efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_HIGH_IP 0x02C 4030efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_LOW_IE 0x030 4130efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_LOW_IP 0x034 4230efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_IOF_EN 0x038 4330efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_IOF_SEL 0x03C 4430efbf33SFabien Chouteau #define SIFIVE_GPIO_REG_OUT_XOR 0x040 4530efbf33SFabien Chouteau 46*ac900edeSEduardo Habkost struct SIFIVEGPIOState { 4730efbf33SFabien Chouteau SysBusDevice parent_obj; 4830efbf33SFabien Chouteau 4930efbf33SFabien Chouteau MemoryRegion mmio; 5030efbf33SFabien Chouteau 5130efbf33SFabien Chouteau qemu_irq irq[SIFIVE_GPIO_PINS]; 5230efbf33SFabien Chouteau qemu_irq output[SIFIVE_GPIO_PINS]; 5330efbf33SFabien Chouteau 5430efbf33SFabien Chouteau uint32_t value; /* Actual value of the pin */ 5530efbf33SFabien Chouteau uint32_t input_en; 5630efbf33SFabien Chouteau uint32_t output_en; 5730efbf33SFabien Chouteau uint32_t port; /* Pin value requested by the user */ 5830efbf33SFabien Chouteau uint32_t pue; 5930efbf33SFabien Chouteau uint32_t ds; 6030efbf33SFabien Chouteau uint32_t rise_ie; 6130efbf33SFabien Chouteau uint32_t rise_ip; 6230efbf33SFabien Chouteau uint32_t fall_ie; 6330efbf33SFabien Chouteau uint32_t fall_ip; 6430efbf33SFabien Chouteau uint32_t high_ie; 6530efbf33SFabien Chouteau uint32_t high_ip; 6630efbf33SFabien Chouteau uint32_t low_ie; 6730efbf33SFabien Chouteau uint32_t low_ip; 6830efbf33SFabien Chouteau uint32_t iof_en; 6930efbf33SFabien Chouteau uint32_t iof_sel; 7030efbf33SFabien Chouteau uint32_t out_xor; 7130efbf33SFabien Chouteau uint32_t in; 7230efbf33SFabien Chouteau uint32_t in_mask; 734bb216f6SBin Meng 744bb216f6SBin Meng /* config */ 754bb216f6SBin Meng uint32_t ngpio; 76*ac900edeSEduardo Habkost }; 7730efbf33SFabien Chouteau 782e30ccb4SBin Meng #endif /* SIFIVE_GPIO_H */ 79