Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
0002 /*
0003  * Mellanox platform driver
0004  *
0005  * Copyright (C) 2016-2018 Mellanox Technologies
0006  * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
0007  */
0008 
0009 #include <linux/device.h>
0010 #include <linux/dmi.h>
0011 #include <linux/i2c.h>
0012 #include <linux/i2c-mux.h>
0013 #include <linux/io.h>
0014 #include <linux/module.h>
0015 #include <linux/platform_device.h>
0016 #include <linux/platform_data/i2c-mux-reg.h>
0017 #include <linux/platform_data/mlxreg.h>
0018 #include <linux/regmap.h>
0019 
0020 #define MLX_PLAT_DEVICE_NAME        "mlxplat"
0021 
0022 /* LPC bus IO offsets */
0023 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR      0x2000
0024 #define MLXPLAT_CPLD_LPC_REG_BASE_ADRR      0x2500
0025 #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET   0x00
0026 #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET   0x01
0027 #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET   0x02
0028 #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET   0x03
0029 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET    0x04
0030 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET   0x05
0031 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET    0x06
0032 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET   0x07
0033 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET    0x08
0034 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET   0x09
0035 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET    0x0a
0036 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET   0x0b
0037 #define MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET   0x19
0038 #define MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET   0x1c
0039 #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
0040 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET  0x1e
0041 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET  0x1f
0042 #define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET    0x20
0043 #define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET    0x21
0044 #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET    0x22
0045 #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET    0x23
0046 #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET    0x24
0047 #define MLXPLAT_CPLD_LPC_REG_LED6_OFFSET    0x25
0048 #define MLXPLAT_CPLD_LPC_REG_LED7_OFFSET    0x26
0049 #define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION  0x2a
0050 #define MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET  0x2b
0051 #define MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET  0x2d
0052 #define MLXPLAT_CPLD_LPC_REG_GP0_OFFSET     0x2e
0053 #define MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET  0x2f
0054 #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET     0x30
0055 #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET     0x31
0056 #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET     0x32
0057 #define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET     0x33
0058 #define MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE  0x34
0059 #define MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET   0x35
0060 #define MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET    0x36
0061 #define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET 0x37
0062 #define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET    0x3a
0063 #define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET   0x3b
0064 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET  0x40
0065 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET 0x41
0066 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET  0x42
0067 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET 0x43
0068 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET  0x44
0069 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET 0x45
0070 #define MLXPLAT_CPLD_LPC_REG_GWP_OFFSET     0x4a
0071 #define MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET   0x4b
0072 #define MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET    0x4c
0073 #define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
0074 #define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET  0x51
0075 #define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET   0x52
0076 #define MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET 0x53
0077 #define MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET 0x54
0078 #define MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET  0x55
0079 #define MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET  0x56
0080 #define MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET 0x57
0081 #define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET     0x58
0082 #define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET   0x59
0083 #define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET    0x5a
0084 #define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET     0x64
0085 #define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET   0x65
0086 #define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET    0x66
0087 #define MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET   0x70
0088 #define MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET 0x71
0089 #define MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET  0x72
0090 #define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET     0x88
0091 #define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET   0x89
0092 #define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET    0x8a
0093 #define MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET   0x9a
0094 #define MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET 0x9b
0095 #define MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET  0x9c
0096 #define MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET   0x9d
0097 #define MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET 0x9e
0098 #define MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET  0x9f
0099 #define MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET   0xa0
0100 #define MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET 0xa1
0101 #define MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET  0xa2
0102 #define MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET   0xa3
0103 #define MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET 0xa4
0104 #define MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET  0xa5
0105 #define MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET   0xa6
0106 #define MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET 0xa7
0107 #define MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET  0xa8
0108 #define MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET   0xa9
0109 #define MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET 0xaa
0110 #define MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET  0xab
0111 #define MLXPLAT_CPLD_LPC_REG_LC_PWR_ON      0xb2
0112 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET    0xc7
0113 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET 0xc8
0114 #define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET 0xc9
0115 #define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET 0xcb
0116 #define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET 0xcd
0117 #define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET   0xce
0118 #define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET 0xcf
0119 #define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET 0xd1
0120 #define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET   0xd2
0121 #define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET 0xd3
0122 #define MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET  0xde
0123 #define MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET  0xdf
0124 #define MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET  0xe0
0125 #define MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET  0xe1
0126 #define MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET 0xe2
0127 #define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET    0xe3
0128 #define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET  0xe4
0129 #define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET  0xe5
0130 #define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET  0xe6
0131 #define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET  0xe7
0132 #define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET  0xe8
0133 #define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET  0xe9
0134 #define MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET    0xea
0135 #define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET  0xeb
0136 #define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET  0xec
0137 #define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET  0xed
0138 #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee
0139 #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef
0140 #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0
0141 #define MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET 0xf1
0142 #define MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET 0xf2
0143 #define MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET    0xf3
0144 #define MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET    0xf4
0145 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET    0xf5
0146 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET    0xf6
0147 #define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7
0148 #define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET 0xf8
0149 #define MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET 0xf9
0150 #define MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET    0xfa
0151 #define MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET 0xfb
0152 #define MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET 0xfc
0153 #define MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET 0xfd
0154 #define MLXPLAT_CPLD_LPC_IO_RANGE       0x100
0155 #define MLXPLAT_CPLD_LPC_I2C_CH1_OFF        0xdb
0156 #define MLXPLAT_CPLD_LPC_I2C_CH2_OFF        0xda
0157 #define MLXPLAT_CPLD_LPC_I2C_CH3_OFF        0xdc
0158 #define MLXPLAT_CPLD_LPC_I2C_CH4_OFF        0xdd
0159 
0160 #define MLXPLAT_CPLD_LPC_PIO_OFFSET     0x10000UL
0161 #define MLXPLAT_CPLD_LPC_REG1   ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
0162                   MLXPLAT_CPLD_LPC_I2C_CH1_OFF) | \
0163                   MLXPLAT_CPLD_LPC_PIO_OFFSET)
0164 #define MLXPLAT_CPLD_LPC_REG2   ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
0165                   MLXPLAT_CPLD_LPC_I2C_CH2_OFF) | \
0166                   MLXPLAT_CPLD_LPC_PIO_OFFSET)
0167 #define MLXPLAT_CPLD_LPC_REG3   ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
0168                   MLXPLAT_CPLD_LPC_I2C_CH3_OFF) | \
0169                   MLXPLAT_CPLD_LPC_PIO_OFFSET)
0170 #define MLXPLAT_CPLD_LPC_REG4   ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
0171                   MLXPLAT_CPLD_LPC_I2C_CH4_OFF) | \
0172                   MLXPLAT_CPLD_LPC_PIO_OFFSET)
0173 
0174 /* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
0175 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF 0x04
0176 #define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF  0x08
0177 #define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF  0x08
0178 #define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF  0x40
0179 #define MLXPLAT_CPLD_AGGR_MASK_DEF  (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
0180                      MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
0181                      MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
0182 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG  0x01
0183 #define MLXPLAT_CPLD_AGGR_MASK_NG_DEF   0x04
0184 #define MLXPLAT_CPLD_AGGR_MASK_COMEX    BIT(0)
0185 #define MLXPLAT_CPLD_AGGR_MASK_LC   BIT(3)
0186 #define MLXPLAT_CPLD_AGGR_MASK_MODULAR  (MLXPLAT_CPLD_AGGR_MASK_NG_DEF | \
0187                      MLXPLAT_CPLD_AGGR_MASK_COMEX | \
0188                      MLXPLAT_CPLD_AGGR_MASK_LC)
0189 #define MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT BIT(0)
0190 #define MLXPLAT_CPLD_AGGR_MASK_LC_RDY   BIT(1)
0191 #define MLXPLAT_CPLD_AGGR_MASK_LC_PG    BIT(2)
0192 #define MLXPLAT_CPLD_AGGR_MASK_LC_SCRD  BIT(3)
0193 #define MLXPLAT_CPLD_AGGR_MASK_LC_SYNC  BIT(4)
0194 #define MLXPLAT_CPLD_AGGR_MASK_LC_ACT   BIT(5)
0195 #define MLXPLAT_CPLD_AGGR_MASK_LC_SDWN  BIT(6)
0196 #define MLXPLAT_CPLD_AGGR_MASK_LC_LOW   (MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT | \
0197                      MLXPLAT_CPLD_AGGR_MASK_LC_RDY | \
0198                      MLXPLAT_CPLD_AGGR_MASK_LC_PG | \
0199                      MLXPLAT_CPLD_AGGR_MASK_LC_SCRD | \
0200                      MLXPLAT_CPLD_AGGR_MASK_LC_SYNC | \
0201                      MLXPLAT_CPLD_AGGR_MASK_LC_ACT | \
0202                      MLXPLAT_CPLD_AGGR_MASK_LC_SDWN)
0203 #define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW  0xc1
0204 #define MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2    BIT(2)
0205 #define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C  BIT(6)
0206 #define MLXPLAT_CPLD_PSU_MASK       GENMASK(1, 0)
0207 #define MLXPLAT_CPLD_PWR_MASK       GENMASK(1, 0)
0208 #define MLXPLAT_CPLD_PSU_EXT_MASK   GENMASK(3, 0)
0209 #define MLXPLAT_CPLD_PWR_EXT_MASK   GENMASK(3, 0)
0210 #define MLXPLAT_CPLD_FAN_MASK       GENMASK(3, 0)
0211 #define MLXPLAT_CPLD_ASIC_MASK      GENMASK(1, 0)
0212 #define MLXPLAT_CPLD_FAN_NG_MASK    GENMASK(6, 0)
0213 #define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
0214 #define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
0215 #define MLXPLAT_CPLD_VOLTREG_UPD_MASK   GENMASK(5, 4)
0216 #define MLXPLAT_CPLD_GWP_MASK       GENMASK(0, 0)
0217 #define MLXPLAT_CPLD_I2C_CAP_BIT    0x04
0218 #define MLXPLAT_CPLD_I2C_CAP_MASK   GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
0219 
0220 /* Masks for aggregation for comex carriers */
0221 #define MLXPLAT_CPLD_AGGR_MASK_CARRIER  BIT(1)
0222 #define MLXPLAT_CPLD_AGGR_MASK_CARR_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
0223                      MLXPLAT_CPLD_AGGR_MASK_CARRIER)
0224 #define MLXPLAT_CPLD_LOW_AGGRCX_MASK    0xc1
0225 
0226 /* Masks for aggregation for modular systems */
0227 #define MLXPLAT_CPLD_LPC_LC_MASK    GENMASK(7, 0)
0228 
0229 /* Default I2C parent bus number */
0230 #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR    1
0231 
0232 /* Maximum number of possible physical buses equipped on system */
0233 #define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM   16
0234 #define MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM   24
0235 
0236 /* Number of channels in group */
0237 #define MLXPLAT_CPLD_GRP_CHNL_NUM       8
0238 
0239 /* Start channel numbers */
0240 #define MLXPLAT_CPLD_CH1            2
0241 #define MLXPLAT_CPLD_CH2            10
0242 #define MLXPLAT_CPLD_CH3            18
0243 #define MLXPLAT_CPLD_CH2_ETH_MODULAR        3
0244 #define MLXPLAT_CPLD_CH3_ETH_MODULAR        43
0245 #define MLXPLAT_CPLD_CH4_ETH_MODULAR        51
0246 
0247 /* Number of LPC attached MUX platform devices */
0248 #define MLXPLAT_CPLD_LPC_MUX_DEVS       4
0249 
0250 /* Hotplug devices adapter numbers */
0251 #define MLXPLAT_CPLD_NR_NONE            -1
0252 #define MLXPLAT_CPLD_PSU_DEFAULT_NR     10
0253 #define MLXPLAT_CPLD_PSU_MSNXXXX_NR     4
0254 #define MLXPLAT_CPLD_FAN1_DEFAULT_NR        11
0255 #define MLXPLAT_CPLD_FAN2_DEFAULT_NR        12
0256 #define MLXPLAT_CPLD_FAN3_DEFAULT_NR        13
0257 #define MLXPLAT_CPLD_FAN4_DEFAULT_NR        14
0258 #define MLXPLAT_CPLD_NR_ASIC            3
0259 #define MLXPLAT_CPLD_NR_LC_BASE         34
0260 
0261 #define MLXPLAT_CPLD_NR_LC_SET(nr)  (MLXPLAT_CPLD_NR_LC_BASE + (nr))
0262 #define MLXPLAT_CPLD_LC_ADDR        0x32
0263 
0264 /* Masks and default values for watchdogs */
0265 #define MLXPLAT_CPLD_WD1_CLEAR_MASK GENMASK(7, 1)
0266 #define MLXPLAT_CPLD_WD2_CLEAR_MASK (GENMASK(7, 0) & ~BIT(1))
0267 
0268 #define MLXPLAT_CPLD_WD_TYPE1_TO_MASK   GENMASK(7, 4)
0269 #define MLXPLAT_CPLD_WD_TYPE2_TO_MASK   0
0270 #define MLXPLAT_CPLD_WD_RESET_ACT_MASK  GENMASK(7, 1)
0271 #define MLXPLAT_CPLD_WD_FAN_ACT_MASK    (GENMASK(7, 0) & ~BIT(4))
0272 #define MLXPLAT_CPLD_WD_COUNT_ACT_MASK  (GENMASK(7, 0) & ~BIT(7))
0273 #define MLXPLAT_CPLD_WD_CPBLTY_MASK (GENMASK(7, 0) & ~BIT(6))
0274 #define MLXPLAT_CPLD_WD_DFLT_TIMEOUT    30
0275 #define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT   600
0276 #define MLXPLAT_CPLD_WD_MAX_DEVS    2
0277 
0278 #define MLXPLAT_CPLD_LPC_SYSIRQ     17
0279 
0280 /* Minimum power required for turning on Ethernet modular system (WATT) */
0281 #define MLXPLAT_CPLD_ETH_MODULAR_PWR_MIN    50
0282 
0283 /* mlxplat_priv - platform private data
0284  * @pdev_i2c - i2c controller platform device
0285  * @pdev_mux - array of mux platform devices
0286  * @pdev_hotplug - hotplug platform devices
0287  * @pdev_led - led platform devices
0288  * @pdev_io_regs - register access platform devices
0289  * @pdev_fan - FAN platform devices
0290  * @pdev_wd - array of watchdog platform devices
0291  * @regmap: device register map
0292  */
0293 struct mlxplat_priv {
0294     struct platform_device *pdev_i2c;
0295     struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
0296     struct platform_device *pdev_hotplug;
0297     struct platform_device *pdev_led;
0298     struct platform_device *pdev_io_regs;
0299     struct platform_device *pdev_fan;
0300     struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
0301     void *regmap;
0302 };
0303 
0304 /* Regions for LPC I2C controller and LPC base register space */
0305 static const struct resource mlxplat_lpc_resources[] = {
0306     [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
0307                    MLXPLAT_CPLD_LPC_IO_RANGE,
0308                    "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
0309     [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
0310                    MLXPLAT_CPLD_LPC_IO_RANGE,
0311                    "mlxplat_cpld_lpc_regs",
0312                    IORESOURCE_IO),
0313 };
0314 
0315 /* Platform i2c next generation systems data */
0316 static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
0317     {
0318         .reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
0319         .mask = MLXPLAT_CPLD_I2C_CAP_MASK,
0320         .bit = MLXPLAT_CPLD_I2C_CAP_BIT,
0321     },
0322 };
0323 
0324 static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
0325     {
0326         .data = mlxplat_mlxcpld_i2c_ng_items_data,
0327     },
0328 };
0329 
0330 /* Platform next generation systems i2c data */
0331 static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
0332     .items = mlxplat_mlxcpld_i2c_ng_items,
0333     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
0334     .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
0335     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
0336     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
0337 };
0338 
0339 /* Platform default channels */
0340 static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
0341     {
0342         MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
0343         MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
0344         5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
0345     },
0346     {
0347         MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
0348         MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
0349         5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
0350     },
0351 };
0352 
0353 /* Platform channels for MSN21xx system family */
0354 static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
0355 
0356 /* Platform mux data */
0357 static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
0358     {
0359         .parent = 1,
0360         .base_nr = MLXPLAT_CPLD_CH1,
0361         .write_only = 1,
0362         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
0363         .reg_size = 1,
0364         .idle_in_use = 1,
0365     },
0366     {
0367         .parent = 1,
0368         .base_nr = MLXPLAT_CPLD_CH2,
0369         .write_only = 1,
0370         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
0371         .reg_size = 1,
0372         .idle_in_use = 1,
0373     },
0374 
0375 };
0376 
0377 /* Platform mux configuration variables */
0378 static int mlxplat_max_adap_num;
0379 static int mlxplat_mux_num;
0380 static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
0381 
0382 /* Platform extended mux data */
0383 static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
0384     {
0385         .parent = 1,
0386         .base_nr = MLXPLAT_CPLD_CH1,
0387         .write_only = 1,
0388         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
0389         .reg_size = 1,
0390         .idle_in_use = 1,
0391     },
0392     {
0393         .parent = 1,
0394         .base_nr = MLXPLAT_CPLD_CH2,
0395         .write_only = 1,
0396         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
0397         .reg_size = 1,
0398         .idle_in_use = 1,
0399     },
0400     {
0401         .parent = 1,
0402         .base_nr = MLXPLAT_CPLD_CH3,
0403         .write_only = 1,
0404         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
0405         .reg_size = 1,
0406         .idle_in_use = 1,
0407     },
0408 
0409 };
0410 
0411 /* Platform channels for modular system family */
0412 static const int mlxplat_modular_upper_channel[] = { 1 };
0413 static const int mlxplat_modular_channels[] = {
0414     1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
0415     21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
0416     38, 39, 40
0417 };
0418 
0419 /* Platform modular mux data */
0420 static struct i2c_mux_reg_platform_data mlxplat_modular_mux_data[] = {
0421     {
0422         .parent = 1,
0423         .base_nr = MLXPLAT_CPLD_CH1,
0424         .write_only = 1,
0425         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG4,
0426         .reg_size = 1,
0427         .idle_in_use = 1,
0428         .values = mlxplat_modular_upper_channel,
0429         .n_values = ARRAY_SIZE(mlxplat_modular_upper_channel),
0430     },
0431     {
0432         .parent = 1,
0433         .base_nr = MLXPLAT_CPLD_CH2_ETH_MODULAR,
0434         .write_only = 1,
0435         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
0436         .reg_size = 1,
0437         .idle_in_use = 1,
0438         .values = mlxplat_modular_channels,
0439         .n_values = ARRAY_SIZE(mlxplat_modular_channels),
0440     },
0441     {
0442         .parent = MLXPLAT_CPLD_CH1,
0443         .base_nr = MLXPLAT_CPLD_CH3_ETH_MODULAR,
0444         .write_only = 1,
0445         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
0446         .reg_size = 1,
0447         .idle_in_use = 1,
0448         .values = mlxplat_msn21xx_channels,
0449         .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
0450     },
0451     {
0452         .parent = 1,
0453         .base_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR,
0454         .write_only = 1,
0455         .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
0456         .reg_size = 1,
0457         .idle_in_use = 1,
0458         .values = mlxplat_msn21xx_channels,
0459         .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
0460     },
0461 };
0462 
0463 /* Platform hotplug devices */
0464 static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
0465     {
0466         I2C_BOARD_INFO("dps460", 0x59),
0467     },
0468     {
0469         I2C_BOARD_INFO("dps460", 0x58),
0470     },
0471 };
0472 
0473 static struct i2c_board_info mlxplat_mlxcpld_ext_pwr[] = {
0474     {
0475         I2C_BOARD_INFO("dps460", 0x5b),
0476     },
0477     {
0478         I2C_BOARD_INFO("dps460", 0x5a),
0479     },
0480 };
0481 
0482 static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
0483     {
0484         I2C_BOARD_INFO("24c32", 0x50),
0485     },
0486     {
0487         I2C_BOARD_INFO("24c32", 0x50),
0488     },
0489     {
0490         I2C_BOARD_INFO("24c32", 0x50),
0491     },
0492     {
0493         I2C_BOARD_INFO("24c32", 0x50),
0494     },
0495 };
0496 
0497 /* Platform hotplug comex carrier system family data */
0498 static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
0499     {
0500         .label = "psu1",
0501         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0502         .mask = BIT(0),
0503         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0504     },
0505     {
0506         .label = "psu2",
0507         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0508         .mask = BIT(1),
0509         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0510     },
0511 };
0512 
0513 /* Platform hotplug default data */
0514 static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
0515     {
0516         .label = "psu1",
0517         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0518         .mask = BIT(0),
0519         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0520     },
0521     {
0522         .label = "psu2",
0523         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0524         .mask = BIT(1),
0525         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0526     },
0527 };
0528 
0529 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
0530     {
0531         .label = "pwr1",
0532         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0533         .mask = BIT(0),
0534         .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
0535         .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
0536     },
0537     {
0538         .label = "pwr2",
0539         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0540         .mask = BIT(1),
0541         .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
0542         .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
0543     },
0544 };
0545 
0546 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_wc_items_data[] = {
0547     {
0548         .label = "pwr1",
0549         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0550         .mask = BIT(0),
0551         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0552     },
0553     {
0554         .label = "pwr2",
0555         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0556         .mask = BIT(1),
0557         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0558     },
0559 };
0560 
0561 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
0562     {
0563         .label = "fan1",
0564         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0565         .mask = BIT(0),
0566         .hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
0567         .hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
0568     },
0569     {
0570         .label = "fan2",
0571         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0572         .mask = BIT(1),
0573         .hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
0574         .hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
0575     },
0576     {
0577         .label = "fan3",
0578         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0579         .mask = BIT(2),
0580         .hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
0581         .hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
0582     },
0583     {
0584         .label = "fan4",
0585         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0586         .mask = BIT(3),
0587         .hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
0588         .hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
0589     },
0590 };
0591 
0592 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
0593     {
0594         .label = "asic1",
0595         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
0596         .mask = MLXPLAT_CPLD_ASIC_MASK,
0597         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0598     },
0599 };
0600 
0601 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic2_items_data[] = {
0602     {
0603         .label = "asic2",
0604         .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
0605         .mask = MLXPLAT_CPLD_ASIC_MASK,
0606         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0607     },
0608 };
0609 
0610 static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
0611     {
0612         .data = mlxplat_mlxcpld_default_psu_items_data,
0613         .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
0614         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0615         .mask = MLXPLAT_CPLD_PSU_MASK,
0616         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
0617         .inversed = 1,
0618         .health = false,
0619     },
0620     {
0621         .data = mlxplat_mlxcpld_default_pwr_items_data,
0622         .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
0623         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0624         .mask = MLXPLAT_CPLD_PWR_MASK,
0625         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
0626         .inversed = 0,
0627         .health = false,
0628     },
0629     {
0630         .data = mlxplat_mlxcpld_default_fan_items_data,
0631         .aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
0632         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0633         .mask = MLXPLAT_CPLD_FAN_MASK,
0634         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
0635         .inversed = 1,
0636         .health = false,
0637     },
0638     {
0639         .data = mlxplat_mlxcpld_default_asic_items_data,
0640         .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
0641         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
0642         .mask = MLXPLAT_CPLD_ASIC_MASK,
0643         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
0644         .inversed = 0,
0645         .health = true,
0646     },
0647 };
0648 
0649 static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
0650     {
0651         .data = mlxplat_mlxcpld_comex_psu_items_data,
0652         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
0653         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0654         .mask = MLXPLAT_CPLD_PSU_MASK,
0655         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
0656         .inversed = 1,
0657         .health = false,
0658     },
0659     {
0660         .data = mlxplat_mlxcpld_default_pwr_items_data,
0661         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
0662         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0663         .mask = MLXPLAT_CPLD_PWR_MASK,
0664         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
0665         .inversed = 0,
0666         .health = false,
0667     },
0668     {
0669         .data = mlxplat_mlxcpld_default_fan_items_data,
0670         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
0671         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0672         .mask = MLXPLAT_CPLD_FAN_MASK,
0673         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
0674         .inversed = 1,
0675         .health = false,
0676     },
0677     {
0678         .data = mlxplat_mlxcpld_default_asic_items_data,
0679         .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
0680         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
0681         .mask = MLXPLAT_CPLD_ASIC_MASK,
0682         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
0683         .inversed = 0,
0684         .health = true,
0685     },
0686 };
0687 
0688 static
0689 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
0690     .items = mlxplat_mlxcpld_default_items,
0691     .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
0692     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
0693     .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
0694     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
0695     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
0696 };
0697 
0698 static struct mlxreg_core_item mlxplat_mlxcpld_default_wc_items[] = {
0699     {
0700         .data = mlxplat_mlxcpld_comex_psu_items_data,
0701         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
0702         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0703         .mask = MLXPLAT_CPLD_PSU_MASK,
0704         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
0705         .inversed = 1,
0706         .health = false,
0707     },
0708     {
0709         .data = mlxplat_mlxcpld_default_pwr_wc_items_data,
0710         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
0711         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0712         .mask = MLXPLAT_CPLD_PWR_MASK,
0713         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
0714         .inversed = 0,
0715         .health = false,
0716     },
0717     {
0718         .data = mlxplat_mlxcpld_default_asic_items_data,
0719         .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
0720         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
0721         .mask = MLXPLAT_CPLD_ASIC_MASK,
0722         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
0723         .inversed = 0,
0724         .health = true,
0725     },
0726 };
0727 
0728 static
0729 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_wc_data = {
0730     .items = mlxplat_mlxcpld_default_wc_items,
0731     .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_wc_items),
0732     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
0733     .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
0734     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
0735     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
0736 };
0737 
0738 static
0739 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
0740     .items = mlxplat_mlxcpld_comex_items,
0741     .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
0742     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
0743     .mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
0744     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
0745     .mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
0746 };
0747 
0748 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
0749     {
0750         .label = "pwr1",
0751         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0752         .mask = BIT(0),
0753         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0754     },
0755     {
0756         .label = "pwr2",
0757         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0758         .mask = BIT(1),
0759         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0760     },
0761 };
0762 
0763 /* Platform hotplug MSN21xx system family data */
0764 static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
0765     {
0766         .data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
0767         .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
0768         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0769         .mask = MLXPLAT_CPLD_PWR_MASK,
0770         .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
0771         .inversed = 0,
0772         .health = false,
0773     },
0774     {
0775         .data = mlxplat_mlxcpld_default_asic_items_data,
0776         .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
0777         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
0778         .mask = MLXPLAT_CPLD_ASIC_MASK,
0779         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
0780         .inversed = 0,
0781         .health = true,
0782     },
0783 };
0784 
0785 static
0786 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
0787     .items = mlxplat_mlxcpld_msn21xx_items,
0788     .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
0789     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
0790     .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
0791     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
0792     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
0793 };
0794 
0795 /* Platform hotplug msn274x system family data */
0796 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
0797     {
0798         .label = "psu1",
0799         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0800         .mask = BIT(0),
0801         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0802     },
0803     {
0804         .label = "psu2",
0805         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0806         .mask = BIT(1),
0807         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0808     },
0809 };
0810 
0811 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
0812     {
0813         .label = "pwr1",
0814         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0815         .mask = BIT(0),
0816         .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
0817         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
0818     },
0819     {
0820         .label = "pwr2",
0821         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0822         .mask = BIT(1),
0823         .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
0824         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
0825     },
0826 };
0827 
0828 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
0829     {
0830         .label = "fan1",
0831         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0832         .mask = BIT(0),
0833         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0834     },
0835     {
0836         .label = "fan2",
0837         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0838         .mask = BIT(1),
0839         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0840     },
0841     {
0842         .label = "fan3",
0843         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0844         .mask = BIT(2),
0845         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0846     },
0847     {
0848         .label = "fan4",
0849         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0850         .mask = BIT(3),
0851         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0852     },
0853 };
0854 
0855 static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
0856     {
0857         .data = mlxplat_mlxcpld_msn274x_psu_items_data,
0858         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
0859         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0860         .mask = MLXPLAT_CPLD_PSU_MASK,
0861         .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
0862         .inversed = 1,
0863         .health = false,
0864     },
0865     {
0866         .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
0867         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
0868         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0869         .mask = MLXPLAT_CPLD_PWR_MASK,
0870         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
0871         .inversed = 0,
0872         .health = false,
0873     },
0874     {
0875         .data = mlxplat_mlxcpld_msn274x_fan_items_data,
0876         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
0877         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0878         .mask = MLXPLAT_CPLD_FAN_MASK,
0879         .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
0880         .inversed = 1,
0881         .health = false,
0882     },
0883     {
0884         .data = mlxplat_mlxcpld_default_asic_items_data,
0885         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
0886         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
0887         .mask = MLXPLAT_CPLD_ASIC_MASK,
0888         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
0889         .inversed = 0,
0890         .health = true,
0891     },
0892 };
0893 
0894 static
0895 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
0896     .items = mlxplat_mlxcpld_msn274x_items,
0897     .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
0898     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
0899     .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
0900     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
0901     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
0902 };
0903 
0904 /* Platform hotplug MSN201x system family data */
0905 static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
0906     {
0907         .label = "pwr1",
0908         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0909         .mask = BIT(0),
0910         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0911     },
0912     {
0913         .label = "pwr2",
0914         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0915         .mask = BIT(1),
0916         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0917     },
0918 };
0919 
0920 static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
0921     {
0922         .data = mlxplat_mlxcpld_msn201x_pwr_items_data,
0923         .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
0924         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
0925         .mask = MLXPLAT_CPLD_PWR_MASK,
0926         .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
0927         .inversed = 0,
0928         .health = false,
0929     },
0930     {
0931         .data = mlxplat_mlxcpld_default_asic_items_data,
0932         .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
0933         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
0934         .mask = MLXPLAT_CPLD_ASIC_MASK,
0935         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
0936         .inversed = 0,
0937         .health = true,
0938     },
0939 };
0940 
0941 static
0942 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
0943     .items = mlxplat_mlxcpld_msn201x_items,
0944     .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
0945     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
0946     .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
0947     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
0948     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
0949 };
0950 
0951 /* Platform hotplug next generation system family data */
0952 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
0953     {
0954         .label = "psu1",
0955         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0956         .mask = BIT(0),
0957         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0958     },
0959     {
0960         .label = "psu2",
0961         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
0962         .mask = BIT(1),
0963         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0964     },
0965 };
0966 
0967 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
0968     {
0969         .label = "fan1",
0970         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0971         .mask = BIT(0),
0972         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
0973         .bit = BIT(0),
0974         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0975     },
0976     {
0977         .label = "fan2",
0978         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0979         .mask = BIT(1),
0980         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
0981         .bit = BIT(1),
0982         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0983     },
0984     {
0985         .label = "fan3",
0986         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0987         .mask = BIT(2),
0988         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
0989         .bit = BIT(2),
0990         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0991     },
0992     {
0993         .label = "fan4",
0994         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
0995         .mask = BIT(3),
0996         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
0997         .bit = BIT(3),
0998         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
0999     },
1000     {
1001         .label = "fan5",
1002         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1003         .mask = BIT(4),
1004         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1005         .bit = BIT(4),
1006         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1007     },
1008     {
1009         .label = "fan6",
1010         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1011         .mask = BIT(5),
1012         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1013         .bit = BIT(5),
1014         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1015     },
1016     {
1017         .label = "fan7",
1018         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1019         .mask = BIT(6),
1020         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1021         .bit = BIT(6),
1022         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1023     },
1024 };
1025 
1026 static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
1027     {
1028         .data = mlxplat_mlxcpld_default_ng_psu_items_data,
1029         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1030         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1031         .mask = MLXPLAT_CPLD_PSU_MASK,
1032         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
1033         .inversed = 1,
1034         .health = false,
1035     },
1036     {
1037         .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
1038         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1039         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1040         .mask = MLXPLAT_CPLD_PWR_MASK,
1041         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
1042         .inversed = 0,
1043         .health = false,
1044     },
1045     {
1046         .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1047         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1048         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1049         .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1050         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1051         .inversed = 1,
1052         .health = false,
1053     },
1054     {
1055         .data = mlxplat_mlxcpld_default_asic_items_data,
1056         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1057         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1058         .mask = MLXPLAT_CPLD_ASIC_MASK,
1059         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1060         .inversed = 0,
1061         .health = true,
1062     },
1063 };
1064 
1065 static
1066 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
1067     .items = mlxplat_mlxcpld_default_ng_items,
1068     .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
1069     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1070     .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1071     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1072     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
1073 };
1074 
1075 /* Platform hotplug extended system family data */
1076 static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
1077     {
1078         .label = "psu1",
1079         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1080         .mask = BIT(0),
1081         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1082     },
1083     {
1084         .label = "psu2",
1085         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1086         .mask = BIT(1),
1087         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1088     },
1089     {
1090         .label = "psu3",
1091         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1092         .mask = BIT(2),
1093         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1094     },
1095     {
1096         .label = "psu4",
1097         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1098         .mask = BIT(3),
1099         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1100     },
1101 };
1102 
1103 static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
1104     {
1105         .label = "pwr1",
1106         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1107         .mask = BIT(0),
1108         .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1109         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1110     },
1111     {
1112         .label = "pwr2",
1113         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1114         .mask = BIT(1),
1115         .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1116         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1117     },
1118     {
1119         .label = "pwr3",
1120         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1121         .mask = BIT(2),
1122         .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1123         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1124     },
1125     {
1126         .label = "pwr4",
1127         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1128         .mask = BIT(3),
1129         .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1130         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1131     },
1132 };
1133 
1134 static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
1135     {
1136         .data = mlxplat_mlxcpld_ext_psu_items_data,
1137         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1138         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1139         .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1140         .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1141         .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1142         .inversed = 1,
1143         .health = false,
1144     },
1145     {
1146         .data = mlxplat_mlxcpld_ext_pwr_items_data,
1147         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1148         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1149         .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1150         .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1151         .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1152         .inversed = 0,
1153         .health = false,
1154     },
1155     {
1156         .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1157         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1158         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1159         .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1160         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1161         .inversed = 1,
1162         .health = false,
1163     },
1164     {
1165         .data = mlxplat_mlxcpld_default_asic_items_data,
1166         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1167         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1168         .mask = MLXPLAT_CPLD_ASIC_MASK,
1169         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1170         .inversed = 0,
1171         .health = true,
1172     },
1173     {
1174         .data = mlxplat_mlxcpld_default_asic2_items_data,
1175         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1176         .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
1177         .mask = MLXPLAT_CPLD_ASIC_MASK,
1178         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic2_items_data),
1179         .inversed = 0,
1180         .health = true,
1181     }
1182 };
1183 
1184 static
1185 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
1186     .items = mlxplat_mlxcpld_ext_items,
1187     .counter = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
1188     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1189     .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1190     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1191     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
1192 };
1193 
1194 static struct mlxreg_core_data mlxplat_mlxcpld_modular_pwr_items_data[] = {
1195     {
1196         .label = "pwr1",
1197         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1198         .mask = BIT(0),
1199         .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1200         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1201     },
1202     {
1203         .label = "pwr2",
1204         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1205         .mask = BIT(1),
1206         .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1207         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1208     },
1209     {
1210         .label = "pwr3",
1211         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1212         .mask = BIT(2),
1213         .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1214         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1215     },
1216     {
1217         .label = "pwr4",
1218         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1219         .mask = BIT(3),
1220         .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1221         .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1222     },
1223 };
1224 
1225 static
1226 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_lc_act = {
1227     .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
1228 };
1229 
1230 static struct mlxreg_core_data mlxplat_mlxcpld_modular_asic_items_data[] = {
1231     {
1232         .label = "asic1",
1233         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1234         .mask = MLXPLAT_CPLD_ASIC_MASK,
1235         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1236     },
1237 };
1238 
1239 static struct i2c_board_info mlxplat_mlxcpld_lc_i2c_dev[] = {
1240     {
1241         I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1242         .platform_data = &mlxplat_mlxcpld_lc_act,
1243     },
1244     {
1245         I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1246         .platform_data = &mlxplat_mlxcpld_lc_act,
1247     },
1248     {
1249         I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1250         .platform_data = &mlxplat_mlxcpld_lc_act,
1251     },
1252     {
1253         I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1254         .platform_data = &mlxplat_mlxcpld_lc_act,
1255     },
1256     {
1257         I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1258         .platform_data = &mlxplat_mlxcpld_lc_act,
1259     },
1260     {
1261         I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1262         .platform_data = &mlxplat_mlxcpld_lc_act,
1263     },
1264     {
1265         I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1266         .platform_data = &mlxplat_mlxcpld_lc_act,
1267     },
1268     {
1269         I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1270         .platform_data = &mlxplat_mlxcpld_lc_act,
1271     },
1272 };
1273 
1274 static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_modular_lc_notifier[] = {
1275     {
1276         .identity = "lc1",
1277     },
1278     {
1279         .identity = "lc2",
1280     },
1281     {
1282         .identity = "lc3",
1283     },
1284     {
1285         .identity = "lc4",
1286     },
1287     {
1288         .identity = "lc5",
1289     },
1290     {
1291         .identity = "lc6",
1292     },
1293     {
1294         .identity = "lc7",
1295     },
1296     {
1297         .identity = "lc8",
1298     },
1299 };
1300 
1301 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pr_items_data[] = {
1302     {
1303         .label = "lc1_present",
1304         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1305         .mask = BIT(0),
1306         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1307         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1308         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1309         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1310         .slot = 1,
1311     },
1312     {
1313         .label = "lc2_present",
1314         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1315         .mask = BIT(1),
1316         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1317         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1318         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1319         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1320         .slot = 2,
1321     },
1322     {
1323         .label = "lc3_present",
1324         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1325         .mask = BIT(2),
1326         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1327         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1328         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1329         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1330         .slot = 3,
1331     },
1332     {
1333         .label = "lc4_present",
1334         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1335         .mask = BIT(3),
1336         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1337         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1338         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1339         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1340         .slot = 4,
1341     },
1342     {
1343         .label = "lc5_present",
1344         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1345         .mask = BIT(4),
1346         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1347         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1348         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1349         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1350         .slot = 5,
1351     },
1352     {
1353         .label = "lc6_present",
1354         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1355         .mask = BIT(5),
1356         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1357         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1358         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1359         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1360         .slot = 6,
1361     },
1362     {
1363         .label = "lc7_present",
1364         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1365         .mask = BIT(6),
1366         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1367         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1368         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1369         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1370         .slot = 7,
1371     },
1372     {
1373         .label = "lc8_present",
1374         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1375         .mask = BIT(7),
1376         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1377         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1378         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1379         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1380         .slot = 8,
1381     },
1382 };
1383 
1384 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ver_items_data[] = {
1385     {
1386         .label = "lc1_verified",
1387         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1388         .mask = BIT(0),
1389         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1390         .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1391         .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1392         .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1393         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1394         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1395         .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1396         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1397         .slot = 1,
1398     },
1399     {
1400         .label = "lc2_verified",
1401         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1402         .mask = BIT(1),
1403         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1404         .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1405         .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1406         .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1407         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1408         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1409         .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1410         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1411         .slot = 2,
1412     },
1413     {
1414         .label = "lc3_verified",
1415         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1416         .mask = BIT(2),
1417         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1418         .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1419         .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1420         .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1421         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1422         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1423         .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1424         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1425         .slot = 3,
1426     },
1427     {
1428         .label = "lc4_verified",
1429         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1430         .mask = BIT(3),
1431         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1432         .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1433         .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1434         .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1435         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1436         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1437         .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1438         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1439         .slot = 4,
1440     },
1441     {
1442         .label = "lc5_verified",
1443         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1444         .mask = BIT(4),
1445         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1446         .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1447         .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1448         .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1449         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1450         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1451         .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1452         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1453         .slot = 5,
1454     },
1455     {
1456         .label = "lc6_verified",
1457         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1458         .mask = BIT(5),
1459         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1460         .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1461         .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1462         .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1463         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1464         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1465         .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1466         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1467         .slot = 6,
1468     },
1469     {
1470         .label = "lc7_verified",
1471         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1472         .mask = BIT(6),
1473         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1474         .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1475         .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1476         .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1477         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1478         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1479         .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1480         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1481         .slot = 7,
1482     },
1483     {
1484         .label = "lc8_verified",
1485         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1486         .mask = BIT(7),
1487         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1488         .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1489         .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1490         .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1491         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1492         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1493         .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1494         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1495         .slot = 8,
1496     },
1497 };
1498 
1499 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pg_data[] = {
1500     {
1501         .label = "lc1_powered",
1502         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1503         .mask = BIT(0),
1504         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1505         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1506         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1507         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1508         .slot = 1,
1509     },
1510     {
1511         .label = "lc2_powered",
1512         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1513         .mask = BIT(1),
1514         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1515         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1516         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1517         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1518         .slot = 2,
1519     },
1520     {
1521         .label = "lc3_powered",
1522         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1523         .mask = BIT(2),
1524         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1525         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1526         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1527         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1528         .slot = 3,
1529     },
1530     {
1531         .label = "lc4_powered",
1532         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1533         .mask = BIT(3),
1534         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1535         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1536         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1537         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1538         .slot = 4,
1539     },
1540     {
1541         .label = "lc5_powered",
1542         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1543         .mask = BIT(4),
1544         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1545         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1546         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1547         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1548         .slot = 5,
1549     },
1550     {
1551         .label = "lc6_powered",
1552         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1553         .mask = BIT(5),
1554         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1555         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1556         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1557         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1558         .slot = 6,
1559     },
1560     {
1561         .label = "lc7_powered",
1562         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1563         .mask = BIT(6),
1564         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1565         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1566         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1567         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1568         .slot = 7,
1569     },
1570     {
1571         .label = "lc8_powered",
1572         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1573         .mask = BIT(7),
1574         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1575         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1576         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1577         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1578         .slot = 8,
1579     },
1580 };
1581 
1582 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ready_data[] = {
1583     {
1584         .label = "lc1_ready",
1585         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1586         .mask = BIT(0),
1587         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1588         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1589         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1590         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1591         .slot = 1,
1592     },
1593     {
1594         .label = "lc2_ready",
1595         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1596         .mask = BIT(1),
1597         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1598         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1599         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1600         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1601         .slot = 2,
1602     },
1603     {
1604         .label = "lc3_ready",
1605         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1606         .mask = BIT(2),
1607         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1608         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1609         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1610         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1611         .slot = 3,
1612     },
1613     {
1614         .label = "lc4_ready",
1615         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1616         .mask = BIT(3),
1617         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1618         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1619         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1620         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1621         .slot = 4,
1622     },
1623     {
1624         .label = "lc5_ready",
1625         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1626         .mask = BIT(4),
1627         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1628         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1629         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1630         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1631         .slot = 5,
1632     },
1633     {
1634         .label = "lc6_ready",
1635         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1636         .mask = BIT(5),
1637         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1638         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1639         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1640         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1641         .slot = 6,
1642     },
1643     {
1644         .label = "lc7_ready",
1645         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1646         .mask = BIT(6),
1647         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1648         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1649         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1650         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1651         .slot = 7,
1652     },
1653     {
1654         .label = "lc8_ready",
1655         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1656         .mask = BIT(7),
1657         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1658         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1659         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1660         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1661         .slot = 8,
1662     },
1663 };
1664 
1665 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_synced_data[] = {
1666     {
1667         .label = "lc1_synced",
1668         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1669         .mask = BIT(0),
1670         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1671         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1672         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1673         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1674         .slot = 1,
1675     },
1676     {
1677         .label = "lc2_synced",
1678         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1679         .mask = BIT(1),
1680         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1681         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1682         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1683         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1684         .slot = 2,
1685     },
1686     {
1687         .label = "lc3_synced",
1688         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1689         .mask = BIT(2),
1690         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1691         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1692         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1693         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1694         .slot = 3,
1695     },
1696     {
1697         .label = "lc4_synced",
1698         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1699         .mask = BIT(3),
1700         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1701         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1702         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1703         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1704         .slot = 4,
1705     },
1706     {
1707         .label = "lc5_synced",
1708         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1709         .mask = BIT(4),
1710         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1711         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1712         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1713         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1714         .slot = 5,
1715     },
1716     {
1717         .label = "lc6_synced",
1718         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1719         .mask = BIT(5),
1720         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1721         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1722         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1723         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1724         .slot = 6,
1725     },
1726     {
1727         .label = "lc7_synced",
1728         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1729         .mask = BIT(6),
1730         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1731         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1732         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1733         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1734         .slot = 7,
1735     },
1736     {
1737         .label = "lc8_synced",
1738         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1739         .mask = BIT(7),
1740         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1741         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1742         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1743         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1744         .slot = 8,
1745     },
1746 };
1747 
1748 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_act_data[] = {
1749     {
1750         .label = "lc1_active",
1751         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1752         .mask = BIT(0),
1753         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1754         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1755         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1756         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1757         .slot = 1,
1758     },
1759     {
1760         .label = "lc2_active",
1761         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1762         .mask = BIT(1),
1763         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1764         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1765         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1766         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1767         .slot = 2,
1768     },
1769     {
1770         .label = "lc3_active",
1771         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1772         .mask = BIT(2),
1773         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1774         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1775         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1776         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1777         .slot = 3,
1778     },
1779     {
1780         .label = "lc4_active",
1781         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1782         .mask = BIT(3),
1783         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1784         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1785         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1786         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1787         .slot = 4,
1788     },
1789     {
1790         .label = "lc5_active",
1791         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1792         .mask = BIT(4),
1793         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1794         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1795         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1796         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1797         .slot = 5,
1798     },
1799     {
1800         .label = "lc6_active",
1801         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1802         .mask = BIT(5),
1803         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1804         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1805         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1806         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1807         .slot = 6,
1808     },
1809     {
1810         .label = "lc7_active",
1811         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1812         .mask = BIT(6),
1813         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1814         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1815         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1816         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1817         .slot = 7,
1818     },
1819     {
1820         .label = "lc8_active",
1821         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1822         .mask = BIT(7),
1823         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1824         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1825         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1826         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1827         .slot = 8,
1828     },
1829 };
1830 
1831 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_sd_data[] = {
1832     {
1833         .label = "lc1_shutdown",
1834         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1835         .mask = BIT(0),
1836         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1837         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1838         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1839         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1840         .slot = 1,
1841     },
1842     {
1843         .label = "lc2_shutdown",
1844         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1845         .mask = BIT(1),
1846         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1847         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1848         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1849         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1850         .slot = 2,
1851     },
1852     {
1853         .label = "lc3_shutdown",
1854         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1855         .mask = BIT(2),
1856         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1857         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1858         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1859         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1860         .slot = 3,
1861     },
1862     {
1863         .label = "lc4_shutdown",
1864         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1865         .mask = BIT(3),
1866         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1867         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1868         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1869         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1870         .slot = 4,
1871     },
1872     {
1873         .label = "lc5_shutdown",
1874         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1875         .mask = BIT(4),
1876         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1877         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1878         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1879         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1880         .slot = 5,
1881     },
1882     {
1883         .label = "lc6_shutdown",
1884         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1885         .mask = BIT(5),
1886         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1887         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1888         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1889         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1890         .slot = 6,
1891     },
1892     {
1893         .label = "lc7_shutdown",
1894         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1895         .mask = BIT(6),
1896         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1897         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1898         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1899         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1900         .slot = 7,
1901     },
1902     {
1903         .label = "lc8_shutdown",
1904         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1905         .mask = BIT(7),
1906         .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1907         .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1908         .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1909         .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1910         .slot = 8,
1911     },
1912 };
1913 
1914 static struct mlxreg_core_item mlxplat_mlxcpld_modular_items[] = {
1915     {
1916         .data = mlxplat_mlxcpld_ext_psu_items_data,
1917         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1918         .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1919         .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1920         .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1921         .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1922         .inversed = 1,
1923         .health = false,
1924     },
1925     {
1926         .data = mlxplat_mlxcpld_modular_pwr_items_data,
1927         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1928         .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1929         .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1930         .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1931         .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1932         .inversed = 0,
1933         .health = false,
1934     },
1935     {
1936         .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1937         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1938         .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1939         .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1940         .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1941         .inversed = 1,
1942         .health = false,
1943     },
1944     {
1945         .data = mlxplat_mlxcpld_modular_asic_items_data,
1946         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1947         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1948         .mask = MLXPLAT_CPLD_ASIC_MASK,
1949         .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_asic_items_data),
1950         .inversed = 0,
1951         .health = true,
1952     },
1953     {
1954         .data = mlxplat_mlxcpld_modular_lc_pr_items_data,
1955         .kind = MLXREG_HOTPLUG_LC_PRESENT,
1956         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1957         .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1958         .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1959         .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pr_items_data),
1960         .inversed = 1,
1961         .health = false,
1962     },
1963     {
1964         .data = mlxplat_mlxcpld_modular_lc_ver_items_data,
1965         .kind = MLXREG_HOTPLUG_LC_VERIFIED,
1966         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1967         .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1968         .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1969         .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ver_items_data),
1970         .inversed = 0,
1971         .health = false,
1972     },
1973     {
1974         .data = mlxplat_mlxcpld_modular_lc_pg_data,
1975         .kind = MLXREG_HOTPLUG_LC_POWERED,
1976         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1977         .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1978         .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1979         .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pg_data),
1980         .inversed = 0,
1981         .health = false,
1982     },
1983     {
1984         .data = mlxplat_mlxcpld_modular_lc_ready_data,
1985         .kind = MLXREG_HOTPLUG_LC_READY,
1986         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1987         .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1988         .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1989         .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ready_data),
1990         .inversed = 0,
1991         .health = false,
1992     },
1993     {
1994         .data = mlxplat_mlxcpld_modular_lc_synced_data,
1995         .kind = MLXREG_HOTPLUG_LC_SYNCED,
1996         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1997         .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1998         .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1999         .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_synced_data),
2000         .inversed = 0,
2001         .health = false,
2002     },
2003     {
2004         .data = mlxplat_mlxcpld_modular_lc_act_data,
2005         .kind = MLXREG_HOTPLUG_LC_ACTIVE,
2006         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2007         .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2008         .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2009         .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_act_data),
2010         .inversed = 0,
2011         .health = false,
2012     },
2013     {
2014         .data = mlxplat_mlxcpld_modular_lc_sd_data,
2015         .kind = MLXREG_HOTPLUG_LC_THERMAL,
2016         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2017         .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2018         .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2019         .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_sd_data),
2020         .inversed = 0,
2021         .health = false,
2022     },
2023 };
2024 
2025 static
2026 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_modular_data = {
2027     .items = mlxplat_mlxcpld_modular_items,
2028     .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_items),
2029     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2030     .mask = MLXPLAT_CPLD_AGGR_MASK_MODULAR,
2031     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2032     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2033 };
2034 
2035 /* Platform hotplug for NVLink blade systems family data  */
2036 static struct mlxreg_core_data mlxplat_mlxcpld_global_wp_items_data[] = {
2037     {
2038         .label = "global_wp_grant",
2039         .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2040         .mask = MLXPLAT_CPLD_GWP_MASK,
2041         .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2042     },
2043 };
2044 
2045 static struct mlxreg_core_item mlxplat_mlxcpld_nvlink_blade_items[] = {
2046     {
2047         .data = mlxplat_mlxcpld_global_wp_items_data,
2048         .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2049         .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2050         .mask = MLXPLAT_CPLD_GWP_MASK,
2051         .count = ARRAY_SIZE(mlxplat_mlxcpld_global_wp_items_data),
2052         .inversed = 0,
2053         .health = false,
2054     },
2055 };
2056 
2057 static
2058 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_nvlink_blade_data = {
2059     .items = mlxplat_mlxcpld_nvlink_blade_items,
2060     .counter = ARRAY_SIZE(mlxplat_mlxcpld_nvlink_blade_items),
2061     .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2062     .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
2063     .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2064     .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2065 };
2066 
2067 /* Platform led default data */
2068 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
2069     {
2070         .label = "status:green",
2071         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2072         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2073     },
2074     {
2075         .label = "status:red",
2076         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2077         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2078     },
2079     {
2080         .label = "psu:green",
2081         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2082         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2083     },
2084     {
2085         .label = "psu:red",
2086         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2087         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2088     },
2089     {
2090         .label = "fan1:green",
2091         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2092         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2093     },
2094     {
2095         .label = "fan1:red",
2096         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2097         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2098     },
2099     {
2100         .label = "fan2:green",
2101         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2102         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2103     },
2104     {
2105         .label = "fan2:red",
2106         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2107         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2108     },
2109     {
2110         .label = "fan3:green",
2111         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2112         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2113     },
2114     {
2115         .label = "fan3:red",
2116         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2117         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2118     },
2119     {
2120         .label = "fan4:green",
2121         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2122         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2123     },
2124     {
2125         .label = "fan4:red",
2126         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2127         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2128     },
2129 };
2130 
2131 static struct mlxreg_core_platform_data mlxplat_default_led_data = {
2132         .data = mlxplat_mlxcpld_default_led_data,
2133         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
2134 };
2135 
2136 /* Platform led default data for water cooling */
2137 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_wc_data[] = {
2138     {
2139         .label = "status:green",
2140         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2141         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2142     },
2143     {
2144         .label = "status:red",
2145         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2146         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2147     },
2148     {
2149         .label = "psu:green",
2150         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2151         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2152     },
2153     {
2154         .label = "psu:red",
2155         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2156         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2157     },
2158 };
2159 
2160 static struct mlxreg_core_platform_data mlxplat_default_led_wc_data = {
2161         .data = mlxplat_mlxcpld_default_led_wc_data,
2162         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_wc_data),
2163 };
2164 
2165 /* Platform led default data for water cooling Ethernet switch blade */
2166 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_eth_wc_blade_data[] = {
2167     {
2168         .label = "status:green",
2169         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2170         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2171     },
2172     {
2173         .label = "status:red",
2174         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2175         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2176     },
2177 };
2178 
2179 static struct mlxreg_core_platform_data mlxplat_default_led_eth_wc_blade_data = {
2180     .data = mlxplat_mlxcpld_default_led_eth_wc_blade_data,
2181     .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_eth_wc_blade_data),
2182 };
2183 
2184 /* Platform led MSN21xx system family data */
2185 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
2186     {
2187         .label = "status:green",
2188         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2189         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2190     },
2191     {
2192         .label = "status:red",
2193         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2194         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2195     },
2196     {
2197         .label = "fan:green",
2198         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2199         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2200     },
2201     {
2202         .label = "fan:red",
2203         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2204         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2205     },
2206     {
2207         .label = "psu1:green",
2208         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2209         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2210     },
2211     {
2212         .label = "psu1:red",
2213         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2214         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2215     },
2216     {
2217         .label = "psu2:green",
2218         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2219         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2220     },
2221     {
2222         .label = "psu2:red",
2223         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2224         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2225     },
2226     {
2227         .label = "uid:blue",
2228         .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2229         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2230     },
2231 };
2232 
2233 static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
2234         .data = mlxplat_mlxcpld_msn21xx_led_data,
2235         .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
2236 };
2237 
2238 /* Platform led for default data for 200GbE systems */
2239 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
2240     {
2241         .label = "status:green",
2242         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2243         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2244     },
2245     {
2246         .label = "status:orange",
2247         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2248         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2249     },
2250     {
2251         .label = "psu:green",
2252         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2253         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2254     },
2255     {
2256         .label = "psu:orange",
2257         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2258         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2259     },
2260     {
2261         .label = "fan1:green",
2262         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2263         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2264         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2265         .bit = BIT(0),
2266     },
2267     {
2268         .label = "fan1:orange",
2269         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2270         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2271         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2272         .bit = BIT(0),
2273     },
2274     {
2275         .label = "fan2:green",
2276         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2277         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2278         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2279         .bit = BIT(1),
2280     },
2281     {
2282         .label = "fan2:orange",
2283         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2284         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2285         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2286         .bit = BIT(1),
2287     },
2288     {
2289         .label = "fan3:green",
2290         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2291         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2292         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2293         .bit = BIT(2),
2294     },
2295     {
2296         .label = "fan3:orange",
2297         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2298         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2299         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2300         .bit = BIT(2),
2301     },
2302     {
2303         .label = "fan4:green",
2304         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2305         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2306         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2307         .bit = BIT(3),
2308     },
2309     {
2310         .label = "fan4:orange",
2311         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2312         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2313         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2314         .bit = BIT(3),
2315     },
2316     {
2317         .label = "fan5:green",
2318         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2319         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2320         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2321         .bit = BIT(4),
2322     },
2323     {
2324         .label = "fan5:orange",
2325         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2326         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2327         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2328         .bit = BIT(4),
2329     },
2330     {
2331         .label = "fan6:green",
2332         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2333         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2334         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2335         .bit = BIT(5),
2336     },
2337     {
2338         .label = "fan6:orange",
2339         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2340         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2341         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2342         .bit = BIT(5),
2343     },
2344     {
2345         .label = "fan7:green",
2346         .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2347         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2348         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2349         .bit = BIT(6),
2350     },
2351     {
2352         .label = "fan7:orange",
2353         .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2354         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2355         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2356         .bit = BIT(6),
2357     },
2358     {
2359         .label = "uid:blue",
2360         .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2361         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2362     },
2363 };
2364 
2365 static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
2366         .data = mlxplat_mlxcpld_default_ng_led_data,
2367         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
2368 };
2369 
2370 /* Platform led for Comex based 100GbE systems */
2371 static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
2372     {
2373         .label = "status:green",
2374         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2375         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2376     },
2377     {
2378         .label = "status:red",
2379         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2380         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2381     },
2382     {
2383         .label = "psu:green",
2384         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2385         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2386     },
2387     {
2388         .label = "psu:red",
2389         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2390         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2391     },
2392     {
2393         .label = "fan1:green",
2394         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2395         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2396     },
2397     {
2398         .label = "fan1:red",
2399         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2400         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2401     },
2402     {
2403         .label = "fan2:green",
2404         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2405         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2406     },
2407     {
2408         .label = "fan2:red",
2409         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2410         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2411     },
2412     {
2413         .label = "fan3:green",
2414         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2415         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2416     },
2417     {
2418         .label = "fan3:red",
2419         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2420         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2421     },
2422     {
2423         .label = "fan4:green",
2424         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2425         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2426     },
2427     {
2428         .label = "fan4:red",
2429         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2430         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2431     },
2432     {
2433         .label = "uid:blue",
2434         .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2435         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2436     },
2437 };
2438 
2439 static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
2440         .data = mlxplat_mlxcpld_comex_100G_led_data,
2441         .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
2442 };
2443 
2444 /* Platform led for data for modular systems */
2445 static struct mlxreg_core_data mlxplat_mlxcpld_modular_led_data[] = {
2446     {
2447         .label = "status:green",
2448         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2449         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2450     },
2451     {
2452         .label = "status:orange",
2453         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2454         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2455     },
2456     {
2457         .label = "psu:green",
2458         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2459         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2460     },
2461     {
2462         .label = "psu:orange",
2463         .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2464         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2465     },
2466     {
2467         .label = "fan1:green",
2468         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2469         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2470         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2471         .bit = BIT(0),
2472     },
2473     {
2474         .label = "fan1:orange",
2475         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2476         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2477         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2478         .bit = BIT(0),
2479     },
2480     {
2481         .label = "fan2:green",
2482         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2483         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2484         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2485         .bit = BIT(1),
2486     },
2487     {
2488         .label = "fan2:orange",
2489         .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2490         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2491         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2492         .bit = BIT(1),
2493     },
2494     {
2495         .label = "fan3:green",
2496         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2497         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2498         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2499         .bit = BIT(2),
2500     },
2501     {
2502         .label = "fan3:orange",
2503         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2504         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2505         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2506         .bit = BIT(2),
2507     },
2508     {
2509         .label = "fan4:green",
2510         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2511         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2512         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2513         .bit = BIT(3),
2514     },
2515     {
2516         .label = "fan4:orange",
2517         .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2518         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2519         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2520         .bit = BIT(3),
2521     },
2522     {
2523         .label = "fan5:green",
2524         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2525         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2526         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2527         .bit = BIT(4),
2528     },
2529     {
2530         .label = "fan5:orange",
2531         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2532         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2533         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2534         .bit = BIT(4),
2535     },
2536     {
2537         .label = "fan6:green",
2538         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2539         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2540         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2541         .bit = BIT(5),
2542     },
2543     {
2544         .label = "fan6:orange",
2545         .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2546         .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2547         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2548         .bit = BIT(5),
2549     },
2550     {
2551         .label = "fan7:green",
2552         .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2553         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2554         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2555         .bit = BIT(6),
2556     },
2557     {
2558         .label = "fan7:orange",
2559         .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2560         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2561         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2562         .bit = BIT(6),
2563     },
2564     {
2565         .label = "uid:blue",
2566         .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2567         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2568     },
2569     {
2570         .label = "fan_front:green",
2571         .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2572         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2573     },
2574     {
2575         .label = "fan_front:orange",
2576         .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2577         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2578     },
2579     {
2580         .label = "mgmt:green",
2581         .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
2582         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2583     },
2584     {
2585         .label = "mgmt:orange",
2586         .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
2587         .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2588     },
2589 };
2590 
2591 static struct mlxreg_core_platform_data mlxplat_modular_led_data = {
2592         .data = mlxplat_mlxcpld_modular_led_data,
2593         .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_led_data),
2594 };
2595 
2596 /* Platform register access default */
2597 static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
2598     {
2599         .label = "cpld1_version",
2600         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2601         .bit = GENMASK(7, 0),
2602         .mode = 0444,
2603     },
2604     {
2605         .label = "cpld2_version",
2606         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2607         .bit = GENMASK(7, 0),
2608         .mode = 0444,
2609     },
2610     {
2611         .label = "cpld1_pn",
2612         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2613         .bit = GENMASK(15, 0),
2614         .mode = 0444,
2615         .regnum = 2,
2616     },
2617     {
2618         .label = "cpld2_pn",
2619         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2620         .bit = GENMASK(15, 0),
2621         .mode = 0444,
2622         .regnum = 2,
2623     },
2624     {
2625         .label = "cpld1_version_min",
2626         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2627         .bit = GENMASK(7, 0),
2628         .mode = 0444,
2629     },
2630     {
2631         .label = "cpld2_version_min",
2632         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2633         .bit = GENMASK(7, 0),
2634         .mode = 0444,
2635     },
2636     {
2637         .label = "reset_long_pb",
2638         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2639         .mask = GENMASK(7, 0) & ~BIT(0),
2640         .mode = 0444,
2641     },
2642     {
2643         .label = "reset_short_pb",
2644         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2645         .mask = GENMASK(7, 0) & ~BIT(1),
2646         .mode = 0444,
2647     },
2648     {
2649         .label = "reset_aux_pwr_or_ref",
2650         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2651         .mask = GENMASK(7, 0) & ~BIT(2),
2652         .mode = 0444,
2653     },
2654     {
2655         .label = "reset_main_pwr_fail",
2656         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2657         .mask = GENMASK(7, 0) & ~BIT(3),
2658         .mode = 0444,
2659     },
2660     {
2661         .label = "reset_sw_reset",
2662         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2663         .mask = GENMASK(7, 0) & ~BIT(4),
2664         .mode = 0444,
2665     },
2666     {
2667         .label = "reset_fw_reset",
2668         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2669         .mask = GENMASK(7, 0) & ~BIT(5),
2670         .mode = 0444,
2671     },
2672     {
2673         .label = "reset_hotswap_or_wd",
2674         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2675         .mask = GENMASK(7, 0) & ~BIT(6),
2676         .mode = 0444,
2677     },
2678     {
2679         .label = "reset_asic_thermal",
2680         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2681         .mask = GENMASK(7, 0) & ~BIT(7),
2682         .mode = 0444,
2683     },
2684     {
2685         .label = "psu1_on",
2686         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2687         .mask = GENMASK(7, 0) & ~BIT(0),
2688         .mode = 0200,
2689     },
2690     {
2691         .label = "psu2_on",
2692         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2693         .mask = GENMASK(7, 0) & ~BIT(1),
2694         .mode = 0200,
2695     },
2696     {
2697         .label = "pwr_cycle",
2698         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2699         .mask = GENMASK(7, 0) & ~BIT(2),
2700         .mode = 0200,
2701     },
2702     {
2703         .label = "pwr_down",
2704         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2705         .mask = GENMASK(7, 0) & ~BIT(3),
2706         .mode = 0200,
2707     },
2708     {
2709         .label = "select_iio",
2710         .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
2711         .mask = GENMASK(7, 0) & ~BIT(6),
2712         .mode = 0644,
2713     },
2714     {
2715         .label = "asic_health",
2716         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2717         .mask = MLXPLAT_CPLD_ASIC_MASK,
2718         .bit = 1,
2719         .mode = 0444,
2720     },
2721 };
2722 
2723 static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
2724         .data = mlxplat_mlxcpld_default_regs_io_data,
2725         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
2726 };
2727 
2728 /* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
2729 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
2730     {
2731         .label = "cpld1_version",
2732         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2733         .bit = GENMASK(7, 0),
2734         .mode = 0444,
2735     },
2736     {
2737         .label = "cpld2_version",
2738         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2739         .bit = GENMASK(7, 0),
2740         .mode = 0444,
2741     },
2742     {
2743         .label = "cpld1_pn",
2744         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2745         .bit = GENMASK(15, 0),
2746         .mode = 0444,
2747         .regnum = 2,
2748     },
2749     {
2750         .label = "cpld2_pn",
2751         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2752         .bit = GENMASK(15, 0),
2753         .mode = 0444,
2754         .regnum = 2,
2755     },
2756     {
2757         .label = "cpld1_version_min",
2758         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2759         .bit = GENMASK(7, 0),
2760         .mode = 0444,
2761     },
2762     {
2763         .label = "cpld2_version_min",
2764         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2765         .bit = GENMASK(7, 0),
2766         .mode = 0444,
2767     },
2768     {
2769         .label = "reset_long_pb",
2770         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2771         .mask = GENMASK(7, 0) & ~BIT(0),
2772         .mode = 0444,
2773     },
2774     {
2775         .label = "reset_short_pb",
2776         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2777         .mask = GENMASK(7, 0) & ~BIT(1),
2778         .mode = 0444,
2779     },
2780     {
2781         .label = "reset_aux_pwr_or_ref",
2782         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2783         .mask = GENMASK(7, 0) & ~BIT(2),
2784         .mode = 0444,
2785     },
2786     {
2787         .label = "reset_sw_reset",
2788         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2789         .mask = GENMASK(7, 0) & ~BIT(3),
2790         .mode = 0444,
2791     },
2792     {
2793         .label = "reset_main_pwr_fail",
2794         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2795         .mask = GENMASK(7, 0) & ~BIT(4),
2796         .mode = 0444,
2797     },
2798     {
2799         .label = "reset_asic_thermal",
2800         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2801         .mask = GENMASK(7, 0) & ~BIT(5),
2802         .mode = 0444,
2803     },
2804     {
2805         .label = "reset_hotswap_or_halt",
2806         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2807         .mask = GENMASK(7, 0) & ~BIT(6),
2808         .mode = 0444,
2809     },
2810     {
2811         .label = "reset_sff_wd",
2812         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
2813         .mask = GENMASK(7, 0) & ~BIT(6),
2814         .mode = 0444,
2815     },
2816     {
2817         .label = "psu1_on",
2818         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2819         .mask = GENMASK(7, 0) & ~BIT(0),
2820         .mode = 0200,
2821     },
2822     {
2823         .label = "psu2_on",
2824         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2825         .mask = GENMASK(7, 0) & ~BIT(1),
2826         .mode = 0200,
2827     },
2828     {
2829         .label = "pwr_cycle",
2830         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2831         .mask = GENMASK(7, 0) & ~BIT(2),
2832         .mode = 0200,
2833     },
2834     {
2835         .label = "pwr_down",
2836         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2837         .mask = GENMASK(7, 0) & ~BIT(3),
2838         .mode = 0200,
2839     },
2840     {
2841         .label = "select_iio",
2842         .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
2843         .mask = GENMASK(7, 0) & ~BIT(6),
2844         .mode = 0644,
2845     },
2846     {
2847         .label = "asic_health",
2848         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2849         .mask = MLXPLAT_CPLD_ASIC_MASK,
2850         .bit = 1,
2851         .mode = 0444,
2852     },
2853 };
2854 
2855 static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
2856         .data = mlxplat_mlxcpld_msn21xx_regs_io_data,
2857         .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
2858 };
2859 
2860 /* Platform register access for next generation systems families data */
2861 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
2862     {
2863         .label = "cpld1_version",
2864         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2865         .bit = GENMASK(7, 0),
2866         .mode = 0444,
2867     },
2868     {
2869         .label = "cpld2_version",
2870         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2871         .bit = GENMASK(7, 0),
2872         .mode = 0444,
2873     },
2874     {
2875         .label = "cpld3_version",
2876         .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
2877         .bit = GENMASK(7, 0),
2878         .mode = 0444,
2879     },
2880     {
2881         .label = "cpld4_version",
2882         .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
2883         .bit = GENMASK(7, 0),
2884         .mode = 0444,
2885     },
2886     {
2887         .label = "cpld1_pn",
2888         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2889         .bit = GENMASK(15, 0),
2890         .mode = 0444,
2891         .regnum = 2,
2892     },
2893     {
2894         .label = "cpld2_pn",
2895         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2896         .bit = GENMASK(15, 0),
2897         .mode = 0444,
2898         .regnum = 2,
2899     },
2900     {
2901         .label = "cpld3_pn",
2902         .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
2903         .bit = GENMASK(15, 0),
2904         .mode = 0444,
2905         .regnum = 2,
2906     },
2907     {
2908         .label = "cpld4_pn",
2909         .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
2910         .bit = GENMASK(15, 0),
2911         .mode = 0444,
2912         .regnum = 2,
2913     },
2914     {
2915         .label = "cpld1_version_min",
2916         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2917         .bit = GENMASK(7, 0),
2918         .mode = 0444,
2919     },
2920     {
2921         .label = "cpld2_version_min",
2922         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2923         .bit = GENMASK(7, 0),
2924         .mode = 0444,
2925     },
2926     {
2927         .label = "cpld3_version_min",
2928         .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
2929         .bit = GENMASK(7, 0),
2930         .mode = 0444,
2931     },
2932     {
2933         .label = "cpld4_version_min",
2934         .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
2935         .bit = GENMASK(7, 0),
2936         .mode = 0444,
2937     },
2938     {
2939         .label = "asic_reset",
2940         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
2941         .mask = GENMASK(7, 0) & ~BIT(3),
2942         .mode = 0200,
2943     },
2944     {
2945         .label = "asic2_reset",
2946         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
2947         .mask = GENMASK(7, 0) & ~BIT(2),
2948         .mode = 0200,
2949     },
2950     {
2951         .label = "reset_long_pb",
2952         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2953         .mask = GENMASK(7, 0) & ~BIT(0),
2954         .mode = 0444,
2955     },
2956     {
2957         .label = "reset_short_pb",
2958         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2959         .mask = GENMASK(7, 0) & ~BIT(1),
2960         .mode = 0444,
2961     },
2962     {
2963         .label = "reset_aux_pwr_or_ref",
2964         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2965         .mask = GENMASK(7, 0) & ~BIT(2),
2966         .mode = 0444,
2967     },
2968     {
2969         .label = "reset_from_comex",
2970         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2971         .mask = GENMASK(7, 0) & ~BIT(4),
2972         .mode = 0444,
2973     },
2974     {
2975         .label = "reset_from_asic",
2976         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2977         .mask = GENMASK(7, 0) & ~BIT(5),
2978         .mode = 0444,
2979     },
2980     {
2981         .label = "reset_swb_wd",
2982         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2983         .mask = GENMASK(7, 0) & ~BIT(6),
2984         .mode = 0444,
2985     },
2986     {
2987         .label = "reset_asic_thermal",
2988         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2989         .mask = GENMASK(7, 0) & ~BIT(7),
2990         .mode = 0444,
2991     },
2992     {
2993         .label = "reset_comex_pwr_fail",
2994         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
2995         .mask = GENMASK(7, 0) & ~BIT(3),
2996         .mode = 0444,
2997     },
2998     {
2999         .label = "reset_platform",
3000         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3001         .mask = GENMASK(7, 0) & ~BIT(4),
3002         .mode = 0444,
3003     },
3004     {
3005         .label = "reset_soc",
3006         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3007         .mask = GENMASK(7, 0) & ~BIT(5),
3008         .mode = 0444,
3009     },
3010     {
3011         .label = "reset_comex_wd",
3012         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3013         .mask = GENMASK(7, 0) & ~BIT(6),
3014         .mode = 0444,
3015     },
3016     {
3017         .label = "reset_voltmon_upgrade_fail",
3018         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3019         .mask = GENMASK(7, 0) & ~BIT(0),
3020         .mode = 0444,
3021     },
3022     {
3023         .label = "reset_system",
3024         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3025         .mask = GENMASK(7, 0) & ~BIT(1),
3026         .mode = 0444,
3027     },
3028     {
3029         .label = "reset_sw_pwr_off",
3030         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3031         .mask = GENMASK(7, 0) & ~BIT(2),
3032         .mode = 0444,
3033     },
3034     {
3035         .label = "reset_comex_thermal",
3036         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3037         .mask = GENMASK(7, 0) & ~BIT(3),
3038         .mode = 0444,
3039     },
3040     {
3041         .label = "reset_reload_bios",
3042         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3043         .mask = GENMASK(7, 0) & ~BIT(5),
3044         .mode = 0444,
3045     },
3046     {
3047         .label = "reset_ac_pwr_fail",
3048         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3049         .mask = GENMASK(7, 0) & ~BIT(6),
3050         .mode = 0444,
3051     },
3052     {
3053         .label = "psu1_on",
3054         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3055         .mask = GENMASK(7, 0) & ~BIT(0),
3056         .mode = 0200,
3057     },
3058     {
3059         .label = "psu2_on",
3060         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3061         .mask = GENMASK(7, 0) & ~BIT(1),
3062         .mode = 0200,
3063     },
3064     {
3065         .label = "pwr_cycle",
3066         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3067         .mask = GENMASK(7, 0) & ~BIT(2),
3068         .mode = 0200,
3069     },
3070     {
3071         .label = "pwr_down",
3072         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3073         .mask = GENMASK(7, 0) & ~BIT(3),
3074         .mode = 0200,
3075     },
3076     {
3077         .label = "jtag_enable",
3078         .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3079         .mask = GENMASK(7, 0) & ~BIT(4),
3080         .mode = 0644,
3081     },
3082     {
3083         .label = "asic_health",
3084         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3085         .mask = MLXPLAT_CPLD_ASIC_MASK,
3086         .bit = 1,
3087         .mode = 0444,
3088     },
3089     {
3090         .label = "asic2_health",
3091         .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
3092         .mask = MLXPLAT_CPLD_ASIC_MASK,
3093         .bit = 1,
3094         .mode = 0444,
3095     },
3096     {
3097         .label = "fan_dir",
3098         .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
3099         .bit = GENMASK(7, 0),
3100         .mode = 0444,
3101     },
3102     {
3103         .label = "bios_safe_mode",
3104         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3105         .mask = GENMASK(7, 0) & ~BIT(4),
3106         .mode = 0444,
3107     },
3108     {
3109         .label = "bios_active_image",
3110         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3111         .mask = GENMASK(7, 0) & ~BIT(5),
3112         .mode = 0444,
3113     },
3114     {
3115         .label = "bios_auth_fail",
3116         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3117         .mask = GENMASK(7, 0) & ~BIT(6),
3118         .mode = 0444,
3119     },
3120     {
3121         .label = "bios_upgrade_fail",
3122         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3123         .mask = GENMASK(7, 0) & ~BIT(7),
3124         .mode = 0444,
3125     },
3126     {
3127         .label = "voltreg_update_status",
3128         .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3129         .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3130         .bit = 5,
3131         .mode = 0444,
3132     },
3133     {
3134         .label = "vpd_wp",
3135         .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3136         .mask = GENMASK(7, 0) & ~BIT(3),
3137         .mode = 0644,
3138     },
3139     {
3140         .label = "pcie_asic_reset_dis",
3141         .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3142         .mask = GENMASK(7, 0) & ~BIT(4),
3143         .mode = 0644,
3144     },
3145     {
3146         .label = "config1",
3147         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3148         .bit = GENMASK(7, 0),
3149         .mode = 0444,
3150     },
3151     {
3152         .label = "config2",
3153         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3154         .bit = GENMASK(7, 0),
3155         .mode = 0444,
3156     },
3157     {
3158         .label = "config3",
3159         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3160         .bit = GENMASK(7, 0),
3161         .mode = 0444,
3162     },
3163     {
3164         .label = "ufm_version",
3165         .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3166         .bit = GENMASK(7, 0),
3167         .mode = 0444,
3168     },
3169 };
3170 
3171 static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
3172         .data = mlxplat_mlxcpld_default_ng_regs_io_data,
3173         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
3174 };
3175 
3176 /* Platform register access for modular systems families data */
3177 static struct mlxreg_core_data mlxplat_mlxcpld_modular_regs_io_data[] = {
3178     {
3179         .label = "cpld1_version",
3180         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3181         .bit = GENMASK(7, 0),
3182         .mode = 0444,
3183     },
3184     {
3185         .label = "cpld2_version",
3186         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
3187         .bit = GENMASK(7, 0),
3188         .mode = 0444,
3189     },
3190     {
3191         .label = "cpld3_version",
3192         .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
3193         .bit = GENMASK(7, 0),
3194         .mode = 0444,
3195     },
3196     {
3197         .label = "cpld4_version",
3198         .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
3199         .bit = GENMASK(7, 0),
3200         .mode = 0444,
3201     },
3202     {
3203         .label = "cpld1_pn",
3204         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3205         .bit = GENMASK(15, 0),
3206         .mode = 0444,
3207         .regnum = 2,
3208     },
3209     {
3210         .label = "cpld2_pn",
3211         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
3212         .bit = GENMASK(15, 0),
3213         .mode = 0444,
3214         .regnum = 2,
3215     },
3216     {
3217         .label = "cpld3_pn",
3218         .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
3219         .bit = GENMASK(15, 0),
3220         .mode = 0444,
3221         .regnum = 2,
3222     },
3223     {
3224         .label = "cpld4_pn",
3225         .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
3226         .bit = GENMASK(15, 0),
3227         .mode = 0444,
3228         .regnum = 2,
3229     },
3230     {
3231         .label = "cpld1_version_min",
3232         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3233         .bit = GENMASK(7, 0),
3234         .mode = 0444,
3235     },
3236     {
3237         .label = "cpld2_version_min",
3238         .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
3239         .bit = GENMASK(7, 0),
3240         .mode = 0444,
3241     },
3242     {
3243         .label = "cpld3_version_min",
3244         .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
3245         .bit = GENMASK(7, 0),
3246         .mode = 0444,
3247     },
3248     {
3249         .label = "cpld4_version_min",
3250         .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
3251         .bit = GENMASK(7, 0),
3252         .mode = 0444,
3253     },
3254     {
3255         .label = "lc1_enable",
3256         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3257         .mask = GENMASK(7, 0) & ~BIT(0),
3258         .mode = 0644,
3259     },
3260     {
3261         .label = "lc2_enable",
3262         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3263         .mask = GENMASK(7, 0) & ~BIT(1),
3264         .mode = 0644,
3265     },
3266     {
3267         .label = "lc3_enable",
3268         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3269         .mask = GENMASK(7, 0) & ~BIT(2),
3270         .mode = 0644,
3271     },
3272     {
3273         .label = "lc4_enable",
3274         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3275         .mask = GENMASK(7, 0) & ~BIT(3),
3276         .mode = 0644,
3277     },
3278     {
3279         .label = "lc5_enable",
3280         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3281         .mask = GENMASK(7, 0) & ~BIT(4),
3282         .mode = 0644,
3283     },
3284     {
3285         .label = "lc6_enable",
3286         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3287         .mask = GENMASK(7, 0) & ~BIT(5),
3288         .mode = 0644,
3289     },
3290     {
3291         .label = "lc7_enable",
3292         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3293         .mask = GENMASK(7, 0) & ~BIT(6),
3294         .mode = 0644,
3295     },
3296     {
3297         .label = "lc8_enable",
3298         .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3299         .mask = GENMASK(7, 0) & ~BIT(7),
3300         .mode = 0644,
3301     },
3302     {
3303         .label = "reset_long_pb",
3304         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3305         .mask = GENMASK(7, 0) & ~BIT(0),
3306         .mode = 0444,
3307     },
3308     {
3309         .label = "reset_short_pb",
3310         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3311         .mask = GENMASK(7, 0) & ~BIT(1),
3312         .mode = 0444,
3313     },
3314     {
3315         .label = "reset_aux_pwr_or_fu",
3316         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3317         .mask = GENMASK(7, 0) & ~BIT(2),
3318         .mode = 0444,
3319     },
3320     {
3321         .label = "reset_mgmt_dc_dc_pwr_fail",
3322         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3323         .mask = GENMASK(7, 0) & ~BIT(3),
3324         .mode = 0444,
3325     },
3326     {
3327         .label = "reset_sys_comex_bios",
3328         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3329         .mask = GENMASK(7, 0) & ~BIT(5),
3330         .mode = 0444,
3331     },
3332     {
3333         .label = "reset_sw_reset",
3334         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3335         .mask = GENMASK(7, 0) & ~BIT(0),
3336         .mode = 0444,
3337     },
3338     {
3339         .label = "reset_aux_pwr_or_reload",
3340         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3341         .mask = GENMASK(7, 0) & ~BIT(2),
3342         .mode = 0444,
3343     },
3344     {
3345         .label = "reset_comex_pwr_fail",
3346         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3347         .mask = GENMASK(7, 0) & ~BIT(3),
3348         .mode = 0444,
3349     },
3350     {
3351         .label = "reset_platform",
3352         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3353         .mask = GENMASK(7, 0) & ~BIT(4),
3354         .mode = 0444,
3355     },
3356     {
3357         .label = "reset_soc",
3358         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3359         .mask = GENMASK(7, 0) & ~BIT(5),
3360         .mode = 0444,
3361     },
3362     {
3363         .label = "reset_pwr_off_from_carrier",
3364         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3365         .mask = GENMASK(7, 0) & ~BIT(7),
3366         .mode = 0444,
3367     },
3368     {
3369         .label = "reset_swb_wd",
3370         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3371         .mask = GENMASK(7, 0) & ~BIT(0),
3372         .mode = 0444,
3373     },
3374     {
3375         .label = "reset_swb_aux_pwr_or_fu",
3376         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3377         .mask = GENMASK(7, 0) & ~BIT(2),
3378         .mode = 0444,
3379     },
3380     {
3381         .label = "reset_swb_dc_dc_pwr_fail",
3382         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3383         .mask = GENMASK(7, 0) & ~BIT(3),
3384         .mode = 0444,
3385     },
3386     {
3387         .label = "reset_swb_12v_fail",
3388         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3389         .mask = GENMASK(7, 0) & ~BIT(4),
3390         .mode = 0444,
3391     },
3392     {
3393         .label = "reset_system",
3394         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3395         .mask = GENMASK(7, 0) & ~BIT(5),
3396         .mode = 0444,
3397     },
3398     {
3399         .label = "reset_thermal_spc_or_pciesw",
3400         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3401         .mask = GENMASK(7, 0) & ~BIT(7),
3402         .mode = 0444,
3403     },
3404     {
3405         .label = "bios_safe_mode",
3406         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3407         .mask = GENMASK(7, 0) & ~BIT(4),
3408         .mode = 0444,
3409     },
3410     {
3411         .label = "bios_active_image",
3412         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3413         .mask = GENMASK(7, 0) & ~BIT(5),
3414         .mode = 0444,
3415     },
3416     {
3417         .label = "bios_auth_fail",
3418         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3419         .mask = GENMASK(7, 0) & ~BIT(6),
3420         .mode = 0444,
3421     },
3422     {
3423         .label = "bios_upgrade_fail",
3424         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3425         .mask = GENMASK(7, 0) & ~BIT(7),
3426         .mode = 0444,
3427     },
3428     {
3429         .label = "voltreg_update_status",
3430         .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3431         .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3432         .bit = 5,
3433         .mode = 0444,
3434     },
3435     {
3436         .label = "vpd_wp",
3437         .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3438         .mask = GENMASK(7, 0) & ~BIT(3),
3439         .mode = 0644,
3440     },
3441     {
3442         .label = "pcie_asic_reset_dis",
3443         .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3444         .mask = GENMASK(7, 0) & ~BIT(4),
3445         .mode = 0644,
3446     },
3447     {
3448         .label = "shutdown_unlock",
3449         .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3450         .mask = GENMASK(7, 0) & ~BIT(5),
3451         .mode = 0644,
3452     },
3453     {
3454         .label = "lc1_rst_mask",
3455         .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3456         .mask = GENMASK(7, 0) & ~BIT(0),
3457         .mode = 0200,
3458     },
3459     {
3460         .label = "lc2_rst_mask",
3461         .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3462         .mask = GENMASK(7, 0) & ~BIT(1),
3463         .mode = 0200,
3464     },
3465     {
3466         .label = "lc3_rst_mask",
3467         .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3468         .mask = GENMASK(7, 0) & ~BIT(2),
3469         .mode = 0200,
3470     },
3471     {
3472         .label = "lc4_rst_mask",
3473         .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3474         .mask = GENMASK(7, 0) & ~BIT(3),
3475         .mode = 0200,
3476     },
3477     {
3478         .label = "lc5_rst_mask",
3479         .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3480         .mask = GENMASK(7, 0) & ~BIT(4),
3481         .mode = 0200,
3482     },
3483     {
3484         .label = "lc6_rst_mask",
3485         .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3486         .mask = GENMASK(7, 0) & ~BIT(5),
3487         .mode = 0200,
3488     },
3489     {
3490         .label = "lc7_rst_mask",
3491         .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3492         .mask = GENMASK(7, 0) & ~BIT(6),
3493         .mode = 0200,
3494     },
3495     {
3496         .label = "lc8_rst_mask",
3497         .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3498         .mask = GENMASK(7, 0) & ~BIT(7),
3499         .mode = 0200,
3500     },
3501     {
3502         .label = "psu1_on",
3503         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3504         .mask = GENMASK(7, 0) & ~BIT(0),
3505         .mode = 0200,
3506     },
3507     {
3508         .label = "psu2_on",
3509         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3510         .mask = GENMASK(7, 0) & ~BIT(1),
3511         .mode = 0200,
3512     },
3513     {
3514         .label = "pwr_cycle",
3515         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3516         .mask = GENMASK(7, 0) & ~BIT(2),
3517         .mode = 0200,
3518     },
3519     {
3520         .label = "pwr_down",
3521         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3522         .mask = GENMASK(7, 0) & ~BIT(3),
3523         .mode = 0200,
3524     },
3525     {
3526         .label = "psu3_on",
3527         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3528         .mask = GENMASK(7, 0) & ~BIT(4),
3529         .mode = 0200,
3530     },
3531     {
3532         .label = "psu4_on",
3533         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3534         .mask = GENMASK(7, 0) & ~BIT(5),
3535         .mode = 0200,
3536     },
3537     {
3538         .label = "auto_power_mode",
3539         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3540         .mask = GENMASK(7, 0) & ~BIT(6),
3541         .mode = 0644,
3542     },
3543     {
3544         .label = "pm_mgmt_en",
3545         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3546         .mask = GENMASK(7, 0) & ~BIT(7),
3547         .mode = 0644,
3548     },
3549     {
3550         .label = "jtag_enable",
3551         .reg = MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE,
3552         .mask = GENMASK(3, 0),
3553         .bit = 1,
3554         .mode = 0644,
3555     },
3556     {
3557         .label = "safe_bios_dis",
3558         .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
3559         .mask = GENMASK(7, 0) & ~BIT(5),
3560         .mode = 0644,
3561     },
3562     {
3563         .label = "safe_bios_dis_wp",
3564         .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET,
3565         .mask = GENMASK(7, 0) & ~BIT(5),
3566         .mode = 0644,
3567     },
3568     {
3569         .label = "asic_health",
3570         .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3571         .mask = MLXPLAT_CPLD_ASIC_MASK,
3572         .bit = 1,
3573         .mode = 0444,
3574     },
3575     {
3576         .label = "fan_dir",
3577         .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
3578         .bit = GENMASK(7, 0),
3579         .mode = 0444,
3580     },
3581     {
3582         .label = "lc1_pwr",
3583         .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3584         .mask = GENMASK(7, 0) & ~BIT(0),
3585         .mode = 0644,
3586     },
3587     {
3588         .label = "lc2_pwr",
3589         .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3590         .mask = GENMASK(7, 0) & ~BIT(1),
3591         .mode = 0644,
3592     },
3593     {
3594         .label = "lc3_pwr",
3595         .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3596         .mask = GENMASK(7, 0) & ~BIT(2),
3597         .mode = 0644,
3598     },
3599     {
3600         .label = "lc4_pwr",
3601         .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3602         .mask = GENMASK(7, 0) & ~BIT(3),
3603         .mode = 0644,
3604     },
3605     {
3606         .label = "lc5_pwr",
3607         .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3608         .mask = GENMASK(7, 0) & ~BIT(4),
3609         .mode = 0644,
3610     },
3611     {
3612         .label = "lc6_pwr",
3613         .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3614         .mask = GENMASK(7, 0) & ~BIT(5),
3615         .mode = 0644,
3616     },
3617     {
3618         .label = "lc7_pwr",
3619         .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3620         .mask = GENMASK(7, 0) & ~BIT(6),
3621         .mode = 0644,
3622     },
3623     {
3624         .label = "lc8_pwr",
3625         .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3626         .mask = GENMASK(7, 0) & ~BIT(7),
3627         .mode = 0644,
3628     },
3629     {
3630         .label = "config1",
3631         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3632         .bit = GENMASK(7, 0),
3633         .mode = 0444,
3634     },
3635     {
3636         .label = "config2",
3637         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3638         .bit = GENMASK(7, 0),
3639         .mode = 0444,
3640     },
3641     {
3642         .label = "config3",
3643         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3644         .bit = GENMASK(7, 0),
3645         .mode = 0444,
3646     },
3647     {
3648         .label = "ufm_version",
3649         .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3650         .bit = GENMASK(7, 0),
3651         .mode = 0444,
3652     },
3653 };
3654 
3655 static struct mlxreg_core_platform_data mlxplat_modular_regs_io_data = {
3656         .data = mlxplat_mlxcpld_modular_regs_io_data,
3657         .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_regs_io_data),
3658 };
3659 
3660 /* Platform register access for NVLink blade systems family data  */
3661 static struct mlxreg_core_data mlxplat_mlxcpld_nvlink_blade_regs_io_data[] = {
3662     {
3663         .label = "cpld1_version",
3664         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3665         .bit = GENMASK(7, 0),
3666         .mode = 0444,
3667     },
3668     {
3669         .label = "cpld1_pn",
3670         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3671         .bit = GENMASK(15, 0),
3672         .mode = 0444,
3673         .regnum = 2,
3674     },
3675     {
3676         .label = "cpld1_version_min",
3677         .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3678         .bit = GENMASK(7, 0),
3679         .mode = 0444,
3680     },
3681     {
3682         .label = "reset_aux_pwr_or_ref",
3683         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3684         .mask = GENMASK(7, 0) & ~BIT(2),
3685         .mode = 0444,
3686     },
3687     {
3688         .label = "reset_from_comex",
3689         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3690         .mask = GENMASK(7, 0) & ~BIT(4),
3691         .mode = 0444,
3692     },
3693     {
3694         .label = "reset_comex_pwr_fail",
3695         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3696         .mask = GENMASK(7, 0) & ~BIT(3),
3697         .mode = 0444,
3698     },
3699     {
3700         .label = "reset_platform",
3701         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3702         .mask = GENMASK(7, 0) & ~BIT(4),
3703         .mode = 0444,
3704     },
3705     {
3706         .label = "reset_soc",
3707         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3708         .mask = GENMASK(7, 0) & ~BIT(5),
3709         .mode = 0444,
3710     },
3711     {
3712         .label = "reset_comex_wd",
3713         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3714         .mask = GENMASK(7, 0) & ~BIT(6),
3715         .mode = 0444,
3716     },
3717     {
3718         .label = "reset_voltmon_upgrade_fail",
3719         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3720         .mask = GENMASK(7, 0) & ~BIT(0),
3721         .mode = 0444,
3722     },
3723     {
3724         .label = "reset_system",
3725         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3726         .mask = GENMASK(7, 0) & ~BIT(1),
3727         .mode = 0444,
3728     },
3729     {
3730         .label = "reset_sw_pwr_off",
3731         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3732         .mask = GENMASK(7, 0) & ~BIT(2),
3733         .mode = 0444,
3734     },
3735     {
3736         .label = "reset_comex_thermal",
3737         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3738         .mask = GENMASK(7, 0) & ~BIT(3),
3739         .mode = 0444,
3740     },
3741     {
3742         .label = "reset_reload_bios",
3743         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3744         .mask = GENMASK(7, 0) & ~BIT(5),
3745         .mode = 0444,
3746     },
3747     {
3748         .label = "reset_ac_pwr_fail",
3749         .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3750         .mask = GENMASK(7, 0) & ~BIT(6),
3751         .mode = 0444,
3752     },
3753     {
3754         .label = "pwr_cycle",
3755         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3756         .mask = GENMASK(7, 0) & ~BIT(2),
3757         .mode = 0200,
3758     },
3759     {
3760         .label = "pwr_down",
3761         .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3762         .mask = GENMASK(7, 0) & ~BIT(3),
3763         .mode = 0200,
3764     },
3765     {
3766         .label = "global_wp_request",
3767         .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3768         .mask = GENMASK(7, 0) & ~BIT(0),
3769         .mode = 0644,
3770     },
3771     {
3772         .label = "jtag_enable",
3773         .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3774         .mask = GENMASK(7, 0) & ~BIT(4),
3775         .mode = 0644,
3776     },
3777     {
3778         .label = "comm_chnl_ready",
3779         .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3780         .mask = GENMASK(7, 0) & ~BIT(6),
3781         .mode = 0200,
3782     },
3783     {
3784         .label = "bios_safe_mode",
3785         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3786         .mask = GENMASK(7, 0) & ~BIT(4),
3787         .mode = 0444,
3788     },
3789     {
3790         .label = "bios_active_image",
3791         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3792         .mask = GENMASK(7, 0) & ~BIT(5),
3793         .mode = 0444,
3794     },
3795     {
3796         .label = "bios_auth_fail",
3797         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3798         .mask = GENMASK(7, 0) & ~BIT(6),
3799         .mode = 0444,
3800     },
3801     {
3802         .label = "bios_upgrade_fail",
3803         .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3804         .mask = GENMASK(7, 0) & ~BIT(7),
3805         .mode = 0444,
3806     },
3807     {
3808         .label = "voltreg_update_status",
3809         .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3810         .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3811         .bit = 5,
3812         .mode = 0444,
3813     },
3814     {
3815         .label = "vpd_wp",
3816         .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3817         .mask = GENMASK(7, 0) & ~BIT(3),
3818         .mode = 0644,
3819     },
3820     {
3821         .label = "pcie_asic_reset_dis",
3822         .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3823         .mask = GENMASK(7, 0) & ~BIT(4),
3824         .mode = 0644,
3825     },
3826     {
3827         .label = "global_wp_response",
3828         .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
3829         .mask = GENMASK(7, 0) & ~BIT(0),
3830         .mode = 0444,
3831     },
3832     {
3833         .label = "config1",
3834         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3835         .bit = GENMASK(7, 0),
3836         .mode = 0444,
3837     },
3838     {
3839         .label = "config2",
3840         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3841         .bit = GENMASK(7, 0),
3842         .mode = 0444,
3843     },
3844     {
3845         .label = "config3",
3846         .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3847         .bit = GENMASK(7, 0),
3848         .mode = 0444,
3849     },
3850     {
3851         .label = "ufm_version",
3852         .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3853         .bit = GENMASK(7, 0),
3854         .mode = 0444,
3855     },
3856 };
3857 
3858 static struct mlxreg_core_platform_data mlxplat_nvlink_blade_regs_io_data = {
3859         .data = mlxplat_mlxcpld_nvlink_blade_regs_io_data,
3860         .counter = ARRAY_SIZE(mlxplat_mlxcpld_nvlink_blade_regs_io_data),
3861 };
3862 
3863 /* Platform FAN default */
3864 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
3865     {
3866         .label = "pwm1",
3867         .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
3868     },
3869     {
3870         .label = "pwm2",
3871         .reg = MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET,
3872     },
3873     {
3874         .label = "pwm3",
3875         .reg = MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET,
3876     },
3877     {
3878         .label = "pwm4",
3879         .reg = MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET,
3880     },
3881     {
3882         .label = "tacho1",
3883         .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
3884         .mask = GENMASK(7, 0),
3885         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3886         .bit = BIT(0),
3887         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3888 
3889     },
3890     {
3891         .label = "tacho2",
3892         .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
3893         .mask = GENMASK(7, 0),
3894         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3895         .bit = BIT(1),
3896         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3897     },
3898     {
3899         .label = "tacho3",
3900         .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
3901         .mask = GENMASK(7, 0),
3902         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3903         .bit = BIT(2),
3904         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3905     },
3906     {
3907         .label = "tacho4",
3908         .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
3909         .mask = GENMASK(7, 0),
3910         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3911         .bit = BIT(3),
3912         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3913     },
3914     {
3915         .label = "tacho5",
3916         .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
3917         .mask = GENMASK(7, 0),
3918         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3919         .bit = BIT(4),
3920         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3921     },
3922     {
3923         .label = "tacho6",
3924         .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
3925         .mask = GENMASK(7, 0),
3926         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3927         .bit = BIT(5),
3928         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3929     },
3930     {
3931         .label = "tacho7",
3932         .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
3933         .mask = GENMASK(7, 0),
3934         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3935         .bit = BIT(6),
3936         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3937     },
3938     {
3939         .label = "tacho8",
3940         .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
3941         .mask = GENMASK(7, 0),
3942         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3943         .bit = BIT(7),
3944         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3945     },
3946     {
3947         .label = "tacho9",
3948         .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
3949         .mask = GENMASK(7, 0),
3950         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3951         .bit = BIT(0),
3952         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3953     },
3954     {
3955         .label = "tacho10",
3956         .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
3957         .mask = GENMASK(7, 0),
3958         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3959         .bit = BIT(1),
3960         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3961     },
3962     {
3963         .label = "tacho11",
3964         .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
3965         .mask = GENMASK(7, 0),
3966         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3967         .bit = BIT(2),
3968         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3969     },
3970     {
3971         .label = "tacho12",
3972         .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
3973         .mask = GENMASK(7, 0),
3974         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3975         .bit = BIT(3),
3976         .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3977     },
3978     {
3979         .label = "tacho13",
3980         .reg = MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET,
3981         .mask = GENMASK(7, 0),
3982         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3983         .bit = BIT(4),
3984     },
3985     {
3986         .label = "tacho14",
3987         .reg = MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET,
3988         .mask = GENMASK(7, 0),
3989         .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3990         .bit = BIT(5),
3991     },
3992     {
3993         .label = "conf",
3994         .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
3995     },
3996 };
3997 
3998 static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
3999         .data = mlxplat_mlxcpld_default_fan_data,
4000         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
4001         .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
4002 };
4003 
4004 /* Watchdog type1: hardware implementation version1
4005  * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
4006  */
4007 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
4008     {
4009         .label = "action",
4010         .reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
4011         .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4012         .bit = 0,
4013     },
4014     {
4015         .label = "timeout",
4016         .reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
4017         .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
4018         .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4019     },
4020     {
4021         .label = "ping",
4022         .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
4023         .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
4024         .bit = 0,
4025     },
4026     {
4027         .label = "reset",
4028         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4029         .mask = GENMASK(7, 0) & ~BIT(6),
4030         .bit = 6,
4031     },
4032 };
4033 
4034 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
4035     {
4036         .label = "action",
4037         .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4038         .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4039         .bit = 4,
4040     },
4041     {
4042         .label = "timeout",
4043         .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4044         .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
4045         .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4046     },
4047     {
4048         .label = "ping",
4049         .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
4050         .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
4051         .bit = 1,
4052     },
4053 };
4054 
4055 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
4056     {
4057         .data = mlxplat_mlxcpld_wd_main_regs_type1,
4058         .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
4059         .version = MLX_WDT_TYPE1,
4060         .identity = "mlx-wdt-main",
4061     },
4062     {
4063         .data = mlxplat_mlxcpld_wd_aux_regs_type1,
4064         .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
4065         .version = MLX_WDT_TYPE1,
4066         .identity = "mlx-wdt-aux",
4067     },
4068 };
4069 
4070 /* Watchdog type2: hardware implementation version 2
4071  * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
4072  */
4073 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
4074     {
4075         .label = "action",
4076         .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4077         .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4078         .bit = 0,
4079     },
4080     {
4081         .label = "timeout",
4082         .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4083         .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4084         .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4085     },
4086     {
4087         .label = "timeleft",
4088         .reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
4089         .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4090     },
4091     {
4092         .label = "ping",
4093         .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4094         .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4095         .bit = 0,
4096     },
4097     {
4098         .label = "reset",
4099         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4100         .mask = GENMASK(7, 0) & ~BIT(6),
4101         .bit = 6,
4102     },
4103 };
4104 
4105 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
4106     {
4107         .label = "action",
4108         .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4109         .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4110         .bit = 4,
4111     },
4112     {
4113         .label = "timeout",
4114         .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4115         .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4116         .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4117     },
4118     {
4119         .label = "timeleft",
4120         .reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
4121         .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4122     },
4123     {
4124         .label = "ping",
4125         .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4126         .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4127         .bit = 4,
4128     },
4129 };
4130 
4131 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
4132     {
4133         .data = mlxplat_mlxcpld_wd_main_regs_type2,
4134         .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
4135         .version = MLX_WDT_TYPE2,
4136         .identity = "mlx-wdt-main",
4137     },
4138     {
4139         .data = mlxplat_mlxcpld_wd_aux_regs_type2,
4140         .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
4141         .version = MLX_WDT_TYPE2,
4142         .identity = "mlx-wdt-aux",
4143     },
4144 };
4145 
4146 /* Watchdog type3: hardware implementation version 3
4147  * Can be on all systems. It's differentiated by WD capability bit.
4148  * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
4149  * still have only one main watchdog.
4150  */
4151 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
4152     {
4153         .label = "action",
4154         .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4155         .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4156         .bit = 0,
4157     },
4158     {
4159         .label = "timeout",
4160         .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4161         .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4162         .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
4163     },
4164     {
4165         .label = "timeleft",
4166         .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4167         .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4168     },
4169     {
4170         .label = "ping",
4171         .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4172         .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4173         .bit = 0,
4174     },
4175     {
4176         .label = "reset",
4177         .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4178         .mask = GENMASK(7, 0) & ~BIT(6),
4179         .bit = 6,
4180     },
4181 };
4182 
4183 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
4184     {
4185         .label = "action",
4186         .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4187         .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4188         .bit = 4,
4189     },
4190     {
4191         .label = "timeout",
4192         .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4193         .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4194         .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
4195     },
4196     {
4197         .label = "timeleft",
4198         .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4199         .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4200     },
4201     {
4202         .label = "ping",
4203         .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4204         .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4205         .bit = 4,
4206     },
4207 };
4208 
4209 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
4210     {
4211         .data = mlxplat_mlxcpld_wd_main_regs_type3,
4212         .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
4213         .version = MLX_WDT_TYPE3,
4214         .identity = "mlx-wdt-main",
4215     },
4216     {
4217         .data = mlxplat_mlxcpld_wd_aux_regs_type3,
4218         .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
4219         .version = MLX_WDT_TYPE3,
4220         .identity = "mlx-wdt-aux",
4221     },
4222 };
4223 
4224 static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
4225 {
4226     switch (reg) {
4227     case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4228     case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4229     case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4230     case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4231     case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4232     case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4233     case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4234     case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4235     case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4236     case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4237     case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4238     case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
4239     case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4240     case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
4241     case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4242     case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4243     case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4244     case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4245     case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4246     case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4247     case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4248     case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4249     case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4250     case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4251     case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4252     case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4253     case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4254     case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4255     case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4256     case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4257     case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4258     case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4259     case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4260     case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4261     case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4262     case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4263     case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4264     case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4265     case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4266     case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4267     case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4268     case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4269     case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4270     case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4271     case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4272     case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4273     case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4274     case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4275     case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4276     case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4277     case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
4278     case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
4279     case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
4280     case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
4281     case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4282     case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4283     case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
4284     case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4285     case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4286     case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
4287     case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4288     case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4289     case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4290     case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4291     case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4292         return true;
4293     }
4294     return false;
4295 }
4296 
4297 static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
4298 {
4299     switch (reg) {
4300     case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
4301     case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
4302     case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
4303     case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
4304     case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
4305     case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
4306     case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
4307     case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
4308     case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
4309     case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
4310     case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
4311     case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
4312     case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4313     case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
4314     case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
4315     case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
4316     case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4317     case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4318     case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4319     case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4320     case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4321     case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4322     case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4323     case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
4324     case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
4325     case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
4326     case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4327     case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4328     case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4329     case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
4330     case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4331     case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
4332     case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4333     case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4334     case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4335     case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
4336     case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4337     case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
4338     case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4339     case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
4340     case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4341     case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
4342     case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4343     case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
4344     case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4345     case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4346     case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
4347     case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4348     case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4349     case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
4350     case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4351     case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4352     case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
4353     case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4354     case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4355     case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
4356     case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4357     case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4358     case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
4359     case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4360     case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4361     case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
4362     case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4363     case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
4364     case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4365     case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4366     case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
4367     case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4368     case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4369     case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4370     case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4371     case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4372     case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
4373     case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4374     case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4375     case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
4376     case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4377     case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4378     case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
4379     case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4380     case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4381     case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
4382     case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4383     case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4384     case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4385     case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
4386     case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
4387     case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
4388     case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
4389     case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4390     case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4391     case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
4392     case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4393     case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4394     case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
4395     case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
4396     case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
4397     case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
4398     case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
4399     case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4400     case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4401     case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4402     case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4403     case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
4404     case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
4405     case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
4406     case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
4407     case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
4408     case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
4409     case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
4410     case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
4411     case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
4412     case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
4413     case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
4414     case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
4415     case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
4416     case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
4417     case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4418     case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
4419     case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
4420     case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
4421     case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
4422     case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
4423     case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
4424     case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
4425     case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
4426     case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
4427     case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
4428         return true;
4429     }
4430     return false;
4431 }
4432 
4433 static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
4434 {
4435     switch (reg) {
4436     case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
4437     case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
4438     case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
4439     case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
4440     case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
4441     case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
4442     case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
4443     case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
4444     case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
4445     case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
4446     case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
4447     case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
4448     case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4449     case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
4450     case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
4451     case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
4452     case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4453     case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4454     case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4455     case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4456     case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4457     case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4458     case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4459     case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
4460     case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
4461     case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
4462     case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4463     case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4464     case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4465     case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4466     case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4467     case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4468     case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4469     case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
4470     case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4471     case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
4472     case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4473     case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
4474     case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4475     case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
4476     case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4477     case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
4478     case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4479     case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4480     case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
4481     case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4482     case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4483     case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
4484     case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4485     case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4486     case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
4487     case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4488     case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4489     case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
4490     case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4491     case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4492     case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
4493     case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4494     case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4495     case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
4496     case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4497     case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
4498     case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4499     case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4500     case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
4501     case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4502     case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4503     case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4504     case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4505     case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4506     case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
4507     case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4508     case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4509     case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
4510     case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4511     case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4512     case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
4513     case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4514     case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4515     case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
4516     case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4517     case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4518     case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4519     case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4520     case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4521     case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4522     case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4523     case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
4524     case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
4525     case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
4526     case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
4527     case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4528     case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4529     case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4530     case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4531     case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
4532     case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
4533     case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
4534     case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
4535     case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
4536     case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
4537     case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
4538     case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
4539     case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
4540     case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
4541     case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
4542     case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
4543     case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
4544     case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
4545     case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4546     case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
4547     case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
4548     case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
4549     case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
4550     case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
4551     case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
4552     case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
4553     case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
4554     case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
4555     case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
4556         return true;
4557     }
4558     return false;
4559 }
4560 
4561 static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
4562     { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
4563     { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
4564     { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4565     { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
4566 };
4567 
4568 static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
4569     { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4570     { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
4571 };
4572 
4573 static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
4574     { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
4575       MLXPLAT_CPLD_LOW_AGGRCX_MASK },
4576     { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4577 };
4578 
4579 static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
4580     { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4581     { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4582     { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4583     { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4584 };
4585 
4586 static const struct reg_default mlxplat_mlxcpld_regmap_eth_modular[] = {
4587     { MLXPLAT_CPLD_LPC_REG_GP2_OFFSET, 0x61 },
4588     { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4589     { MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET, 0x00 },
4590     { MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET, 0x00 },
4591     { MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET, 0x00 },
4592     { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4593     { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4594     { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4595     { MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET,
4596       MLXPLAT_CPLD_AGGR_MASK_LC_LOW },
4597 };
4598 
4599 struct mlxplat_mlxcpld_regmap_context {
4600     void __iomem *base;
4601 };
4602 
4603 static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
4604 
4605 static int
4606 mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
4607 {
4608     struct mlxplat_mlxcpld_regmap_context *ctx = context;
4609 
4610     *val = ioread8(ctx->base + reg);
4611     return 0;
4612 }
4613 
4614 static int
4615 mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
4616 {
4617     struct mlxplat_mlxcpld_regmap_context *ctx = context;
4618 
4619     iowrite8(val, ctx->base + reg);
4620     return 0;
4621 }
4622 
4623 static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
4624     .reg_bits = 8,
4625     .val_bits = 8,
4626     .max_register = 255,
4627     .cache_type = REGCACHE_FLAT,
4628     .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4629     .readable_reg = mlxplat_mlxcpld_readable_reg,
4630     .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4631     .reg_defaults = mlxplat_mlxcpld_regmap_default,
4632     .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
4633     .reg_read = mlxplat_mlxcpld_reg_read,
4634     .reg_write = mlxplat_mlxcpld_reg_write,
4635 };
4636 
4637 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
4638     .reg_bits = 8,
4639     .val_bits = 8,
4640     .max_register = 255,
4641     .cache_type = REGCACHE_FLAT,
4642     .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4643     .readable_reg = mlxplat_mlxcpld_readable_reg,
4644     .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4645     .reg_defaults = mlxplat_mlxcpld_regmap_ng,
4646     .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
4647     .reg_read = mlxplat_mlxcpld_reg_read,
4648     .reg_write = mlxplat_mlxcpld_reg_write,
4649 };
4650 
4651 static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
4652     .reg_bits = 8,
4653     .val_bits = 8,
4654     .max_register = 255,
4655     .cache_type = REGCACHE_FLAT,
4656     .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4657     .readable_reg = mlxplat_mlxcpld_readable_reg,
4658     .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4659     .reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
4660     .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
4661     .reg_read = mlxplat_mlxcpld_reg_read,
4662     .reg_write = mlxplat_mlxcpld_reg_write,
4663 };
4664 
4665 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
4666     .reg_bits = 8,
4667     .val_bits = 8,
4668     .max_register = 255,
4669     .cache_type = REGCACHE_FLAT,
4670     .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4671     .readable_reg = mlxplat_mlxcpld_readable_reg,
4672     .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4673     .reg_defaults = mlxplat_mlxcpld_regmap_ng400,
4674     .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
4675     .reg_read = mlxplat_mlxcpld_reg_read,
4676     .reg_write = mlxplat_mlxcpld_reg_write,
4677 };
4678 
4679 static const struct regmap_config mlxplat_mlxcpld_regmap_config_eth_modular = {
4680     .reg_bits = 8,
4681     .val_bits = 8,
4682     .max_register = 255,
4683     .cache_type = REGCACHE_FLAT,
4684     .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4685     .readable_reg = mlxplat_mlxcpld_readable_reg,
4686     .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4687     .reg_defaults = mlxplat_mlxcpld_regmap_eth_modular,
4688     .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_eth_modular),
4689     .reg_read = mlxplat_mlxcpld_reg_read,
4690     .reg_write = mlxplat_mlxcpld_reg_write,
4691 };
4692 
4693 static struct resource mlxplat_mlxcpld_resources[] = {
4694     [0] = DEFINE_RES_IRQ_NAMED(MLXPLAT_CPLD_LPC_SYSIRQ, "mlxreg-hotplug"),
4695 };
4696 
4697 static struct platform_device *mlxplat_dev;
4698 static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
4699 static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
4700 static struct mlxreg_core_platform_data *mlxplat_led;
4701 static struct mlxreg_core_platform_data *mlxplat_regs_io;
4702 static struct mlxreg_core_platform_data *mlxplat_fan;
4703 static struct mlxreg_core_platform_data
4704     *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
4705 static const struct regmap_config *mlxplat_regmap_config;
4706 
4707 static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
4708 {
4709     int i;
4710 
4711     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4712     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4713     mlxplat_mux_data = mlxplat_default_mux_data;
4714     for (i = 0; i < mlxplat_mux_num; i++) {
4715         mlxplat_mux_data[i].values = mlxplat_default_channels[i];
4716         mlxplat_mux_data[i].n_values =
4717                 ARRAY_SIZE(mlxplat_default_channels[i]);
4718     }
4719     mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
4720     mlxplat_hotplug->deferred_nr =
4721         mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4722     mlxplat_led = &mlxplat_default_led_data;
4723     mlxplat_regs_io = &mlxplat_default_regs_io_data;
4724     mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4725 
4726     return 1;
4727 }
4728 
4729 static int __init mlxplat_dmi_default_wc_matched(const struct dmi_system_id *dmi)
4730 {
4731     int i;
4732 
4733     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4734     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4735     mlxplat_mux_data = mlxplat_default_mux_data;
4736     for (i = 0; i < mlxplat_mux_num; i++) {
4737         mlxplat_mux_data[i].values = mlxplat_default_channels[i];
4738         mlxplat_mux_data[i].n_values =
4739                 ARRAY_SIZE(mlxplat_default_channels[i]);
4740     }
4741     mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
4742     mlxplat_hotplug->deferred_nr =
4743         mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4744     mlxplat_led = &mlxplat_default_led_wc_data;
4745     mlxplat_regs_io = &mlxplat_default_regs_io_data;
4746     mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4747 
4748     return 1;
4749 }
4750 
4751 static int __init mlxplat_dmi_default_eth_wc_blade_matched(const struct dmi_system_id *dmi)
4752 {
4753     int i;
4754 
4755     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4756     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4757     mlxplat_mux_data = mlxplat_default_mux_data;
4758     for (i = 0; i < mlxplat_mux_num; i++) {
4759         mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4760         mlxplat_mux_data[i].n_values =
4761                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4762     }
4763     mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
4764     mlxplat_hotplug->deferred_nr =
4765         mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4766     mlxplat_led = &mlxplat_default_led_eth_wc_blade_data;
4767     mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
4768     for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4769         mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4770     mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4771     mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
4772 
4773     return 1;
4774 }
4775 
4776 static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
4777 {
4778     int i;
4779 
4780     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4781     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4782     mlxplat_mux_data = mlxplat_default_mux_data;
4783     for (i = 0; i < mlxplat_mux_num; i++) {
4784         mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4785         mlxplat_mux_data[i].n_values =
4786                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4787     }
4788     mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
4789     mlxplat_hotplug->deferred_nr =
4790         mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4791     mlxplat_led = &mlxplat_msn21xx_led_data;
4792     mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
4793     mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4794 
4795     return 1;
4796 }
4797 
4798 static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
4799 {
4800     int i;
4801 
4802     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4803     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4804     mlxplat_mux_data = mlxplat_default_mux_data;
4805     for (i = 0; i < mlxplat_mux_num; i++) {
4806         mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4807         mlxplat_mux_data[i].n_values =
4808                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4809     }
4810     mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
4811     mlxplat_hotplug->deferred_nr =
4812         mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4813     mlxplat_led = &mlxplat_default_led_data;
4814     mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
4815     mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4816 
4817     return 1;
4818 }
4819 
4820 static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
4821 {
4822     int i;
4823 
4824     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4825     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4826     mlxplat_mux_data = mlxplat_default_mux_data;
4827     for (i = 0; i < mlxplat_mux_num; i++) {
4828         mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4829         mlxplat_mux_data[i].n_values =
4830                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4831     }
4832     mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
4833     mlxplat_hotplug->deferred_nr =
4834         mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4835     mlxplat_led = &mlxplat_msn21xx_led_data;
4836     mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
4837     mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4838 
4839     return 1;
4840 }
4841 
4842 static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
4843 {
4844     int i;
4845 
4846     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4847     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4848     mlxplat_mux_data = mlxplat_default_mux_data;
4849     for (i = 0; i < mlxplat_mux_num; i++) {
4850         mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4851         mlxplat_mux_data[i].n_values =
4852                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4853     }
4854     mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
4855     mlxplat_hotplug->deferred_nr =
4856         mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4857     mlxplat_led = &mlxplat_default_ng_led_data;
4858     mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
4859     mlxplat_fan = &mlxplat_default_fan_data;
4860     for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4861         mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4862     mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4863     mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
4864 
4865     return 1;
4866 }
4867 
4868 static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
4869 {
4870     int i;
4871 
4872     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
4873     mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
4874     mlxplat_mux_data = mlxplat_extended_mux_data;
4875     for (i = 0; i < mlxplat_mux_num; i++) {
4876         mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4877         mlxplat_mux_data[i].n_values =
4878                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4879     }
4880     mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
4881     mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
4882     mlxplat_led = &mlxplat_comex_100G_led_data;
4883     mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
4884     mlxplat_fan = &mlxplat_default_fan_data;
4885     for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4886         mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4887     mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
4888 
4889     return 1;
4890 }
4891 
4892 static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
4893 {
4894     int i;
4895 
4896     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4897     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4898     mlxplat_mux_data = mlxplat_default_mux_data;
4899     for (i = 0; i < mlxplat_mux_num; i++) {
4900         mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4901         mlxplat_mux_data[i].n_values =
4902                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4903     }
4904     mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
4905     mlxplat_hotplug->deferred_nr =
4906         mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4907     mlxplat_led = &mlxplat_default_ng_led_data;
4908     mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
4909     mlxplat_fan = &mlxplat_default_fan_data;
4910     for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4911         mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4912     mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4913     mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
4914 
4915     return 1;
4916 }
4917 
4918 static int __init mlxplat_dmi_modular_matched(const struct dmi_system_id *dmi)
4919 {
4920     int i;
4921 
4922     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4923     mlxplat_mux_num = ARRAY_SIZE(mlxplat_modular_mux_data);
4924     mlxplat_mux_data = mlxplat_modular_mux_data;
4925     mlxplat_hotplug = &mlxplat_mlxcpld_modular_data;
4926     mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR;
4927     mlxplat_led = &mlxplat_modular_led_data;
4928     mlxplat_regs_io = &mlxplat_modular_regs_io_data;
4929     mlxplat_fan = &mlxplat_default_fan_data;
4930     for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4931         mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4932     mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4933     mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_eth_modular;
4934 
4935     return 1;
4936 }
4937 
4938 static int __init mlxplat_dmi_nvlink_blade_matched(const struct dmi_system_id *dmi)
4939 {
4940     int i;
4941 
4942     mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4943     mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4944     mlxplat_mux_data = mlxplat_default_mux_data;
4945     mlxplat_hotplug = &mlxplat_mlxcpld_nvlink_blade_data;
4946     mlxplat_hotplug->deferred_nr =
4947         mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4948     for (i = 0; i < mlxplat_mux_num; i++) {
4949         mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4950         mlxplat_mux_data[i].n_values =
4951                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4952     }
4953     mlxplat_regs_io = &mlxplat_nvlink_blade_regs_io_data;
4954     mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4955     mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
4956 
4957     return 1;
4958 }
4959 
4960 static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
4961     {
4962         .callback = mlxplat_dmi_default_wc_matched,
4963         .matches = {
4964             DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
4965             DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI138"),
4966         },
4967     },
4968     {
4969         .callback = mlxplat_dmi_default_matched,
4970         .matches = {
4971             DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
4972         },
4973     },
4974     {
4975         .callback = mlxplat_dmi_msn21xx_matched,
4976         .matches = {
4977             DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
4978         },
4979     },
4980     {
4981         .callback = mlxplat_dmi_msn274x_matched,
4982         .matches = {
4983             DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
4984         },
4985     },
4986     {
4987         .callback = mlxplat_dmi_msn201x_matched,
4988         .matches = {
4989             DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
4990         },
4991     },
4992     {
4993         .callback = mlxplat_dmi_default_eth_wc_blade_matched,
4994         .matches = {
4995             DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
4996             DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI139"),
4997         },
4998     },
4999     {
5000         .callback = mlxplat_dmi_qmb7xx_matched,
5001         .matches = {
5002             DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
5003         },
5004     },
5005     {
5006         .callback = mlxplat_dmi_qmb7xx_matched,
5007         .matches = {
5008             DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
5009         },
5010     },
5011     {
5012         .callback = mlxplat_dmi_comex_matched,
5013         .matches = {
5014             DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
5015         },
5016     },
5017     {
5018         .callback = mlxplat_dmi_ng400_matched,
5019         .matches = {
5020             DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
5021         },
5022     },
5023     {
5024         .callback = mlxplat_dmi_modular_matched,
5025         .matches = {
5026             DMI_MATCH(DMI_BOARD_NAME, "VMOD0011"),
5027         },
5028     },
5029     {
5030         .callback = mlxplat_dmi_nvlink_blade_matched,
5031         .matches = {
5032             DMI_MATCH(DMI_BOARD_NAME, "VMOD0015"),
5033         },
5034     },
5035     {
5036         .callback = mlxplat_dmi_msn274x_matched,
5037         .matches = {
5038             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5039             DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
5040         },
5041     },
5042     {
5043         .callback = mlxplat_dmi_default_matched,
5044         .matches = {
5045             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5046             DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
5047         },
5048     },
5049     {
5050         .callback = mlxplat_dmi_default_matched,
5051         .matches = {
5052             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5053             DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
5054         },
5055     },
5056     {
5057         .callback = mlxplat_dmi_default_matched,
5058         .matches = {
5059             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5060             DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
5061         },
5062     },
5063     {
5064         .callback = mlxplat_dmi_default_matched,
5065         .matches = {
5066             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5067             DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
5068         },
5069     },
5070     {
5071         .callback = mlxplat_dmi_msn21xx_matched,
5072         .matches = {
5073             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5074             DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
5075         },
5076     },
5077     {
5078         .callback = mlxplat_dmi_msn201x_matched,
5079         .matches = {
5080             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5081             DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
5082         },
5083     },
5084     {
5085         .callback = mlxplat_dmi_qmb7xx_matched,
5086         .matches = {
5087             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5088             DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
5089         },
5090     },
5091     {
5092         .callback = mlxplat_dmi_qmb7xx_matched,
5093         .matches = {
5094             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5095             DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
5096         },
5097     },
5098     {
5099         .callback = mlxplat_dmi_qmb7xx_matched,
5100         .matches = {
5101             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5102             DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
5103         },
5104     },
5105     {
5106         .callback = mlxplat_dmi_qmb7xx_matched,
5107         .matches = {
5108             DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5109             DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
5110         },
5111     },
5112     { }
5113 };
5114 
5115 MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
5116 
5117 static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
5118 {
5119     struct i2c_adapter *search_adap;
5120     int shift, i;
5121 
5122     /* Scan adapters from expected id to verify it is free. */
5123     *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
5124     for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
5125          mlxplat_max_adap_num; i++) {
5126         search_adap = i2c_get_adapter(i);
5127         if (search_adap) {
5128             i2c_put_adapter(search_adap);
5129             continue;
5130         }
5131 
5132         /* Return if expected parent adapter is free. */
5133         if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
5134             return 0;
5135         break;
5136     }
5137 
5138     /* Return with error if free id for adapter is not found. */
5139     if (i == mlxplat_max_adap_num)
5140         return -ENODEV;
5141 
5142     /* Shift adapter ids, since expected parent adapter is not free. */
5143     *nr = i;
5144     for (i = 0; i < mlxplat_mux_num; i++) {
5145         shift = *nr - mlxplat_mux_data[i].parent;
5146         mlxplat_mux_data[i].parent = *nr;
5147         mlxplat_mux_data[i].base_nr += shift;
5148         if (shift > 0)
5149             mlxplat_hotplug->shift_nr = shift;
5150     }
5151 
5152     return 0;
5153 }
5154 
5155 static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
5156 {
5157     u32 regval;
5158     int i, rc;
5159 
5160     rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
5161              &regval);
5162     if (rc)
5163         return rc;
5164 
5165     if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
5166         for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
5167             if (mlxplat_wd_data[i])
5168                 mlxplat_wd_data[i] =
5169                     &mlxplat_mlxcpld_wd_set_type3[i];
5170         }
5171     }
5172 
5173     return 0;
5174 }
5175 
5176 static int __init mlxplat_init(void)
5177 {
5178     struct mlxplat_priv *priv;
5179     int i, j, nr, err;
5180 
5181     if (!dmi_check_system(mlxplat_dmi_table))
5182         return -ENODEV;
5183 
5184     mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, -1,
5185                     mlxplat_lpc_resources,
5186                     ARRAY_SIZE(mlxplat_lpc_resources));
5187 
5188     if (IS_ERR(mlxplat_dev))
5189         return PTR_ERR(mlxplat_dev);
5190 
5191     priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
5192                 GFP_KERNEL);
5193     if (!priv) {
5194         err = -ENOMEM;
5195         goto fail_alloc;
5196     }
5197     platform_set_drvdata(mlxplat_dev, priv);
5198 
5199     mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
5200                    mlxplat_lpc_resources[1].start, 1);
5201     if (!mlxplat_mlxcpld_regmap_ctx.base) {
5202         err = -ENOMEM;
5203         goto fail_alloc;
5204     }
5205 
5206     if (!mlxplat_regmap_config)
5207         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
5208 
5209     priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
5210                     &mlxplat_mlxcpld_regmap_ctx,
5211                     mlxplat_regmap_config);
5212     if (IS_ERR(priv->regmap)) {
5213         err = PTR_ERR(priv->regmap);
5214         goto fail_alloc;
5215     }
5216 
5217     err = mlxplat_mlxcpld_verify_bus_topology(&nr);
5218     if (nr < 0)
5219         goto fail_alloc;
5220 
5221     nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
5222     if (mlxplat_i2c)
5223         mlxplat_i2c->regmap = priv->regmap;
5224     priv->pdev_i2c = platform_device_register_resndata(&mlxplat_dev->dev, "i2c_mlxcpld",
5225                                nr, mlxplat_mlxcpld_resources,
5226                                ARRAY_SIZE(mlxplat_mlxcpld_resources),
5227                                mlxplat_i2c, sizeof(*mlxplat_i2c));
5228     if (IS_ERR(priv->pdev_i2c)) {
5229         err = PTR_ERR(priv->pdev_i2c);
5230         goto fail_alloc;
5231     }
5232 
5233     for (i = 0; i < mlxplat_mux_num; i++) {
5234         priv->pdev_mux[i] = platform_device_register_resndata(&priv->pdev_i2c->dev,
5235                                       "i2c-mux-reg", i, NULL, 0,
5236                                       &mlxplat_mux_data[i],
5237                                       sizeof(mlxplat_mux_data[i]));
5238         if (IS_ERR(priv->pdev_mux[i])) {
5239             err = PTR_ERR(priv->pdev_mux[i]);
5240             goto fail_platform_mux_register;
5241         }
5242     }
5243 
5244     /* Add hotplug driver */
5245     if (mlxplat_hotplug) {
5246         mlxplat_hotplug->regmap = priv->regmap;
5247         priv->pdev_hotplug =
5248         platform_device_register_resndata(&mlxplat_dev->dev,
5249                           "mlxreg-hotplug", PLATFORM_DEVID_NONE,
5250                           mlxplat_mlxcpld_resources,
5251                           ARRAY_SIZE(mlxplat_mlxcpld_resources),
5252                           mlxplat_hotplug, sizeof(*mlxplat_hotplug));
5253         if (IS_ERR(priv->pdev_hotplug)) {
5254             err = PTR_ERR(priv->pdev_hotplug);
5255             goto fail_platform_mux_register;
5256         }
5257     }
5258 
5259     /* Set default registers. */
5260     for (j = 0; j <  mlxplat_regmap_config->num_reg_defaults; j++) {
5261         err = regmap_write(priv->regmap,
5262                    mlxplat_regmap_config->reg_defaults[j].reg,
5263                    mlxplat_regmap_config->reg_defaults[j].def);
5264         if (err)
5265             goto fail_platform_mux_register;
5266     }
5267 
5268     /* Add LED driver. */
5269     if (mlxplat_led) {
5270         mlxplat_led->regmap = priv->regmap;
5271         priv->pdev_led =
5272         platform_device_register_resndata(&mlxplat_dev->dev, "leds-mlxreg",
5273                           PLATFORM_DEVID_NONE, NULL, 0, mlxplat_led,
5274                           sizeof(*mlxplat_led));
5275         if (IS_ERR(priv->pdev_led)) {
5276             err = PTR_ERR(priv->pdev_led);
5277             goto fail_platform_hotplug_register;
5278         }
5279     }
5280 
5281     /* Add registers io access driver. */
5282     if (mlxplat_regs_io) {
5283         mlxplat_regs_io->regmap = priv->regmap;
5284         priv->pdev_io_regs = platform_device_register_resndata(&mlxplat_dev->dev,
5285                                        "mlxreg-io",
5286                                        PLATFORM_DEVID_NONE, NULL,
5287                                        0, mlxplat_regs_io,
5288                                        sizeof(*mlxplat_regs_io));
5289         if (IS_ERR(priv->pdev_io_regs)) {
5290             err = PTR_ERR(priv->pdev_io_regs);
5291             goto fail_platform_led_register;
5292         }
5293     }
5294 
5295     /* Add FAN driver. */
5296     if (mlxplat_fan) {
5297         mlxplat_fan->regmap = priv->regmap;
5298         priv->pdev_fan = platform_device_register_resndata(&mlxplat_dev->dev, "mlxreg-fan",
5299                                    PLATFORM_DEVID_NONE, NULL, 0,
5300                                    mlxplat_fan,
5301                                    sizeof(*mlxplat_fan));
5302         if (IS_ERR(priv->pdev_fan)) {
5303             err = PTR_ERR(priv->pdev_fan);
5304             goto fail_platform_io_regs_register;
5305         }
5306     }
5307 
5308     /* Add WD drivers. */
5309     err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
5310     if (err)
5311         goto fail_platform_wd_register;
5312     for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) {
5313         if (mlxplat_wd_data[j]) {
5314             mlxplat_wd_data[j]->regmap = priv->regmap;
5315             priv->pdev_wd[j] =
5316                 platform_device_register_resndata(&mlxplat_dev->dev, "mlx-wdt", j,
5317                                   NULL, 0, mlxplat_wd_data[j],
5318                                   sizeof(*mlxplat_wd_data[j]));
5319             if (IS_ERR(priv->pdev_wd[j])) {
5320                 err = PTR_ERR(priv->pdev_wd[j]);
5321                 goto fail_platform_wd_register;
5322             }
5323         }
5324     }
5325 
5326     /* Sync registers with hardware. */
5327     regcache_mark_dirty(priv->regmap);
5328     err = regcache_sync(priv->regmap);
5329     if (err)
5330         goto fail_platform_wd_register;
5331 
5332     return 0;
5333 
5334 fail_platform_wd_register:
5335     while (--j >= 0)
5336         platform_device_unregister(priv->pdev_wd[j]);
5337     if (mlxplat_fan)
5338         platform_device_unregister(priv->pdev_fan);
5339 fail_platform_io_regs_register:
5340     if (mlxplat_regs_io)
5341         platform_device_unregister(priv->pdev_io_regs);
5342 fail_platform_led_register:
5343     if (mlxplat_led)
5344         platform_device_unregister(priv->pdev_led);
5345 fail_platform_hotplug_register:
5346     if (mlxplat_hotplug)
5347         platform_device_unregister(priv->pdev_hotplug);
5348 fail_platform_mux_register:
5349     while (--i >= 0)
5350         platform_device_unregister(priv->pdev_mux[i]);
5351     platform_device_unregister(priv->pdev_i2c);
5352 fail_alloc:
5353     platform_device_unregister(mlxplat_dev);
5354 
5355     return err;
5356 }
5357 module_init(mlxplat_init);
5358 
5359 static void __exit mlxplat_exit(void)
5360 {
5361     struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
5362     int i;
5363 
5364     for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0 ; i--)
5365         platform_device_unregister(priv->pdev_wd[i]);
5366     if (priv->pdev_fan)
5367         platform_device_unregister(priv->pdev_fan);
5368     if (priv->pdev_io_regs)
5369         platform_device_unregister(priv->pdev_io_regs);
5370     if (priv->pdev_led)
5371         platform_device_unregister(priv->pdev_led);
5372     if (priv->pdev_hotplug)
5373         platform_device_unregister(priv->pdev_hotplug);
5374 
5375     for (i = mlxplat_mux_num - 1; i >= 0 ; i--)
5376         platform_device_unregister(priv->pdev_mux[i]);
5377 
5378     platform_device_unregister(priv->pdev_i2c);
5379     platform_device_unregister(mlxplat_dev);
5380 }
5381 module_exit(mlxplat_exit);
5382 
5383 MODULE_AUTHOR("Vadim Pasternak (vadimp@mellanox.com)");
5384 MODULE_DESCRIPTION("Mellanox platform driver");
5385 MODULE_LICENSE("Dual BSD/GPL");