root/usr.sbin/emcfanctl/emcfanctlconst.h
/*      $NetBSD: emcfanctlconst.h,v 1.1 2025/03/11 13:56:48 brad Exp $  */

/*
 * Copyright (c) 2025 Brad Spencer <brad@anduin.eldar.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _EMCFANCTLCONST_H_
#define _EMCFANCTLCONST_H_

/* These structures describe the command line command structure */

static const struct emcfanctlcmd emcfanctlcmds[] = {
        {
                .cmd = "info",
                .id = EMCFANCTL_INFO,
                .helpargs = ""

        },
        {
                .cmd = "register",
                .id = EMCFANCTL_REGISTER,
                .helpargs = "list|read|write"

        },
        {
                .cmd = "fan",
                .id = EMCFANCTL_FAN,
                .helpargs = "<n> drive|divider|min_expected_rpm|edges|polarity read|write|inverted|non-inverted <write value>"
        },
        {
                .cmd = "apd",
                .id = EMCFANCTL_APD,
                .helpargs = "read|on|off"
        },
        {
                .cmd = "smbus_timeout",
                .id = EMCFANCTL_SMBUSTO,
                .helpargs = "read|on|off"
        }
};

static const struct emcfanctlcmd emcfanctlregistercmds[] = {
        {
                .cmd = "list",
                .id = EMCFANCTL_REGISTER_LIST,
                .helpargs = "list"

        },
        {
                .cmd = "read",
                .id = EMCFANCTL_REGISTER_READ,
                .helpargs = "read start_register [end_register]"

        },
        {
                .cmd = "write",
                .id = EMCFANCTL_REGISTER_WRITE,
                .helpargs = "write register value"

        }
};

static const struct emcfanctlcmd emcfanctlfancmds[] = {
        {
                .cmd = "status",
                .id = EMCFANCTL_FAN_STATUS,
                .helpargs = "<n> status"
        },
        {
                .cmd = "drive",
                .id = EMCFANCTL_FAN_DRIVE,
                .helpargs = "drive"
        },
        {
                .cmd = "divider",
                .id = EMCFANCTL_FAN_DIVIDER,
                .helpargs = "divider"
        },
        {
                .cmd = "min_expected_rpm",
                .id = EMCFANCTL_FAN_MINEXPECTED_RPM,
                .helpargs = "min_expected_rpm"
        },
        {
                .cmd = "edges",
                .id = EMCFANCTL_FAN_EDGES,
                .helpargs = "edges"
        },
        {
                .cmd = "polarity",
                .id = EMCFANCTL_FAN_POLARITY,
                .helpargs = "polarity read|inverted|non-inverted"
        },
        {
                .cmd = "pwm_base_frequency",
                .id = EMCFANCTL_FAN_PWM_BASEFREQ,
                .helpargs = "pwm_base_frequency read|write"
        },
        {
                .cmd = "pwm_output_type",
                .id = EMCFANCTL_FAN_PWM_OUTPUTTYPE,
                .helpargs = "pwm_output_type read|push-pull|open-drain"
        }
};

static const struct emcfanctlcmd emcfanctlddcmds[] = {
        {
                .cmd = "read",
                .id = EMCFANCTL_FAN_DD_READ,
                .helpargs = "read"
        },
        {
                .cmd = "write",
                .id = EMCFANCTL_FAN_DD_WRITE,
                .helpargs = "write"
        }
};

static const struct emcfanctlcmd emcfanctlpcmds[] = {
        {
                .cmd = "read",
                .id = EMCFANCTL_FAN_P_READ,
                .helpargs = "read"
        },
        {
                .cmd = "inverted",
                .id = EMCFANCTL_FAN_P_INVERTED,
                .helpargs = "inverted"
        },
        {
                .cmd = "non-inverted",
                .id = EMCFANCTL_FAN_P_NONINVERTED,
                .helpargs = "non-inverted"
        }
};

static const struct emcfanctlcmd emcfanctlotcmds[] = {
        {
                .cmd = "read",
                .id = EMCFANCTL_FAN_OT_READ,
                .helpargs = "read"
        },
        {
                .cmd = "push-pull",
                .id = EMCFANCTL_FAN_OT_PUSHPULL,
                .helpargs = "push-pull"
        },
        {
                .cmd = "open-drain",
                .id = EMCFANCTL_FAN_OT_OPENDRAIN,
                .helpargs = "open-drain"
        }
};

static const struct emcfanctlcmd emcfanctlapdsmtocmds[] = {
        {
                .cmd = "read",
                .id = EMCFANCTL_APD_READ,
                .helpargs = "read"
        },
        {
                .cmd = "on",
                .id = EMCFANCTL_APD_ON,
                .helpargs = "on"
        },
        {
                .cmd = "off",
                .id = EMCFANCTL_APD_OFF,
                .helpargs = "off"
        }
};

/* Name the registers for each of the chip types */

static const struct emcfan_registers emcfanctl_2101_registers[] = {
        {
                .name = "internal_temperature",
                .reg = 0x00
        },
        {
                .name = "external_diode_temperature_high_byte",
                .reg = 0x01
        },
        {
                .name = "status",
                .reg = 0x02
        },
        {
                .name = "configuration",
                .reg = 0x03
        },
        {
                .name = "conversion_rate",
                .reg = 0x04
        },
        {
                .name = "internal_temp_limit",
                .reg = 0x05
        },
        {
                .name = "external_temp_high_limit_high_byte",
                .reg = 0x07
        },
        {
                .name = "external_temp_low_limit_high_byte",
                .reg = 0x08
        },
        {
                .name = "configuration_alt",
                .reg = 0x09
        },
        {
                .name = "conversion_rate_alt",
                .reg = 0x0A
        },
        {
                .name = "internal_temp_limit_alt",
                .reg = 0x0B
        },
        {
                .name = "external_temp_high_limit_high_byte_alt",
                .reg = 0x0D
        },
        {
                .name = "external_temp_low_limit_high_byte_alt",
                .reg = 0x0E
        },
        {
                .name = "external_temperature_force",
                .reg = 0x0C
        },
        {
                .name = "one_shot",
                .reg = 0x0F
        },
        {
                .name = "external_diode_temperature_low_byte",
                .reg = 0x10
        },
        {
                .name = "scratchpad1",
                .reg = 0x11
        },
        {
                .name = "scratchpad2",
                .reg = 0x12
        },
        {
                .name = "external_diode_high_limit_low_byte",
                .reg = 0x13
        },
        {
                .name = "external_diode_low_limit_low_byte",
                .reg = 0x14
        },
        {
                .name = "alert_mask",
                .reg = 0x16
        },
        {
                .name = "external_diode_ideality_factor",
                .reg = 0x17
        },
        {
                .name = "beta_compensation_factor",
                .reg = 0x18
        },
        {
                .name = "tcrit_temp_limit",
                .reg = 0x19
        },
        {
                .name = "tcrit_hysteresis",
                .reg = 0x21
        },
        {
                .name = "tach_reading_low_byte",
                .reg = 0x46
        },
        {
                .name = "tach_reading_high_byte",
                .reg = 0x47
        },
        {
                .name = "tach_limit_low_byte",
                .reg = 0x48
        },
        {
                .name = "tach_limit_high_byte",
                .reg = 0x49
        },
        {
                .name = "fan_configuration",
                .reg = 0x4A
        },
        {
                .name = "fan_spin-up",
                .reg = 0x4B
        },
        {
                .name = "fan_setting",
                .reg = 0x4C
        },
        {
                .name = "pwm_frequency",
                .reg = 0x4D
        },
        {
                .name = "pwm_frequency_divide",
                .reg = 0x4E
        },
        {
                .name = "lookup_table_hysteresis",
                .reg = 0x4F
        },
        {
                .name = "lookup_table_temp_setting_1",
                .reg = 0x50
        },
        {
                .name = "lookup_table_fan_setting_1",
                .reg = 0x51
        },
        {
                .name = "lookup_table_temp_setting_2",
                .reg = 0x52
        },
        {
                .name = "lookup_table_fan_setting_2",
                .reg = 0x53
        },
        {
                .name = "lookup_table_temp_setting_3",
                .reg = 0x54
        },
        {
                .name = "lookup_table_fan_setting_3",
                .reg = 0x55
        },
        {
                .name = "lookup_table_temp_setting_4",
                .reg = 0x56
        },
        {
                .name = "lookup_table_fan_setting_4",
                .reg = 0x57
        },
        {
                .name = "lookup_table_temp_setting_5",
                .reg = 0x58
        },
        {
                .name = "lookup_table_fan_setting_5",
                .reg = 0x59
        },
        {
                .name = "lookup_table_temp_setting_6",
                .reg = 0x5A
        },
        {
                .name = "lookup_table_fan_setting_6",
                .reg = 0x5B
        },
        {
                .name = "lookup_table_temp_setting_7",
                .reg = 0x5C
        },
        {
                .name = "lookup_table_fan_setting_7",
                .reg = 0x5D
        },
        {
                .name = "lookup_table_temp_setting_8",
                .reg = 0x5E
        },
        {
                .name = "lookup_table_fan_setting_8",
                .reg = 0x5F
        },
        {
                .name = "averaging_filter",
                .reg = 0xBF
        },
        {
                .name = "product_id",
                .reg = 0xFD
        },
        {
                .name = "manufacturer_id",
                .reg = 0xFE
        },
        {
                .name = "revision_register",
                .reg = 0xFF
        }
};

