| /* |
| * ASPEED GPIO Controller |
| * |
| * Copyright (C) 2017-2018 IBM Corp. |
| * |
| * This code is licensed under the GPL version 2 or later. See |
| * the COPYING file in the top-level directory. |
| */ |
| |
| #ifndef ASPEED_GPIO_H |
| #define ASPEED_GPIO_H |
| |
| #include "hw/sysbus.h" |
| #include "qom/object.h" |
| |
| #define TYPE_ASPEED_GPIO "aspeed.gpio" |
| OBJECT_DECLARE_TYPE(AspeedGPIOState, AspeedGPIOClass, ASPEED_GPIO) |
| |
| #define ASPEED_GPIO_MAX_NR_SETS 8 |
| #define ASPEED_GPIOS_PER_SET 32 |
| #define ASPEED_REGS_PER_BANK 14 |
| #define ASPEED_GPIO_MAX_NR_REGS (ASPEED_REGS_PER_BANK * ASPEED_GPIO_MAX_NR_SETS) |
| #define ASPEED_GROUPS_PER_SET 4 |
| #define ASPEED_GPIO_NR_DEBOUNCE_REGS 3 |
| #define ASPEED_CHARS_PER_GROUP_LABEL 4 |
| |
| typedef struct GPIOSets GPIOSets; |
| |
| typedef struct GPIOSetProperties { |
| uint32_t input; |
| uint32_t output; |
| char group_label[ASPEED_GROUPS_PER_SET][ASPEED_CHARS_PER_GROUP_LABEL]; |
| } GPIOSetProperties; |
| |
| enum GPIORegType { |
| gpio_not_a_reg, |
| gpio_reg_data_value, |
| gpio_reg_direction, |
| gpio_reg_int_enable, |
| gpio_reg_int_sens_0, |
| gpio_reg_int_sens_1, |
| gpio_reg_int_sens_2, |
| gpio_reg_int_status, |
| gpio_reg_reset_tolerant, |
| gpio_reg_debounce_1, |
| gpio_reg_debounce_2, |
| gpio_reg_cmd_source_0, |
| gpio_reg_cmd_source_1, |
| gpio_reg_data_read, |
| gpio_reg_input_mask, |
| }; |
| |
| /* GPIO index mode */ |
| enum GPIORegIndexType { |
| gpio_reg_idx_data = 0, |
| gpio_reg_idx_direction, |
| gpio_reg_idx_interrupt, |
| gpio_reg_idx_debounce, |
| gpio_reg_idx_tolerance, |
| gpio_reg_idx_cmd_src, |
| gpio_reg_idx_input_mask, |
| gpio_reg_idx_reserved, |
| gpio_reg_idx_new_w_cmd_src, |
| gpio_reg_idx_new_r_cmd_src, |
| }; |
| |
| typedef struct AspeedGPIOReg { |
| uint16_t set_idx; |
| enum GPIORegType type; |
| } AspeedGPIOReg; |
| |
| struct AspeedGPIOClass { |
| SysBusDevice parent_obj; |
| const GPIOSetProperties *props; |
| uint32_t nr_gpio_pins; |
| uint32_t nr_gpio_sets; |
| const AspeedGPIOReg *reg_table; |
| unsigned reg_table_count; |
| uint64_t mem_size; |
| const MemoryRegionOps *reg_ops; |
| }; |
| |
| struct AspeedGPIOState { |
| /* <private> */ |
| SysBusDevice parent; |
| |
| /*< public >*/ |
| MemoryRegion iomem; |
| int pending; |
| qemu_irq irq; |
| qemu_irq gpios[ASPEED_GPIO_MAX_NR_SETS][ASPEED_GPIOS_PER_SET]; |
| |
| /* Parallel GPIO Registers */ |
| uint32_t debounce_regs[ASPEED_GPIO_NR_DEBOUNCE_REGS]; |
| struct GPIOSets { |
| uint32_t data_value; /* Reflects pin values */ |
| uint32_t data_read; /* Contains last value written to data value */ |
| uint32_t direction; |
| uint32_t int_enable; |
| uint32_t int_sens_0; |
| uint32_t int_sens_1; |
| uint32_t int_sens_2; |
| uint32_t int_status; |
| uint32_t reset_tol; |
| uint32_t cmd_source_0; |
| uint32_t cmd_source_1; |
| uint32_t debounce_1; |
| uint32_t debounce_2; |
| uint32_t input_mask; |
| } sets[ASPEED_GPIO_MAX_NR_SETS]; |
| }; |
| |
| #endif /* ASPEED_GPIO_H */ |