/* $NetBSD: emcfanctlconst.h,v 1.1 2025/03/11 13:56:48 brad Exp $ */ /* * Copyright (c) 2025 Brad Spencer * * 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 = " drive|divider|min_expected_rpm|edges|polarity read|write|inverted|non-inverted " }, { .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 = " 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