static const struct emcfan_registers emcfanctl_2103_1_registers[] = {
        {
                .name = "internal_temp_reading_high_byte",
                .reg = 0x00
        },
        {
                .name = "internal_temp_reading_low_byte",
                .reg = 0x01
        },
        {
                .name = "external_diode_1_temp_reading_high_byte",
                .reg = 0x02
        },
        {
                .name = "external_diode_1_temp_reading_low_byte",
                .reg = 0x03
        },
        {
                .name = "critical/thermal_shutdown_temperature",
                .reg = 0x0A
        },
        {
                .name = "pushed_temperature_1",
                .reg = 0x0C
        },
        {
                .name = "pushed_temperature_2",
                .reg = 0x0D
        },
        {
                .name = "trip_set_voltage",
                .reg = 0x10
        },
        {
                .name = "external_diode_1_ideality_register",
                .reg = 0x11
        },
        {
                .name = "external_diode_1_beta_configuration",
                .reg = 0x14
        },
        {
                .name = "external_diode_rec_configuration",
                .reg = 0x17
        },
        {
                .name = "external_diode_1_tcrit_limit",
                .reg = 0x19
        },
        {
                .name = "internal_diode_tcrit_limit",
                .reg = 0x1D
        },
        {
                .name = "tcrit_status",
                .reg = 0x1F
        },
        {
                .name = "configuration",
                .reg = 0x20
        },
        {
                .name = "configuration_2",
                .reg = 0x21
        },
        {
                .name = "interrupt_status",
                .reg = 0x23
        },
        {
                .name = "high_limit_status",
                .reg = 0x24
        },
        {
                .name = "low_limit_status",
                .reg = 0x25
        },
        {
                .name = "diode_fault",
                .reg = 0x26
        },
        {
                .name = "fan_status",
                .reg = 0x27
        },
        {
                .name = "interrupt_enable_register",
                .reg = 0x28
        },
        {
                .name = "fan_interrupt_enable_register",
                .reg = 0x29
        },
        {
                .name = "pwm_config",
                .reg = 0x2A
        },
        {
                .name = "pwm_base_frequency",
                .reg = 0x2B
        },
        {
                .name = "external_diode_1_temp_high_limit",
                .reg = 0x30
        },
        {
                .name = "internal_diode_high_limit",
                .reg = 0x34
        },
        {
                .name = "external_diode_1_temp_low_limit",
                .reg = 0x38
        },
        {
                .name = "internal_diode_low_limit",
                .reg = 0x3C
        },
        {
                .name = "fan_setting",
                .reg = 0x40
        },
        {
                .name = "pwm_divide",
                .reg = 0x41
        },
        {
                .name = "fan_configuration_1",
                .reg = 0x42
        },
        {
                .name = "fan_configuration_2",
                .reg = 0x43
        },
        {
                .name = "gain",
                .reg = 0x45
        },
        {
                .name = "fan_spin_up_configuration",
                .reg = 0x46
        },
        {
                .name = "fan_step",
                .reg = 0x47
        },
        {
                .name = "fan_minimum_drive",
                .reg = 0x48
        },
        {
                .name = "fan_valid_tach_count",
                .reg = 0x49
        },
        {
                .name = "fan_drive_fail_band_low_byte",
                .reg = 0x4A
        },
        {
                .name = "fan_drive_fail_band_high_byte",
                .reg = 0x4B
        },
        {
                .name = "tach_target_low_byte",
                .reg = 0x4C
        },
        {
                .name = "tach_target_high_byte",
                .reg = 0x4D
        },
        {
                .name = "tach_reading_high_byte",
                .reg = 0x4E
        },
        {
                .name = "tach_reading_low_byte",
                .reg = 0x4F
        },
        {
                .name = "lut_configuration",
                .reg = 0x50
        },
        {
                .name = "lut_drive_1",
                .reg = 0x51
        },
        {
                .name = "lut_temp_1_setting_1",
                .reg = 0x52
        },
        {
                .name = "lut_temp_2_setting_1",
                .reg = 0x53
        },
        {
                .name = "lut_temp_3_setting_1",
                .reg = 0x54
        },
        {
                .name = "lut_temp_4_setting_1",
                .reg = 0x55
        },
        {
                .name = "lut_drive_2",
                .reg = 0x56
        },
        {
                .name = "lut_temp_1_setting_2",
                .reg = 0x57
        },
        {
                .name = "lut_temp_2_setting_2",
                .reg = 0x58
        },
        {
                .name = "lut_temp_3_setting_2",
                .reg = 0x59
        },
        {
                .name = "lut_temp_4_setting_2",
                .reg = 0x5A
        },
        {
                .name = "lut_drive_3",
                .reg = 0x5B
        },
        {
                .name = "lut_temp_1_setting_3",
                .reg = 0x5C
        },
        {
                .name = "lut_temp_2_setting_3",
                .reg = 0x5D
        },
        {
                .name = "lut_temp_3_setting_3",
                .reg = 0x5E
        },
        {
                .name = "lut_temp_4_setting_3",
                .reg = 0x5F
        },
        {
                .name = "lut_drive_4",
                .reg = 0x60
        },
        {
                .name = "lut_temp_1_setting_4",
                .reg = 0x61
        },
        {
                .name = "lut_temp_2_setting_4",
                .reg = 0x62
        },
        {
                .name = "lut_temp_3_setting_4",
                .reg = 0x63
        },
        {
                .name = "lut_temp_4_setting_4",
                .reg = 0x64
        },
        {
                .name = "lut_drive_5",
                .reg = 0x65
        },
        {
                .name = "lut_temp_1_setting_5",
                .reg = 0x66
        },
        {
                .name = "lut_temp_2_setting_5",
                .reg = 0x67
        },
        {
                .name = "lut_temp_3_setting_5",
                .reg = 0x68
        },
        {
                .name = "lut_temp_4_setting_5",
                .reg = 0x69
        },
        {
                .name = "lut_drive_6",
                .reg = 0x6A
        },
        {
                .name = "lut_temp_1_setting_6",
                .reg = 0x6B
        },
        {
                .name = "lut_temp_2_setting_6",
                .reg = 0x6C
        },
        {
                .name = "lut_temp_3_setting_6",
                .reg = 0x6D
        },
        {
                .name = "lut_temp_4_setting_6",
                .reg = 0x6E
        },
        {
                .name = "lut_drive_7",
                .reg = 0x6F
        },
        {
                .name = "lut_temp_1_setting_7",
                .reg = 0x70
        },
        {
                .name = "lut_temp_2_setting_7",
                .reg = 0x71
        },
        {
                .name = "lut_temp_3_setting_7",
                .reg = 0x72
        },
        {
                .name = "lut_temp_4_setting_7",
                .reg = 0x73
        },
        {
                .name = "lut_drive_8",
                .reg = 0x74
        },
        {
                .name = "lut_temp_1_setting_8",
                .reg = 0x75
        },
        {
                .name = "lut_temp_2_setting_8",
                .reg = 0x76
        },
        {
                .name = "lut_temp_3_setting_8",
                .reg = 0x77
        },
        {
                .name = "lut_temp_4_setting_8",
                .reg = 0x78
        },
        {
                .name = "lut_temp_hysteresis",
                .reg = 0x79
        },
        {
                .name = "software_lock",
                .reg = 0xEF
        },
        {
                .name = "product_features",
                .reg = 0xFC
        },
        {
                .name = "product_id",
                .reg = 0xFD
        },
        {
                .name = "manufacturer_id",
                .reg = 0xFE
        },
        {
                .name = "revision",
                .reg = 0xFF
        }
};

