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