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 20*87bd33e8SPeter 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 534b7f9568SRashmica Gupta typedef struct AspeedGPIOReg { 544b7f9568SRashmica Gupta uint16_t set_idx; 554b7f9568SRashmica Gupta enum GPIORegType type; 564b7f9568SRashmica Gupta } AspeedGPIOReg; 574b7f9568SRashmica Gupta 58db1015e9SEduardo Habkost struct AspeedGPIOClass { 594b7f9568SRashmica Gupta SysBusDevice parent_obj; 604b7f9568SRashmica Gupta const GPIOSetProperties *props; 614b7f9568SRashmica Gupta uint32_t nr_gpio_pins; 624b7f9568SRashmica Gupta uint32_t nr_gpio_sets; 634b7f9568SRashmica Gupta const AspeedGPIOReg *reg_table; 64db1015e9SEduardo Habkost }; 654b7f9568SRashmica Gupta 66db1015e9SEduardo Habkost struct AspeedGPIOState { 674b7f9568SRashmica Gupta /* <private> */ 684b7f9568SRashmica Gupta SysBusDevice parent; 694b7f9568SRashmica Gupta 704b7f9568SRashmica Gupta /*< public >*/ 714b7f9568SRashmica Gupta MemoryRegion iomem; 724b7f9568SRashmica Gupta int pending; 734b7f9568SRashmica Gupta qemu_irq irq; 74*87bd33e8SPeter Delevoryas qemu_irq gpios[ASPEED_GPIO_MAX_NR_SETS][ASPEED_GPIOS_PER_SET]; 754b7f9568SRashmica Gupta 764b7f9568SRashmica Gupta /* Parallel GPIO Registers */ 774b7f9568SRashmica Gupta uint32_t debounce_regs[ASPEED_GPIO_NR_DEBOUNCE_REGS]; 784b7f9568SRashmica Gupta struct GPIOSets { 794b7f9568SRashmica Gupta uint32_t data_value; /* Reflects pin values */ 804b7f9568SRashmica Gupta uint32_t data_read; /* Contains last value written to data value */ 814b7f9568SRashmica Gupta uint32_t direction; 824b7f9568SRashmica Gupta uint32_t int_enable; 834b7f9568SRashmica Gupta uint32_t int_sens_0; 844b7f9568SRashmica Gupta uint32_t int_sens_1; 854b7f9568SRashmica Gupta uint32_t int_sens_2; 864b7f9568SRashmica Gupta uint32_t int_status; 874b7f9568SRashmica Gupta uint32_t reset_tol; 884b7f9568SRashmica Gupta uint32_t cmd_source_0; 894b7f9568SRashmica Gupta uint32_t cmd_source_1; 904b7f9568SRashmica Gupta uint32_t debounce_1; 914b7f9568SRashmica Gupta uint32_t debounce_2; 924b7f9568SRashmica Gupta uint32_t input_mask; 934b7f9568SRashmica Gupta } sets[ASPEED_GPIO_MAX_NR_SETS]; 94db1015e9SEduardo Habkost }; 954b7f9568SRashmica Gupta 964b7f9568SRashmica Gupta #endif /* _ASPEED_GPIO_H_ */ 97