14b7f9568SRashmica Gupta /* 24b7f9568SRashmica Gupta * ASPEED GPIO Controller 34b7f9568SRashmica Gupta * 44b7f9568SRashmica Gupta * Copyright (C) 2017-2018 IBM Corp. 54b7f9568SRashmica Gupta * 64b7f9568SRashmica Gupta * This code is licensed under the GPL version 2 or later. See 74b7f9568SRashmica Gupta * the COPYING file in the top-level directory. 84b7f9568SRashmica Gupta */ 94b7f9568SRashmica Gupta 104b7f9568SRashmica Gupta #ifndef ASPEED_GPIO_H 114b7f9568SRashmica Gupta #define ASPEED_GPIO_H 124b7f9568SRashmica Gupta 134b7f9568SRashmica Gupta #include "hw/sysbus.h" 14db1015e9SEduardo Habkost #include "qom/object.h" 154b7f9568SRashmica Gupta 164b7f9568SRashmica Gupta #define TYPE_ASPEED_GPIO "aspeed.gpio" 17a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(AspeedGPIOState, AspeedGPIOClass, ASPEED_GPIO) 184b7f9568SRashmica Gupta 194b7f9568SRashmica Gupta #define ASPEED_GPIO_MAX_NR_SETS 8 2087bd33e8SPeter Delevoryas #define ASPEED_GPIOS_PER_SET 32 214b7f9568SRashmica Gupta #define ASPEED_REGS_PER_BANK 14 224b7f9568SRashmica Gupta #define ASPEED_GPIO_MAX_NR_REGS (ASPEED_REGS_PER_BANK * ASPEED_GPIO_MAX_NR_SETS) 234b7f9568SRashmica Gupta #define ASPEED_GROUPS_PER_SET 4 244b7f9568SRashmica Gupta #define ASPEED_GPIO_NR_DEBOUNCE_REGS 3 254b7f9568SRashmica Gupta #define ASPEED_CHARS_PER_GROUP_LABEL 4 264b7f9568SRashmica Gupta 274b7f9568SRashmica Gupta typedef struct GPIOSets GPIOSets; 284b7f9568SRashmica Gupta 294b7f9568SRashmica Gupta typedef struct GPIOSetProperties { 304b7f9568SRashmica Gupta uint32_t input; 314b7f9568SRashmica Gupta uint32_t output; 324b7f9568SRashmica Gupta char group_label[ASPEED_GROUPS_PER_SET][ASPEED_CHARS_PER_GROUP_LABEL]; 334b7f9568SRashmica Gupta } GPIOSetProperties; 344b7f9568SRashmica Gupta 354b7f9568SRashmica Gupta enum GPIORegType { 364b7f9568SRashmica Gupta gpio_not_a_reg, 374b7f9568SRashmica Gupta gpio_reg_data_value, 384b7f9568SRashmica Gupta gpio_reg_direction, 394b7f9568SRashmica Gupta gpio_reg_int_enable, 404b7f9568SRashmica Gupta gpio_reg_int_sens_0, 414b7f9568SRashmica Gupta gpio_reg_int_sens_1, 424b7f9568SRashmica Gupta gpio_reg_int_sens_2, 434b7f9568SRashmica Gupta gpio_reg_int_status, 444b7f9568SRashmica Gupta gpio_reg_reset_tolerant, 454b7f9568SRashmica Gupta gpio_reg_debounce_1, 464b7f9568SRashmica Gupta gpio_reg_debounce_2, 474b7f9568SRashmica Gupta gpio_reg_cmd_source_0, 484b7f9568SRashmica Gupta gpio_reg_cmd_source_1, 494b7f9568SRashmica Gupta gpio_reg_data_read, 504b7f9568SRashmica Gupta gpio_reg_input_mask, 514b7f9568SRashmica Gupta }; 524b7f9568SRashmica Gupta 53247c0029SJamin Lin /* GPIO index mode */ 54247c0029SJamin Lin enum GPIORegIndexType { 55247c0029SJamin Lin gpio_reg_idx_data = 0, 56247c0029SJamin Lin gpio_reg_idx_direction, 57247c0029SJamin Lin gpio_reg_idx_interrupt, 58247c0029SJamin Lin gpio_reg_idx_debounce, 59247c0029SJamin Lin gpio_reg_idx_tolerance, 60247c0029SJamin Lin gpio_reg_idx_cmd_src, 61247c0029SJamin Lin gpio_reg_idx_input_mask, 62247c0029SJamin Lin gpio_reg_idx_reserved, 63247c0029SJamin Lin gpio_reg_idx_new_w_cmd_src, 64247c0029SJamin Lin gpio_reg_idx_new_r_cmd_src, 65247c0029SJamin Lin }; 66247c0029SJamin Lin 674b7f9568SRashmica Gupta typedef struct AspeedGPIOReg { 684b7f9568SRashmica Gupta uint16_t set_idx; 694b7f9568SRashmica Gupta enum GPIORegType type; 704b7f9568SRashmica Gupta } AspeedGPIOReg; 714b7f9568SRashmica Gupta 72db1015e9SEduardo Habkost struct AspeedGPIOClass { 734b7f9568SRashmica Gupta SysBusDevice parent_obj; 744b7f9568SRashmica Gupta const GPIOSetProperties *props; 754b7f9568SRashmica Gupta uint32_t nr_gpio_pins; 764b7f9568SRashmica Gupta uint32_t nr_gpio_sets; 774b7f9568SRashmica Gupta const AspeedGPIOReg *reg_table; 7887511bb8SZheyu Ma unsigned reg_table_count; 799422dbd1SJamin Lin uint64_t mem_size; 80*404e7534SJamin Lin const MemoryRegionOps *reg_ops; 81db1015e9SEduardo Habkost }; 824b7f9568SRashmica Gupta 83db1015e9SEduardo Habkost struct AspeedGPIOState { 844b7f9568SRashmica Gupta /* <private> */ 854b7f9568SRashmica Gupta SysBusDevice parent; 864b7f9568SRashmica Gupta 874b7f9568SRashmica Gupta /*< public >*/ 884b7f9568SRashmica Gupta MemoryRegion iomem; 894b7f9568SRashmica Gupta int pending; 904b7f9568SRashmica Gupta qemu_irq irq; 9187bd33e8SPeter Delevoryas qemu_irq gpios[ASPEED_GPIO_MAX_NR_SETS][ASPEED_GPIOS_PER_SET]; 924b7f9568SRashmica Gupta 934b7f9568SRashmica Gupta /* Parallel GPIO Registers */ 944b7f9568SRashmica Gupta uint32_t debounce_regs[ASPEED_GPIO_NR_DEBOUNCE_REGS]; 954b7f9568SRashmica Gupta struct GPIOSets { 964b7f9568SRashmica Gupta uint32_t data_value; /* Reflects pin values */ 974b7f9568SRashmica Gupta uint32_t data_read; /* Contains last value written to data value */ 984b7f9568SRashmica Gupta uint32_t direction; 994b7f9568SRashmica Gupta uint32_t int_enable; 1004b7f9568SRashmica Gupta uint32_t int_sens_0; 1014b7f9568SRashmica Gupta uint32_t int_sens_1; 1024b7f9568SRashmica Gupta uint32_t int_sens_2; 1034b7f9568SRashmica Gupta uint32_t int_status; 1044b7f9568SRashmica Gupta uint32_t reset_tol; 1054b7f9568SRashmica Gupta uint32_t cmd_source_0; 1064b7f9568SRashmica Gupta uint32_t cmd_source_1; 1074b7f9568SRashmica Gupta uint32_t debounce_1; 1084b7f9568SRashmica Gupta uint32_t debounce_2; 1094b7f9568SRashmica Gupta uint32_t input_mask; 1104b7f9568SRashmica Gupta } sets[ASPEED_GPIO_MAX_NR_SETS]; 111db1015e9SEduardo Habkost }; 1124b7f9568SRashmica Gupta 113ea9cea93SMarkus Armbruster #endif /* ASPEED_GPIO_H */ 114