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