xref: /qemu/include/hw/gpio/aspeed_gpio.h (revision 87bd33e8b0d2e08a6030ffced9433e5927360de5)
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