meta-facebook/meta-minipack/recipes-kernel/cpld-mod/files/smbcpld.c (1,681 lines of code) (raw):

/* * smbcpld.c - The i2c driver for SMBCPLD * * Copyright 2018-present Facebook. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ //#define DEBUG #include <linux/errno.h> #include <linux/module.h> #include <linux/i2c.h> #include <i2c_dev_sysfs.h> #ifdef DEBUG #define PP_DEBUG(fmt, ...) do { \ printk(KERN_DEBUG "%s:%d " fmt "\n", \ __FUNCTION__, __LINE__, ##__VA_ARGS__); \ } while (0) #else /* !DEBUG */ #define PP_DEBUG(fmt, ...) #endif #define present_help_str \ "0: Present\n" \ "1: Not present" #define intr_help_str \ "0: Interrupt active\n" \ "1: No interrupt" #define reset_help_str \ "0: It is placed in reset state\n" \ "1: It is placed in normal operation state" #define fail_normal_help_str \ "0: Fail\n" \ "1: Normal" #define sys_lock_help_str \ "0: System reset signal to be normal\n" \ "1: Lock system reset signal to be high" #define cpld_cpu_blk_help_str \ "0: CPLD passes the interrupt to CPU\n" \ "1: CPLD blocks incoming the interrupt" #define pim_fpga_plug_help_str \ "0: PIM_FPGA had plugged\n" \ "1: No PIM_FPGA" \ static const i2c_dev_attr_st smbcpld_attr_table[] = { { "board_ver", "0x0: R0A\n" "0x1: R0B\n" "0x2: R0C\n" "0x3: R01", I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x0, 0, 2, }, { "board_rev", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x0, 4, 3, }, { "cpld_ver", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x01, 0, 6, }, { "cpld_released", "0: Not released\n" "1: Released version after PVT", I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x01, 6, 1, }, { "cpld_sub_ver", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x02, 0, 8, }, { "psu_L1_smb_alert", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x03, 0, 1, }, { "psu_L1_pwr_ok", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x03, 1, 1, }, { "psu_L1_present_L", present_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x03, 2, 1, }, { "psu_L1_input_ok", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x03, 3, 1, }, { "psu_L2_smb_alert", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x03, 4, 1, }, { "psu_L2_pwr_ok", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x03, 5, 1, }, { "psu_L2_present_L", present_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x03, 6, 1, }, { "psu_L2_input_ok", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x03, 7, 1, }, { "psu_R1_smb_alert", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x04, 0, 1, }, { "psu_R1_pwr_ok", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x04, 1, 1, }, { "psu_R1_present_L", present_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x04, 2, 1, }, { "psu_R1_input_ok", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x04, 3, 1, }, { "psu_R2_smb_alert", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x04, 4, 1, }, { "psu_R2_pwr_ok", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x04, 5, 1, }, { "psu_R2_present_L", present_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x04, 6, 1, }, { "psu_R2_input_ok", fail_normal_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x04, 7, 1, }, { "cpld_mac_reset_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x05, 0, 1, }, { "cpld_mac_pcie_perst_l", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x05, 1, 1, }, { "cpld_bcm5396_resetb_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x05, 2, 1, }, { "cpld_bmc_phy_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x05, 3, 1, }, { "cpld_bmc_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x05, 4, 1, }, { "bmc9_9548_0_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x05, 5, 1, }, { "bmc10_9548_1_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x05, 6, 1, }, { "bmc12_9548_2_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x05, 7, 1, }, { "bmc_scm_lpc_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x06, 0, 1, }, { "bmc_extrst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x06, 1, 1, }, { "cpld_fpga_flash_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x06, 2, 1, }, { "cpld_smb_phy_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x06, 3, 1, }, { "cpld_usb2112a_brdg_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x06, 4, 1, }, { "cpld_cp2112_i2c_9548_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x06, 5, 1, }, { "cpld_clkgen_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x06, 6, 1, }, { "cpld_tpm_i2c_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x06, 7, 1, }, { "bmc_pim8_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x07, 0, 1, }, { "bmc_pim7_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x07, 1, 1, }, { "bmc_pim6_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x07, 2, 1, }, { "bmc_pim5_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x07, 3, 1, }, { "bmc_pim4_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x07, 4, 1, }, { "bmc_pim3_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x07, 5, 1, }, { "bmc_pim2_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x07, 6, 1, }, { "bmc_pim1_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x07, 7, 1, }, { "smb_cpld_fcm_cpld_rst_t", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x08, 0, 1, }, { "smb_cpld_fcm_cpld_rst_b", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x08, 1, 1, }, { "smb_cpld_fcm_9548_rst_t", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x08, 2, 1, }, { "smb_cpld_fcm_9548_rst_b", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x08, 3, 1, }, { "bmc_spi_2_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x08, 4, 1, }, { "bmc_spi_1_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x08, 5, 1, }, { "psu_pdb_9548_R_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x08, 6, 1, }, { "psu_pdb_9548_L_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x08, 7, 1, }, { "cpld_pim_hw_rst_1", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x09, 0, 1, }, { "cpld_pim_hw_rst_2", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x09, 1, 1, }, { "cpld_pim_hw_rst_3", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x09, 2, 1, }, { "cpld_pim_hw_rst_4", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x09, 3, 1, }, { "cpld_pim_hw_rst_5", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x09, 4, 1, }, { "cpld_pim_hw_rst_6", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x09, 5, 1, }, { "cpld_pim_hw_rst_7", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x09, 6, 1, }, { "cpld_pim_hw_rst_8", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x09, 7, 1, }, { "cpld_pim1_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0a, 0, 1, }, { "cpld_pim2_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0a, 1, 1, }, { "cpld_pim3_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0a, 2, 1, }, { "cpld_pim4_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0a, 3, 1, }, { "cpld_pim5_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0a, 4, 1, }, { "cpld_pim6_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0a, 5, 1, }, { "cpld_pim7_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0a, 6, 1, }, { "cpld_pim8_9548_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0a, 7, 1, }, { "cpld_9548_0_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0b, 0, 1, }, { "cpld_9548_1_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0b, 1, 1, }, { "cpld_9548_2_rst", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0b, 2, 1, }, { "cpld_usbhub_rst_n", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0b, 3, 1, }, { "scm_reset_cpld_1", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0c, 0, 1, }, { "scm_reset_cpld_2", reset_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0c, 1, 1, }, { "system_reset_lock_unlock", sys_lock_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x0d, 0, 1, }, { "pim_fpga_cpld_1_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x10, 0, 1, }, { "pim_fpga_cpld_2_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x10, 1, 1, }, { "pim_fpga_cpld_3_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x10, 2, 1, }, { "pim_fpga_cpld_4_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x10, 3, 1, }, { "pim_fpga_cpld_5_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x10, 4, 1, }, { "pim_fpga_cpld_6_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x10, 5, 1, }, { "pim_fpga_cpld_7_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x10, 6, 1, }, { "pim_fpga_cpld_8_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x10, 7, 1, }, { "temp_sensor_cpld_alert1_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x11, 0, 1, }, { "temp_sensor_cpld_alert2_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x11, 1, 1, }, { "temp_sensor_cpld_alert3_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x11, 2, 1, }, { "temp_sensor_cpld_alert4_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x11, 3, 1, }, { "pdb_L_temp_alert_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x11, 4, 1, }, { "pdb_R_temp_alert_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x11, 5, 1, }, { "fcm_smb_cpld_fan_alert_b_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x11, 6, 1, }, { "fcm_smb_cpld_fan_alert_t_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x11, 7, 1, }, { "scm_alert_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x12, 0, 1, }, { "scm_m2_alert_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x12, 1, 1, }, { "scm_tpm_pp_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x12, 2, 1, }, { "vdd_core_fault_L_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x12, 3, 1, }, { "mac_cpld_pcie_intr_L_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x12, 4, 1, }, { "tpm_cpld_i2c_daint_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x12, 5, 1, }, { "mac_cpld_pcie_wake_L_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x12, 6, 1, }, { "pim_fpga_cpld_1_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x20, 0, 1, }, { "pim_fpga_cpld_2_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x20, 1, 1, }, { "pim_fpga_cpld_3_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x20, 2, 1, }, { "pim_fpga_cpld_4_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x20, 3, 1, }, { "pim_fpga_cpld_5_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x20, 4, 1, }, { "pim_fpga_cpld_6_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x20, 5, 1, }, { "pim_fpga_cpld_7_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x20, 6, 1, }, { "pim_fpga_cpld_8_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x20, 7, 1, }, { "temp_sensor_cpld_alert1_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x21, 0, 1, }, { "temp_sensor_cpld_alert2_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x21, 1, 1, }, { "temp_sensor_cpld_alert3_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x21, 2, 1, }, { "temp_sensor_cpld_alert4_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x21, 3, 1, }, { "pdb_L_temp_alert_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x21, 4, 1, }, { "pdb_R_temp_alert_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x21, 5, 1, }, { "fcm_smb_cpld_fan_alt_b_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x21, 6, 1, }, { "fcm_smb_cpld_fan_alt_t_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x21, 7, 1, }, { "scm_alert_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x22, 0, 1, }, { "scm_m2_alert_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x22, 1, 1, }, { "scm_tpm_pp_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x22, 2, 1, }, { "vdd_core_fault_L_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x22, 3, 1, }, { "mac_cpld_pcie_intr_L_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x22, 4, 1, }, { "tpm_cpld_i2c_daint_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x22, 5, 1, }, { "mac_cpld_pcie_wake_L_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x22, 6, 1, }, { "pim_fpga_cpld_1_prsnt_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x30, 0, 1, }, { "pim_fpga_cpld_2_prsnt_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x30, 1, 1, }, { "pim_fpga_cpld_3_prsnt_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x30, 2, 1, }, { "pim_fpga_cpld_4_prsnt_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x30, 3, 1, }, { "pim_fpga_cpld_5_prsnt_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x30, 4, 1, }, { "pim_fpga_cpld_6_prsnt_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x30, 5, 1, }, { "pim_fpga_cpld_7_prsnt_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x30, 6, 1, }, { "pim_fpga_cpld_8_prsnt_n_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x30, 7, 1, }, { "pim_fpga_cpld_1_prsnt_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x31, 0, 1, }, { "pim_fpga_cpld_2_prsnt_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x31, 1, 1, }, { "pim_fpga_cpld_3_prsnt_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x31, 2, 1, }, { "pim_fpga_cpld_4_prsnt_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x31, 3, 1, }, { "pim_fpga_cpld_5_prsnt_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x31, 4, 1, }, { "pim_fpga_cpld_6_prsnt_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x31, 5, 1, }, { "pim_fpga_cpld_7_prsnt_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x31, 6, 1, }, { "pim_fpga_cpld_8_prsnt_n_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x31, 7, 1, }, { "pim_fpga_cpld_1_prsnt_n_status", pim_fpga_plug_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x32, 0, 1, }, { "pim_fpga_cpld_2_prsnt_n_status", pim_fpga_plug_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x32, 1, 1, }, { "pim_fpga_cpld_3_prsnt_n_status", pim_fpga_plug_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x32, 2, 1, }, { "pim_fpga_cpld_4_prsnt_n_status", pim_fpga_plug_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x32, 3, 1, }, { "pim_fpga_cpld_5_prsnt_n_status", pim_fpga_plug_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x32, 4, 1, }, { "pim_fpga_cpld_6_prsnt_n_status", pim_fpga_plug_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x32, 5, 1, }, { "pim_fpga_cpld_7_prsnt_n_status", pim_fpga_plug_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x32, 6, 1, }, { "pim_fpga_cpld_8_prsnt_n_status", pim_fpga_plug_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x32, 7, 1, }, { "fcm_smb_cpld_present_t_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x33, 0, 1, }, { "fcm_smb_cpld_present_b_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x33, 1, 1, }, { "scm_presnt_int_status", intr_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x33, 2, 1, }, { "fcm_smb_cpld_present_t_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x34, 0, 1, }, { "fcm_smb_cpld_present_b_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x34, 1, 1, }, { "scm_presnt_int_mask", cpld_cpu_blk_help_str, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x34, 2, 1, }, { "fcm_smb_cpld_present_t_status", "0: SMB had plugged\n" "1: No SMB", I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x35, 0, 1, }, { "fcm_smb_cpld_present_b_status", "0: SMB had plugged\n" "1: No SMB", I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x35, 1, 1, }, { "scm_presnt_status", "0: SCM had plugged\n" "1: No SCM", I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x35, 2, 1, }, { "bmc_cpld_heartbeat_n", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x40, 0, 1, }, { "mac_cpld_pcie_wake_L", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x40, 1, 1, }, { "cpld_smb_phy_lowpwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x40, 2, 1, }, { "cpld_smb_phy_wp", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x40, 3, 1, }, { "cpld_bmc_phy_lowpwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x40, 4, 1, }, { "cpld_bmc_phy_wp", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x40, 5, 1, }, { "cpld_bmc_spi_1_wp_n", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x40, 6, 1, }, { "cpld_cp2112_ee_wp", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x41, 0, 1, }, { "cpld_brdid_ee_wp", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x41, 1, 1, }, { "cpld_mac_wp", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x41, 2, 1, }, { "cpld_spi_sec_boot_wp_n", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x41, 3, 1, }, { "usbhub_en1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x41, 4, 1, }, { "usbhub_en3", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x41, 5, 1, }, { "cpld_usbhub_ocs_n1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x41, 6, 1, }, { "cpld_usbhub_ocs_n3", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x41, 7, 1, }, { "cpld_in_p1220", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x42, 0, 1, }, { "cpld_fpga_prg", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x42, 1, 1, }, { "smb_cpld_uart1_sel", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x42, 2, 1, }, { "smb_cpld_fcm_b_cpld_sel", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x42, 3, 1, }, { "smb_cpld_fcm_t_cpld_sel", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x42, 4, 1, }, { "bmc_pwr_ok", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x43, 0, 1, }, { "th3_pwr_ok", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x43, 1, 1, }, { "ps1_R_on", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x43, 2, 1, }, { "ps2_R_on", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x43, 3, 1, }, { "ps1_L_on", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x43, 4, 1, }, { "ps2_L_on", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x43, 5, 1, }, { "cpld_pim1_pca9548_pwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x45, 0, 1, }, { "cpld_pim2_pca9548_pwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x45, 1, 1, }, { "cpld_pim3_pca9548_pwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x45, 2, 1, }, { "cpld_pim4_pca9548_pwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x45, 3, 1, }, { "cpld_pim5_pca9548_pwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x45, 4, 1, }, { "cpld_pim6_pca9548_pwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x45, 5, 1, }, { "cpld_pim7_pca9548_pwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x45, 6, 1, }, { "cpld_pim8_pca9548_pwr", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x45, 7, 1, }, { "mac_cpld_rov0", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x46, 0, 1, }, { "mac_cpld_rov1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x46, 1, 1, }, { "mac_cpld_rov2", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x46, 2, 1, }, { "mac_cpld_rov3", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x46, 3, 1, }, { "mac_cpld_rov4", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x46, 4, 1, }, { "mac_cpld_rov5", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x46, 5, 1, }, { "mac_cpld_rov6", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x46, 6, 1, }, { "mac_cpld_rov7", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x46, 7, 1, }, { "cp2112a_cpld_gpio0", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x47, 0, 1, }, { "cp2112a_cpld_gpio1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x47, 1, 1, }, { "cp2112a_cpld_gpio2", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x47, 2, 1, }, { "cp2112a_cpld_gpio3", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x47, 3, 1, }, { "cp2112a_cpld_gpio4", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x47, 4, 1, }, { "cp2112a_cpld_gpio5", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x47, 5, 1, }, { "cp2112a_cpld_gpio6", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x47, 6, 1, }, { "spi_1_b0", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x48, 0, 1, }, { "spi_1_b1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x48, 1, 1, }, { "spi_1_b2", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x48, 2, 1, }, { "spi_2_b0", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x48, 3, 1, }, { "spi_2_b1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x48, 4, 1, }, { "spi_2_b2", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x48, 5, 1, }, { "spi_2_b3", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x48, 6, 1, }, { "th3_spi_mux_sel", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x49, 0, 1, }, { "fpga_spi_mux_sel", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x49, 1, 1, }, { "cpld_bcm5396_mux_sel", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x49, 2, 1, }, { "bmc_cpld_gpio_spare1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x4a, 0, 1, }, { "bmc_cpld_gpio_spare2", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x4a, 1, 1, }, { "bmc_cpld_gpio_spare3", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x4a, 2, 1, }, { "bmc_cpld_gpio_spare4", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x4a, 3, 1, }, { "bmc_cpld_gpio_spare5", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x4a, 4, 1, }, { "cpld_reserved_1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x4b, 0, 1, }, { "cpld_reserved_2", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x4b, 1, 1, }, { "cpld_reserved_3", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, I2C_DEV_ATTR_STORE_DEFAULT, 0x4b, 2, 1, }, { "cpld_reserved_4", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x4b, 3, 1, }, { "iso_reserved_1", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x4b, 4, 1, }, { "iso_reserved_2", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x4b, 5, 1, }, { "iso_reserved_3", NULL, I2C_DEV_ATTR_SHOW_DEFAULT, NULL, 0x4b, 6, 1, }, }; /* * SMBCPLD i2c addresses. */ static const unsigned short normal_i2c[] = { 0x3e, I2C_CLIENT_END }; /* SMBCPLD id */ static const struct i2c_device_id smbcpld_id[] = { { "smbcpld", 0 }, { }, }; MODULE_DEVICE_TABLE(i2c, smbcpld_id); /* Return 0 if detection is successful, -ENODEV otherwise */ static int smbcpld_detect(struct i2c_client *client, struct i2c_board_info *info) { /* * We don't currently do any detection of the SMBCPLD */ strlcpy(info->type, "smbcpld", I2C_NAME_SIZE); return 0; } static int smbcpld_probe(struct i2c_client *client, const struct i2c_device_id *id) { int n_attrs = sizeof(smbcpld_attr_table) / sizeof(smbcpld_attr_table[0]); struct device *dev = &client->dev; i2c_dev_data_st *data; data = devm_kzalloc(dev, sizeof(i2c_dev_data_st), GFP_KERNEL); if (!data) { return -ENOMEM; } return i2c_dev_sysfs_data_init(client, data, smbcpld_attr_table, n_attrs); } static int smbcpld_remove(struct i2c_client *client) { i2c_dev_data_st *data = i2c_get_clientdata(client); i2c_dev_sysfs_data_clean(client, data); return 0; } static struct i2c_driver smbcpld_driver = { .class = I2C_CLASS_HWMON, .driver = { .name = "smbcpld", }, .probe = smbcpld_probe, .remove = smbcpld_remove, .id_table = smbcpld_id, .detect = smbcpld_detect, .address_list = normal_i2c, }; static int __init smbcpld_mod_init(void) { return i2c_add_driver(&smbcpld_driver); } static void __exit smbcpld_mod_exit(void) { i2c_del_driver(&smbcpld_driver); } MODULE_AUTHOR("Tian Fang <tfang@fb.com>"); MODULE_DESCRIPTION("SMBCPLD Driver"); MODULE_LICENSE("GPL"); module_init(smbcpld_mod_init); module_exit(smbcpld_mod_exit);