static const struct emcfan_registers emcfanctl_2103_24_registers[] = {
        {
                .name = "internal_temp_reading_high_byte",
                .reg = 0x00
        },
        {
                .name = "internal_temp_reading_low_byte",
                .reg = 0x01
        },
        {
                .name = "external_diode_1_temp_reading_high_byte",
                .reg = 0x02
        },
        {
                .name = "external_diode_1_temp_reading_low_byte",
                .reg = 0x03
        },
        {
                .name = "external_diode_2_temp_reading_high_byte",
                .reg = 0x04
        },
        {
                .name = "external_diode_2_temp_reading_low_byte",
                .reg = 0x05
        },
        {
                .name = "external_diode_3_temp_reading_high_byte",
                .reg = 0x06
        },
        {
                .name = "external_diode_3_temp_reading_low_byte",
                .reg = 0x07
        },
        {
                .name = "critical/thermal_shutdown_temperature",
                .reg = 0x0A
        },
        {
                .name = "pushed_temperature_1",
                .reg = 0x0C
        },
        {
                .name = "pushed_temperature_2",
                .reg = 0x0D
        },
        {
                .name = "trip_set_voltage",
                .reg = 0x10
        },
        {
                .name = "external_diode_1_ideality_register",
                .reg = 0x11
        },
        {
                .name = "external_diode_2_ideality_register",
                .reg = 0x12
        },
        {
                .name = "external_diode_1_beta_configuration",
                .reg = 0x14
        },
        {
                .name = "external_diode_2_beta_configuration",
                .reg = 0x15
        },
        {
                .name = "external_diode_rec_configuration",
                .reg = 0x17
        },
        {
                .name = "external_diode_1_tcrit_limit",
                .reg = 0x19
        },
        {
                .name = "external_diode_2_tcrit_limit",
                .reg = 0x1A
        },
        {
                .name = "external_diode_3_tcrit_limit",
                .reg = 0x1B
        },
        {
                .name = "internal_diode_tcrit_limit",
                .reg = 0x1D
        },
        {
                .name = "tcrit_status",
                .reg = 0x1F
        },
        {
                .name = "configuration",
                .reg = 0x20
        },
        {
                .name = "configuration_2",
                .reg = 0x21
        },
        {
                .name = "interrupt_status",
                .reg = 0x23
        },
        {
                .name = "high_limit_status",
                .reg = 0x24
        },
        {
                .name = "low_limit_status",
                .reg = 0x25
        },
        {
                .name = "diode_fault",
                .reg = 0x26
        },
        {
                .name = "fan_status",
                .reg = 0x27
        },
        {
                .name = "interrupt_enable_register",
                .reg = 0x28
        },
        {
                .name = "fan_interrupt_enable_register",
                .reg = 0x29
        },
        {
                .name = "pwm_config",
                .reg = 0x2A
        },
        {
                .name = "pwm_base_frequency",
                .reg = 0x2B
        },
        {
                .name = "external_diode_1_temp_high_limit",
                .reg = 0x30
        },
        {
                .name = "external_diode_2_temp_high_limit",
                .reg = 0x31
        },
        {
                .name = "external_diode_3_temp_high_limit",
                .reg = 0x32
        },
        {
                .name = "internal_diode_high_limit",
                .reg = 0x34
        },
        {
                .name = "external_diode_1_temp_low_limit",
                .reg = 0x38
        },
        {
                .name = "external_diode_2_temp_low_limit",
                .reg = 0x39
        },
        {
                .name = "external_diode_3_temp_low_limit",
                .reg = 0x3A
        },
        {
                .name = "internal_diode_low_limit",
                .reg = 0x3C
        },
        {
                .name = "fan_setting",
                .reg = 0x40
        },
        {
                .name = "pwm_divide",
                .reg = 0x41
        },
        {
                .name = "fan_configuration_1",
                .reg = 0x42
        },
        {
                .name = "fan_configuration_2",
                .reg = 0x43
        },
        {
                .name = "gain",
                .reg = 0x45
        },
        {
                .name = "fan_spin_up_configuration",
                .reg = 0x46
        },
        {
                .name = "fan_step",
                .reg = 0x47
        },
        {
                .name = "fan_minimum_drive",
                .reg = 0x48
        },
        {
                .name = "fan_valid_tach_count",
                .reg = 0x49
        },
        {
                .name = "fan_drive_fail_band_low_byte",
                .reg = 0x4A
        },
        {
                .name = "fan_drive_fail_band_high_byte",
                .reg = 0x4B
        },
        {
                .name = "tach_target_low_byte",
                .reg = 0x4C
        },
        {
                .name = "tach_target_high_byte",
                .reg = 0x4D
        },
        {
                .name = "tach_reading_high_byte",
                .reg = 0x4E
        },
        {
                .name = "tach_reading_low_byte",
                .reg = 0x4F
        },
        {
                .name = "lut_configuration",
                .reg = 0x50
        },
        {
                .name = "lut_drive_1",
                .reg = 0x51
        },
        {
                .name = "lut_temp_1_setting_1",
                .reg = 0x52
        },
        {
                .name = "lut_temp_2_setting_1",
                .reg = 0x53
        },
        {
                .name = "lut_temp_3_setting_1",
                .reg = 0x54
        },
        {
                .name = "lut_temp_4_setting_1",
                .reg = 0x55
        },
        {
                .name = "lut_drive_2",
                .reg = 0x56
        },
        {
                .name = "lut_temp_1_setting_2",
                .reg = 0x57
        },
        {
                .name = "lut_temp_2_setting_2",
                .reg = 0x58
        },
        {
                .name = "lut_temp_3_setting_2",
                .reg = 0x59
        },
        {
                .name = "lut_temp_4_setting_2",
                .reg = 0x5A
        },
        {
                .name = "lut_drive_3",
                .reg = 0x5B
        },
        {
                .name = "lut_temp_1_setting_3",
                .reg = 0x5C
        },
        {
                .name = "lut_temp_2_setting_3",
                .reg = 0x5D
        },
        {
                .name = "lut_temp_3_setting_3",
                .reg = 0x5E
        },
        {
                .name = "lut_temp_4_setting_3",
                .reg = 0x5F
        },
        {
                .name = "lut_drive_4",
                .reg = 0x60
        },
        {
                .name = "lut_temp_1_setting_4",
                .reg = 0x61
        },
        {
                .name = "lut_temp_2_setting_4",
                .reg = 0x62
        },
        {
                .name = "lut_temp_3_setting_4",
                .reg = 0x63
        },
        {
                .name = "lut_temp_4_setting_4",
                .reg = 0x64
        },
        {
                .name = "lut_drive_5",
                .reg = 0x65
        },
        {
                .name = "lut_temp_1_setting_5",
                .reg = 0x66
        },
        {
                .name = "lut_temp_2_setting_5",
                .reg = 0x67
        },
        {
                .name = "lut_temp_3_setting_5",
                .reg = 0x68
        },
        {
                .name = "lut_temp_4_setting_5",
                .reg = 0x69
        },
        {
                .name = "lut_drive_6",
                .reg = 0x6A
        },
        {
                .name = "lut_temp_1_setting_6",
                .reg = 0x6B
        },
        {
                .name = "lut_temp_2_setting_6",
                .reg = 0x6C
        },
        {
                .name = "lut_temp_3_setting_6",
                .reg = 0x6D
        },
        {
                .name = "lut_temp_4_setting_6",
                .reg = 0x6E
        },
        {
                .name = "lut_drive_7",
                .reg = 0x6F
        },
        {
                .name = "lut_temp_1_setting_7",
                .reg = 0x70
        },
        {
                .name = "lut_temp_2_setting_7",
                .reg = 0x71
        },
        {
                .name = "lut_temp_3_setting_7",
                .reg = 0x72
        },
        {
                .name = "lut_temp_4_setting_7",
                .reg = 0x73
        },
        {
                .name = "lut_drive_8",
                .reg = 0x74
        },
        {
                .name = "lut_temp_1_setting_8",
                .reg = 0x75
        },
        {
                .name = "lut_temp_2_setting_8",
                .reg = 0x76
        },
        {
                .name = "lut_temp_3_setting_8",
                .reg = 0x77
        },
        {
                .name = "lut_temp_4_setting_8",
                .reg = 0x78
        },
        {
                .name = "lut_temp_hysteresis",
                .reg = 0x79
        },
        {
                .name = "gpio_direction_register",
                .reg = 0xE1
        },
        {
                .name = "gpio_output_configuration_register",
                .reg = 0xE2
        },
        {
                .name = "gpio_input_register",
                .reg = 0xE3
        },
        {
                .name = "gpio_output_register",
                .reg = 0xE4
        },
        {
                .name = "gpio_interrupt_enable_register",
                .reg = 0xE5
        },
        {
                .name = "gpio_status",
                .reg = 0xE6
        },
        {
                .name = "software_lock",
                .reg = 0xEF
        },
        {
                .name = "product_features",
                .reg = 0xFC
        },
        {
                .name = "product_id",
                .reg = 0xFD
        },
        {
                .name = "manufacturer_id",
                .reg = 0xFE
        },
        {
                .name = "revision",
                .reg = 0xFF
        }
};

