/*
 *  ASPEED GPIO Controller
 *
 *  Copyright (C) 2017-2018 IBM Corp.
 *
 * This code is licensed under the GPL version 2 or later.  See
 * the COPYING file in the top-level directory.
 */

#ifndef ASPEED_GPIO_H
#define ASPEED_GPIO_H

#include "hw/sysbus.h"

#define TYPE_ASPEED_GPIO "aspeed.gpio"
#define ASPEED_GPIO(obj) OBJECT_CHECK(AspeedGPIOState, (obj), TYPE_ASPEED_GPIO)
#define ASPEED_GPIO_CLASS(klass) \
     OBJECT_CLASS_CHECK(AspeedGPIOClass, (klass), TYPE_ASPEED_GPIO)
#define ASPEED_GPIO_GET_CLASS(obj) \
     OBJECT_GET_CLASS(AspeedGPIOClass, (obj), TYPE_ASPEED_GPIO)

#define ASPEED_GPIO_MAX_NR_SETS 8
#define ASPEED_REGS_PER_BANK 14
#define ASPEED_GPIO_MAX_NR_REGS (ASPEED_REGS_PER_BANK * ASPEED_GPIO_MAX_NR_SETS)
#define ASPEED_GPIO_NR_PINS 228
#define ASPEED_GROUPS_PER_SET 4
#define ASPEED_GPIO_NR_DEBOUNCE_REGS 3
#define ASPEED_CHARS_PER_GROUP_LABEL 4

typedef struct GPIOSets GPIOSets;

typedef struct GPIOSetProperties {
    uint32_t input;
    uint32_t output;
    char group_label[ASPEED_GROUPS_PER_SET][ASPEED_CHARS_PER_GROUP_LABEL];
} GPIOSetProperties;

enum GPIORegType {
    gpio_not_a_reg,
    gpio_reg_data_value,
    gpio_reg_direction,
    gpio_reg_int_enable,
    gpio_reg_int_sens_0,
    gpio_reg_int_sens_1,
    gpio_reg_int_sens_2,
    gpio_reg_int_status,
    gpio_reg_reset_tolerant,
    gpio_reg_debounce_1,
    gpio_reg_debounce_2,
    gpio_reg_cmd_source_0,
    gpio_reg_cmd_source_1,
    gpio_reg_data_read,
    gpio_reg_input_mask,
};

typedef struct AspeedGPIOReg {
    uint16_t set_idx;
    enum GPIORegType type;
 } AspeedGPIOReg;

typedef struct  AspeedGPIOClass {
    SysBusDevice parent_obj;
    const GPIOSetProperties *props;
    uint32_t nr_gpio_pins;
    uint32_t nr_gpio_sets;
    uint32_t gap;
    const AspeedGPIOReg *reg_table;
}  AspeedGPIOClass;

typedef struct AspeedGPIOState {
    /* <private> */
    SysBusDevice parent;

    /*< public >*/
    MemoryRegion iomem;
    int pending;
    qemu_irq irq;
    qemu_irq gpios[ASPEED_GPIO_NR_PINS];

/* Parallel GPIO Registers */
    uint32_t debounce_regs[ASPEED_GPIO_NR_DEBOUNCE_REGS];
    struct GPIOSets {
        uint32_t data_value; /* Reflects pin values */
        uint32_t data_read; /* Contains last value written to data value */
        uint32_t direction;
        uint32_t int_enable;
        uint32_t int_sens_0;
        uint32_t int_sens_1;
        uint32_t int_sens_2;
        uint32_t int_status;
        uint32_t reset_tol;
        uint32_t cmd_source_0;
        uint32_t cmd_source_1;
        uint32_t debounce_1;
        uint32_t debounce_2;
        uint32_t input_mask;
    } sets[ASPEED_GPIO_MAX_NR_SETS];
} AspeedGPIOState;

#endif /* _ASPEED_GPIO_H_ */
