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