static const struct emcfan_registers emcfanctl_2104_registers[] = {
        {
                .name = "internal_temp_reading_high_byte",
                .reg = 0x00
        },
        {
                .name = "internal_temp_reading_low_byte",
                .reg = 0x01
        },
        {
                .name = "external_diode_1_temp_reading_high_byte",
                .reg = 0x02
        },
        {
                .name = "external_diode_1_temp_reading_low_byte",
                .reg = 0x03
        },
        {
                .name = "external_diode_2_temp_reading_high_byte",
                .reg = 0x04
        },
        {
                .name = "external_diode_2_temp_reading_low_byte",
                .reg = 0x05
        },
        {
                .name = "external_diode_3_temp_reading_high_byte",
                .reg = 0x06
        },
        {
                .name = "external_diode_3_temp_reading_low_byte",
                .reg = 0x07
        },
        {
                .name = "external_diode_4_temp_reading_high_byte",
                .reg = 0x08
        },
        {
                .name = "external_diode_4_temp_reading_low_byte",
                .reg = 0x09
        },
        {
                .name = "critical/thermal_shutdown_temperature",
                .reg = 0x0A
        },
        {
                .name = "pushed_temperature_1",
                .reg = 0x0C
        },
        {
                .name = "pushed_temperature_2",
                .reg = 0x0D
        },
        {
                .name = "pushed_temperature_3",
                .reg = 0x0E
        },
        {
                .name = "pushed_temperature_4",
                .reg = 0x0F
        },
        {
                .name = "trip_set_voltage",
                .reg = 0x10
        },
        {
                .name = "external_diode_1_beta_configuration",
                .reg = 0x14
        },
        {
                .name = "external_diode_2_beta_configuration",
                .reg = 0x15
        },
        {
                .name = "external_diode_3_beta_configuration",
                .reg = 0x16
        },
        {
                .name = "external_diode_rec_configuration",
                .reg = 0x17
        },
        {
                .name = "external_diode_1_tcrit_limit",
                .reg = 0x19
        },
        {
                .name = "external_diode_2_tcrit_limit",
                .reg = 0x1A
        },
        {
                .name = "external_diode_3_tcrit_limit",
                .reg = 0x1B
        },
        {
                .name = "external_diode_4_tcrit_limit",
                .reg = 0x1C
        },
        {
                .name = "internal_diode_tcrit_limit",
                .reg = 0x1D
        },
        {
                .name = "tcrit_limit_status",
                .reg = 0x1F
        },
        {
                .name = "configuration",
                .reg = 0x20
        },
        {
                .name = "configuration_2",
                .reg = 0x21
        },
        {
                .name = "configuration_3",
                .reg = 0x22
        },
        {
                .name = "interrupt_status",
                .reg = 0x23
        },
        {
                .name = "high_limit_status",
                .reg = 0x24
        },
        {
                .name = "low_limit_status",
                .reg = 0x25
        },
        {
                .name = "diode_fault",
                .reg = 0x26
        },
        {
                .name = "fan_status",
                .reg = 0x27
        },
        {
                .name = "interrupt_enable_register",
                .reg = 0x28
        },
        {
                .name = "fan_interrupt_enable_register",
                .reg = 0x29
        },
        {
                .name = "pwm_config",
                .reg = 0x2A
        },
        {
                .name = "pwm_base_frequency",
                .reg = 0x2B
        },
        {
                .name = "external_diode_1_temp_high_limit",
                .reg = 0x30
        },
        {
                .name = "external_diode_2_temp_high_limit",
                .reg = 0x31
        },
        {
                .name = "external_diode_3_temp_high_limit",
                .reg = 0x32
        },
        {
                .name = "external_diode_4_temp_high_limit",
                .reg = 0x33
        },
        {
                .name = "internal_diode_high_limit",
                .reg = 0x34
        },
        {
                .name = "voltage_4_high_limit",
                .reg = 0x35
        },
        {
                .name = "external_diode_1_temp_low_limit",
                .reg = 0x38
        },
        {
                .name = "external_diode_2_temp_low_limit",
                .reg = 0x39
        },
        {
                .name = "external_diode_3_temp_low_limit",
                .reg = 0x3A
        },
        {
                .name = "external_diode_4_temp_low_limit",
                .reg = 0x3B
        },
        {
                .name = "internal_diode_low_limit",
                .reg = 0x3C
        },
        {
                .name = "voltage_4_low_limit",
                .reg = 0x3D
        },
        {
                .name = "fan_1_setting",
                .reg = 0x40
        },
        {
                .name = "pwm_1_divide",
                .reg = 0x41
        },
        {
                .name = "fan_1_configuration_1",
                .reg = 0x42
        },
        {
                .name = "fan_1_configuration_2",
                .reg = 0x43
        },
        {
                .name = "gain_1",
                .reg = 0x45
        },
        {
                .name = "fan_1_spin_up_configuration",
                .reg = 0x46
        },
        {
                .name = "fan_1_step",
                .reg = 0x47
        },
        {
                .name = "fan_1_minimum_drive",
                .reg = 0x48
        },
        {
                .name = "fan_1_valid_tach_count",
                .reg = 0x49
        },
        {
                .name = "fan_1_drive_fail_band_low_byte",
                .reg = 0x4A
        },
        {
                .name = "fan_1_drive_fail_band_high_byte",
                .reg = 0x4B
        },
        {
                .name = "tach_1_target_low_byte",
                .reg = 0x4C
        },
        {
                .name = "tach_1_target_high_byte",
                .reg = 0x4D
        },
        {
                .name = "tach_1_readinghigh_byte",
                .reg = 0x4E
        },
        {
                .name = "tach_1_reading_low_byte",
                .reg = 0x4F
        },
        {
                .name = "lut_1_configuration",
                .reg = 0x50
        },
        {
                .name = "lut_1_drive_1",
                .reg = 0x51
        },
        {
                .name = "lut_1_temp_1_setting_1",
                .reg = 0x52
        },
        {
                .name = "lut_1_temp_2_setting_1",
                .reg = 0x53
        },
        {
                .name = "lut_1_temp_3_setting_1",
                .reg = 0x54
        },
        {
                .name = "lut_1_temp_4_setting_1",
                .reg = 0x55
        },
        {
                .name = "lut_1_drive_2",
                .reg = 0x56
        },
        {
                .name = "lut_1_temp_1_setting_2",
                .reg = 0x57
        },
        {
                .name = "lut_1_temp_2_setting_2",
                .reg = 0x58
        },
        {
                .name = "lut_1_temp_3_setting_2",
                .reg = 0x59
        },
        {
                .name = "lut_1_temp_4_setting_2",
                .reg = 0x5A
        },
        {
                .name = "lut_1_drive_3",
                .reg = 0x5B
        },
        {
                .name = "lut_1_temp_1_setting_3",
                .reg = 0x5C
        },
        {
                .name = "lut_1_temp_2_setting_3",
                .reg = 0x5D
        },
        {
                .name = "lut_1_temp_3_setting_3",
                .reg = 0x5E
        },
        {
                .name = "lut_1_temp_4_setting_3",
                .reg = 0x5F
        },
        {
                .name = "lut_1_drive_4",
                .reg = 0x60
        },
        {
                .name = "lut_1_temp_1_setting_4",
                .reg = 0x61
        },
        {
                .name = "lut_1_temp_2_setting_4",
                .reg = 0x62
        },
        {
                .name = "lut_1_temp_3_setting_4",
                .reg = 0x63
        },
        {
                .name = "lut_1_temp_4_setting_4",
                .reg = 0x64
        },
        {
                .name = "lut_1_drive_5",
                .reg = 0x65
        },
        {
                .name = "lut_1_temp_1_setting_5",
                .reg = 0x66
        },
        {
                .name = "lut_1_temp_2_setting_5",
                .reg = 0x67
        },
        {
                .name = "lut_1_temp_3_setting_5",
                .reg = 0x68
        },
        {
                .name = "lut_1_temp_4_setting_5",
                .reg = 0x69
        },
        {
                .name = "lut_1_drive_6",
                .reg = 0x6A
        },
        {
                .name = "lut_1_temp_1_setting_6",
                .reg = 0x6B
        },
        {
                .name = "lut_1_temp_2_setting_6",
                .reg = 0x6C
        },
        {
                .name = "lut_1_temp_3_setting_6",
                .reg = 0x6D
        },
        {
                .name = "lut_1_temp_4_setting_6",
                .reg = 0x6E
        },
        {
                .name = "lut_1_drive_7",
                .reg = 0x6F
        },
        {
                .name = "lut_1_temp_1_setting_7",
                .reg = 0x70
        },
        {
                .name = "lut_1_temp_2_setting_7",
                .reg = 0x71
        },
        {
                .name = "lut_1_temp_3_setting_7",
                .reg = 0x72
        },
        {
                .name = "lut_1_temp_4_setting_7",
                .reg = 0x73
        },
        {
                .name = "lut_1_drive_8",
                .reg = 0x74
        },
        {
                .name = "lut_1_temp_1_setting_8",
                .reg = 0x75
        },
        {
                .name = "lut_1_temp_2_setting_8",
                .reg = 0x76
        },
        {
                .name = "lut_1_temp_3_setting_8",
                .reg = 0x77
        },
        {
                .name = "lut_1_temp_4_setting_8",
                .reg = 0x78
        },
        {
                .name = "lut_1_temp_hysteresis",
                .reg = 0x79
        },
        {
                .name = "fan_2_setting",
                .reg = 0x80
        },
        {
                .name = "pwm2_divide",
                .reg = 0x81
        },
        {
                .name = "fan_2_configuration_1",
                .reg = 0x82
        },
        {
                .name = "fan_2_configuration_2",
                .reg = 0x83
        },
        {
                .name = "gain_2",
                .reg = 0x85
        },
        {
                .name = "fan_2_spin_up_configuration",
                .reg = 0x86
        },
        {
                .name = "fan_2_step",
                .reg = 0x87
        },
        {
                .name = "fan_2_minimum_drive",
                .reg = 0x88
        },
        {
                .name = "fan_2_valid_tach_count",
                .reg = 0x89
        },
        {
                .name = "fan_2_drive_fail_band_low_byte",
                .reg = 0x8A
        },
        {
                .name = "fan_2_drive_fail_band_high_byte",
                .reg = 0x8B
        },
        {
                .name = "tach_2_target_low_byte",
                .reg = 0x8C
        },
        {
                .name = "tach_2_target_high_byte",
                .reg = 0x8D
        },
        {
                .name = "tach_2_reading_high_byte",
                .reg = 0x8E
        },
        {
                .name = "tach_2_reading_low_byte",
                .reg = 0x8F
        },
        {
                .name = "lut_2_configuration",
                .reg = 0x90
        },
        {
                .name = "lut_2_drive_1",
                .reg = 0x91
        },
        {
                .name = "lut_2_temp_1_setting_1",
                .reg = 0x92
        },
        {
                .name = "lut_2_temp_2_setting_1",
                .reg = 0x93
        },
        {
                .name = "lut_2_temp_3_setting_1",
                .reg = 0x94
        },
        {
                .name = "lut_2_temp_4_setting_1",
                .reg = 0x95
        },
        {
                .name = "lut_2_drive_2",
                .reg = 0x96
        },
        {
                .name = "lut_2_temp_1_setting_2",
                .reg = 0x97
        },
        {
                .name = "lut_2_temp_2_setting_2",
                .reg = 0x98
        },
        {
                .name = "lut_2_temp_3_setting_2",
                .reg = 0x99
        },
        {
                .name = "lut_2_temp_4_setting_2",
                .reg = 0x9A
        },
        {
                .name = "lut_2_drive_3",
                .reg = 0x9B
        },
        {
                .name = "lut_2_temp_1_setting_3",
                .reg = 0x9C
        },
        {
                .name = "lut_2_temp_2_setting_3",
                .reg = 0x9D
        },
        {
                .name = "lut_2_temp_3_setting_3",
                .reg = 0x9E
        },
        {
                .name = "lut_2_temp_4_setting_3",
                .reg = 0x9F
        },
        {
                .name = "lut_2_drive_4",
                .reg = 0xA0
        },
        {
                .name = "lut_2_temp_1_setting_4",
                .reg = 0xA1
        },
        {
                .name = "lut_2_temp_2_setting_4",
                .reg = 0xA2
        },
        {
                .name = "lut_2_temp_3_setting_4",
                .reg = 0xA3
        },
        {
                .name = "lut_2_temp_4_setting_4",
                .reg = 0xA4
        },
        {
                .name = "lut_2_drive_5",
                .reg = 0xA5
        },
        {
                .name = "lut_2_temp_1_setting_5",
                .reg = 0xA6
        },
        {
                .name = "lut_2_temp_2_setting_5",
                .reg = 0xA7
        },
        {
                .name = "lut_2_temp_3_setting_5",
                .reg = 0xA8
        },
        {
                .name = "lut_2_temp_4_setting_5",
                .reg = 0xA9
        },
        {
                .name = "lut_2_drive_6",
                .reg = 0xAA
        },
        {
                .name = "lut_2_temp_1_setting_6",
                .reg = 0xAB
        },
        {
                .name = "lut_2_temp_2_setting_6",
                .reg = 0xAC
        },
        {
                .name = "lut_2_temp_3_setting_6",
                .reg = 0xAD
        },
        {
                .name = "lut_2_temp_4_setting_6",
                .reg = 0xAE
        },
        {
                .name = "lut_2_drive_7",
                .reg = 0xAF
        },
        {
                .name = "lut_2_temp_1_setting_6",
                .reg = 0xB0
        },
        {
                .name = "lut_2_temp_2_setting_6",
                .reg = 0xB1
        },
        {
                .name = "lut_2_temp_3_setting_6",
                .reg = 0xB2
        },
        {
                .name = "lut_2_temp_4_setting_6",
                .reg = 0xB3
        },
        {
                .name = "lut_2_drive_8",
                .reg = 0xB4
        },
        {
                .name = "lut_2_temp_1_setting_8",
                .reg = 0xB5
        },
        {
                .name = "lut_2_temp_2_setting_8",
                .reg = 0xB6
        },
        {
                .name = "lut_2_temp_3_setting_8",
                .reg = 0xB7
        },
        {
                .name = "lut_2_temp_4_setting_8",
                .reg = 0xB8
        },
        {
                .name = "lut_2_temp_hysteresis",
                .reg = 0xB9
        },
        {
                .name = "muxed_pin_configuration_register",
                .reg = 0xE0
        },
        {
                .name = "gpio_direction_register",
                .reg = 0xE1
        },
        {
                .name = "gpio_output_configuration_register",
                .reg = 0xE2
        },
        {
                .name = "gpio_input_register",
                .reg = 0xE3
        },
        {
                .name = "gpio_output_register",
                .reg = 0xE4
        },
        {
                .name = "gpio_interrupt_enable_register",
                .reg = 0xE5
        },
        {
                .name = "gpio_status",
                .reg = 0xE6
        },
        {
                .name = "software_lock",
                .reg = 0xEF
        },
        {
                .name = "product_features",
                .reg = 0xFC
        },
        {
                .name = "product_id",
                .reg = 0xFD
        },
        {
                .name = "manufacturer_id",
                .reg = 0xFE
        },
        {
                .name = "revision",
                .reg = 0xFF
        }
};

