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" 14*db1015e9SEduardo Habkost #include "qom/object.h" 154b7f9568SRashmica Gupta 164b7f9568SRashmica Gupta #define TYPE_ASPEED_GPIO "aspeed.gpio" 17*db1015e9SEduardo Habkost typedef struct AspeedGPIOClass AspeedGPIOClass; 18*db1015e9SEduardo Habkost typedef struct AspeedGPIOState AspeedGPIOState; 194b7f9568SRashmica Gupta #define ASPEED_GPIO(obj) OBJECT_CHECK(AspeedGPIOState, (obj), TYPE_ASPEED_GPIO) 204b7f9568SRashmica Gupta #define ASPEED_GPIO_CLASS(klass) \ 214b7f9568SRashmica Gupta OBJECT_CLASS_CHECK(AspeedGPIOClass, (klass), TYPE_ASPEED_GPIO) 224b7f9568SRashmica Gupta #define ASPEED_GPIO_GET_CLASS(obj) \ 234b7f9568SRashmica Gupta OBJECT_GET_CLASS(AspeedGPIOClass, (obj), TYPE_ASPEED_GPIO) 244b7f9568SRashmica Gupta 254b7f9568SRashmica Gupta #define ASPEED_GPIO_MAX_NR_SETS 8 264b7f9568SRashmica Gupta #define ASPEED_REGS_PER_BANK 14 274b7f9568SRashmica Gupta #define ASPEED_GPIO_MAX_NR_REGS (ASPEED_REGS_PER_BANK * ASPEED_GPIO_MAX_NR_SETS) 284b7f9568SRashmica Gupta #define ASPEED_GPIO_NR_PINS 228 294b7f9568SRashmica Gupta #define ASPEED_GROUPS_PER_SET 4 304b7f9568SRashmica Gupta #define ASPEED_GPIO_NR_DEBOUNCE_REGS 3 314b7f9568SRashmica Gupta #define ASPEED_CHARS_PER_GROUP_LABEL 4 324b7f9568SRashmica Gupta 334b7f9568SRashmica Gupta typedef struct GPIOSets GPIOSets; 344b7f9568SRashmica Gupta 354b7f9568SRashmica Gupta typedef struct GPIOSetProperties { 364b7f9568SRashmica Gupta uint32_t input; 374b7f9568SRashmica Gupta uint32_t output; 384b7f9568SRashmica Gupta char group_label[ASPEED_GROUPS_PER_SET][ASPEED_CHARS_PER_GROUP_LABEL]; 394b7f9568SRashmica Gupta } GPIOSetProperties; 404b7f9568SRashmica Gupta 414b7f9568SRashmica Gupta enum GPIORegType { 424b7f9568SRashmica Gupta gpio_not_a_reg, 434b7f9568SRashmica Gupta gpio_reg_data_value, 444b7f9568SRashmica Gupta gpio_reg_direction, 454b7f9568SRashmica Gupta gpio_reg_int_enable, 464b7f9568SRashmica Gupta gpio_reg_int_sens_0, 474b7f9568SRashmica Gupta gpio_reg_int_sens_1, 484b7f9568SRashmica Gupta gpio_reg_int_sens_2, 494b7f9568SRashmica Gupta gpio_reg_int_status, 504b7f9568SRashmica Gupta gpio_reg_reset_tolerant, 514b7f9568SRashmica Gupta gpio_reg_debounce_1, 524b7f9568SRashmica Gupta gpio_reg_debounce_2, 534b7f9568SRashmica Gupta gpio_reg_cmd_source_0, 544b7f9568SRashmica Gupta gpio_reg_cmd_source_1, 554b7f9568SRashmica Gupta gpio_reg_data_read, 564b7f9568SRashmica Gupta gpio_reg_input_mask, 574b7f9568SRashmica Gupta }; 584b7f9568SRashmica Gupta 594b7f9568SRashmica Gupta typedef struct AspeedGPIOReg { 604b7f9568SRashmica Gupta uint16_t set_idx; 614b7f9568SRashmica Gupta enum GPIORegType type; 624b7f9568SRashmica Gupta } AspeedGPIOReg; 634b7f9568SRashmica Gupta 64*db1015e9SEduardo Habkost struct AspeedGPIOClass { 654b7f9568SRashmica Gupta SysBusDevice parent_obj; 664b7f9568SRashmica Gupta const GPIOSetProperties *props; 674b7f9568SRashmica Gupta uint32_t nr_gpio_pins; 684b7f9568SRashmica Gupta uint32_t nr_gpio_sets; 694b7f9568SRashmica Gupta uint32_t gap; 704b7f9568SRashmica Gupta const AspeedGPIOReg *reg_table; 71*db1015e9SEduardo Habkost }; 724b7f9568SRashmica Gupta 73*db1015e9SEduardo Habkost struct AspeedGPIOState { 744b7f9568SRashmica Gupta /* <private> */ 754b7f9568SRashmica Gupta SysBusDevice parent; 764b7f9568SRashmica Gupta 774b7f9568SRashmica Gupta /*< public >*/ 784b7f9568SRashmica Gupta MemoryRegion iomem; 794b7f9568SRashmica Gupta int pending; 804b7f9568SRashmica Gupta qemu_irq irq; 814b7f9568SRashmica Gupta qemu_irq gpios[ASPEED_GPIO_NR_PINS]; 824b7f9568SRashmica Gupta 834b7f9568SRashmica Gupta /* Parallel GPIO Registers */ 844b7f9568SRashmica Gupta uint32_t debounce_regs[ASPEED_GPIO_NR_DEBOUNCE_REGS]; 854b7f9568SRashmica Gupta struct GPIOSets { 864b7f9568SRashmica Gupta uint32_t data_value; /* Reflects pin values */ 874b7f9568SRashmica Gupta uint32_t data_read; /* Contains last value written to data value */ 884b7f9568SRashmica Gupta uint32_t direction; 894b7f9568SRashmica Gupta uint32_t int_enable; 904b7f9568SRashmica Gupta uint32_t int_sens_0; 914b7f9568SRashmica Gupta uint32_t int_sens_1; 924b7f9568SRashmica Gupta uint32_t int_sens_2; 934b7f9568SRashmica Gupta uint32_t int_status; 944b7f9568SRashmica Gupta uint32_t reset_tol; 954b7f9568SRashmica Gupta uint32_t cmd_source_0; 964b7f9568SRashmica Gupta uint32_t cmd_source_1; 974b7f9568SRashmica Gupta uint32_t debounce_1; 984b7f9568SRashmica Gupta uint32_t debounce_2; 994b7f9568SRashmica Gupta uint32_t input_mask; 1004b7f9568SRashmica Gupta } sets[ASPEED_GPIO_MAX_NR_SETS]; 101*db1015e9SEduardo Habkost }; 1024b7f9568SRashmica Gupta 1034b7f9568SRashmica Gupta #endif /* _ASPEED_GPIO_H_ */ 104