root/include/linux/mfd/gsc.h
/* SPDX-License-Identifier: GPL-2.0
 *
 * Copyright (C) 2020 Gateworks Corporation
 */
#ifndef __LINUX_MFD_GSC_H_
#define __LINUX_MFD_GSC_H_

#include <linux/regmap.h>

/* Device Addresses */
#define GSC_MISC        0x20
#define GSC_UPDATE      0x21
#define GSC_GPIO        0x23
#define GSC_HWMON       0x29
#define GSC_EEPROM0     0x50
#define GSC_EEPROM1     0x51
#define GSC_EEPROM2     0x52
#define GSC_EEPROM3     0x53
#define GSC_RTC         0x68

/* Register offsets */
enum {
        GSC_CTRL_0      = 0x00,
        GSC_CTRL_1      = 0x01,
        GSC_TIME        = 0x02,
        GSC_TIME_ADD    = 0x06,
        GSC_IRQ_STATUS  = 0x0A,
        GSC_IRQ_ENABLE  = 0x0B,
        GSC_FW_CRC      = 0x0C,
        GSC_FW_VER      = 0x0E,
        GSC_WP          = 0x0F,
};

/* Bit definitions */
#define GSC_CTRL_0_PB_HARD_RESET        0
#define GSC_CTRL_0_PB_CLEAR_SECURE_KEY  1
#define GSC_CTRL_0_PB_SOFT_POWER_DOWN   2
#define GSC_CTRL_0_PB_BOOT_ALTERNATE    3
#define GSC_CTRL_0_PERFORM_CRC          4
#define GSC_CTRL_0_TAMPER_DETECT        5
#define GSC_CTRL_0_SWITCH_HOLD          6

#define GSC_CTRL_1_SLEEP_ENABLE         0
#define GSC_CTRL_1_SLEEP_ACTIVATE       1
#define GSC_CTRL_1_SLEEP_ADD            2
#define GSC_CTRL_1_SLEEP_NOWAKEPB       3
#define GSC_CTRL_1_WDT_TIME             4
#define GSC_CTRL_1_WDT_ENABLE           5
#define GSC_CTRL_1_SWITCH_BOOT_ENABLE   6
#define GSC_CTRL_1_SWITCH_BOOT_CLEAR    7

#define GSC_IRQ_PB                      0
#define GSC_IRQ_KEY_ERASED              1
#define GSC_IRQ_EEPROM_WP               2
#define GSC_IRQ_RESV                    3
#define GSC_IRQ_GPIO                    4
#define GSC_IRQ_TAMPER                  5
#define GSC_IRQ_WDT_TIMEOUT             6
#define GSC_IRQ_SWITCH_HOLD             7

int gsc_read(void *context, unsigned int reg, unsigned int *val);
int gsc_write(void *context, unsigned int reg, unsigned int val);

struct gsc_dev {
        struct device *dev;

        struct i2c_client *i2c;         /* 0x20: interrupt controller, WDT */
        struct i2c_client *i2c_hwmon;   /* 0x29: hwmon, fan controller */

        struct regmap *regmap;

        unsigned int fwver;
        unsigned short fwcrc;
};

#endif /* __LINUX_MFD_GSC_H_ */