static const struct emcfan_registers emcfanctl_2106_registers[] = {
        {
                .name = "internal_temp_reading_high_byte",
                .reg = 0x00
        },
        {
                .name = "internal_temp_reading_low_byte",
                .reg = 0x01
        },
        {
                .name = "external_diode_1_temp_reading_high_byte",
                .reg = 0x02
        },
        {
                .name = "external_diode_1_temp_reading_low_byte",
                .reg = 0x03
        },
        {
                .name = "external_diode_2_temp_reading_high_byte",
                .reg = 0x04
        },
        {
                .name = "external_diode_2_temp_reading_low_byte",
                .reg = 0x05
        },
        {
                .name = "external_diode_3_temp_reading_high_byte",
                .reg = 0x06
        },
        {
                .name = "external_diode_3_temp_reading_low_byte",
                .reg = 0x07
        },
        {
                .name = "external_diode_4_temp_reading_high_byte",
                .reg = 0x08
        },
        {
                .name = "external_diode_4_temp_reading_low_byte",
                .reg = 0x09
        },
        {
                .name = "critical/thermal_shutdown_temperature",
                .reg = 0x0A
        },
        {
                .name = "pushed_temperature_1",
                .reg = 0x0C
        },
        {
                .name = "pushed_temperature_2",
                .reg = 0x0D
        },
        {
                .name = "pushed_temperature_3",
                .reg = 0x0E
        },
        {
                .name = "pushed_temperature_4",
                .reg = 0x0F
        },
        {
                .name = "trip_set_voltage",
                .reg = 0x10
        },
        {
                .name = "external_diode_1_beta_configuration",
                .reg = 0x14
        },
        {
                .name = "external_diode_2_beta_configuration",
                .reg = 0x15
        },
        {
                .name = "external_diode_3_beta_configuration",
                .reg = 0x16
        },
        {
                .name = "external_diode_rec_configuration",
                .reg = 0x17
        },
        {
                .name = "external_diode_1_tcrit_limit",
                .reg = 0x19
        },
        {
                .name = "external_diode_2_tcrit_limit",
                .reg = 0x1A
        },
        {
                .name = "external_diode_3_tcrit_limit",
                .reg = 0x1B
        },
        {
                .name = "external_diode_4_tcrit_limit",
                .reg = 0x1C
        },
        {
                .name = "internal_diode_tcrit_limit",
                .reg = 0x1D
        },
        {
                .name = "tcrit_limit_status",
                .reg = 0x1F
        },
        {
                .name = "configuration",
                .reg = 0x20
        },
        {
                .name = "configuration_2",
                .reg = 0x21
        },
        {
                .name = "configuration_3",
                .reg = 0x22
        },
        {
                .name = "interrupt_status",
                .reg = 0x23
        },
        {
                .name = "high_limit_status",
                .reg = 0x24
        },
        {
                .name = "low_limit_status",
                .reg = 0x25
        },
        {
                .name = "diode_fault",
                .reg = 0x26
        },
        {
                .name = "fan_status",
                .reg = 0x27
        },
        {
                .name = "interrupt_enable_register",
                .reg = 0x28
        },
        {
                .name = "fan_interruptenable_register",
                .reg = 0x29
        },
        {
                .name = "pwm_config",
                .reg = 0x2A
        },
        {
                .name = "pwm_base_frequency",
                .reg = 0x2B
        },
        {
                .name = "pwm_3_frequency_divide",
                .reg = 0x2C
        },
        {
                .name = "pwm3_setting",
                .reg = 0x2D
        },
        {
                .name = "pwm4_setting",
                .reg = 0x2E
        },
        {
                .name = "pwm4_frequency_divide",
                .reg = 0x2F
        },
        {
                .name = "external_diode_1_temp_high_limit",
                .reg = 0x30
        },
        {
                .name = "external_diode_2_temp_high_limit",
                .reg = 0x31
        },
        {
                .name = "external_diode_3_temp_high_limit",
                .reg = 0x32
        },
        {
                .name = "external_diode_4_temp_high_limit",
                .reg = 0x33
        },
        {
                .name = "internal_diode_high_limit",
                .reg = 0x34
        },
        {
                .name = "voltage_4_high_limit",
                .reg = 0x35
        },
        {
                .name = "external_diode_1_temp_low_limit",
                .reg = 0x38
        },
        {
                .name = "external_diode_2_temp_low_limit",
                .reg = 0x39
        },
        {
                .name = "external_diode_3_temp_low_limit",
                .reg = 0x3A
        },
        {
                .name = "external_diode_4_temp_low_limit",
                .reg = 0x3B
        },
        {
                .name = "internal_diode_low_limit",
                .reg = 0x3C
        },
        {
                .name = "voltage_4_low_limit",
                .reg = 0x3D
        },
        {
                .name = "fan_1_setting",
                .reg = 0x40
        },
        {
                .name = "pwm_1_divide",
                .reg = 0x41
        },
        {
                .name = "fan_1_configuration_1",
                .reg = 0x42
        },
        {
                .name = "fan_1_configuration_2",
                .reg = 0x43
        },
        {
                .name = "gain_1",
                .reg = 0x45
        },
        {
                .name = "fan_1_spin_up_configuration",
                .reg = 0x46
        },
        {
                .name = "fan_1_step",
                .reg = 0x47
        },
        {
                .name = "fan_1_minimum_drive",
                .reg = 0x48
        },
        {
                .name = "fan_1_valid_tach_count",
                .reg = 0x49
        },
        {
                .name = "fan_1_drive_fail_band_low_byte",
                .reg = 0x4A
        },
        {
                .name = "fan_1_drive_fail_band_high_byte",
                .reg = 0x4B
        },
        {
                .name = "tach_1_target_low_byte",
                .reg = 0x4C
        },
        {
                .name = "tach_1_target_high_byte",
                .reg = 0x4D
        },
        {
                .name = "tach_1_readinghigh_byte",
                .reg = 0x4E
        },
        {
                .name = "tach_1_reading_low_byte",
                .reg = 0x4F
        },
        {
                .name = "lut_1_configuration",
                .reg = 0x50
        },
        {
                .name = "lut_1_drive_1",
                .reg = 0x51
        },
        {
                .name = "lut_1_temp_1_setting_1",
                .reg = 0x52
        },
        {
                .name = "lut_1_temp_2_setting_1",
                .reg = 0x53
        },
        {
                .name = "lut_1_temp_3_setting_1",
                .reg = 0x54
        },
        {
                .name = "lut_1_temp_4_setting_1",
                .reg = 0x55
        },
        {
                .name = "lut_1_drive_2",
                .reg = 0x56
        },
        {
                .name = "lut_1_temp_1_setting_2",
                .reg = 0x57
        },
        {
                .name = "lut_1_temp_2_setting_2",
                .reg = 0x58
        },
        {
                .name = "lut_1_temp_3_setting_2",
                .reg = 0x59
        },
        {
                .name = "lut_1_temp_4_setting_2",
                .reg = 0x5A
        },
        {
                .name = "lut_1_drive_3",
                .reg = 0x5B
        },
        {
                .name = "lut_1_temp_1_setting_3",
                .reg = 0x5C
        },
        {
                .name = "lut_1_temp_2_setting_3",
                .reg = 0x5D
        },
        {
                .name = "lut_1_temp_3_setting_3",
                .reg = 0x5E
        },
        {
                .name = "lut_1_temp_4_setting_3",
                .reg = 0x5F
        },
        {
                .name = "lut_1_drive_4",
                .reg = 0x60
        },
        {
                .name = "lut_1_temp_1_setting_4",
                .reg = 0x61
        },
        {
                .name = "lut_1_temp_2_setting_4",
                .reg = 0x62
        },
        {
                .name = "lut_1_temp_3_setting_4",
                .reg = 0x63
        },
        {
                .name = "lut_1_temp_4_setting_4",
                .reg = 0x64
        },
        {
                .name = "lut_1_drive_5",
                .reg = 0x65
        },
        {
                .name = "lut_1_temp_1_setting_5",
                .reg = 0x66
        },
        {
                .name = "lut_1_temp_2_setting_5",
                .reg = 0x67
        },
        {
                .name = "lut_1_temp_3_setting_5",
                .reg = 0x68
        },
        {
                .name = "lut_1_temp_4_setting_5",
                .reg = 0x69
        },
        {
                .name = "lut_1_drive_6",
                .reg = 0x6A
        },
        {
                .name = "lut_1_temp_1_setting_6",
                .reg = 0x6B
        },
        {
                .name = "lut_1_temp_2_setting_6",
                .reg = 0x6C
        },
        {
                .name = "lut_1_temp_3_setting_6",
                .reg = 0x6D
        },
        {
                .name = "lut_1_temp_4_setting_6",
                .reg = 0x6E
        },
        {
                .name = "lut_1_drive_7",
                .reg = 0x6F
        },
        {
                .name = "lut_1_temp_1_setting_7",
                .reg = 0x70
        },
        {
                .name = "lut_1_temp_2_setting_7",
                .reg = 0x71
        },
        {
                .name = "lut_1_temp_3_setting_7",
                .reg = 0x72
        },
        {
                .name = "lut_1_temp_4_setting_7",
                .reg = 0x73
        },
        {
                .name = "lut_1_drive_8",
                .reg = 0x74
        },
        {
                .name = "lut_1_temp_1_setting_8",
                .reg = 0x75
        },
        {
                .name = "lut_1_temp_2_setting_8",
                .reg = 0x76
        },
        {
                .name = "lut_1_temp_3_setting_8",
                .reg = 0x77
        },
        {
                .name = "lut_1_temp_4_setting_8",
                .reg = 0x78
        },
        {
                .name = "lut_1_temp_hysteresis",
                .reg = 0x79
        },
        {
                .name = "fan_2_setting",
                .reg = 0x80
        },
        {
                .name = "pwm2_divide",
                .reg = 0x81
        },
        {
                .name = "fan_2_configuration_1",
                .reg = 0x82
        },
        {
                .name = "fan_2_configuration_2",
                .reg = 0x83
        },
        {
                .name = "gain_2",
                .reg = 0x85
        },
        {
                .name = "fan_2_spin_up_configuration",
                .reg = 0x86
        },
        {
                .name = "fan_2_step",
                .reg = 0x87
        },
        {
                .name = "fan_2_minimum_drive",
                .reg = 0x88
        },
        {
                .name = "fan_2_valid_tach_count",
                .reg = 0x89
        },
        {
                .name = "fan_2_drive_fail_band_low_byte",
                .reg = 0x8A
        },
        {
                .name = "fan_2_drive_fail_band_high_byte",
                .reg = 0x8B
        },
        {
                .name = "tach_2_targetlow_byte",
                .reg = 0x8C
        },
        {
                .name = "tach_2_target_high_byte",
                .reg = 0x8D
        },
        {
                .name = "tach_2_reading_high_byte",
                .reg = 0x8E
        },
        {
                .name = "tach_2_reading_low_byte",
                .reg = 0x8F
        },
        {
                .name = "lut_2_configuration",
                .reg = 0x90
        },
        {
                .name = "lut_2_drive_1",
                .reg = 0x91
        },
        {
                .name = "lut_2_temp_1_setting_1",
                .reg = 0x92
        },
        {
                .name = "lut_2_temp_2_setting_1",
                .reg = 0x93
        },
        {
                .name = "lut_2_temp_3_setting_1",
                .reg = 0x94
        },
        {
                .name = "lut_2_temp_4_setting_1",
                .reg = 0x95
        },
        {
                .name = "lut_2_drive_2",
                .reg = 0x96
        },
        {
                .name = "lut_2_temp_1_setting_2",
                .reg = 0x97
        },
        {
                .name = "lut_2_temp_2_setting_2",
                .reg = 0x98
        },
        {
                .name = "lut_2_temp_3_setting_2",
                .reg = 0x99
        },
        {
                .name = "lut_2_temp_4_setting_2",
                .reg = 0x9A
        },
        {
                .name = "lut_2_drive_3",
                .reg = 0x9B
        },
        {
                .name = "lut_2_temp_1_setting_3",
                .reg = 0x9C
        },
        {
                .name = "lut_2_temp_2_setting_3",
                .reg = 0x9D
        },
        {
                .name = "lut_2_temp_3_setting_3",
                .reg = 0x9E
        },
        {
                .name = "lut_2_temp_4_setting_3",
                .reg = 0x9F
        },
        {
                .name = "lut_2_drive_4",
                .reg = 0xA0
        },
        {
                .name = "lut_2_temp_1_setting_4",
                .reg = 0xA1
        },
        {
                .name = "lut_2_temp_2_setting_4",
                .reg = 0xA2
        },
        {
                .name = "lut_2_temp_3_setting_4",
                .reg = 0xA3
        },
        {
                .name = "lut_2_temp_4_setting_4",
                .reg = 0xA4
        },
        {
                .name = "lut_2_drive_5",
                .reg = 0xA5
        },
        {
                .name = "lut_2_temp_1_setting_5",
                .reg = 0xA6
        },
        {
                .name = "lut_2_temp_2_setting_5",
                .reg = 0xA7
        },
        {
                .name = "lut_2_temp_3_setting_5",
                .reg = 0xA8
        },
        {
                .name = "lut_2_temp_4_setting_5",
                .reg = 0xA9
        },
        {
                .name = "lut_2_drive_6",
                .reg = 0xAA
        },
        {
                .name = "lut_2_temp_1_setting_6",
                .reg = 0xAB
        },
        {
                .name = "lut_2_temp_2_setting_6",
                .reg = 0xAC
        },
        {
                .name = "lut_2_temp_3_setting_6",
                .reg = 0xAD
        },
        {
                .name = "lut_2_temp_4_setting_6",
                .reg = 0xAE
        },
        {
                .name = "lut_2_drive_7",
                .reg = 0xAF
        },
        {
                .name = "lut_2_temp_1_setting_6",
                .reg = 0xB0
        },
        {
                .name = "lut_2_temp_2_setting_6",
                .reg = 0xB1
        },
        {
                .name = "lut_2_temp_3setting_6",
                .reg = 0xB2
        },
        {
                .name = "lut_2_temp_4_setting_6",
                .reg = 0xB3
        },
        {
                .name = "lut_2_drive_8",
                .reg = 0xB4
        },
        {
                .name = "lut_2_temp_1_setting_8",
                .reg = 0xB5
        },
        {
                .name = "lut_2_temp_2_setting_8",
                .reg = 0xB6
        },
        {
                .name = "lut_2_temp_3_setting_8",
                .reg = 0xB7
        },
        {
                .name = "lut_2_temp_4_setting_8",
                .reg = 0xB8
        },
        {
                .name = "lut_2_temp_hysteresis",
                .reg = 0xB9
        },
        {
                .name = "muxed_pin_configuration_register",
                .reg = 0xE0
        },
        {
                .name = "gpio_direction_register",
                .reg = 0xE1
        },
        {
                .name = "gpio_output_configuration_register",
                .reg = 0xE2
        },
        {
                .name = "gpio_input_register",
                .reg = 0xE3
        },
        {
                .name = "gpio_output_register",
                .reg = 0xE4
        },
        {
                .name = "gpio_interrupt_enable_register",
                .reg = 0xE5
        },
        {
                .name = "gpio_status",
                .reg = 0xE6
        },
        {
                .name = "software_lock",
                .reg = 0xEF
        },
        {
                .name = "product_features",
                .reg = 0xFC
        },
        {
                .name = "product_id",
                .reg = 0xFD
        },
        {
                .name = "manufacturer_id",
                .reg = 0xFE
        },
        {
                .name = "revision",
                .reg = 0xFF
        }
};

static const struct emcfan_registers emcfanctl_230x_registers[] = {
        {
                .name = "configuration",
                .reg = 0x20
        },
        {
                .name = "fan_status",
                .reg = 0x24
        },
        {
                .name = "fan_stall_status",
                .reg = 0x25
        },
        {
                .name = "fan_spin_status",
                .reg = 0x26
        },
        {
                .name = "drive_fail_status",
                .reg = 0x27
        },
        {
                .name = "fan_interrupt_enable_register",
                .reg = 0x29
        },
        {
                .name = "pwm_polarity_config",
                .reg = 0x2A
        },
        {
                .name = "pwm_output_config",
                .reg = 0x2B
        },
        {
                .name = "pwm_basef45",
                .reg = 0x2C
        },
        {
                .name = "pwm_basef123",
                .reg = 0x2D
        },
        {
                .name = "fan_1_setting",
                .reg = 0x30
        },
        {
                .name = "pwm_1_divide",
                .reg = 0x31
        },
        {
                .name = "fan_1_configuration_1",
                .reg = 0x32
        },
        {
                .name = "fan_1_configuration_2",
                .reg = 0x33
        },
        {
                .name = "gain_1",
                .reg = 0x35
        },
        {
                .name = "fan_1_spin_up_configuration",
                .reg = 0x36
        },
        {
                .name = "fan_1_max_step",
                .reg = 0x37
        },
        {
                .name = "fan_1_minimum_drive",
                .reg = 0x38
        },
        {
                .name = "fan_1_valid_tach_count",
                .reg = 0x39
        },
        {
                .name = "fan_1_drive_fail_band_low_byte",
                .reg = 0x3A
        },
        {
                .name = "fan_1_drive_fail_band_high_byte",
                .reg = 0x3B
        },
        {
                .name = "tach_1_target_low_byte",
                .reg = 0x3C
        },
        {
                .name = "tach_1_target_high_byte",
                .reg = 0x3D
        },
        {
                .name = "tach_1_reading_high_byte",
                .reg = 0x3E
        },
        {
                .name = "tach_1_reading_low_byte",
                .reg = 0x3F
        },
        {
                .name = "fan_2_setting",
                .reg = 0x40
        },
        {
                .name = "pwm_2_divide",
                .reg = 0x41
        },
        {
                .name = "fan_2_configuration_1",
                .reg = 0x42
        },
        {
                .name = "fan_2_configuration_2",
                .reg = 0x43
        },
        {
                .name = "gain_2",
                .reg = 0x45
        },
        {
                .name = "fan_2_spin_up_configuration",
                .reg = 0x46
        },
        {
                .name = "fan_2_max_step",
                .reg = 0x47
        },
        {
                .name = "fan_2_minimum_drive",
                .reg = 0x48
        },
        {
                .name = "fan_2_valid_tach_count",
                .reg = 0x49
        },
        {
                .name = "fan_2_drive_fail_band_low_byte",
                .reg = 0x4A
        },
        {
                .name = "fan_2_drive_fail_band_high_byte",
                .reg = 0x4B
        },
        {
                .name = "tach_2_target_low_byte",
                .reg = 0x4C
        },
        {
                .name = "tach_2_target_high_byte",
                .reg = 0x4D
        },
        {
                .name = "tach_2_reading_high_byte",
                .reg = 0x4E
        },
        {
                .name = "tach_2_reading_low_byte",
                .reg = 0x4F
        },
        {
                .name = "fan_3_setting",
                .reg = 0x50
        },
        {
                .name = "pwm_3_divide",
                .reg = 0x51
        },
        {
                .name = "fan_3_configuration_1",
                .reg = 0x52
        },
        {
                .name = "fan_3_configuration_2",
                .reg = 0x53
        },
        {
                .name = "gain_3",
                .reg = 0x55
        },
        {
                .name = "fan_3_spin_up_configuration",
                .reg = 0x56
        },
        {
                .name = "fan_3_max_step",
                .reg = 0x57
        },
        {
                .name = "fan_3_minimum_drive",
                .reg = 0x58
        },
        {
                .name = "fan_3_valid_tach_count",
                .reg = 0x59
        },
        {
                .name = "fan_3_drive_fail_band_low_byte",
                .reg = 0x5A
        },
        {
                .name = "fan_3_drive_fail_band_high_byte",
                .reg = 0x5B
        },
        {
                .name = "tach_3_target_low_byte",
                .reg = 0x5C
        },
        {
                .name = "tach_3_target_high_byte",
                .reg = 0x5D
        },
        {
                .name = "tach_3_reading_high_byte",
                .reg = 0x5E
        },
        {
                .name = "tach_3_reading_low_byte",
                .reg = 0x5F
        },
        {
                .name = "fan_4_setting",
                .reg = 0x60
        },
        {
                .name = "pwm_4_divide",
                .reg = 0x61
        },
        {
                .name = "fan_4_configuration_1",
                .reg = 0x62
        },
        {
                .name = "fan_4_configuration_2",
                .reg = 0x63
        },
        {
                .name = "gain_4",
                .reg = 0x65
        },
        {
                .name = "fan_4_spin_up_configuration",
                .reg = 0x66
        },
        {
                .name = "fan_4_max_step",
                .reg = 0x67
        },
        {
                .name = "fan_4_minimum_drive",
                .reg = 0x68
        },
        {
                .name = "fan_4_valid_tach_count",
                .reg = 0x69
        },
        {
                .name = "fan_4_drive_fail_band_low_byte",
                .reg = 0x6A
        },
        {
                .name = "fan_4_drive_fail_band_high_byte",
                .reg = 0x6B
        },
        {
                .name = "tach_4_target_low_byte",
                .reg = 0x6C
        },
        {
                .name = "tach_4_target_high_byte",
                .reg = 0x6D
        },
        {
                .name = "tach_4_reading_high_byte",
                .reg = 0x6E
        },
        {
                .name = "tach_4_reading_low_byte",
                .reg = 0x6F
        },
        {
                .name = "fan_5_setting",
                .reg = 0x70
        },
        {
                .name = "pwm_5_divide",
                .reg = 0x71
        },
        {
                .name = "fan_5_configuration_1",
                .reg = 0x72
        },
        {
                .name = "fan_5_configuration_2",
                .reg = 0x73
        },
        {
                .name = "gain_5",
                .reg = 0x75
        },
        {
                .name = "fan_5_spin_up_configuration",
                .reg = 0x76
        },
        {
                .name = "fan_5_max_step",
                .reg = 0x77
        },
        {
                .name = "fan_5_minimum_drive",
                .reg = 0x78
        },
        {
                .name = "fan_5_valid_tach_count",
                .reg = 0x79
        },
        {
                .name = "fan_5_drive_fail_band_low_byte",
                .reg = 0x7A
        },
        {
                .name = "fan_5_drive_fail_band_high_byte",
                .reg = 0x7B
        },
        {
                .name = "tach_5_target_low_byte",
                .reg = 0x7C
        },
        {
                .name = "tach_5_target_high_byte",
                .reg = 0x7D
        },
        {
                .name = "tach_5_reading_high_byte",
                .reg = 0x7E
        },
        {
                .name = "tach_5_reading_low_byte",
                .reg = 0x7F
        },
        {
                .name = "software_lock",
                .reg = 0xEF
        },
        {
                .name = "product_features",
                .reg = 0xFC
        },
        {
                .name = "product_id",
                .reg = 0xFD
        },
        {
                .name = "manufacturer_id",
                .reg = 0xFE
        },
        {
                .name = "revision",
                .reg = 0xFF
        }
};

static const struct emcfan_bits_translate fan_polarity[] = {
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000001,
                .bit_mask = 0b00000001,
                .human_str = "inverted",
                .instance = 0
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000001,
                .bit_mask = 0b00000000,
                .human_str = "non-inverted",
                .instance = 0
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000010,
                .bit_mask = 0b00000010,
                .human_str = "inverted",
                .instance = 1
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000010,
                .bit_mask = 0b00000000,
                .human_str = "non-inverted",
                .instance = 1
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000100,
                .bit_mask = 0b00000100,
                .human_str = "inverted",
                .instance = 2
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000100,
                .bit_mask = 0b00000000,
                .human_str = "non-inverted",
                .instance = 2
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00001000,
                .bit_mask = 0b00001000,
                .human_str = "inverted",
                .instance = 3
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00001000,
                .bit_mask = 0b00000000,
                .human_str = "non-inverted",
                .instance = 3
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00010000,
                .bit_mask = 0b00010000,
                .human_str = "inverted",
                .instance = 4
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00010000,
                .bit_mask = 0b00000000,
                .human_str = "non-inverted",
                .instance = 4
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00010000,
                .bit_mask = 0b00010000,
                .human_str = "inverted",
                .instance = 2101
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00010000,
                .bit_mask = 0b00000000,
                .human_str = "non-inverted",
                .instance = 2101
        }
};

static const struct emcfan_bits_translate fan_minexpectedrpm[] = {
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b01100000,
                .bit_mask = 0b00000000,
                .human_int = 500
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b01100000,
                .bit_mask = 0b00100000,
                .human_int = 1000
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b01100000,
                .bit_mask = 0b01000000,
                .human_int = 2000
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b01100000,
                .bit_mask = 0b01100000,
                .human_int = 4000
        }
};

static const struct emcfan_bits_translate fan_numedges[] = {
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00011000,
                .bit_mask = 0b00000000,
                .human_int = 3
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00011000,
                .bit_mask = 0b00001000,
                .human_int = 5
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00011000,
                .bit_mask = 0b00010000,
                .human_int = 7
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00011000,
                .bit_mask = 0b00011000,
                .human_int = 9
        }
};

static const struct emcfan_bits_translate fan_pwm_basefreq[] = {
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00000011,
                .bit_mask = 0b00000000,
                .human_int = 26000,
                .instance = 0
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00000011,
                .bit_mask = 0b00000001,
                .human_int = 19531,
                .instance = 0
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00000011,
                .bit_mask = 0b00000010,
                .human_int = 4882,
                .instance = 0
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00000011,
                .bit_mask = 0b00000011,
                .human_int = 2441,
                .instance = 0
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00001100,
                .bit_mask = 0b00000000,
                .human_int = 26000,
                .instance = 1
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00001100,
                .bit_mask = 0b00000100,
                .human_int = 19531,
                .instance = 1
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00001100,
                .bit_mask = 0b00001000,
                .human_int = 4882,
                .instance = 1
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00001100,
                .bit_mask = 0b00001100,
                .human_int = 2441,
                .instance = 1
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00110000,
                .bit_mask = 0b00000000,
                .human_int = 26000,
                .instance = 2
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00110000,
                .bit_mask = 0b00010000,
                .human_int = 19531,
                .instance = 2
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00110000,
                .bit_mask = 0b00100000,
                .human_int = 4882,
                .instance = 2
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00110000,
                .bit_mask = 0b00110000,
                .human_int = 2441,
                .instance = 2
        },

        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b11000000,
                .bit_mask = 0b00000000,
                .human_int = 26000,
                .instance = 3
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b11000000,
                .bit_mask = 0b01000000,
                .human_int = 19531,
                .instance = 3
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b11000000,
                .bit_mask = 0b10000000,
                .human_int = 4882,
                .instance = 3
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b11000000,
                .bit_mask = 0b11000000,
                .human_int = 2441,
                .instance = 3
        },

        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00000011,
                .bit_mask = 0b00000000,
                .human_int = 26000,
                .instance = 23053
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00000011,
                .bit_mask = 0b00000001,
                .human_int = 19531,
                .instance = 23053
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00000011,
                .bit_mask = 0b00000010,
                .human_int = 4882,
                .instance = 23053
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00000011,
                .bit_mask = 0b00000011,
                .human_int = 2441,
                .instance = 23053
        },

        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00001100,
                .bit_mask = 0b00000000,
                .human_int = 26000,
                .instance = 23054
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00001100,
                .bit_mask = 0b00000100,
                .human_int = 19531,
                .instance = 23054
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00001100,
                .bit_mask = 0b00001000,
                .human_int = 4882,
                .instance = 23054
        },
        {
                .type = EMCFAN_TRANSLATE_INT,
                .clear_mask = 0b00001100,
                .bit_mask = 0b00001100,
                .human_int = 2441,
                .instance = 23054
        }
};

static const struct emcfan_bits_translate fan_pwm_output_type[] = {
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000001,
                .bit_mask = 0b00000001,
                .human_str = "push-pull",
                .instance = 0
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000001,
                .bit_mask = 0b00000000,
                .human_str = "open-drain",
                .instance = 0
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000010,
                .bit_mask = 0b00000010,
                .human_str = "push-pull",
                .instance = 1
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000010,
                .bit_mask = 0b00000000,
                .human_str = "open-drain",
                .instance = 1
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000100,
                .bit_mask = 0b00000100,
                .human_str = "push-pull",
                .instance = 2
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000100,
                .bit_mask = 0b00000000,
                .human_str = "open-drain",
                .instance = 2
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00001000,
                .bit_mask = 0b00001000,
                .human_str = "push-pull",
                .instance = 3
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00001000,
                .bit_mask = 0b00000000,
                .human_str = "open-drain",
                .instance = 3
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00010000,
                .bit_mask = 0b00010000,
                .human_str = "push-pull",
                .instance = 4
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00010000,
                .bit_mask = 0b00000000,
                .human_str = "open-drain",
                .instance = 4
        }
};

static const struct emcfan_bits_translate smbus_timeout[] = {
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00001000,
                .bit_mask = 0b00000000,
                .human_str = "on",
                .instance = 2101
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00001000,
                .bit_mask = 0b00001000,
                .human_str = "off",
                .instance = 2101
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00100000,
                .bit_mask = 0b00000000,
                .human_str = "on",
                .instance = 2103
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00100000,
                .bit_mask = 0b00100000,
                .human_str = "off",
                .instance = 2103
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b01000000,
                .bit_mask = 0b00000000,
                .human_str = "on",
                .instance = 2301
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b01000000,
                .bit_mask = 0b01000000,
                .human_str = "off",
                .instance = 2301
        }
};

static const struct emcfan_bits_translate apd[] = {
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000001,
                .bit_mask = 0b00000001,
                .human_str = "on"
        },
        {
                .type = EMCFAN_TRANSLATE_STR,
                .clear_mask = 0b00000001,
                .bit_mask = 0b00000000,
                .human_str = "off"
        }
};

#endif