platform: mellanox: Introduce support for rack manager switch
[linux-2.6-microblaze.git] / drivers / platform / x86 / mlx-platform.c
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /*
3  * Mellanox platform driver
4  *
5  * Copyright (C) 2016-2018 Mellanox Technologies
6  * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
7  */
8
9 #include <linux/device.h>
10 #include <linux/dmi.h>
11 #include <linux/i2c.h>
12 #include <linux/i2c-mux.h>
13 #include <linux/io.h>
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/platform_data/i2c-mux-reg.h>
17 #include <linux/platform_data/mlxreg.h>
18 #include <linux/regmap.h>
19
20 #define MLX_PLAT_DEVICE_NAME            "mlxplat"
21
22 /* LPC bus IO offsets */
23 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR          0x2000
24 #define MLXPLAT_CPLD_LPC_REG_BASE_ADRR          0x2500
25 #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET   0x00
26 #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET   0x01
27 #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET   0x02
28 #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET   0x03
29 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET    0x04
30 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET   0x05
31 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET    0x06
32 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET   0x07
33 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET    0x08
34 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET   0x09
35 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET    0x0a
36 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET   0x0b
37 #define MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET   0x19
38 #define MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET   0x1c
39 #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
40 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET  0x1e
41 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET  0x1f
42 #define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET        0x20
43 #define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET        0x21
44 #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET        0x22
45 #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET        0x23
46 #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET        0x24
47 #define MLXPLAT_CPLD_LPC_REG_LED6_OFFSET        0x25
48 #define MLXPLAT_CPLD_LPC_REG_LED7_OFFSET        0x26
49 #define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION      0x2a
50 #define MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET      0x2b
51 #define MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET      0x2d
52 #define MLXPLAT_CPLD_LPC_REG_GP0_OFFSET         0x2e
53 #define MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET      0x2f
54 #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET         0x30
55 #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET         0x31
56 #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET         0x32
57 #define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET         0x33
58 #define MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE      0x34
59 #define MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET       0x35
60 #define MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET    0x36
61 #define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET 0x37
62 #define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET        0x3a
63 #define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET   0x3b
64 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET      0x40
65 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET 0x41
66 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET      0x42
67 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET 0x43
68 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET      0x44
69 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET 0x45
70 #define MLXPLAT_CPLD_LPC_REG_GWP_OFFSET         0x4a
71 #define MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET   0x4b
72 #define MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET    0x4c
73 #define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
74 #define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET  0x51
75 #define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET   0x52
76 #define MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET 0x53
77 #define MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET 0x54
78 #define MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET  0x55
79 #define MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET      0x56
80 #define MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET 0x57
81 #define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET         0x58
82 #define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET   0x59
83 #define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET    0x5a
84 #define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET         0x64
85 #define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET   0x65
86 #define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET    0x66
87 #define MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET       0x70
88 #define MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET 0x71
89 #define MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET  0x72
90 #define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET         0x88
91 #define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET   0x89
92 #define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET    0x8a
93 #define MLXPLAT_CPLD_LPC_REG_EROT_OFFSET        0x91
94 #define MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET  0x92
95 #define MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET   0x93
96 #define MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET       0x94
97 #define MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET 0x95
98 #define MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET  0x96
99 #define MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET       0x9a
100 #define MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET 0x9b
101 #define MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET  0x9c
102 #define MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET       0x9d
103 #define MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET 0x9e
104 #define MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET  0x9f
105 #define MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET       0xa0
106 #define MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET 0xa1
107 #define MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET  0xa2
108 #define MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET       0xa3
109 #define MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET 0xa4
110 #define MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET  0xa5
111 #define MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET       0xa6
112 #define MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET 0xa7
113 #define MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET  0xa8
114 #define MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET       0xa9
115 #define MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET 0xaa
116 #define MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET  0xab
117 #define MLXPLAT_CPLD_LPC_REG_LC_PWR_ON          0xb2
118 #define MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET      0xc2
119 #define MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT    0xc3
120 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET    0xc7
121 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET 0xc8
122 #define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET     0xc9
123 #define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET     0xcb
124 #define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET     0xcd
125 #define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET   0xce
126 #define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET     0xcf
127 #define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET     0xd1
128 #define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET   0xd2
129 #define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET     0xd3
130 #define MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET  0xde
131 #define MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET  0xdf
132 #define MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET  0xe0
133 #define MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET  0xe1
134 #define MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET 0xe2
135 #define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET        0xe3
136 #define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET      0xe4
137 #define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET      0xe5
138 #define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET      0xe6
139 #define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET      0xe7
140 #define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET      0xe8
141 #define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET      0xe9
142 #define MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET        0xea
143 #define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET      0xeb
144 #define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET      0xec
145 #define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET      0xed
146 #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET     0xee
147 #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET     0xef
148 #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET     0xf0
149 #define MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET     0xf1
150 #define MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET     0xf2
151 #define MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET        0xf3
152 #define MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET        0xf4
153 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET    0xf5
154 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET    0xf6
155 #define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7
156 #define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET 0xf8
157 #define MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET 0xf9
158 #define MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET    0xfa
159 #define MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET     0xfb
160 #define MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET     0xfc
161 #define MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET     0xfd
162 #define MLXPLAT_CPLD_LPC_IO_RANGE               0x100
163 #define MLXPLAT_CPLD_LPC_I2C_CH1_OFF            0xdb
164 #define MLXPLAT_CPLD_LPC_I2C_CH2_OFF            0xda
165 #define MLXPLAT_CPLD_LPC_I2C_CH3_OFF            0xdc
166 #define MLXPLAT_CPLD_LPC_I2C_CH4_OFF            0xdd
167
168 #define MLXPLAT_CPLD_LPC_PIO_OFFSET             0x10000UL
169 #define MLXPLAT_CPLD_LPC_REG1   ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
170                                   MLXPLAT_CPLD_LPC_I2C_CH1_OFF) | \
171                                   MLXPLAT_CPLD_LPC_PIO_OFFSET)
172 #define MLXPLAT_CPLD_LPC_REG2   ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
173                                   MLXPLAT_CPLD_LPC_I2C_CH2_OFF) | \
174                                   MLXPLAT_CPLD_LPC_PIO_OFFSET)
175 #define MLXPLAT_CPLD_LPC_REG3   ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
176                                   MLXPLAT_CPLD_LPC_I2C_CH3_OFF) | \
177                                   MLXPLAT_CPLD_LPC_PIO_OFFSET)
178 #define MLXPLAT_CPLD_LPC_REG4   ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
179                                   MLXPLAT_CPLD_LPC_I2C_CH4_OFF) | \
180                                   MLXPLAT_CPLD_LPC_PIO_OFFSET)
181
182 /* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
183 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF 0x04
184 #define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF  0x08
185 #define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF  0x08
186 #define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF  0x40
187 #define MLXPLAT_CPLD_AGGR_MASK_DEF      (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
188                                          MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
189                                          MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
190 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG  0x01
191 #define MLXPLAT_CPLD_AGGR_MASK_NG_DEF   0x04
192 #define MLXPLAT_CPLD_AGGR_MASK_COMEX    BIT(0)
193 #define MLXPLAT_CPLD_AGGR_MASK_LC       BIT(3)
194 #define MLXPLAT_CPLD_AGGR_MASK_MODULAR  (MLXPLAT_CPLD_AGGR_MASK_NG_DEF | \
195                                          MLXPLAT_CPLD_AGGR_MASK_COMEX | \
196                                          MLXPLAT_CPLD_AGGR_MASK_LC)
197 #define MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT BIT(0)
198 #define MLXPLAT_CPLD_AGGR_MASK_LC_RDY   BIT(1)
199 #define MLXPLAT_CPLD_AGGR_MASK_LC_PG    BIT(2)
200 #define MLXPLAT_CPLD_AGGR_MASK_LC_SCRD  BIT(3)
201 #define MLXPLAT_CPLD_AGGR_MASK_LC_SYNC  BIT(4)
202 #define MLXPLAT_CPLD_AGGR_MASK_LC_ACT   BIT(5)
203 #define MLXPLAT_CPLD_AGGR_MASK_LC_SDWN  BIT(6)
204 #define MLXPLAT_CPLD_AGGR_MASK_LC_LOW   (MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT | \
205                                          MLXPLAT_CPLD_AGGR_MASK_LC_RDY | \
206                                          MLXPLAT_CPLD_AGGR_MASK_LC_PG | \
207                                          MLXPLAT_CPLD_AGGR_MASK_LC_SCRD | \
208                                          MLXPLAT_CPLD_AGGR_MASK_LC_SYNC | \
209                                          MLXPLAT_CPLD_AGGR_MASK_LC_ACT | \
210                                          MLXPLAT_CPLD_AGGR_MASK_LC_SDWN)
211 #define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW  0xc1
212 #define MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2        BIT(2)
213 #define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C  BIT(6)
214 #define MLXPLAT_CPLD_PSU_MASK           GENMASK(1, 0)
215 #define MLXPLAT_CPLD_PWR_MASK           GENMASK(1, 0)
216 #define MLXPLAT_CPLD_PSU_EXT_MASK       GENMASK(3, 0)
217 #define MLXPLAT_CPLD_PWR_EXT_MASK       GENMASK(3, 0)
218 #define MLXPLAT_CPLD_FAN_MASK           GENMASK(3, 0)
219 #define MLXPLAT_CPLD_ASIC_MASK          GENMASK(1, 0)
220 #define MLXPLAT_CPLD_FAN_NG_MASK        GENMASK(6, 0)
221 #define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
222 #define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
223 #define MLXPLAT_CPLD_VOLTREG_UPD_MASK   GENMASK(5, 4)
224 #define MLXPLAT_CPLD_GWP_MASK           GENMASK(0, 0)
225 #define MLXPLAT_CPLD_EROT_MASK          GENMASK(1, 0)
226 #define MLXPLAT_CPLD_I2C_CAP_BIT        0x04
227 #define MLXPLAT_CPLD_I2C_CAP_MASK       GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
228
229 /* Masks for aggregation for comex carriers */
230 #define MLXPLAT_CPLD_AGGR_MASK_CARRIER  BIT(1)
231 #define MLXPLAT_CPLD_AGGR_MASK_CARR_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
232                                          MLXPLAT_CPLD_AGGR_MASK_CARRIER)
233 #define MLXPLAT_CPLD_LOW_AGGRCX_MASK    0xc1
234
235 /* Masks for aggregation for modular systems */
236 #define MLXPLAT_CPLD_LPC_LC_MASK        GENMASK(7, 0)
237
238 /* Default I2C parent bus number */
239 #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR        1
240
241 /* Maximum number of possible physical buses equipped on system */
242 #define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM       16
243 #define MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM   24
244
245 /* Number of channels in group */
246 #define MLXPLAT_CPLD_GRP_CHNL_NUM               8
247
248 /* Start channel numbers */
249 #define MLXPLAT_CPLD_CH1                        2
250 #define MLXPLAT_CPLD_CH2                        10
251 #define MLXPLAT_CPLD_CH3                        18
252 #define MLXPLAT_CPLD_CH2_ETH_MODULAR            3
253 #define MLXPLAT_CPLD_CH3_ETH_MODULAR            43
254 #define MLXPLAT_CPLD_CH4_ETH_MODULAR            51
255 #define MLXPLAT_CPLD_CH2_RACK_SWITCH            18
256
257 /* Number of LPC attached MUX platform devices */
258 #define MLXPLAT_CPLD_LPC_MUX_DEVS               4
259
260 /* Hotplug devices adapter numbers */
261 #define MLXPLAT_CPLD_NR_NONE                    -1
262 #define MLXPLAT_CPLD_PSU_DEFAULT_NR             10
263 #define MLXPLAT_CPLD_PSU_MSNXXXX_NR             4
264 #define MLXPLAT_CPLD_FAN1_DEFAULT_NR            11
265 #define MLXPLAT_CPLD_FAN2_DEFAULT_NR            12
266 #define MLXPLAT_CPLD_FAN3_DEFAULT_NR            13
267 #define MLXPLAT_CPLD_FAN4_DEFAULT_NR            14
268 #define MLXPLAT_CPLD_NR_ASIC                    3
269 #define MLXPLAT_CPLD_NR_LC_BASE                 34
270
271 #define MLXPLAT_CPLD_NR_LC_SET(nr)      (MLXPLAT_CPLD_NR_LC_BASE + (nr))
272 #define MLXPLAT_CPLD_LC_ADDR            0x32
273
274 /* Masks and default values for watchdogs */
275 #define MLXPLAT_CPLD_WD1_CLEAR_MASK     GENMASK(7, 1)
276 #define MLXPLAT_CPLD_WD2_CLEAR_MASK     (GENMASK(7, 0) & ~BIT(1))
277
278 #define MLXPLAT_CPLD_WD_TYPE1_TO_MASK   GENMASK(7, 4)
279 #define MLXPLAT_CPLD_WD_TYPE2_TO_MASK   0
280 #define MLXPLAT_CPLD_WD_RESET_ACT_MASK  GENMASK(7, 1)
281 #define MLXPLAT_CPLD_WD_FAN_ACT_MASK    (GENMASK(7, 0) & ~BIT(4))
282 #define MLXPLAT_CPLD_WD_COUNT_ACT_MASK  (GENMASK(7, 0) & ~BIT(7))
283 #define MLXPLAT_CPLD_WD_CPBLTY_MASK     (GENMASK(7, 0) & ~BIT(6))
284 #define MLXPLAT_CPLD_WD_DFLT_TIMEOUT    30
285 #define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT   600
286 #define MLXPLAT_CPLD_WD_MAX_DEVS        2
287
288 #define MLXPLAT_CPLD_LPC_SYSIRQ         17
289
290 /* Minimum power required for turning on Ethernet modular system (WATT) */
291 #define MLXPLAT_CPLD_ETH_MODULAR_PWR_MIN        50
292
293 /* Default value for PWM control register for rack switch system */
294 #define MLXPLAT_REGMAP_NVSWITCH_PWM_DEFAULT 0xf4
295
296 /* mlxplat_priv - platform private data
297  * @pdev_i2c - i2c controller platform device
298  * @pdev_mux - array of mux platform devices
299  * @pdev_hotplug - hotplug platform devices
300  * @pdev_led - led platform devices
301  * @pdev_io_regs - register access platform devices
302  * @pdev_fan - FAN platform devices
303  * @pdev_wd - array of watchdog platform devices
304  * @regmap: device register map
305  */
306 struct mlxplat_priv {
307         struct platform_device *pdev_i2c;
308         struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
309         struct platform_device *pdev_hotplug;
310         struct platform_device *pdev_led;
311         struct platform_device *pdev_io_regs;
312         struct platform_device *pdev_fan;
313         struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
314         void *regmap;
315 };
316
317 /* Regions for LPC I2C controller and LPC base register space */
318 static const struct resource mlxplat_lpc_resources[] = {
319         [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
320                                MLXPLAT_CPLD_LPC_IO_RANGE,
321                                "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
322         [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
323                                MLXPLAT_CPLD_LPC_IO_RANGE,
324                                "mlxplat_cpld_lpc_regs",
325                                IORESOURCE_IO),
326 };
327
328 /* Platform i2c next generation systems data */
329 static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
330         {
331                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
332                 .mask = MLXPLAT_CPLD_I2C_CAP_MASK,
333                 .bit = MLXPLAT_CPLD_I2C_CAP_BIT,
334         },
335 };
336
337 static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
338         {
339                 .data = mlxplat_mlxcpld_i2c_ng_items_data,
340         },
341 };
342
343 /* Platform next generation systems i2c data */
344 static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
345         .items = mlxplat_mlxcpld_i2c_ng_items,
346         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
347         .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
348         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
349         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
350 };
351
352 /* Platform default channels */
353 static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
354         {
355                 MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
356                 MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
357                 5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
358         },
359         {
360                 MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
361                 MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
362                 5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
363         },
364 };
365
366 /* Platform channels for MSN21xx system family */
367 static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
368
369 /* Platform mux data */
370 static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
371         {
372                 .parent = 1,
373                 .base_nr = MLXPLAT_CPLD_CH1,
374                 .write_only = 1,
375                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
376                 .reg_size = 1,
377                 .idle_in_use = 1,
378         },
379         {
380                 .parent = 1,
381                 .base_nr = MLXPLAT_CPLD_CH2,
382                 .write_only = 1,
383                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
384                 .reg_size = 1,
385                 .idle_in_use = 1,
386         },
387
388 };
389
390 /* Platform mux configuration variables */
391 static int mlxplat_max_adap_num;
392 static int mlxplat_mux_num;
393 static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
394
395 /* Platform extended mux data */
396 static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
397         {
398                 .parent = 1,
399                 .base_nr = MLXPLAT_CPLD_CH1,
400                 .write_only = 1,
401                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
402                 .reg_size = 1,
403                 .idle_in_use = 1,
404         },
405         {
406                 .parent = 1,
407                 .base_nr = MLXPLAT_CPLD_CH2,
408                 .write_only = 1,
409                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
410                 .reg_size = 1,
411                 .idle_in_use = 1,
412         },
413         {
414                 .parent = 1,
415                 .base_nr = MLXPLAT_CPLD_CH3,
416                 .write_only = 1,
417                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
418                 .reg_size = 1,
419                 .idle_in_use = 1,
420         },
421
422 };
423
424 /* Platform channels for modular system family */
425 static const int mlxplat_modular_upper_channel[] = { 1 };
426 static const int mlxplat_modular_channels[] = {
427         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
428         21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
429         38, 39, 40
430 };
431
432 /* Platform modular mux data */
433 static struct i2c_mux_reg_platform_data mlxplat_modular_mux_data[] = {
434         {
435                 .parent = 1,
436                 .base_nr = MLXPLAT_CPLD_CH1,
437                 .write_only = 1,
438                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG4,
439                 .reg_size = 1,
440                 .idle_in_use = 1,
441                 .values = mlxplat_modular_upper_channel,
442                 .n_values = ARRAY_SIZE(mlxplat_modular_upper_channel),
443         },
444         {
445                 .parent = 1,
446                 .base_nr = MLXPLAT_CPLD_CH2_ETH_MODULAR,
447                 .write_only = 1,
448                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
449                 .reg_size = 1,
450                 .idle_in_use = 1,
451                 .values = mlxplat_modular_channels,
452                 .n_values = ARRAY_SIZE(mlxplat_modular_channels),
453         },
454         {
455                 .parent = MLXPLAT_CPLD_CH1,
456                 .base_nr = MLXPLAT_CPLD_CH3_ETH_MODULAR,
457                 .write_only = 1,
458                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
459                 .reg_size = 1,
460                 .idle_in_use = 1,
461                 .values = mlxplat_msn21xx_channels,
462                 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
463         },
464         {
465                 .parent = 1,
466                 .base_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR,
467                 .write_only = 1,
468                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
469                 .reg_size = 1,
470                 .idle_in_use = 1,
471                 .values = mlxplat_msn21xx_channels,
472                 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
473         },
474 };
475
476 /* Platform channels for rack swicth system family */
477 static const int mlxplat_rack_switch_channels[] = {
478         1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
479 };
480
481 /* Platform rack switch mux data */
482 static struct i2c_mux_reg_platform_data mlxplat_rack_switch_mux_data[] = {
483         {
484                 .parent = 1,
485                 .base_nr = MLXPLAT_CPLD_CH1,
486                 .write_only = 1,
487                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
488                 .reg_size = 1,
489                 .idle_in_use = 1,
490                 .values = mlxplat_rack_switch_channels,
491                 .n_values = ARRAY_SIZE(mlxplat_rack_switch_channels),
492         },
493         {
494                 .parent = 1,
495                 .base_nr = MLXPLAT_CPLD_CH2_RACK_SWITCH,
496                 .write_only = 1,
497                 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
498                 .reg_size = 1,
499                 .idle_in_use = 1,
500                 .values = mlxplat_msn21xx_channels,
501                 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
502         },
503
504 };
505
506 /* Platform hotplug devices */
507 static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
508         {
509                 I2C_BOARD_INFO("dps460", 0x59),
510         },
511         {
512                 I2C_BOARD_INFO("dps460", 0x58),
513         },
514 };
515
516 static struct i2c_board_info mlxplat_mlxcpld_ext_pwr[] = {
517         {
518                 I2C_BOARD_INFO("dps460", 0x5b),
519         },
520         {
521                 I2C_BOARD_INFO("dps460", 0x5a),
522         },
523 };
524
525 static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
526         {
527                 I2C_BOARD_INFO("24c32", 0x50),
528         },
529         {
530                 I2C_BOARD_INFO("24c32", 0x50),
531         },
532         {
533                 I2C_BOARD_INFO("24c32", 0x50),
534         },
535         {
536                 I2C_BOARD_INFO("24c32", 0x50),
537         },
538 };
539
540 /* Platform hotplug comex carrier system family data */
541 static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
542         {
543                 .label = "psu1",
544                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
545                 .mask = BIT(0),
546                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
547         },
548         {
549                 .label = "psu2",
550                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
551                 .mask = BIT(1),
552                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
553         },
554 };
555
556 /* Platform hotplug default data */
557 static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
558         {
559                 .label = "psu1",
560                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
561                 .mask = BIT(0),
562                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
563         },
564         {
565                 .label = "psu2",
566                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
567                 .mask = BIT(1),
568                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
569         },
570 };
571
572 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
573         {
574                 .label = "pwr1",
575                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
576                 .mask = BIT(0),
577                 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
578                 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
579         },
580         {
581                 .label = "pwr2",
582                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
583                 .mask = BIT(1),
584                 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
585                 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
586         },
587 };
588
589 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_wc_items_data[] = {
590         {
591                 .label = "pwr1",
592                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
593                 .mask = BIT(0),
594                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
595         },
596         {
597                 .label = "pwr2",
598                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
599                 .mask = BIT(1),
600                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
601         },
602 };
603
604 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
605         {
606                 .label = "fan1",
607                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
608                 .mask = BIT(0),
609                 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
610                 .hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
611         },
612         {
613                 .label = "fan2",
614                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
615                 .mask = BIT(1),
616                 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
617                 .hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
618         },
619         {
620                 .label = "fan3",
621                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
622                 .mask = BIT(2),
623                 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
624                 .hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
625         },
626         {
627                 .label = "fan4",
628                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
629                 .mask = BIT(3),
630                 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
631                 .hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
632         },
633 };
634
635 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
636         {
637                 .label = "asic1",
638                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
639                 .mask = MLXPLAT_CPLD_ASIC_MASK,
640                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
641         },
642 };
643
644 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic2_items_data[] = {
645         {
646                 .label = "asic2",
647                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
648                 .mask = MLXPLAT_CPLD_ASIC_MASK,
649                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
650         },
651 };
652
653 static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
654         {
655                 .data = mlxplat_mlxcpld_default_psu_items_data,
656                 .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
657                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
658                 .mask = MLXPLAT_CPLD_PSU_MASK,
659                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
660                 .inversed = 1,
661                 .health = false,
662         },
663         {
664                 .data = mlxplat_mlxcpld_default_pwr_items_data,
665                 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
666                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
667                 .mask = MLXPLAT_CPLD_PWR_MASK,
668                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
669                 .inversed = 0,
670                 .health = false,
671         },
672         {
673                 .data = mlxplat_mlxcpld_default_fan_items_data,
674                 .aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
675                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
676                 .mask = MLXPLAT_CPLD_FAN_MASK,
677                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
678                 .inversed = 1,
679                 .health = false,
680         },
681         {
682                 .data = mlxplat_mlxcpld_default_asic_items_data,
683                 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
684                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
685                 .mask = MLXPLAT_CPLD_ASIC_MASK,
686                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
687                 .inversed = 0,
688                 .health = true,
689         },
690 };
691
692 static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
693         {
694                 .data = mlxplat_mlxcpld_comex_psu_items_data,
695                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
696                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
697                 .mask = MLXPLAT_CPLD_PSU_MASK,
698                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
699                 .inversed = 1,
700                 .health = false,
701         },
702         {
703                 .data = mlxplat_mlxcpld_default_pwr_items_data,
704                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
705                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
706                 .mask = MLXPLAT_CPLD_PWR_MASK,
707                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
708                 .inversed = 0,
709                 .health = false,
710         },
711         {
712                 .data = mlxplat_mlxcpld_default_fan_items_data,
713                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
714                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
715                 .mask = MLXPLAT_CPLD_FAN_MASK,
716                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
717                 .inversed = 1,
718                 .health = false,
719         },
720         {
721                 .data = mlxplat_mlxcpld_default_asic_items_data,
722                 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
723                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
724                 .mask = MLXPLAT_CPLD_ASIC_MASK,
725                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
726                 .inversed = 0,
727                 .health = true,
728         },
729 };
730
731 static
732 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
733         .items = mlxplat_mlxcpld_default_items,
734         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
735         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
736         .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
737         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
738         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
739 };
740
741 static struct mlxreg_core_item mlxplat_mlxcpld_default_wc_items[] = {
742         {
743                 .data = mlxplat_mlxcpld_comex_psu_items_data,
744                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
745                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
746                 .mask = MLXPLAT_CPLD_PSU_MASK,
747                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
748                 .inversed = 1,
749                 .health = false,
750         },
751         {
752                 .data = mlxplat_mlxcpld_default_pwr_wc_items_data,
753                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
754                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
755                 .mask = MLXPLAT_CPLD_PWR_MASK,
756                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
757                 .inversed = 0,
758                 .health = false,
759         },
760         {
761                 .data = mlxplat_mlxcpld_default_asic_items_data,
762                 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
763                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
764                 .mask = MLXPLAT_CPLD_ASIC_MASK,
765                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
766                 .inversed = 0,
767                 .health = true,
768         },
769 };
770
771 static
772 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_wc_data = {
773         .items = mlxplat_mlxcpld_default_wc_items,
774         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_wc_items),
775         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
776         .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
777         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
778         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
779 };
780
781 static
782 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
783         .items = mlxplat_mlxcpld_comex_items,
784         .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
785         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
786         .mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
787         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
788         .mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
789 };
790
791 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
792         {
793                 .label = "pwr1",
794                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
795                 .mask = BIT(0),
796                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
797         },
798         {
799                 .label = "pwr2",
800                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
801                 .mask = BIT(1),
802                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
803         },
804 };
805
806 /* Platform hotplug MSN21xx system family data */
807 static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
808         {
809                 .data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
810                 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
811                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
812                 .mask = MLXPLAT_CPLD_PWR_MASK,
813                 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
814                 .inversed = 0,
815                 .health = false,
816         },
817         {
818                 .data = mlxplat_mlxcpld_default_asic_items_data,
819                 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
820                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
821                 .mask = MLXPLAT_CPLD_ASIC_MASK,
822                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
823                 .inversed = 0,
824                 .health = true,
825         },
826 };
827
828 static
829 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
830         .items = mlxplat_mlxcpld_msn21xx_items,
831         .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
832         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
833         .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
834         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
835         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
836 };
837
838 /* Platform hotplug msn274x system family data */
839 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
840         {
841                 .label = "psu1",
842                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
843                 .mask = BIT(0),
844                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
845         },
846         {
847                 .label = "psu2",
848                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
849                 .mask = BIT(1),
850                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
851         },
852 };
853
854 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
855         {
856                 .label = "pwr1",
857                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
858                 .mask = BIT(0),
859                 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
860                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
861         },
862         {
863                 .label = "pwr2",
864                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
865                 .mask = BIT(1),
866                 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
867                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
868         },
869 };
870
871 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
872         {
873                 .label = "fan1",
874                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
875                 .mask = BIT(0),
876                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
877         },
878         {
879                 .label = "fan2",
880                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
881                 .mask = BIT(1),
882                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
883         },
884         {
885                 .label = "fan3",
886                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
887                 .mask = BIT(2),
888                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
889         },
890         {
891                 .label = "fan4",
892                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
893                 .mask = BIT(3),
894                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
895         },
896 };
897
898 static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
899         {
900                 .data = mlxplat_mlxcpld_msn274x_psu_items_data,
901                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
902                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
903                 .mask = MLXPLAT_CPLD_PSU_MASK,
904                 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
905                 .inversed = 1,
906                 .health = false,
907         },
908         {
909                 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
910                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
911                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
912                 .mask = MLXPLAT_CPLD_PWR_MASK,
913                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
914                 .inversed = 0,
915                 .health = false,
916         },
917         {
918                 .data = mlxplat_mlxcpld_msn274x_fan_items_data,
919                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
920                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
921                 .mask = MLXPLAT_CPLD_FAN_MASK,
922                 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
923                 .inversed = 1,
924                 .health = false,
925         },
926         {
927                 .data = mlxplat_mlxcpld_default_asic_items_data,
928                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
929                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
930                 .mask = MLXPLAT_CPLD_ASIC_MASK,
931                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
932                 .inversed = 0,
933                 .health = true,
934         },
935 };
936
937 static
938 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
939         .items = mlxplat_mlxcpld_msn274x_items,
940         .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
941         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
942         .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
943         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
944         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
945 };
946
947 /* Platform hotplug MSN201x system family data */
948 static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
949         {
950                 .label = "pwr1",
951                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
952                 .mask = BIT(0),
953                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
954         },
955         {
956                 .label = "pwr2",
957                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
958                 .mask = BIT(1),
959                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
960         },
961 };
962
963 static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
964         {
965                 .data = mlxplat_mlxcpld_msn201x_pwr_items_data,
966                 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
967                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
968                 .mask = MLXPLAT_CPLD_PWR_MASK,
969                 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
970                 .inversed = 0,
971                 .health = false,
972         },
973         {
974                 .data = mlxplat_mlxcpld_default_asic_items_data,
975                 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
976                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
977                 .mask = MLXPLAT_CPLD_ASIC_MASK,
978                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
979                 .inversed = 0,
980                 .health = true,
981         },
982 };
983
984 static
985 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
986         .items = mlxplat_mlxcpld_msn201x_items,
987         .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
988         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
989         .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
990         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
991         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
992 };
993
994 /* Platform hotplug next generation system family data */
995 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
996         {
997                 .label = "psu1",
998                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
999                 .mask = BIT(0),
1000                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1001         },
1002         {
1003                 .label = "psu2",
1004                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1005                 .mask = BIT(1),
1006                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1007         },
1008 };
1009
1010 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
1011         {
1012                 .label = "fan1",
1013                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1014                 .mask = BIT(0),
1015                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1016                 .bit = BIT(0),
1017                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1018         },
1019         {
1020                 .label = "fan2",
1021                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1022                 .mask = BIT(1),
1023                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1024                 .bit = BIT(1),
1025                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1026         },
1027         {
1028                 .label = "fan3",
1029                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1030                 .mask = BIT(2),
1031                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1032                 .bit = BIT(2),
1033                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1034         },
1035         {
1036                 .label = "fan4",
1037                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1038                 .mask = BIT(3),
1039                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1040                 .bit = BIT(3),
1041                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1042         },
1043         {
1044                 .label = "fan5",
1045                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1046                 .mask = BIT(4),
1047                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1048                 .bit = BIT(4),
1049                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1050         },
1051         {
1052                 .label = "fan6",
1053                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1054                 .mask = BIT(5),
1055                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1056                 .bit = BIT(5),
1057                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1058         },
1059         {
1060                 .label = "fan7",
1061                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1062                 .mask = BIT(6),
1063                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1064                 .bit = BIT(6),
1065                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1066         },
1067 };
1068
1069 static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
1070         {
1071                 .data = mlxplat_mlxcpld_default_ng_psu_items_data,
1072                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1073                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1074                 .mask = MLXPLAT_CPLD_PSU_MASK,
1075                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
1076                 .inversed = 1,
1077                 .health = false,
1078         },
1079         {
1080                 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
1081                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1082                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1083                 .mask = MLXPLAT_CPLD_PWR_MASK,
1084                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
1085                 .inversed = 0,
1086                 .health = false,
1087         },
1088         {
1089                 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1090                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1091                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1092                 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1093                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1094                 .inversed = 1,
1095                 .health = false,
1096         },
1097         {
1098                 .data = mlxplat_mlxcpld_default_asic_items_data,
1099                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1100                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1101                 .mask = MLXPLAT_CPLD_ASIC_MASK,
1102                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1103                 .inversed = 0,
1104                 .health = true,
1105         },
1106 };
1107
1108 static
1109 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
1110         .items = mlxplat_mlxcpld_default_ng_items,
1111         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
1112         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1113         .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1114         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1115         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
1116 };
1117
1118 /* Platform hotplug extended system family data */
1119 static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
1120         {
1121                 .label = "psu1",
1122                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1123                 .mask = BIT(0),
1124                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1125         },
1126         {
1127                 .label = "psu2",
1128                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1129                 .mask = BIT(1),
1130                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1131         },
1132         {
1133                 .label = "psu3",
1134                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1135                 .mask = BIT(2),
1136                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1137         },
1138         {
1139                 .label = "psu4",
1140                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1141                 .mask = BIT(3),
1142                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1143         },
1144 };
1145
1146 static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
1147         {
1148                 .label = "pwr1",
1149                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1150                 .mask = BIT(0),
1151                 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1152                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1153         },
1154         {
1155                 .label = "pwr2",
1156                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1157                 .mask = BIT(1),
1158                 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1159                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1160         },
1161         {
1162                 .label = "pwr3",
1163                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1164                 .mask = BIT(2),
1165                 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1166                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1167         },
1168         {
1169                 .label = "pwr4",
1170                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1171                 .mask = BIT(3),
1172                 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1173                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1174         },
1175 };
1176
1177 static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
1178         {
1179                 .data = mlxplat_mlxcpld_ext_psu_items_data,
1180                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1181                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1182                 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1183                 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1184                 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1185                 .inversed = 1,
1186                 .health = false,
1187         },
1188         {
1189                 .data = mlxplat_mlxcpld_ext_pwr_items_data,
1190                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1191                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1192                 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1193                 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1194                 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1195                 .inversed = 0,
1196                 .health = false,
1197         },
1198         {
1199                 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1200                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1201                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1202                 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1203                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1204                 .inversed = 1,
1205                 .health = false,
1206         },
1207         {
1208                 .data = mlxplat_mlxcpld_default_asic_items_data,
1209                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1210                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1211                 .mask = MLXPLAT_CPLD_ASIC_MASK,
1212                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1213                 .inversed = 0,
1214                 .health = true,
1215         },
1216         {
1217                 .data = mlxplat_mlxcpld_default_asic2_items_data,
1218                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1219                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
1220                 .mask = MLXPLAT_CPLD_ASIC_MASK,
1221                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic2_items_data),
1222                 .inversed = 0,
1223                 .health = true,
1224         }
1225 };
1226
1227 static
1228 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
1229         .items = mlxplat_mlxcpld_ext_items,
1230         .counter = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
1231         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1232         .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1233         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1234         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
1235 };
1236
1237 static struct mlxreg_core_data mlxplat_mlxcpld_modular_pwr_items_data[] = {
1238         {
1239                 .label = "pwr1",
1240                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1241                 .mask = BIT(0),
1242                 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1243                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1244         },
1245         {
1246                 .label = "pwr2",
1247                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1248                 .mask = BIT(1),
1249                 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1250                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1251         },
1252         {
1253                 .label = "pwr3",
1254                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1255                 .mask = BIT(2),
1256                 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1257                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1258         },
1259         {
1260                 .label = "pwr4",
1261                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1262                 .mask = BIT(3),
1263                 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1264                 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1265         },
1266 };
1267
1268 static
1269 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_lc_act = {
1270         .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
1271 };
1272
1273 static struct mlxreg_core_data mlxplat_mlxcpld_modular_asic_items_data[] = {
1274         {
1275                 .label = "asic1",
1276                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1277                 .mask = MLXPLAT_CPLD_ASIC_MASK,
1278                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1279         },
1280 };
1281
1282 static struct i2c_board_info mlxplat_mlxcpld_lc_i2c_dev[] = {
1283         {
1284                 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1285                 .platform_data = &mlxplat_mlxcpld_lc_act,
1286         },
1287         {
1288                 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1289                 .platform_data = &mlxplat_mlxcpld_lc_act,
1290         },
1291         {
1292                 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1293                 .platform_data = &mlxplat_mlxcpld_lc_act,
1294         },
1295         {
1296                 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1297                 .platform_data = &mlxplat_mlxcpld_lc_act,
1298         },
1299         {
1300                 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1301                 .platform_data = &mlxplat_mlxcpld_lc_act,
1302         },
1303         {
1304                 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1305                 .platform_data = &mlxplat_mlxcpld_lc_act,
1306         },
1307         {
1308                 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1309                 .platform_data = &mlxplat_mlxcpld_lc_act,
1310         },
1311         {
1312                 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1313                 .platform_data = &mlxplat_mlxcpld_lc_act,
1314         },
1315 };
1316
1317 static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_modular_lc_notifier[] = {
1318         {
1319                 .identity = "lc1",
1320         },
1321         {
1322                 .identity = "lc2",
1323         },
1324         {
1325                 .identity = "lc3",
1326         },
1327         {
1328                 .identity = "lc4",
1329         },
1330         {
1331                 .identity = "lc5",
1332         },
1333         {
1334                 .identity = "lc6",
1335         },
1336         {
1337                 .identity = "lc7",
1338         },
1339         {
1340                 .identity = "lc8",
1341         },
1342 };
1343
1344 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pr_items_data[] = {
1345         {
1346                 .label = "lc1_present",
1347                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1348                 .mask = BIT(0),
1349                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1350                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1351                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1352                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1353                 .slot = 1,
1354         },
1355         {
1356                 .label = "lc2_present",
1357                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1358                 .mask = BIT(1),
1359                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1360                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1361                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1362                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1363                 .slot = 2,
1364         },
1365         {
1366                 .label = "lc3_present",
1367                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1368                 .mask = BIT(2),
1369                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1370                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1371                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1372                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1373                 .slot = 3,
1374         },
1375         {
1376                 .label = "lc4_present",
1377                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1378                 .mask = BIT(3),
1379                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1380                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1381                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1382                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1383                 .slot = 4,
1384         },
1385         {
1386                 .label = "lc5_present",
1387                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1388                 .mask = BIT(4),
1389                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1390                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1391                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1392                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1393                 .slot = 5,
1394         },
1395         {
1396                 .label = "lc6_present",
1397                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1398                 .mask = BIT(5),
1399                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1400                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1401                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1402                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1403                 .slot = 6,
1404         },
1405         {
1406                 .label = "lc7_present",
1407                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1408                 .mask = BIT(6),
1409                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1410                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1411                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1412                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1413                 .slot = 7,
1414         },
1415         {
1416                 .label = "lc8_present",
1417                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1418                 .mask = BIT(7),
1419                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1420                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1421                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1422                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1423                 .slot = 8,
1424         },
1425 };
1426
1427 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ver_items_data[] = {
1428         {
1429                 .label = "lc1_verified",
1430                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1431                 .mask = BIT(0),
1432                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1433                 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1434                 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1435                 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1436                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1437                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1438                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1439                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1440                 .slot = 1,
1441         },
1442         {
1443                 .label = "lc2_verified",
1444                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1445                 .mask = BIT(1),
1446                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1447                 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1448                 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1449                 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1450                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1451                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1452                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1453                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1454                 .slot = 2,
1455         },
1456         {
1457                 .label = "lc3_verified",
1458                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1459                 .mask = BIT(2),
1460                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1461                 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1462                 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1463                 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1464                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1465                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1466                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1467                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1468                 .slot = 3,
1469         },
1470         {
1471                 .label = "lc4_verified",
1472                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1473                 .mask = BIT(3),
1474                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1475                 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1476                 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1477                 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1478                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1479                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1480                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1481                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1482                 .slot = 4,
1483         },
1484         {
1485                 .label = "lc5_verified",
1486                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1487                 .mask = BIT(4),
1488                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1489                 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1490                 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1491                 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1492                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1493                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1494                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1495                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1496                 .slot = 5,
1497         },
1498         {
1499                 .label = "lc6_verified",
1500                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1501                 .mask = BIT(5),
1502                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1503                 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1504                 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1505                 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1506                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1507                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1508                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1509                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1510                 .slot = 6,
1511         },
1512         {
1513                 .label = "lc7_verified",
1514                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1515                 .mask = BIT(6),
1516                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1517                 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1518                 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1519                 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1520                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1521                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1522                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1523                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1524                 .slot = 7,
1525         },
1526         {
1527                 .label = "lc8_verified",
1528                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1529                 .mask = BIT(7),
1530                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1531                 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1532                 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1533                 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1534                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1535                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1536                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1537                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1538                 .slot = 8,
1539         },
1540 };
1541
1542 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pg_data[] = {
1543         {
1544                 .label = "lc1_powered",
1545                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1546                 .mask = BIT(0),
1547                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1548                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1549                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1550                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1551                 .slot = 1,
1552         },
1553         {
1554                 .label = "lc2_powered",
1555                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1556                 .mask = BIT(1),
1557                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1558                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1559                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1560                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1561                 .slot = 2,
1562         },
1563         {
1564                 .label = "lc3_powered",
1565                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1566                 .mask = BIT(2),
1567                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1568                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1569                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1570                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1571                 .slot = 3,
1572         },
1573         {
1574                 .label = "lc4_powered",
1575                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1576                 .mask = BIT(3),
1577                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1578                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1579                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1580                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1581                 .slot = 4,
1582         },
1583         {
1584                 .label = "lc5_powered",
1585                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1586                 .mask = BIT(4),
1587                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1588                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1589                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1590                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1591                 .slot = 5,
1592         },
1593         {
1594                 .label = "lc6_powered",
1595                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1596                 .mask = BIT(5),
1597                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1598                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1599                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1600                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1601                 .slot = 6,
1602         },
1603         {
1604                 .label = "lc7_powered",
1605                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1606                 .mask = BIT(6),
1607                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1608                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1609                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1610                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1611                 .slot = 7,
1612         },
1613         {
1614                 .label = "lc8_powered",
1615                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1616                 .mask = BIT(7),
1617                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1618                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1619                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1620                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1621                 .slot = 8,
1622         },
1623 };
1624
1625 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ready_data[] = {
1626         {
1627                 .label = "lc1_ready",
1628                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1629                 .mask = BIT(0),
1630                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1631                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1632                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1633                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1634                 .slot = 1,
1635         },
1636         {
1637                 .label = "lc2_ready",
1638                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1639                 .mask = BIT(1),
1640                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1641                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1642                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1643                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1644                 .slot = 2,
1645         },
1646         {
1647                 .label = "lc3_ready",
1648                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1649                 .mask = BIT(2),
1650                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1651                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1652                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1653                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1654                 .slot = 3,
1655         },
1656         {
1657                 .label = "lc4_ready",
1658                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1659                 .mask = BIT(3),
1660                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1661                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1662                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1663                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1664                 .slot = 4,
1665         },
1666         {
1667                 .label = "lc5_ready",
1668                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1669                 .mask = BIT(4),
1670                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1671                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1672                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1673                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1674                 .slot = 5,
1675         },
1676         {
1677                 .label = "lc6_ready",
1678                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1679                 .mask = BIT(5),
1680                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1681                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1682                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1683                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1684                 .slot = 6,
1685         },
1686         {
1687                 .label = "lc7_ready",
1688                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1689                 .mask = BIT(6),
1690                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1691                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1692                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1693                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1694                 .slot = 7,
1695         },
1696         {
1697                 .label = "lc8_ready",
1698                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1699                 .mask = BIT(7),
1700                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1701                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1702                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1703                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1704                 .slot = 8,
1705         },
1706 };
1707
1708 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_synced_data[] = {
1709         {
1710                 .label = "lc1_synced",
1711                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1712                 .mask = BIT(0),
1713                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1714                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1715                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1716                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1717                 .slot = 1,
1718         },
1719         {
1720                 .label = "lc2_synced",
1721                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1722                 .mask = BIT(1),
1723                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1724                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1725                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1726                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1727                 .slot = 2,
1728         },
1729         {
1730                 .label = "lc3_synced",
1731                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1732                 .mask = BIT(2),
1733                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1734                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1735                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1736                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1737                 .slot = 3,
1738         },
1739         {
1740                 .label = "lc4_synced",
1741                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1742                 .mask = BIT(3),
1743                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1744                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1745                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1746                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1747                 .slot = 4,
1748         },
1749         {
1750                 .label = "lc5_synced",
1751                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1752                 .mask = BIT(4),
1753                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1754                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1755                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1756                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1757                 .slot = 5,
1758         },
1759         {
1760                 .label = "lc6_synced",
1761                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1762                 .mask = BIT(5),
1763                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1764                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1765                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1766                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1767                 .slot = 6,
1768         },
1769         {
1770                 .label = "lc7_synced",
1771                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1772                 .mask = BIT(6),
1773                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1774                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1775                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1776                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1777                 .slot = 7,
1778         },
1779         {
1780                 .label = "lc8_synced",
1781                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1782                 .mask = BIT(7),
1783                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1784                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1785                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1786                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1787                 .slot = 8,
1788         },
1789 };
1790
1791 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_act_data[] = {
1792         {
1793                 .label = "lc1_active",
1794                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1795                 .mask = BIT(0),
1796                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1797                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1798                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1799                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1800                 .slot = 1,
1801         },
1802         {
1803                 .label = "lc2_active",
1804                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1805                 .mask = BIT(1),
1806                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1807                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1808                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1809                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1810                 .slot = 2,
1811         },
1812         {
1813                 .label = "lc3_active",
1814                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1815                 .mask = BIT(2),
1816                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1817                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1818                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1819                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1820                 .slot = 3,
1821         },
1822         {
1823                 .label = "lc4_active",
1824                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1825                 .mask = BIT(3),
1826                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1827                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1828                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1829                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1830                 .slot = 4,
1831         },
1832         {
1833                 .label = "lc5_active",
1834                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1835                 .mask = BIT(4),
1836                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1837                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1838                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1839                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1840                 .slot = 5,
1841         },
1842         {
1843                 .label = "lc6_active",
1844                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1845                 .mask = BIT(5),
1846                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1847                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1848                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1849                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1850                 .slot = 6,
1851         },
1852         {
1853                 .label = "lc7_active",
1854                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1855                 .mask = BIT(6),
1856                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1857                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1858                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1859                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1860                 .slot = 7,
1861         },
1862         {
1863                 .label = "lc8_active",
1864                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1865                 .mask = BIT(7),
1866                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1867                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1868                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1869                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1870                 .slot = 8,
1871         },
1872 };
1873
1874 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_sd_data[] = {
1875         {
1876                 .label = "lc1_shutdown",
1877                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1878                 .mask = BIT(0),
1879                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1880                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1881                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1882                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1883                 .slot = 1,
1884         },
1885         {
1886                 .label = "lc2_shutdown",
1887                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1888                 .mask = BIT(1),
1889                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1890                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1891                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1892                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1893                 .slot = 2,
1894         },
1895         {
1896                 .label = "lc3_shutdown",
1897                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1898                 .mask = BIT(2),
1899                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1900                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1901                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1902                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1903                 .slot = 3,
1904         },
1905         {
1906                 .label = "lc4_shutdown",
1907                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1908                 .mask = BIT(3),
1909                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1910                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1911                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1912                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1913                 .slot = 4,
1914         },
1915         {
1916                 .label = "lc5_shutdown",
1917                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1918                 .mask = BIT(4),
1919                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1920                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1921                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1922                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1923                 .slot = 5,
1924         },
1925         {
1926                 .label = "lc6_shutdown",
1927                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1928                 .mask = BIT(5),
1929                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1930                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1931                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1932                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1933                 .slot = 6,
1934         },
1935         {
1936                 .label = "lc7_shutdown",
1937                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1938                 .mask = BIT(6),
1939                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1940                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1941                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1942                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1943                 .slot = 7,
1944         },
1945         {
1946                 .label = "lc8_shutdown",
1947                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1948                 .mask = BIT(7),
1949                 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1950                 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1951                 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1952                 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1953                 .slot = 8,
1954         },
1955 };
1956
1957 static struct mlxreg_core_item mlxplat_mlxcpld_modular_items[] = {
1958         {
1959                 .data = mlxplat_mlxcpld_ext_psu_items_data,
1960                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1961                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1962                 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1963                 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1964                 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1965                 .inversed = 1,
1966                 .health = false,
1967         },
1968         {
1969                 .data = mlxplat_mlxcpld_modular_pwr_items_data,
1970                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1971                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1972                 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1973                 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1974                 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1975                 .inversed = 0,
1976                 .health = false,
1977         },
1978         {
1979                 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1980                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1981                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1982                 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1983                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1984                 .inversed = 1,
1985                 .health = false,
1986         },
1987         {
1988                 .data = mlxplat_mlxcpld_modular_asic_items_data,
1989                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1990                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1991                 .mask = MLXPLAT_CPLD_ASIC_MASK,
1992                 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_asic_items_data),
1993                 .inversed = 0,
1994                 .health = true,
1995         },
1996         {
1997                 .data = mlxplat_mlxcpld_modular_lc_pr_items_data,
1998                 .kind = MLXREG_HOTPLUG_LC_PRESENT,
1999                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2000                 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
2001                 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2002                 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pr_items_data),
2003                 .inversed = 1,
2004                 .health = false,
2005         },
2006         {
2007                 .data = mlxplat_mlxcpld_modular_lc_ver_items_data,
2008                 .kind = MLXREG_HOTPLUG_LC_VERIFIED,
2009                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2010                 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
2011                 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2012                 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ver_items_data),
2013                 .inversed = 0,
2014                 .health = false,
2015         },
2016         {
2017                 .data = mlxplat_mlxcpld_modular_lc_pg_data,
2018                 .kind = MLXREG_HOTPLUG_LC_POWERED,
2019                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2020                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
2021                 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2022                 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pg_data),
2023                 .inversed = 0,
2024                 .health = false,
2025         },
2026         {
2027                 .data = mlxplat_mlxcpld_modular_lc_ready_data,
2028                 .kind = MLXREG_HOTPLUG_LC_READY,
2029                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2030                 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
2031                 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2032                 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ready_data),
2033                 .inversed = 0,
2034                 .health = false,
2035         },
2036         {
2037                 .data = mlxplat_mlxcpld_modular_lc_synced_data,
2038                 .kind = MLXREG_HOTPLUG_LC_SYNCED,
2039                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2040                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2041                 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2042                 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_synced_data),
2043                 .inversed = 0,
2044                 .health = false,
2045         },
2046         {
2047                 .data = mlxplat_mlxcpld_modular_lc_act_data,
2048                 .kind = MLXREG_HOTPLUG_LC_ACTIVE,
2049                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2050                 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2051                 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2052                 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_act_data),
2053                 .inversed = 0,
2054                 .health = false,
2055         },
2056         {
2057                 .data = mlxplat_mlxcpld_modular_lc_sd_data,
2058                 .kind = MLXREG_HOTPLUG_LC_THERMAL,
2059                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2060                 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2061                 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2062                 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_sd_data),
2063                 .inversed = 0,
2064                 .health = false,
2065         },
2066 };
2067
2068 static
2069 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_modular_data = {
2070         .items = mlxplat_mlxcpld_modular_items,
2071         .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_items),
2072         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2073         .mask = MLXPLAT_CPLD_AGGR_MASK_MODULAR,
2074         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2075         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2076 };
2077
2078 /* Platform hotplug for NVLink blade systems family data  */
2079 static struct mlxreg_core_data mlxplat_mlxcpld_global_wp_items_data[] = {
2080         {
2081                 .label = "global_wp_grant",
2082                 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2083                 .mask = MLXPLAT_CPLD_GWP_MASK,
2084                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2085         },
2086 };
2087
2088 static struct mlxreg_core_item mlxplat_mlxcpld_nvlink_blade_items[] = {
2089         {
2090                 .data = mlxplat_mlxcpld_global_wp_items_data,
2091                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2092                 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2093                 .mask = MLXPLAT_CPLD_GWP_MASK,
2094                 .count = ARRAY_SIZE(mlxplat_mlxcpld_global_wp_items_data),
2095                 .inversed = 0,
2096                 .health = false,
2097         },
2098 };
2099
2100 static
2101 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_nvlink_blade_data = {
2102         .items = mlxplat_mlxcpld_nvlink_blade_items,
2103         .counter = ARRAY_SIZE(mlxplat_mlxcpld_nvlink_blade_items),
2104         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2105         .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
2106         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2107         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2108 };
2109
2110 /* Platform hotplug for  switch systems family data */
2111 static struct mlxreg_core_data mlxplat_mlxcpld_erot_ap_items_data[] = {
2112         {
2113                 .label = "erot1_ap",
2114                 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2115                 .mask = BIT(0),
2116                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2117         },
2118         {
2119                 .label = "erot2_ap",
2120                 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2121                 .mask = BIT(1),
2122                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2123         },
2124 };
2125
2126 static struct mlxreg_core_data mlxplat_mlxcpld_erot_error_items_data[] = {
2127         {
2128                 .label = "erot1_error",
2129                 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2130                 .mask = BIT(0),
2131                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2132         },
2133         {
2134                 .label = "erot2_error",
2135                 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2136                 .mask = BIT(1),
2137                 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2138         },
2139 };
2140
2141 static struct mlxreg_core_item mlxplat_mlxcpld_rack_switch_items[] = {
2142         {
2143                 .data = mlxplat_mlxcpld_ext_psu_items_data,
2144                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2145                 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2146                 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
2147                 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2148                 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
2149                 .inversed = 1,
2150                 .health = false,
2151         },
2152         {
2153                 .data = mlxplat_mlxcpld_ext_pwr_items_data,
2154                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2155                 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2156                 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
2157                 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2158                 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
2159                 .inversed = 0,
2160                 .health = false,
2161         },
2162         {
2163                 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
2164                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2165                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2166                 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
2167                 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
2168                 .inversed = 1,
2169                 .health = false,
2170         },
2171         {
2172                 .data = mlxplat_mlxcpld_erot_ap_items_data,
2173                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2174                 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2175                 .mask = MLXPLAT_CPLD_EROT_MASK,
2176                 .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_ap_items_data),
2177                 .inversed = 1,
2178                 .health = false,
2179         },
2180         {
2181                 .data = mlxplat_mlxcpld_erot_error_items_data,
2182                 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2183                 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2184                 .mask = MLXPLAT_CPLD_EROT_MASK,
2185                 .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_error_items_data),
2186                 .inversed = 1,
2187                 .health = false,
2188         },
2189 };
2190
2191 static
2192 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_rack_switch_data = {
2193         .items = mlxplat_mlxcpld_rack_switch_items,
2194         .counter = ARRAY_SIZE(mlxplat_mlxcpld_rack_switch_items),
2195         .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2196         .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
2197         .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2198         .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2199 };
2200
2201 /* Platform led default data */
2202 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
2203         {
2204                 .label = "status:green",
2205                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2206                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2207         },
2208         {
2209                 .label = "status:red",
2210                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2211                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2212         },
2213         {
2214                 .label = "psu:green",
2215                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2216                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2217         },
2218         {
2219                 .label = "psu:red",
2220                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2221                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2222         },
2223         {
2224                 .label = "fan1:green",
2225                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2226                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2227         },
2228         {
2229                 .label = "fan1:red",
2230                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2231                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2232         },
2233         {
2234                 .label = "fan2:green",
2235                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2236                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2237         },
2238         {
2239                 .label = "fan2:red",
2240                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2241                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2242         },
2243         {
2244                 .label = "fan3:green",
2245                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2246                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2247         },
2248         {
2249                 .label = "fan3:red",
2250                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2251                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2252         },
2253         {
2254                 .label = "fan4:green",
2255                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2256                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2257         },
2258         {
2259                 .label = "fan4:red",
2260                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2261                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2262         },
2263 };
2264
2265 static struct mlxreg_core_platform_data mlxplat_default_led_data = {
2266                 .data = mlxplat_mlxcpld_default_led_data,
2267                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
2268 };
2269
2270 /* Platform led default data for water cooling */
2271 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_wc_data[] = {
2272         {
2273                 .label = "status:green",
2274                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2275                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2276         },
2277         {
2278                 .label = "status:red",
2279                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2280                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2281         },
2282         {
2283                 .label = "psu:green",
2284                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2285                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2286         },
2287         {
2288                 .label = "psu:red",
2289                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2290                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2291         },
2292 };
2293
2294 static struct mlxreg_core_platform_data mlxplat_default_led_wc_data = {
2295                 .data = mlxplat_mlxcpld_default_led_wc_data,
2296                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_wc_data),
2297 };
2298
2299 /* Platform led default data for water cooling Ethernet switch blade */
2300 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_eth_wc_blade_data[] = {
2301         {
2302                 .label = "status:green",
2303                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2304                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2305         },
2306         {
2307                 .label = "status:red",
2308                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2309                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2310         },
2311 };
2312
2313 static struct mlxreg_core_platform_data mlxplat_default_led_eth_wc_blade_data = {
2314         .data = mlxplat_mlxcpld_default_led_eth_wc_blade_data,
2315         .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_eth_wc_blade_data),
2316 };
2317
2318 /* Platform led MSN21xx system family data */
2319 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
2320         {
2321                 .label = "status:green",
2322                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2323                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2324         },
2325         {
2326                 .label = "status:red",
2327                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2328                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2329         },
2330         {
2331                 .label = "fan:green",
2332                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2333                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2334         },
2335         {
2336                 .label = "fan:red",
2337                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2338                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2339         },
2340         {
2341                 .label = "psu1:green",
2342                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2343                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2344         },
2345         {
2346                 .label = "psu1:red",
2347                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2348                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2349         },
2350         {
2351                 .label = "psu2:green",
2352                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2353                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2354         },
2355         {
2356                 .label = "psu2:red",
2357                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2358                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2359         },
2360         {
2361                 .label = "uid:blue",
2362                 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2363                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2364         },
2365 };
2366
2367 static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
2368                 .data = mlxplat_mlxcpld_msn21xx_led_data,
2369                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
2370 };
2371
2372 /* Platform led for default data for 200GbE systems */
2373 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
2374         {
2375                 .label = "status:green",
2376                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2377                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2378         },
2379         {
2380                 .label = "status:orange",
2381                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2382                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2383         },
2384         {
2385                 .label = "psu:green",
2386                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2387                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2388         },
2389         {
2390                 .label = "psu:orange",
2391                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2392                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2393         },
2394         {
2395                 .label = "fan1:green",
2396                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2397                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2398                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2399                 .bit = BIT(0),
2400         },
2401         {
2402                 .label = "fan1:orange",
2403                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2404                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2405                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2406                 .bit = BIT(0),
2407         },
2408         {
2409                 .label = "fan2:green",
2410                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2411                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2412                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2413                 .bit = BIT(1),
2414         },
2415         {
2416                 .label = "fan2:orange",
2417                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2418                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2419                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2420                 .bit = BIT(1),
2421         },
2422         {
2423                 .label = "fan3:green",
2424                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2425                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2426                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2427                 .bit = BIT(2),
2428         },
2429         {
2430                 .label = "fan3:orange",
2431                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2432                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2433                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2434                 .bit = BIT(2),
2435         },
2436         {
2437                 .label = "fan4:green",
2438                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2439                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2440                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2441                 .bit = BIT(3),
2442         },
2443         {
2444                 .label = "fan4:orange",
2445                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2446                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2447                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2448                 .bit = BIT(3),
2449         },
2450         {
2451                 .label = "fan5:green",
2452                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2453                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2454                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2455                 .bit = BIT(4),
2456         },
2457         {
2458                 .label = "fan5:orange",
2459                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2460                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2461                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2462                 .bit = BIT(4),
2463         },
2464         {
2465                 .label = "fan6:green",
2466                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2467                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2468                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2469                 .bit = BIT(5),
2470         },
2471         {
2472                 .label = "fan6:orange",
2473                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2474                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2475                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2476                 .bit = BIT(5),
2477         },
2478         {
2479                 .label = "fan7:green",
2480                 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2481                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2482                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2483                 .bit = BIT(6),
2484         },
2485         {
2486                 .label = "fan7:orange",
2487                 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2488                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2489                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2490                 .bit = BIT(6),
2491         },
2492         {
2493                 .label = "uid:blue",
2494                 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2495                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2496         },
2497 };
2498
2499 static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
2500                 .data = mlxplat_mlxcpld_default_ng_led_data,
2501                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
2502 };
2503
2504 /* Platform led for Comex based 100GbE systems */
2505 static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
2506         {
2507                 .label = "status:green",
2508                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2509                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2510         },
2511         {
2512                 .label = "status:red",
2513                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2514                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2515         },
2516         {
2517                 .label = "psu:green",
2518                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2519                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2520         },
2521         {
2522                 .label = "psu:red",
2523                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2524                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2525         },
2526         {
2527                 .label = "fan1:green",
2528                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2529                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2530         },
2531         {
2532                 .label = "fan1:red",
2533                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2534                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2535         },
2536         {
2537                 .label = "fan2:green",
2538                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2539                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2540         },
2541         {
2542                 .label = "fan2:red",
2543                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2544                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2545         },
2546         {
2547                 .label = "fan3:green",
2548                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2549                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2550         },
2551         {
2552                 .label = "fan3:red",
2553                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2554                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2555         },
2556         {
2557                 .label = "fan4:green",
2558                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2559                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2560         },
2561         {
2562                 .label = "fan4:red",
2563                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2564                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2565         },
2566         {
2567                 .label = "uid:blue",
2568                 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2569                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2570         },
2571 };
2572
2573 static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
2574                 .data = mlxplat_mlxcpld_comex_100G_led_data,
2575                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
2576 };
2577
2578 /* Platform led for data for modular systems */
2579 static struct mlxreg_core_data mlxplat_mlxcpld_modular_led_data[] = {
2580         {
2581                 .label = "status:green",
2582                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2583                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2584         },
2585         {
2586                 .label = "status:orange",
2587                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2588                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2589         },
2590         {
2591                 .label = "psu:green",
2592                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2593                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2594         },
2595         {
2596                 .label = "psu:orange",
2597                 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2598                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2599         },
2600         {
2601                 .label = "fan1:green",
2602                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2603                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2604                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2605                 .bit = BIT(0),
2606         },
2607         {
2608                 .label = "fan1:orange",
2609                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2610                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2611                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2612                 .bit = BIT(0),
2613         },
2614         {
2615                 .label = "fan2:green",
2616                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2617                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2618                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2619                 .bit = BIT(1),
2620         },
2621         {
2622                 .label = "fan2:orange",
2623                 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2624                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2625                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2626                 .bit = BIT(1),
2627         },
2628         {
2629                 .label = "fan3:green",
2630                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2631                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2632                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2633                 .bit = BIT(2),
2634         },
2635         {
2636                 .label = "fan3:orange",
2637                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2638                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2639                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2640                 .bit = BIT(2),
2641         },
2642         {
2643                 .label = "fan4:green",
2644                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2645                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2646                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2647                 .bit = BIT(3),
2648         },
2649         {
2650                 .label = "fan4:orange",
2651                 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2652                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2653                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2654                 .bit = BIT(3),
2655         },
2656         {
2657                 .label = "fan5:green",
2658                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2659                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2660                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2661                 .bit = BIT(4),
2662         },
2663         {
2664                 .label = "fan5:orange",
2665                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2666                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2667                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2668                 .bit = BIT(4),
2669         },
2670         {
2671                 .label = "fan6:green",
2672                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2673                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2674                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2675                 .bit = BIT(5),
2676         },
2677         {
2678                 .label = "fan6:orange",
2679                 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2680                 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2681                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2682                 .bit = BIT(5),
2683         },
2684         {
2685                 .label = "fan7:green",
2686                 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2687                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2688                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2689                 .bit = BIT(6),
2690         },
2691         {
2692                 .label = "fan7:orange",
2693                 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2694                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2695                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2696                 .bit = BIT(6),
2697         },
2698         {
2699                 .label = "uid:blue",
2700                 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2701                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2702         },
2703         {
2704                 .label = "fan_front:green",
2705                 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2706                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2707         },
2708         {
2709                 .label = "fan_front:orange",
2710                 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2711                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2712         },
2713         {
2714                 .label = "mgmt:green",
2715                 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
2716                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2717         },
2718         {
2719                 .label = "mgmt:orange",
2720                 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
2721                 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2722         },
2723 };
2724
2725 static struct mlxreg_core_platform_data mlxplat_modular_led_data = {
2726                 .data = mlxplat_mlxcpld_modular_led_data,
2727                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_led_data),
2728 };
2729
2730 /* Platform register access default */
2731 static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
2732         {
2733                 .label = "cpld1_version",
2734                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2735                 .bit = GENMASK(7, 0),
2736                 .mode = 0444,
2737         },
2738         {
2739                 .label = "cpld2_version",
2740                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2741                 .bit = GENMASK(7, 0),
2742                 .mode = 0444,
2743         },
2744         {
2745                 .label = "cpld1_pn",
2746                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2747                 .bit = GENMASK(15, 0),
2748                 .mode = 0444,
2749                 .regnum = 2,
2750         },
2751         {
2752                 .label = "cpld2_pn",
2753                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2754                 .bit = GENMASK(15, 0),
2755                 .mode = 0444,
2756                 .regnum = 2,
2757         },
2758         {
2759                 .label = "cpld1_version_min",
2760                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2761                 .bit = GENMASK(7, 0),
2762                 .mode = 0444,
2763         },
2764         {
2765                 .label = "cpld2_version_min",
2766                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2767                 .bit = GENMASK(7, 0),
2768                 .mode = 0444,
2769         },
2770         {
2771                 .label = "reset_long_pb",
2772                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2773                 .mask = GENMASK(7, 0) & ~BIT(0),
2774                 .mode = 0444,
2775         },
2776         {
2777                 .label = "reset_short_pb",
2778                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2779                 .mask = GENMASK(7, 0) & ~BIT(1),
2780                 .mode = 0444,
2781         },
2782         {
2783                 .label = "reset_aux_pwr_or_ref",
2784                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2785                 .mask = GENMASK(7, 0) & ~BIT(2),
2786                 .mode = 0444,
2787         },
2788         {
2789                 .label = "reset_main_pwr_fail",
2790                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2791                 .mask = GENMASK(7, 0) & ~BIT(3),
2792                 .mode = 0444,
2793         },
2794         {
2795                 .label = "reset_sw_reset",
2796                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2797                 .mask = GENMASK(7, 0) & ~BIT(4),
2798                 .mode = 0444,
2799         },
2800         {
2801                 .label = "reset_fw_reset",
2802                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2803                 .mask = GENMASK(7, 0) & ~BIT(5),
2804                 .mode = 0444,
2805         },
2806         {
2807                 .label = "reset_hotswap_or_wd",
2808                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2809                 .mask = GENMASK(7, 0) & ~BIT(6),
2810                 .mode = 0444,
2811         },
2812         {
2813                 .label = "reset_asic_thermal",
2814                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2815                 .mask = GENMASK(7, 0) & ~BIT(7),
2816                 .mode = 0444,
2817         },
2818         {
2819                 .label = "psu1_on",
2820                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2821                 .mask = GENMASK(7, 0) & ~BIT(0),
2822                 .mode = 0200,
2823         },
2824         {
2825                 .label = "psu2_on",
2826                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2827                 .mask = GENMASK(7, 0) & ~BIT(1),
2828                 .mode = 0200,
2829         },
2830         {
2831                 .label = "pwr_cycle",
2832                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2833                 .mask = GENMASK(7, 0) & ~BIT(2),
2834                 .mode = 0200,
2835         },
2836         {
2837                 .label = "pwr_down",
2838                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2839                 .mask = GENMASK(7, 0) & ~BIT(3),
2840                 .mode = 0200,
2841         },
2842         {
2843                 .label = "select_iio",
2844                 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
2845                 .mask = GENMASK(7, 0) & ~BIT(6),
2846                 .mode = 0644,
2847         },
2848         {
2849                 .label = "asic_health",
2850                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2851                 .mask = MLXPLAT_CPLD_ASIC_MASK,
2852                 .bit = 1,
2853                 .mode = 0444,
2854         },
2855 };
2856
2857 static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
2858                 .data = mlxplat_mlxcpld_default_regs_io_data,
2859                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
2860 };
2861
2862 /* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
2863 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
2864         {
2865                 .label = "cpld1_version",
2866                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2867                 .bit = GENMASK(7, 0),
2868                 .mode = 0444,
2869         },
2870         {
2871                 .label = "cpld2_version",
2872                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2873                 .bit = GENMASK(7, 0),
2874                 .mode = 0444,
2875         },
2876         {
2877                 .label = "cpld1_pn",
2878                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2879                 .bit = GENMASK(15, 0),
2880                 .mode = 0444,
2881                 .regnum = 2,
2882         },
2883         {
2884                 .label = "cpld2_pn",
2885                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2886                 .bit = GENMASK(15, 0),
2887                 .mode = 0444,
2888                 .regnum = 2,
2889         },
2890         {
2891                 .label = "cpld1_version_min",
2892                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2893                 .bit = GENMASK(7, 0),
2894                 .mode = 0444,
2895         },
2896         {
2897                 .label = "cpld2_version_min",
2898                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2899                 .bit = GENMASK(7, 0),
2900                 .mode = 0444,
2901         },
2902         {
2903                 .label = "reset_long_pb",
2904                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2905                 .mask = GENMASK(7, 0) & ~BIT(0),
2906                 .mode = 0444,
2907         },
2908         {
2909                 .label = "reset_short_pb",
2910                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2911                 .mask = GENMASK(7, 0) & ~BIT(1),
2912                 .mode = 0444,
2913         },
2914         {
2915                 .label = "reset_aux_pwr_or_ref",
2916                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2917                 .mask = GENMASK(7, 0) & ~BIT(2),
2918                 .mode = 0444,
2919         },
2920         {
2921                 .label = "reset_sw_reset",
2922                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2923                 .mask = GENMASK(7, 0) & ~BIT(3),
2924                 .mode = 0444,
2925         },
2926         {
2927                 .label = "reset_main_pwr_fail",
2928                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2929                 .mask = GENMASK(7, 0) & ~BIT(4),
2930                 .mode = 0444,
2931         },
2932         {
2933                 .label = "reset_asic_thermal",
2934                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2935                 .mask = GENMASK(7, 0) & ~BIT(5),
2936                 .mode = 0444,
2937         },
2938         {
2939                 .label = "reset_hotswap_or_halt",
2940                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2941                 .mask = GENMASK(7, 0) & ~BIT(6),
2942                 .mode = 0444,
2943         },
2944         {
2945                 .label = "reset_sff_wd",
2946                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
2947                 .mask = GENMASK(7, 0) & ~BIT(6),
2948                 .mode = 0444,
2949         },
2950         {
2951                 .label = "psu1_on",
2952                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2953                 .mask = GENMASK(7, 0) & ~BIT(0),
2954                 .mode = 0200,
2955         },
2956         {
2957                 .label = "psu2_on",
2958                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2959                 .mask = GENMASK(7, 0) & ~BIT(1),
2960                 .mode = 0200,
2961         },
2962         {
2963                 .label = "pwr_cycle",
2964                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2965                 .mask = GENMASK(7, 0) & ~BIT(2),
2966                 .mode = 0200,
2967         },
2968         {
2969                 .label = "pwr_down",
2970                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2971                 .mask = GENMASK(7, 0) & ~BIT(3),
2972                 .mode = 0200,
2973         },
2974         {
2975                 .label = "select_iio",
2976                 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
2977                 .mask = GENMASK(7, 0) & ~BIT(6),
2978                 .mode = 0644,
2979         },
2980         {
2981                 .label = "asic_health",
2982                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2983                 .mask = MLXPLAT_CPLD_ASIC_MASK,
2984                 .bit = 1,
2985                 .mode = 0444,
2986         },
2987 };
2988
2989 static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
2990                 .data = mlxplat_mlxcpld_msn21xx_regs_io_data,
2991                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
2992 };
2993
2994 /* Platform register access for next generation systems families data */
2995 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
2996         {
2997                 .label = "cpld1_version",
2998                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2999                 .bit = GENMASK(7, 0),
3000                 .mode = 0444,
3001         },
3002         {
3003                 .label = "cpld2_version",
3004                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
3005                 .bit = GENMASK(7, 0),
3006                 .mode = 0444,
3007         },
3008         {
3009                 .label = "cpld3_version",
3010                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
3011                 .bit = GENMASK(7, 0),
3012                 .mode = 0444,
3013         },
3014         {
3015                 .label = "cpld4_version",
3016                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
3017                 .bit = GENMASK(7, 0),
3018                 .mode = 0444,
3019         },
3020         {
3021                 .label = "cpld1_pn",
3022                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3023                 .bit = GENMASK(15, 0),
3024                 .mode = 0444,
3025                 .regnum = 2,
3026         },
3027         {
3028                 .label = "cpld2_pn",
3029                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
3030                 .bit = GENMASK(15, 0),
3031                 .mode = 0444,
3032                 .regnum = 2,
3033         },
3034         {
3035                 .label = "cpld3_pn",
3036                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
3037                 .bit = GENMASK(15, 0),
3038                 .mode = 0444,
3039                 .regnum = 2,
3040         },
3041         {
3042                 .label = "cpld4_pn",
3043                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
3044                 .bit = GENMASK(15, 0),
3045                 .mode = 0444,
3046                 .regnum = 2,
3047         },
3048         {
3049                 .label = "cpld1_version_min",
3050                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3051                 .bit = GENMASK(7, 0),
3052                 .mode = 0444,
3053         },
3054         {
3055                 .label = "cpld2_version_min",
3056                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
3057                 .bit = GENMASK(7, 0),
3058                 .mode = 0444,
3059         },
3060         {
3061                 .label = "cpld3_version_min",
3062                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
3063                 .bit = GENMASK(7, 0),
3064                 .mode = 0444,
3065         },
3066         {
3067                 .label = "cpld4_version_min",
3068                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
3069                 .bit = GENMASK(7, 0),
3070                 .mode = 0444,
3071         },
3072         {
3073                 .label = "asic_reset",
3074                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
3075                 .mask = GENMASK(7, 0) & ~BIT(3),
3076                 .mode = 0200,
3077         },
3078         {
3079                 .label = "asic2_reset",
3080                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
3081                 .mask = GENMASK(7, 0) & ~BIT(2),
3082                 .mode = 0200,
3083         },
3084         {
3085                 .label = "erot1_reset",
3086                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
3087                 .mask = GENMASK(7, 0) & ~BIT(6),
3088                 .mode = 0644,
3089         },
3090         {
3091                 .label = "erot2_reset",
3092                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
3093                 .mask = GENMASK(7, 0) & ~BIT(7),
3094                 .mode = 0644,
3095         },
3096         {
3097                 .label = "erot1_recovery",
3098                 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
3099                 .mask = GENMASK(7, 0) & ~BIT(6),
3100                 .mode = 0644,
3101         },
3102         {
3103                 .label = "erot2_recovery",
3104                 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
3105                 .mask = GENMASK(7, 0) & ~BIT(7),
3106                 .mode = 0644,
3107         },
3108         {
3109                 .label = "erot1_wp",
3110                 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
3111                 .mask = GENMASK(7, 0) & ~BIT(4),
3112                 .mode = 0644,
3113                 .secured = 1,
3114         },
3115         {
3116                 .label = "erot2_wp",
3117                 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
3118                 .mask = GENMASK(7, 0) & ~BIT(5),
3119                 .mode = 0644,
3120                 .secured = 1,
3121         },
3122         {
3123                 .label = "reset_long_pb",
3124                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3125                 .mask = GENMASK(7, 0) & ~BIT(0),
3126                 .mode = 0444,
3127         },
3128         {
3129                 .label = "reset_short_pb",
3130                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3131                 .mask = GENMASK(7, 0) & ~BIT(1),
3132                 .mode = 0444,
3133         },
3134         {
3135                 .label = "reset_aux_pwr_or_ref",
3136                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3137                 .mask = GENMASK(7, 0) & ~BIT(2),
3138                 .mode = 0444,
3139         },
3140         {
3141                 .label = "reset_from_comex",
3142                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3143                 .mask = GENMASK(7, 0) & ~BIT(4),
3144                 .mode = 0444,
3145         },
3146         {
3147                 .label = "reset_from_asic",
3148                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3149                 .mask = GENMASK(7, 0) & ~BIT(5),
3150                 .mode = 0444,
3151         },
3152         {
3153                 .label = "reset_swb_wd",
3154                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3155                 .mask = GENMASK(7, 0) & ~BIT(6),
3156                 .mode = 0444,
3157         },
3158         {
3159                 .label = "reset_asic_thermal",
3160                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3161                 .mask = GENMASK(7, 0) & ~BIT(7),
3162                 .mode = 0444,
3163         },
3164         {
3165                 .label = "reset_comex_pwr_fail",
3166                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3167                 .mask = GENMASK(7, 0) & ~BIT(3),
3168                 .mode = 0444,
3169         },
3170         {
3171                 .label = "reset_platform",
3172                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3173                 .mask = GENMASK(7, 0) & ~BIT(4),
3174                 .mode = 0444,
3175         },
3176         {
3177                 .label = "reset_soc",
3178                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3179                 .mask = GENMASK(7, 0) & ~BIT(5),
3180                 .mode = 0444,
3181         },
3182         {
3183                 .label = "reset_comex_wd",
3184                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3185                 .mask = GENMASK(7, 0) & ~BIT(6),
3186                 .mode = 0444,
3187         },
3188         {
3189                 .label = "reset_voltmon_upgrade_fail",
3190                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3191                 .mask = GENMASK(7, 0) & ~BIT(0),
3192                 .mode = 0444,
3193         },
3194         {
3195                 .label = "reset_system",
3196                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3197                 .mask = GENMASK(7, 0) & ~BIT(1),
3198                 .mode = 0444,
3199         },
3200         {
3201                 .label = "reset_sw_pwr_off",
3202                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3203                 .mask = GENMASK(7, 0) & ~BIT(2),
3204                 .mode = 0444,
3205         },
3206         {
3207                 .label = "reset_comex_thermal",
3208                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3209                 .mask = GENMASK(7, 0) & ~BIT(3),
3210                 .mode = 0444,
3211         },
3212         {
3213                 .label = "reset_reload_bios",
3214                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3215                 .mask = GENMASK(7, 0) & ~BIT(5),
3216                 .mode = 0444,
3217         },
3218         {
3219                 .label = "reset_ac_pwr_fail",
3220                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3221                 .mask = GENMASK(7, 0) & ~BIT(6),
3222                 .mode = 0444,
3223         },
3224         {
3225                 .label = "psu1_on",
3226                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3227                 .mask = GENMASK(7, 0) & ~BIT(0),
3228                 .mode = 0200,
3229         },
3230         {
3231                 .label = "psu2_on",
3232                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3233                 .mask = GENMASK(7, 0) & ~BIT(1),
3234                 .mode = 0200,
3235         },
3236         {
3237                 .label = "pwr_cycle",
3238                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3239                 .mask = GENMASK(7, 0) & ~BIT(2),
3240                 .mode = 0200,
3241         },
3242         {
3243                 .label = "pwr_down",
3244                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3245                 .mask = GENMASK(7, 0) & ~BIT(3),
3246                 .mode = 0200,
3247         },
3248         {
3249                 .label = "jtag_enable",
3250                 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3251                 .mask = GENMASK(7, 0) & ~BIT(4),
3252                 .mode = 0644,
3253         },
3254         {
3255                 .label = "asic_health",
3256                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3257                 .mask = MLXPLAT_CPLD_ASIC_MASK,
3258                 .bit = 1,
3259                 .mode = 0444,
3260         },
3261         {
3262                 .label = "asic2_health",
3263                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
3264                 .mask = MLXPLAT_CPLD_ASIC_MASK,
3265                 .bit = 1,
3266                 .mode = 0444,
3267         },
3268         {
3269                 .label = "fan_dir",
3270                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
3271                 .bit = GENMASK(7, 0),
3272                 .mode = 0444,
3273         },
3274         {
3275                 .label = "bios_safe_mode",
3276                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3277                 .mask = GENMASK(7, 0) & ~BIT(4),
3278                 .mode = 0444,
3279         },
3280         {
3281                 .label = "bios_active_image",
3282                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3283                 .mask = GENMASK(7, 0) & ~BIT(5),
3284                 .mode = 0444,
3285         },
3286         {
3287                 .label = "bios_auth_fail",
3288                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3289                 .mask = GENMASK(7, 0) & ~BIT(6),
3290                 .mode = 0444,
3291         },
3292         {
3293                 .label = "bios_upgrade_fail",
3294                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3295                 .mask = GENMASK(7, 0) & ~BIT(7),
3296                 .mode = 0444,
3297         },
3298         {
3299                 .label = "voltreg_update_status",
3300                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3301                 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3302                 .bit = 5,
3303                 .mode = 0444,
3304         },
3305         {
3306                 .label = "vpd_wp",
3307                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3308                 .mask = GENMASK(7, 0) & ~BIT(3),
3309                 .mode = 0644,
3310         },
3311         {
3312                 .label = "pcie_asic_reset_dis",
3313                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3314                 .mask = GENMASK(7, 0) & ~BIT(4),
3315                 .mode = 0644,
3316         },
3317         {
3318                 .label = "erot1_ap_reset",
3319                 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
3320                 .mask = GENMASK(7, 0) & ~BIT(0),
3321                 .mode = 0444,
3322         },
3323         {
3324                 .label = "erot2_ap_reset",
3325                 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
3326                 .mask = GENMASK(7, 0) & ~BIT(1),
3327                 .mode = 0444,
3328         },
3329         {
3330                 .label = "spi_chnl_select",
3331                 .reg = MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT,
3332                 .mask = GENMASK(7, 0),
3333                 .bit = 1,
3334                 .mode = 0644,
3335         },
3336         {
3337                 .label = "config1",
3338                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3339                 .bit = GENMASK(7, 0),
3340                 .mode = 0444,
3341         },
3342         {
3343                 .label = "config2",
3344                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3345                 .bit = GENMASK(7, 0),
3346                 .mode = 0444,
3347         },
3348         {
3349                 .label = "config3",
3350                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3351                 .bit = GENMASK(7, 0),
3352                 .mode = 0444,
3353         },
3354         {
3355                 .label = "ufm_version",
3356                 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3357                 .bit = GENMASK(7, 0),
3358                 .mode = 0444,
3359         },
3360 };
3361
3362 static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
3363                 .data = mlxplat_mlxcpld_default_ng_regs_io_data,
3364                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
3365 };
3366
3367 /* Platform register access for modular systems families data */
3368 static struct mlxreg_core_data mlxplat_mlxcpld_modular_regs_io_data[] = {
3369         {
3370                 .label = "cpld1_version",
3371                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3372                 .bit = GENMASK(7, 0),
3373                 .mode = 0444,
3374         },
3375         {
3376                 .label = "cpld2_version",
3377                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
3378                 .bit = GENMASK(7, 0),
3379                 .mode = 0444,
3380         },
3381         {
3382                 .label = "cpld3_version",
3383                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
3384                 .bit = GENMASK(7, 0),
3385                 .mode = 0444,
3386         },
3387         {
3388                 .label = "cpld4_version",
3389                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
3390                 .bit = GENMASK(7, 0),
3391                 .mode = 0444,
3392         },
3393         {
3394                 .label = "cpld1_pn",
3395                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3396                 .bit = GENMASK(15, 0),
3397                 .mode = 0444,
3398                 .regnum = 2,
3399         },
3400         {
3401                 .label = "cpld2_pn",
3402                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
3403                 .bit = GENMASK(15, 0),
3404                 .mode = 0444,
3405                 .regnum = 2,
3406         },
3407         {
3408                 .label = "cpld3_pn",
3409                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
3410                 .bit = GENMASK(15, 0),
3411                 .mode = 0444,
3412                 .regnum = 2,
3413         },
3414         {
3415                 .label = "cpld4_pn",
3416                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
3417                 .bit = GENMASK(15, 0),
3418                 .mode = 0444,
3419                 .regnum = 2,
3420         },
3421         {
3422                 .label = "cpld1_version_min",
3423                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3424                 .bit = GENMASK(7, 0),
3425                 .mode = 0444,
3426         },
3427         {
3428                 .label = "cpld2_version_min",
3429                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
3430                 .bit = GENMASK(7, 0),
3431                 .mode = 0444,
3432         },
3433         {
3434                 .label = "cpld3_version_min",
3435                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
3436                 .bit = GENMASK(7, 0),
3437                 .mode = 0444,
3438         },
3439         {
3440                 .label = "cpld4_version_min",
3441                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
3442                 .bit = GENMASK(7, 0),
3443                 .mode = 0444,
3444         },
3445         {
3446                 .label = "lc1_enable",
3447                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3448                 .mask = GENMASK(7, 0) & ~BIT(0),
3449                 .mode = 0644,
3450         },
3451         {
3452                 .label = "lc2_enable",
3453                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3454                 .mask = GENMASK(7, 0) & ~BIT(1),
3455                 .mode = 0644,
3456         },
3457         {
3458                 .label = "lc3_enable",
3459                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3460                 .mask = GENMASK(7, 0) & ~BIT(2),
3461                 .mode = 0644,
3462         },
3463         {
3464                 .label = "lc4_enable",
3465                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3466                 .mask = GENMASK(7, 0) & ~BIT(3),
3467                 .mode = 0644,
3468         },
3469         {
3470                 .label = "lc5_enable",
3471                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3472                 .mask = GENMASK(7, 0) & ~BIT(4),
3473                 .mode = 0644,
3474         },
3475         {
3476                 .label = "lc6_enable",
3477                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3478                 .mask = GENMASK(7, 0) & ~BIT(5),
3479                 .mode = 0644,
3480         },
3481         {
3482                 .label = "lc7_enable",
3483                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3484                 .mask = GENMASK(7, 0) & ~BIT(6),
3485                 .mode = 0644,
3486         },
3487         {
3488                 .label = "lc8_enable",
3489                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3490                 .mask = GENMASK(7, 0) & ~BIT(7),
3491                 .mode = 0644,
3492         },
3493         {
3494                 .label = "reset_long_pb",
3495                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3496                 .mask = GENMASK(7, 0) & ~BIT(0),
3497                 .mode = 0444,
3498         },
3499         {
3500                 .label = "reset_short_pb",
3501                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3502                 .mask = GENMASK(7, 0) & ~BIT(1),
3503                 .mode = 0444,
3504         },
3505         {
3506                 .label = "reset_aux_pwr_or_fu",
3507                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3508                 .mask = GENMASK(7, 0) & ~BIT(2),
3509                 .mode = 0444,
3510         },
3511         {
3512                 .label = "reset_mgmt_dc_dc_pwr_fail",
3513                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3514                 .mask = GENMASK(7, 0) & ~BIT(3),
3515                 .mode = 0444,
3516         },
3517         {
3518                 .label = "reset_sys_comex_bios",
3519                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3520                 .mask = GENMASK(7, 0) & ~BIT(5),
3521                 .mode = 0444,
3522         },
3523         {
3524                 .label = "reset_sw_reset",
3525                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3526                 .mask = GENMASK(7, 0) & ~BIT(0),
3527                 .mode = 0444,
3528         },
3529         {
3530                 .label = "reset_aux_pwr_or_reload",
3531                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3532                 .mask = GENMASK(7, 0) & ~BIT(2),
3533                 .mode = 0444,
3534         },
3535         {
3536                 .label = "reset_comex_pwr_fail",
3537                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3538                 .mask = GENMASK(7, 0) & ~BIT(3),
3539                 .mode = 0444,
3540         },
3541         {
3542                 .label = "reset_platform",
3543                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3544                 .mask = GENMASK(7, 0) & ~BIT(4),
3545                 .mode = 0444,
3546         },
3547         {
3548                 .label = "reset_soc",
3549                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3550                 .mask = GENMASK(7, 0) & ~BIT(5),
3551                 .mode = 0444,
3552         },
3553         {
3554                 .label = "reset_pwr_off_from_carrier",
3555                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3556                 .mask = GENMASK(7, 0) & ~BIT(7),
3557                 .mode = 0444,
3558         },
3559         {
3560                 .label = "reset_swb_wd",
3561                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3562                 .mask = GENMASK(7, 0) & ~BIT(0),
3563                 .mode = 0444,
3564         },
3565         {
3566                 .label = "reset_swb_aux_pwr_or_fu",
3567                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3568                 .mask = GENMASK(7, 0) & ~BIT(2),
3569                 .mode = 0444,
3570         },
3571         {
3572                 .label = "reset_swb_dc_dc_pwr_fail",
3573                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3574                 .mask = GENMASK(7, 0) & ~BIT(3),
3575                 .mode = 0444,
3576         },
3577         {
3578                 .label = "reset_swb_12v_fail",
3579                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3580                 .mask = GENMASK(7, 0) & ~BIT(4),
3581                 .mode = 0444,
3582         },
3583         {
3584                 .label = "reset_system",
3585                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3586                 .mask = GENMASK(7, 0) & ~BIT(5),
3587                 .mode = 0444,
3588         },
3589         {
3590                 .label = "reset_thermal_spc_or_pciesw",
3591                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3592                 .mask = GENMASK(7, 0) & ~BIT(7),
3593                 .mode = 0444,
3594         },
3595         {
3596                 .label = "bios_safe_mode",
3597                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3598                 .mask = GENMASK(7, 0) & ~BIT(4),
3599                 .mode = 0444,
3600         },
3601         {
3602                 .label = "bios_active_image",
3603                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3604                 .mask = GENMASK(7, 0) & ~BIT(5),
3605                 .mode = 0444,
3606         },
3607         {
3608                 .label = "bios_auth_fail",
3609                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3610                 .mask = GENMASK(7, 0) & ~BIT(6),
3611                 .mode = 0444,
3612         },
3613         {
3614                 .label = "bios_upgrade_fail",
3615                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3616                 .mask = GENMASK(7, 0) & ~BIT(7),
3617                 .mode = 0444,
3618         },
3619         {
3620                 .label = "voltreg_update_status",
3621                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3622                 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3623                 .bit = 5,
3624                 .mode = 0444,
3625         },
3626         {
3627                 .label = "vpd_wp",
3628                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3629                 .mask = GENMASK(7, 0) & ~BIT(3),
3630                 .mode = 0644,
3631         },
3632         {
3633                 .label = "pcie_asic_reset_dis",
3634                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3635                 .mask = GENMASK(7, 0) & ~BIT(4),
3636                 .mode = 0644,
3637         },
3638         {
3639                 .label = "shutdown_unlock",
3640                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3641                 .mask = GENMASK(7, 0) & ~BIT(5),
3642                 .mode = 0644,
3643         },
3644         {
3645                 .label = "lc1_rst_mask",
3646                 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3647                 .mask = GENMASK(7, 0) & ~BIT(0),
3648                 .mode = 0200,
3649         },
3650         {
3651                 .label = "lc2_rst_mask",
3652                 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3653                 .mask = GENMASK(7, 0) & ~BIT(1),
3654                 .mode = 0200,
3655         },
3656         {
3657                 .label = "lc3_rst_mask",
3658                 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3659                 .mask = GENMASK(7, 0) & ~BIT(2),
3660                 .mode = 0200,
3661         },
3662         {
3663                 .label = "lc4_rst_mask",
3664                 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3665                 .mask = GENMASK(7, 0) & ~BIT(3),
3666                 .mode = 0200,
3667         },
3668         {
3669                 .label = "lc5_rst_mask",
3670                 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3671                 .mask = GENMASK(7, 0) & ~BIT(4),
3672                 .mode = 0200,
3673         },
3674         {
3675                 .label = "lc6_rst_mask",
3676                 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3677                 .mask = GENMASK(7, 0) & ~BIT(5),
3678                 .mode = 0200,
3679         },
3680         {
3681                 .label = "lc7_rst_mask",
3682                 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3683                 .mask = GENMASK(7, 0) & ~BIT(6),
3684                 .mode = 0200,
3685         },
3686         {
3687                 .label = "lc8_rst_mask",
3688                 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3689                 .mask = GENMASK(7, 0) & ~BIT(7),
3690                 .mode = 0200,
3691         },
3692         {
3693                 .label = "psu1_on",
3694                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3695                 .mask = GENMASK(7, 0) & ~BIT(0),
3696                 .mode = 0200,
3697         },
3698         {
3699                 .label = "psu2_on",
3700                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3701                 .mask = GENMASK(7, 0) & ~BIT(1),
3702                 .mode = 0200,
3703         },
3704         {
3705                 .label = "pwr_cycle",
3706                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3707                 .mask = GENMASK(7, 0) & ~BIT(2),
3708                 .mode = 0200,
3709         },
3710         {
3711                 .label = "pwr_down",
3712                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3713                 .mask = GENMASK(7, 0) & ~BIT(3),
3714                 .mode = 0200,
3715         },
3716         {
3717                 .label = "psu3_on",
3718                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3719                 .mask = GENMASK(7, 0) & ~BIT(4),
3720                 .mode = 0200,
3721         },
3722         {
3723                 .label = "psu4_on",
3724                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3725                 .mask = GENMASK(7, 0) & ~BIT(5),
3726                 .mode = 0200,
3727         },
3728         {
3729                 .label = "auto_power_mode",
3730                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3731                 .mask = GENMASK(7, 0) & ~BIT(6),
3732                 .mode = 0644,
3733         },
3734         {
3735                 .label = "pm_mgmt_en",
3736                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3737                 .mask = GENMASK(7, 0) & ~BIT(7),
3738                 .mode = 0644,
3739         },
3740         {
3741                 .label = "jtag_enable",
3742                 .reg = MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE,
3743                 .mask = GENMASK(3, 0),
3744                 .bit = 1,
3745                 .mode = 0644,
3746         },
3747         {
3748                 .label = "safe_bios_dis",
3749                 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
3750                 .mask = GENMASK(7, 0) & ~BIT(5),
3751                 .mode = 0644,
3752         },
3753         {
3754                 .label = "safe_bios_dis_wp",
3755                 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET,
3756                 .mask = GENMASK(7, 0) & ~BIT(5),
3757                 .mode = 0644,
3758         },
3759         {
3760                 .label = "asic_health",
3761                 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3762                 .mask = MLXPLAT_CPLD_ASIC_MASK,
3763                 .bit = 1,
3764                 .mode = 0444,
3765         },
3766         {
3767                 .label = "fan_dir",
3768                 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
3769                 .bit = GENMASK(7, 0),
3770                 .mode = 0444,
3771         },
3772         {
3773                 .label = "lc1_pwr",
3774                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3775                 .mask = GENMASK(7, 0) & ~BIT(0),
3776                 .mode = 0644,
3777         },
3778         {
3779                 .label = "lc2_pwr",
3780                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3781                 .mask = GENMASK(7, 0) & ~BIT(1),
3782                 .mode = 0644,
3783         },
3784         {
3785                 .label = "lc3_pwr",
3786                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3787                 .mask = GENMASK(7, 0) & ~BIT(2),
3788                 .mode = 0644,
3789         },
3790         {
3791                 .label = "lc4_pwr",
3792                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3793                 .mask = GENMASK(7, 0) & ~BIT(3),
3794                 .mode = 0644,
3795         },
3796         {
3797                 .label = "lc5_pwr",
3798                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3799                 .mask = GENMASK(7, 0) & ~BIT(4),
3800                 .mode = 0644,
3801         },
3802         {
3803                 .label = "lc6_pwr",
3804                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3805                 .mask = GENMASK(7, 0) & ~BIT(5),
3806                 .mode = 0644,
3807         },
3808         {
3809                 .label = "lc7_pwr",
3810                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3811                 .mask = GENMASK(7, 0) & ~BIT(6),
3812                 .mode = 0644,
3813         },
3814         {
3815                 .label = "lc8_pwr",
3816                 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3817                 .mask = GENMASK(7, 0) & ~BIT(7),
3818                 .mode = 0644,
3819         },
3820         {
3821                 .label = "config1",
3822                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3823                 .bit = GENMASK(7, 0),
3824                 .mode = 0444,
3825         },
3826         {
3827                 .label = "config2",
3828                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3829                 .bit = GENMASK(7, 0),
3830                 .mode = 0444,
3831         },
3832         {
3833                 .label = "config3",
3834                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3835                 .bit = GENMASK(7, 0),
3836                 .mode = 0444,
3837         },
3838         {
3839                 .label = "ufm_version",
3840                 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3841                 .bit = GENMASK(7, 0),
3842                 .mode = 0444,
3843         },
3844 };
3845
3846 static struct mlxreg_core_platform_data mlxplat_modular_regs_io_data = {
3847                 .data = mlxplat_mlxcpld_modular_regs_io_data,
3848                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_regs_io_data),
3849 };
3850
3851 /* Platform register access for NVLink blade systems family data  */
3852 static struct mlxreg_core_data mlxplat_mlxcpld_nvlink_blade_regs_io_data[] = {
3853         {
3854                 .label = "cpld1_version",
3855                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3856                 .bit = GENMASK(7, 0),
3857                 .mode = 0444,
3858         },
3859         {
3860                 .label = "cpld1_pn",
3861                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3862                 .bit = GENMASK(15, 0),
3863                 .mode = 0444,
3864                 .regnum = 2,
3865         },
3866         {
3867                 .label = "cpld1_version_min",
3868                 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3869                 .bit = GENMASK(7, 0),
3870                 .mode = 0444,
3871         },
3872         {
3873                 .label = "reset_aux_pwr_or_ref",
3874                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3875                 .mask = GENMASK(7, 0) & ~BIT(2),
3876                 .mode = 0444,
3877         },
3878         {
3879                 .label = "reset_from_comex",
3880                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3881                 .mask = GENMASK(7, 0) & ~BIT(4),
3882                 .mode = 0444,
3883         },
3884         {
3885                 .label = "reset_comex_pwr_fail",
3886                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3887                 .mask = GENMASK(7, 0) & ~BIT(3),
3888                 .mode = 0444,
3889         },
3890         {
3891                 .label = "reset_platform",
3892                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3893                 .mask = GENMASK(7, 0) & ~BIT(4),
3894                 .mode = 0444,
3895         },
3896         {
3897                 .label = "reset_soc",
3898                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3899                 .mask = GENMASK(7, 0) & ~BIT(5),
3900                 .mode = 0444,
3901         },
3902         {
3903                 .label = "reset_comex_wd",
3904                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3905                 .mask = GENMASK(7, 0) & ~BIT(6),
3906                 .mode = 0444,
3907         },
3908         {
3909                 .label = "reset_voltmon_upgrade_fail",
3910                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3911                 .mask = GENMASK(7, 0) & ~BIT(0),
3912                 .mode = 0444,
3913         },
3914         {
3915                 .label = "reset_system",
3916                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3917                 .mask = GENMASK(7, 0) & ~BIT(1),
3918                 .mode = 0444,
3919         },
3920         {
3921                 .label = "reset_sw_pwr_off",
3922                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3923                 .mask = GENMASK(7, 0) & ~BIT(2),
3924                 .mode = 0444,
3925         },
3926         {
3927                 .label = "reset_comex_thermal",
3928                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3929                 .mask = GENMASK(7, 0) & ~BIT(3),
3930                 .mode = 0444,
3931         },
3932         {
3933                 .label = "reset_reload_bios",
3934                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3935                 .mask = GENMASK(7, 0) & ~BIT(5),
3936                 .mode = 0444,
3937         },
3938         {
3939                 .label = "reset_ac_pwr_fail",
3940                 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3941                 .mask = GENMASK(7, 0) & ~BIT(6),
3942                 .mode = 0444,
3943         },
3944         {
3945                 .label = "pwr_cycle",
3946                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3947                 .mask = GENMASK(7, 0) & ~BIT(2),
3948                 .mode = 0200,
3949         },
3950         {
3951                 .label = "pwr_down",
3952                 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3953                 .mask = GENMASK(7, 0) & ~BIT(3),
3954                 .mode = 0200,
3955         },
3956         {
3957                 .label = "global_wp_request",
3958                 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3959                 .mask = GENMASK(7, 0) & ~BIT(0),
3960                 .mode = 0644,
3961         },
3962         {
3963                 .label = "jtag_enable",
3964                 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3965                 .mask = GENMASK(7, 0) & ~BIT(4),
3966                 .mode = 0644,
3967         },
3968         {
3969                 .label = "comm_chnl_ready",
3970                 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3971                 .mask = GENMASK(7, 0) & ~BIT(6),
3972                 .mode = 0200,
3973         },
3974         {
3975                 .label = "bios_safe_mode",
3976                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3977                 .mask = GENMASK(7, 0) & ~BIT(4),
3978                 .mode = 0444,
3979         },
3980         {
3981                 .label = "bios_active_image",
3982                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3983                 .mask = GENMASK(7, 0) & ~BIT(5),
3984                 .mode = 0444,
3985         },
3986         {
3987                 .label = "bios_auth_fail",
3988                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3989                 .mask = GENMASK(7, 0) & ~BIT(6),
3990                 .mode = 0444,
3991         },
3992         {
3993                 .label = "bios_upgrade_fail",
3994                 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3995                 .mask = GENMASK(7, 0) & ~BIT(7),
3996                 .mode = 0444,
3997         },
3998         {
3999                 .label = "voltreg_update_status",
4000                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
4001                 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
4002                 .bit = 5,
4003                 .mode = 0444,
4004         },
4005         {
4006                 .label = "vpd_wp",
4007                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4008                 .mask = GENMASK(7, 0) & ~BIT(3),
4009                 .mode = 0644,
4010         },
4011         {
4012                 .label = "pcie_asic_reset_dis",
4013                 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4014                 .mask = GENMASK(7, 0) & ~BIT(4),
4015                 .mode = 0644,
4016         },
4017         {
4018                 .label = "global_wp_response",
4019                 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
4020                 .mask = GENMASK(7, 0) & ~BIT(0),
4021                 .mode = 0444,
4022         },
4023         {
4024                 .label = "config1",
4025                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
4026                 .bit = GENMASK(7, 0),
4027                 .mode = 0444,
4028         },
4029         {
4030                 .label = "config2",
4031                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
4032                 .bit = GENMASK(7, 0),
4033                 .mode = 0444,
4034         },
4035         {
4036                 .label = "config3",
4037                 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
4038                 .bit = GENMASK(7, 0),
4039                 .mode = 0444,
4040         },
4041         {
4042                 .label = "ufm_version",
4043                 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
4044                 .bit = GENMASK(7, 0),
4045                 .mode = 0444,
4046         },
4047 };
4048
4049 static struct mlxreg_core_platform_data mlxplat_nvlink_blade_regs_io_data = {
4050                 .data = mlxplat_mlxcpld_nvlink_blade_regs_io_data,
4051                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_nvlink_blade_regs_io_data),
4052 };
4053
4054 /* Platform FAN default */
4055 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
4056         {
4057                 .label = "pwm1",
4058                 .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
4059         },
4060         {
4061                 .label = "pwm2",
4062                 .reg = MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET,
4063         },
4064         {
4065                 .label = "pwm3",
4066                 .reg = MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET,
4067         },
4068         {
4069                 .label = "pwm4",
4070                 .reg = MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET,
4071         },
4072         {
4073                 .label = "tacho1",
4074                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
4075                 .mask = GENMASK(7, 0),
4076                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4077                 .bit = BIT(0),
4078                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4079
4080         },
4081         {
4082                 .label = "tacho2",
4083                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
4084                 .mask = GENMASK(7, 0),
4085                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4086                 .bit = BIT(1),
4087                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4088         },
4089         {
4090                 .label = "tacho3",
4091                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
4092                 .mask = GENMASK(7, 0),
4093                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4094                 .bit = BIT(2),
4095                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4096         },
4097         {
4098                 .label = "tacho4",
4099                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
4100                 .mask = GENMASK(7, 0),
4101                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4102                 .bit = BIT(3),
4103                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4104         },
4105         {
4106                 .label = "tacho5",
4107                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
4108                 .mask = GENMASK(7, 0),
4109                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4110                 .bit = BIT(4),
4111                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4112         },
4113         {
4114                 .label = "tacho6",
4115                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
4116                 .mask = GENMASK(7, 0),
4117                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4118                 .bit = BIT(5),
4119                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4120         },
4121         {
4122                 .label = "tacho7",
4123                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
4124                 .mask = GENMASK(7, 0),
4125                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4126                 .bit = BIT(6),
4127                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4128         },
4129         {
4130                 .label = "tacho8",
4131                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
4132                 .mask = GENMASK(7, 0),
4133                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4134                 .bit = BIT(7),
4135                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4136         },
4137         {
4138                 .label = "tacho9",
4139                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
4140                 .mask = GENMASK(7, 0),
4141                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4142                 .bit = BIT(0),
4143                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4144         },
4145         {
4146                 .label = "tacho10",
4147                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
4148                 .mask = GENMASK(7, 0),
4149                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4150                 .bit = BIT(1),
4151                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4152         },
4153         {
4154                 .label = "tacho11",
4155                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
4156                 .mask = GENMASK(7, 0),
4157                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4158                 .bit = BIT(2),
4159                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4160         },
4161         {
4162                 .label = "tacho12",
4163                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
4164                 .mask = GENMASK(7, 0),
4165                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4166                 .bit = BIT(3),
4167                 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4168         },
4169         {
4170                 .label = "tacho13",
4171                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET,
4172                 .mask = GENMASK(7, 0),
4173                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4174                 .bit = BIT(4),
4175         },
4176         {
4177                 .label = "tacho14",
4178                 .reg = MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET,
4179                 .mask = GENMASK(7, 0),
4180                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4181                 .bit = BIT(5),
4182         },
4183         {
4184                 .label = "conf",
4185                 .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
4186         },
4187 };
4188
4189 static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
4190                 .data = mlxplat_mlxcpld_default_fan_data,
4191                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
4192                 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
4193 };
4194
4195 /* Watchdog type1: hardware implementation version1
4196  * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
4197  */
4198 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
4199         {
4200                 .label = "action",
4201                 .reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
4202                 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4203                 .bit = 0,
4204         },
4205         {
4206                 .label = "timeout",
4207                 .reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
4208                 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
4209                 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4210         },
4211         {
4212                 .label = "ping",
4213                 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
4214                 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
4215                 .bit = 0,
4216         },
4217         {
4218                 .label = "reset",
4219                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4220                 .mask = GENMASK(7, 0) & ~BIT(6),
4221                 .bit = 6,
4222         },
4223 };
4224
4225 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
4226         {
4227                 .label = "action",
4228                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4229                 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4230                 .bit = 4,
4231         },
4232         {
4233                 .label = "timeout",
4234                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4235                 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
4236                 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4237         },
4238         {
4239                 .label = "ping",
4240                 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
4241                 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
4242                 .bit = 1,
4243         },
4244 };
4245
4246 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
4247         {
4248                 .data = mlxplat_mlxcpld_wd_main_regs_type1,
4249                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
4250                 .version = MLX_WDT_TYPE1,
4251                 .identity = "mlx-wdt-main",
4252         },
4253         {
4254                 .data = mlxplat_mlxcpld_wd_aux_regs_type1,
4255                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
4256                 .version = MLX_WDT_TYPE1,
4257                 .identity = "mlx-wdt-aux",
4258         },
4259 };
4260
4261 /* Watchdog type2: hardware implementation version 2
4262  * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
4263  */
4264 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
4265         {
4266                 .label = "action",
4267                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4268                 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4269                 .bit = 0,
4270         },
4271         {
4272                 .label = "timeout",
4273                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4274                 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4275                 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4276         },
4277         {
4278                 .label = "timeleft",
4279                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
4280                 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4281         },
4282         {
4283                 .label = "ping",
4284                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4285                 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4286                 .bit = 0,
4287         },
4288         {
4289                 .label = "reset",
4290                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4291                 .mask = GENMASK(7, 0) & ~BIT(6),
4292                 .bit = 6,
4293         },
4294 };
4295
4296 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
4297         {
4298                 .label = "action",
4299                 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4300                 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4301                 .bit = 4,
4302         },
4303         {
4304                 .label = "timeout",
4305                 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4306                 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4307                 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4308         },
4309         {
4310                 .label = "timeleft",
4311                 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
4312                 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4313         },
4314         {
4315                 .label = "ping",
4316                 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4317                 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4318                 .bit = 4,
4319         },
4320 };
4321
4322 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
4323         {
4324                 .data = mlxplat_mlxcpld_wd_main_regs_type2,
4325                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
4326                 .version = MLX_WDT_TYPE2,
4327                 .identity = "mlx-wdt-main",
4328         },
4329         {
4330                 .data = mlxplat_mlxcpld_wd_aux_regs_type2,
4331                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
4332                 .version = MLX_WDT_TYPE2,
4333                 .identity = "mlx-wdt-aux",
4334         },
4335 };
4336
4337 /* Watchdog type3: hardware implementation version 3
4338  * Can be on all systems. It's differentiated by WD capability bit.
4339  * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
4340  * still have only one main watchdog.
4341  */
4342 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
4343         {
4344                 .label = "action",
4345                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4346                 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4347                 .bit = 0,
4348         },
4349         {
4350                 .label = "timeout",
4351                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4352                 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4353                 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
4354         },
4355         {
4356                 .label = "timeleft",
4357                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4358                 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4359         },
4360         {
4361                 .label = "ping",
4362                 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4363                 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4364                 .bit = 0,
4365         },
4366         {
4367                 .label = "reset",
4368                 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4369                 .mask = GENMASK(7, 0) & ~BIT(6),
4370                 .bit = 6,
4371         },
4372 };
4373
4374 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
4375         {
4376                 .label = "action",
4377                 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4378                 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4379                 .bit = 4,
4380         },
4381         {
4382                 .label = "timeout",
4383                 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4384                 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4385                 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
4386         },
4387         {
4388                 .label = "timeleft",
4389                 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4390                 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4391         },
4392         {
4393                 .label = "ping",
4394                 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4395                 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4396                 .bit = 4,
4397         },
4398 };
4399
4400 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
4401         {
4402                 .data = mlxplat_mlxcpld_wd_main_regs_type3,
4403                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
4404                 .version = MLX_WDT_TYPE3,
4405                 .identity = "mlx-wdt-main",
4406         },
4407         {
4408                 .data = mlxplat_mlxcpld_wd_aux_regs_type3,
4409                 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
4410                 .version = MLX_WDT_TYPE3,
4411                 .identity = "mlx-wdt-aux",
4412         },
4413 };
4414
4415 static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
4416 {
4417         switch (reg) {
4418         case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4419         case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4420         case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4421         case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4422         case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4423         case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4424         case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4425         case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4426         case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4427         case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4428         case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4429         case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
4430         case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4431         case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
4432         case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4433         case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4434         case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4435         case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4436         case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4437         case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4438         case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4439         case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4440         case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4441         case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4442         case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4443         case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4444         case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4445         case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4446         case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4447         case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4448         case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4449         case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4450         case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4451         case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
4452         case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
4453         case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
4454         case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
4455         case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4456         case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4457         case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4458         case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4459         case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4460         case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4461         case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4462         case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4463         case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4464         case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4465         case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4466         case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4467         case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4468         case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4469         case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4470         case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4471         case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4472         case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
4473         case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
4474         case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
4475         case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
4476         case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
4477         case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4478         case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4479         case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
4480         case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4481         case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4482         case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
4483         case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4484         case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4485         case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4486         case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4487         case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4488                 return true;
4489         }
4490         return false;
4491 }
4492
4493 static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
4494 {
4495         switch (reg) {
4496         case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
4497         case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
4498         case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
4499         case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
4500         case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
4501         case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
4502         case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
4503         case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
4504         case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
4505         case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
4506         case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
4507         case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
4508         case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4509         case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
4510         case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
4511         case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
4512         case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4513         case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4514         case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4515         case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4516         case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4517         case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4518         case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4519         case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
4520         case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
4521         case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
4522         case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4523         case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4524         case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4525         case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
4526         case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4527         case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
4528         case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4529         case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4530         case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4531         case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
4532         case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4533         case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
4534         case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4535         case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
4536         case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4537         case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
4538         case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4539         case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
4540         case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4541         case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4542         case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
4543         case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4544         case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4545         case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
4546         case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4547         case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4548         case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
4549         case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4550         case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4551         case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
4552         case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4553         case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4554         case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
4555         case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4556         case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4557         case MLXPLAT_CPLD_LPC_REG_EROT_OFFSET:
4558         case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
4559         case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
4560         case MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET:
4561         case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
4562         case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
4563         case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
4564         case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4565         case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
4566         case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4567         case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4568         case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
4569         case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4570         case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4571         case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4572         case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4573         case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4574         case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
4575         case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4576         case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4577         case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
4578         case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4579         case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4580         case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
4581         case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4582         case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4583         case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
4584         case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4585         case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4586         case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4587         case MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET:
4588         case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
4589         case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
4590         case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
4591         case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
4592         case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
4593         case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4594         case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4595         case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
4596         case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4597         case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4598         case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
4599         case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
4600         case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
4601         case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
4602         case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
4603         case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4604         case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4605         case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4606         case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4607         case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
4608         case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
4609         case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
4610         case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
4611         case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
4612         case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
4613         case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
4614         case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
4615         case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
4616         case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
4617         case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
4618         case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
4619         case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
4620         case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
4621         case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4622         case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
4623         case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
4624         case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
4625         case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
4626         case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
4627         case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
4628         case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
4629         case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
4630         case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
4631         case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
4632                 return true;
4633         }
4634         return false;
4635 }
4636
4637 static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
4638 {
4639         switch (reg) {
4640         case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
4641         case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
4642         case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
4643         case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
4644         case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
4645         case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
4646         case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
4647         case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
4648         case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
4649         case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
4650         case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
4651         case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
4652         case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4653         case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
4654         case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
4655         case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
4656         case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4657         case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4658         case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4659         case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4660         case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4661         case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4662         case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4663         case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
4664         case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
4665         case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
4666         case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4667         case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4668         case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4669         case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4670         case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4671         case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4672         case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4673         case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
4674         case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4675         case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
4676         case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4677         case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
4678         case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4679         case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
4680         case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4681         case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
4682         case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4683         case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4684         case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
4685         case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4686         case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4687         case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
4688         case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4689         case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4690         case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
4691         case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4692         case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4693         case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
4694         case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4695         case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4696         case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
4697         case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4698         case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4699         case MLXPLAT_CPLD_LPC_REG_EROT_OFFSET:
4700         case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
4701         case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
4702         case MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET:
4703         case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
4704         case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
4705         case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
4706         case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4707         case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
4708         case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4709         case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4710         case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
4711         case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4712         case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4713         case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4714         case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4715         case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4716         case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
4717         case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4718         case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4719         case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
4720         case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4721         case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4722         case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
4723         case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4724         case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4725         case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
4726         case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4727         case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4728         case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4729         case MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET:
4730         case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
4731         case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4732         case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4733         case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4734         case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4735         case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
4736         case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
4737         case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
4738         case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
4739         case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4740         case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4741         case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4742         case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4743         case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
4744         case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
4745         case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
4746         case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
4747         case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
4748         case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
4749         case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
4750         case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
4751         case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
4752         case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
4753         case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
4754         case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
4755         case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
4756         case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
4757         case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4758         case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
4759         case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
4760         case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
4761         case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
4762         case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
4763         case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
4764         case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
4765         case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
4766         case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
4767         case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
4768                 return true;
4769         }
4770         return false;
4771 }
4772
4773 static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
4774         { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
4775         { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
4776         { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4777         { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
4778 };
4779
4780 static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
4781         { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4782         { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
4783 };
4784
4785 static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
4786         { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
4787           MLXPLAT_CPLD_LOW_AGGRCX_MASK },
4788         { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4789 };
4790
4791 static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
4792         { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4793         { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4794         { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4795         { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4796 };
4797
4798 static const struct reg_default mlxplat_mlxcpld_regmap_rack_switch[] = {
4799         { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, MLXPLAT_REGMAP_NVSWITCH_PWM_DEFAULT },
4800         { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4801         { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4802         { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4803 };
4804
4805 static const struct reg_default mlxplat_mlxcpld_regmap_eth_modular[] = {
4806         { MLXPLAT_CPLD_LPC_REG_GP2_OFFSET, 0x61 },
4807         { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4808         { MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET, 0x00 },
4809         { MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET, 0x00 },
4810         { MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET, 0x00 },
4811         { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4812         { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4813         { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4814         { MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET,
4815           MLXPLAT_CPLD_AGGR_MASK_LC_LOW },
4816 };
4817
4818 struct mlxplat_mlxcpld_regmap_context {
4819         void __iomem *base;
4820 };
4821
4822 static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
4823
4824 static int
4825 mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
4826 {
4827         struct mlxplat_mlxcpld_regmap_context *ctx = context;
4828
4829         *val = ioread8(ctx->base + reg);
4830         return 0;
4831 }
4832
4833 static int
4834 mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
4835 {
4836         struct mlxplat_mlxcpld_regmap_context *ctx = context;
4837
4838         iowrite8(val, ctx->base + reg);
4839         return 0;
4840 }
4841
4842 static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
4843         .reg_bits = 8,
4844         .val_bits = 8,
4845         .max_register = 255,
4846         .cache_type = REGCACHE_FLAT,
4847         .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4848         .readable_reg = mlxplat_mlxcpld_readable_reg,
4849         .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4850         .reg_defaults = mlxplat_mlxcpld_regmap_default,
4851         .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
4852         .reg_read = mlxplat_mlxcpld_reg_read,
4853         .reg_write = mlxplat_mlxcpld_reg_write,
4854 };
4855
4856 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
4857         .reg_bits = 8,
4858         .val_bits = 8,
4859         .max_register = 255,
4860         .cache_type = REGCACHE_FLAT,
4861         .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4862         .readable_reg = mlxplat_mlxcpld_readable_reg,
4863         .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4864         .reg_defaults = mlxplat_mlxcpld_regmap_ng,
4865         .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
4866         .reg_read = mlxplat_mlxcpld_reg_read,
4867         .reg_write = mlxplat_mlxcpld_reg_write,
4868 };
4869
4870 static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
4871         .reg_bits = 8,
4872         .val_bits = 8,
4873         .max_register = 255,
4874         .cache_type = REGCACHE_FLAT,
4875         .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4876         .readable_reg = mlxplat_mlxcpld_readable_reg,
4877         .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4878         .reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
4879         .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
4880         .reg_read = mlxplat_mlxcpld_reg_read,
4881         .reg_write = mlxplat_mlxcpld_reg_write,
4882 };
4883
4884 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
4885         .reg_bits = 8,
4886         .val_bits = 8,
4887         .max_register = 255,
4888         .cache_type = REGCACHE_FLAT,
4889         .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4890         .readable_reg = mlxplat_mlxcpld_readable_reg,
4891         .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4892         .reg_defaults = mlxplat_mlxcpld_regmap_ng400,
4893         .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
4894         .reg_read = mlxplat_mlxcpld_reg_read,
4895         .reg_write = mlxplat_mlxcpld_reg_write,
4896 };
4897
4898 static const struct regmap_config mlxplat_mlxcpld_regmap_config_rack_switch = {
4899         .reg_bits = 8,
4900         .val_bits = 8,
4901         .max_register = 255,
4902         .cache_type = REGCACHE_FLAT,
4903         .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4904         .readable_reg = mlxplat_mlxcpld_readable_reg,
4905         .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4906         .reg_defaults = mlxplat_mlxcpld_regmap_rack_switch,
4907         .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_rack_switch),
4908         .reg_read = mlxplat_mlxcpld_reg_read,
4909         .reg_write = mlxplat_mlxcpld_reg_write,
4910 };
4911
4912 static const struct regmap_config mlxplat_mlxcpld_regmap_config_eth_modular = {
4913         .reg_bits = 8,
4914         .val_bits = 8,
4915         .max_register = 255,
4916         .cache_type = REGCACHE_FLAT,
4917         .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4918         .readable_reg = mlxplat_mlxcpld_readable_reg,
4919         .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4920         .reg_defaults = mlxplat_mlxcpld_regmap_eth_modular,
4921         .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_eth_modular),
4922         .reg_read = mlxplat_mlxcpld_reg_read,
4923         .reg_write = mlxplat_mlxcpld_reg_write,
4924 };
4925
4926 static struct resource mlxplat_mlxcpld_resources[] = {
4927         [0] = DEFINE_RES_IRQ_NAMED(MLXPLAT_CPLD_LPC_SYSIRQ, "mlxreg-hotplug"),
4928 };
4929
4930 static struct platform_device *mlxplat_dev;
4931 static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
4932 static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
4933 static struct mlxreg_core_platform_data *mlxplat_led;
4934 static struct mlxreg_core_platform_data *mlxplat_regs_io;
4935 static struct mlxreg_core_platform_data *mlxplat_fan;
4936 static struct mlxreg_core_platform_data
4937         *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
4938 static const struct regmap_config *mlxplat_regmap_config;
4939
4940 static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
4941 {
4942         int i;
4943
4944         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4945         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4946         mlxplat_mux_data = mlxplat_default_mux_data;
4947         for (i = 0; i < mlxplat_mux_num; i++) {
4948                 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
4949                 mlxplat_mux_data[i].n_values =
4950                                 ARRAY_SIZE(mlxplat_default_channels[i]);
4951         }
4952         mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
4953         mlxplat_hotplug->deferred_nr =
4954                 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4955         mlxplat_led = &mlxplat_default_led_data;
4956         mlxplat_regs_io = &mlxplat_default_regs_io_data;
4957         mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4958
4959         return 1;
4960 }
4961
4962 static int __init mlxplat_dmi_default_wc_matched(const struct dmi_system_id *dmi)
4963 {
4964         int i;
4965
4966         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4967         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4968         mlxplat_mux_data = mlxplat_default_mux_data;
4969         for (i = 0; i < mlxplat_mux_num; i++) {
4970                 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
4971                 mlxplat_mux_data[i].n_values =
4972                                 ARRAY_SIZE(mlxplat_default_channels[i]);
4973         }
4974         mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
4975         mlxplat_hotplug->deferred_nr =
4976                 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4977         mlxplat_led = &mlxplat_default_led_wc_data;
4978         mlxplat_regs_io = &mlxplat_default_regs_io_data;
4979         mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4980
4981         return 1;
4982 }
4983
4984 static int __init mlxplat_dmi_default_eth_wc_blade_matched(const struct dmi_system_id *dmi)
4985 {
4986         int i;
4987
4988         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4989         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4990         mlxplat_mux_data = mlxplat_default_mux_data;
4991         for (i = 0; i < mlxplat_mux_num; i++) {
4992                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4993                 mlxplat_mux_data[i].n_values =
4994                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
4995         }
4996         mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
4997         mlxplat_hotplug->deferred_nr =
4998                 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4999         mlxplat_led = &mlxplat_default_led_eth_wc_blade_data;
5000         mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5001         for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5002                 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5003         mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5004         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
5005
5006         return 1;
5007 }
5008
5009 static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
5010 {
5011         int i;
5012
5013         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5014         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5015         mlxplat_mux_data = mlxplat_default_mux_data;
5016         for (i = 0; i < mlxplat_mux_num; i++) {
5017                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5018                 mlxplat_mux_data[i].n_values =
5019                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
5020         }
5021         mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
5022         mlxplat_hotplug->deferred_nr =
5023                 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5024         mlxplat_led = &mlxplat_msn21xx_led_data;
5025         mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
5026         mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
5027
5028         return 1;
5029 }
5030
5031 static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
5032 {
5033         int i;
5034
5035         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5036         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5037         mlxplat_mux_data = mlxplat_default_mux_data;
5038         for (i = 0; i < mlxplat_mux_num; i++) {
5039                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5040                 mlxplat_mux_data[i].n_values =
5041                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
5042         }
5043         mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
5044         mlxplat_hotplug->deferred_nr =
5045                 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5046         mlxplat_led = &mlxplat_default_led_data;
5047         mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
5048         mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
5049
5050         return 1;
5051 }
5052
5053 static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
5054 {
5055         int i;
5056
5057         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5058         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5059         mlxplat_mux_data = mlxplat_default_mux_data;
5060         for (i = 0; i < mlxplat_mux_num; i++) {
5061                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5062                 mlxplat_mux_data[i].n_values =
5063                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
5064         }
5065         mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
5066         mlxplat_hotplug->deferred_nr =
5067                 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5068         mlxplat_led = &mlxplat_msn21xx_led_data;
5069         mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
5070         mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
5071
5072         return 1;
5073 }
5074
5075 static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
5076 {
5077         int i;
5078
5079         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5080         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5081         mlxplat_mux_data = mlxplat_default_mux_data;
5082         for (i = 0; i < mlxplat_mux_num; i++) {
5083                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5084                 mlxplat_mux_data[i].n_values =
5085                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
5086         }
5087         mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
5088         mlxplat_hotplug->deferred_nr =
5089                 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5090         mlxplat_led = &mlxplat_default_ng_led_data;
5091         mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5092         mlxplat_fan = &mlxplat_default_fan_data;
5093         for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5094                 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5095         mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5096         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
5097
5098         return 1;
5099 }
5100
5101 static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
5102 {
5103         int i;
5104
5105         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
5106         mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
5107         mlxplat_mux_data = mlxplat_extended_mux_data;
5108         for (i = 0; i < mlxplat_mux_num; i++) {
5109                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5110                 mlxplat_mux_data[i].n_values =
5111                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
5112         }
5113         mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
5114         mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
5115         mlxplat_led = &mlxplat_comex_100G_led_data;
5116         mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5117         mlxplat_fan = &mlxplat_default_fan_data;
5118         for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5119                 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5120         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
5121
5122         return 1;
5123 }
5124
5125 static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
5126 {
5127         int i;
5128
5129         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5130         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5131         mlxplat_mux_data = mlxplat_default_mux_data;
5132         for (i = 0; i < mlxplat_mux_num; i++) {
5133                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5134                 mlxplat_mux_data[i].n_values =
5135                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
5136         }
5137         mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
5138         mlxplat_hotplug->deferred_nr =
5139                 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5140         mlxplat_led = &mlxplat_default_ng_led_data;
5141         mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5142         mlxplat_fan = &mlxplat_default_fan_data;
5143         for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5144                 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5145         mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5146         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
5147
5148         return 1;
5149 }
5150
5151 static int __init mlxplat_dmi_modular_matched(const struct dmi_system_id *dmi)
5152 {
5153         int i;
5154
5155         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5156         mlxplat_mux_num = ARRAY_SIZE(mlxplat_modular_mux_data);
5157         mlxplat_mux_data = mlxplat_modular_mux_data;
5158         mlxplat_hotplug = &mlxplat_mlxcpld_modular_data;
5159         mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR;
5160         mlxplat_led = &mlxplat_modular_led_data;
5161         mlxplat_regs_io = &mlxplat_modular_regs_io_data;
5162         mlxplat_fan = &mlxplat_default_fan_data;
5163         for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5164                 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5165         mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5166         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_eth_modular;
5167
5168         return 1;
5169 }
5170
5171 static int __init mlxplat_dmi_nvlink_blade_matched(const struct dmi_system_id *dmi)
5172 {
5173         int i;
5174
5175         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5176         mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5177         mlxplat_mux_data = mlxplat_default_mux_data;
5178         mlxplat_hotplug = &mlxplat_mlxcpld_nvlink_blade_data;
5179         mlxplat_hotplug->deferred_nr =
5180                 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5181         for (i = 0; i < mlxplat_mux_num; i++) {
5182                 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5183                 mlxplat_mux_data[i].n_values =
5184                                 ARRAY_SIZE(mlxplat_msn21xx_channels);
5185         }
5186         mlxplat_regs_io = &mlxplat_nvlink_blade_regs_io_data;
5187         mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5188         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
5189
5190         return 1;
5191 }
5192
5193 static int __init mlxplat_dmi_rack_switch_matched(const struct dmi_system_id *dmi)
5194 {
5195         int i;
5196
5197         mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5198         mlxplat_mux_num = ARRAY_SIZE(mlxplat_rack_switch_mux_data);
5199         mlxplat_mux_data = mlxplat_rack_switch_mux_data;
5200         mlxplat_hotplug = &mlxplat_mlxcpld_rack_switch_data;
5201         mlxplat_hotplug->deferred_nr =
5202                 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5203         mlxplat_led = &mlxplat_default_ng_led_data;
5204         mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5205         mlxplat_fan = &mlxplat_default_fan_data;
5206         for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5207                 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5208         mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5209         mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_rack_switch;
5210
5211         return 1;
5212 }
5213
5214 static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
5215         {
5216                 .callback = mlxplat_dmi_default_wc_matched,
5217                 .matches = {
5218                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
5219                         DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI138"),
5220                 },
5221         },
5222         {
5223                 .callback = mlxplat_dmi_default_matched,
5224                 .matches = {
5225                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
5226                 },
5227         },
5228         {
5229                 .callback = mlxplat_dmi_msn21xx_matched,
5230                 .matches = {
5231                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
5232                 },
5233         },
5234         {
5235                 .callback = mlxplat_dmi_msn274x_matched,
5236                 .matches = {
5237                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
5238                 },
5239         },
5240         {
5241                 .callback = mlxplat_dmi_msn201x_matched,
5242                 .matches = {
5243                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
5244                 },
5245         },
5246         {
5247                 .callback = mlxplat_dmi_default_eth_wc_blade_matched,
5248                 .matches = {
5249                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
5250                         DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI139"),
5251                 },
5252         },
5253         {
5254                 .callback = mlxplat_dmi_qmb7xx_matched,
5255                 .matches = {
5256                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
5257                 },
5258         },
5259         {
5260                 .callback = mlxplat_dmi_qmb7xx_matched,
5261                 .matches = {
5262                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
5263                 },
5264         },
5265         {
5266                 .callback = mlxplat_dmi_comex_matched,
5267                 .matches = {
5268                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
5269                 },
5270         },
5271         {
5272                 .callback = mlxplat_dmi_rack_switch_matched,
5273                 .matches = {
5274                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
5275                         DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI142"),
5276                 },
5277         },
5278         {
5279                 .callback = mlxplat_dmi_ng400_matched,
5280                 .matches = {
5281                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
5282                 },
5283         },
5284         {
5285                 .callback = mlxplat_dmi_modular_matched,
5286                 .matches = {
5287                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0011"),
5288                 },
5289         },
5290         {
5291                 .callback = mlxplat_dmi_nvlink_blade_matched,
5292                 .matches = {
5293                         DMI_MATCH(DMI_BOARD_NAME, "VMOD0015"),
5294                 },
5295         },
5296         {
5297                 .callback = mlxplat_dmi_msn274x_matched,
5298                 .matches = {
5299                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5300                         DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
5301                 },
5302         },
5303         {
5304                 .callback = mlxplat_dmi_default_matched,
5305                 .matches = {
5306                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5307                         DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
5308                 },
5309         },
5310         {
5311                 .callback = mlxplat_dmi_default_matched,
5312                 .matches = {
5313                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5314                         DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
5315                 },
5316         },
5317         {
5318                 .callback = mlxplat_dmi_default_matched,
5319                 .matches = {
5320                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5321                         DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
5322                 },
5323         },
5324         {
5325                 .callback = mlxplat_dmi_default_matched,
5326                 .matches = {
5327                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5328                         DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
5329                 },
5330         },
5331         {
5332                 .callback = mlxplat_dmi_msn21xx_matched,
5333                 .matches = {
5334                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5335                         DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
5336                 },
5337         },
5338         {
5339                 .callback = mlxplat_dmi_msn201x_matched,
5340                 .matches = {
5341                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5342                         DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
5343                 },
5344         },
5345         {
5346                 .callback = mlxplat_dmi_qmb7xx_matched,
5347                 .matches = {
5348                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5349                         DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
5350                 },
5351         },
5352         {
5353                 .callback = mlxplat_dmi_qmb7xx_matched,
5354                 .matches = {
5355                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5356                         DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
5357                 },
5358         },
5359         {
5360                 .callback = mlxplat_dmi_qmb7xx_matched,
5361                 .matches = {
5362                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5363                         DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
5364                 },
5365         },
5366         {
5367                 .callback = mlxplat_dmi_qmb7xx_matched,
5368                 .matches = {
5369                         DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5370                         DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
5371                 },
5372         },
5373         { }
5374 };
5375
5376 MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
5377
5378 static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
5379 {
5380         struct i2c_adapter *search_adap;
5381         int shift, i;
5382
5383         /* Scan adapters from expected id to verify it is free. */
5384         *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
5385         for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
5386              mlxplat_max_adap_num; i++) {
5387                 search_adap = i2c_get_adapter(i);
5388                 if (search_adap) {
5389                         i2c_put_adapter(search_adap);
5390                         continue;
5391                 }
5392
5393                 /* Return if expected parent adapter is free. */
5394                 if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
5395                         return 0;
5396                 break;
5397         }
5398
5399         /* Return with error if free id for adapter is not found. */
5400         if (i == mlxplat_max_adap_num)
5401                 return -ENODEV;
5402
5403         /* Shift adapter ids, since expected parent adapter is not free. */
5404         *nr = i;
5405         for (i = 0; i < mlxplat_mux_num; i++) {
5406                 shift = *nr - mlxplat_mux_data[i].parent;
5407                 mlxplat_mux_data[i].parent = *nr;
5408                 mlxplat_mux_data[i].base_nr += shift;
5409                 if (shift > 0)
5410                         mlxplat_hotplug->shift_nr = shift;
5411         }
5412
5413         return 0;
5414 }
5415
5416 static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
5417 {
5418         u32 regval;
5419         int i, rc;
5420
5421         rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
5422                          &regval);
5423         if (rc)
5424                 return rc;
5425
5426         if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
5427                 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
5428                         if (mlxplat_wd_data[i])
5429                                 mlxplat_wd_data[i] =
5430                                         &mlxplat_mlxcpld_wd_set_type3[i];
5431                 }
5432         }
5433
5434         return 0;
5435 }
5436
5437 static int __init mlxplat_init(void)
5438 {
5439         struct mlxplat_priv *priv;
5440         int i, j, nr, err;
5441
5442         if (!dmi_check_system(mlxplat_dmi_table))
5443                 return -ENODEV;
5444
5445         mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, PLATFORM_DEVID_NONE,
5446                                         mlxplat_lpc_resources,
5447                                         ARRAY_SIZE(mlxplat_lpc_resources));
5448
5449         if (IS_ERR(mlxplat_dev))
5450                 return PTR_ERR(mlxplat_dev);
5451
5452         priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
5453                             GFP_KERNEL);
5454         if (!priv) {
5455                 err = -ENOMEM;
5456                 goto fail_alloc;
5457         }
5458         platform_set_drvdata(mlxplat_dev, priv);
5459
5460         mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
5461                                mlxplat_lpc_resources[1].start, 1);
5462         if (!mlxplat_mlxcpld_regmap_ctx.base) {
5463                 err = -ENOMEM;
5464                 goto fail_alloc;
5465         }
5466
5467         if (!mlxplat_regmap_config)
5468                 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
5469
5470         priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
5471                                         &mlxplat_mlxcpld_regmap_ctx,
5472                                         mlxplat_regmap_config);
5473         if (IS_ERR(priv->regmap)) {
5474                 err = PTR_ERR(priv->regmap);
5475                 goto fail_alloc;
5476         }
5477
5478         err = mlxplat_mlxcpld_verify_bus_topology(&nr);
5479         if (nr < 0)
5480                 goto fail_alloc;
5481
5482         nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
5483         if (mlxplat_i2c)
5484                 mlxplat_i2c->regmap = priv->regmap;
5485         priv->pdev_i2c = platform_device_register_resndata(&mlxplat_dev->dev, "i2c_mlxcpld",
5486                                                            nr, mlxplat_mlxcpld_resources,
5487                                                            ARRAY_SIZE(mlxplat_mlxcpld_resources),
5488                                                            mlxplat_i2c, sizeof(*mlxplat_i2c));
5489         if (IS_ERR(priv->pdev_i2c)) {
5490                 err = PTR_ERR(priv->pdev_i2c);
5491                 goto fail_alloc;
5492         }
5493
5494         for (i = 0; i < mlxplat_mux_num; i++) {
5495                 priv->pdev_mux[i] = platform_device_register_resndata(&priv->pdev_i2c->dev,
5496                                                                       "i2c-mux-reg", i, NULL, 0,
5497                                                                       &mlxplat_mux_data[i],
5498                                                                       sizeof(mlxplat_mux_data[i]));
5499                 if (IS_ERR(priv->pdev_mux[i])) {
5500                         err = PTR_ERR(priv->pdev_mux[i]);
5501                         goto fail_platform_mux_register;
5502                 }
5503         }
5504
5505         /* Add hotplug driver */
5506         if (mlxplat_hotplug) {
5507                 mlxplat_hotplug->regmap = priv->regmap;
5508                 priv->pdev_hotplug =
5509                 platform_device_register_resndata(&mlxplat_dev->dev,
5510                                                   "mlxreg-hotplug", PLATFORM_DEVID_NONE,
5511                                                   mlxplat_mlxcpld_resources,
5512                                                   ARRAY_SIZE(mlxplat_mlxcpld_resources),
5513                                                   mlxplat_hotplug, sizeof(*mlxplat_hotplug));
5514                 if (IS_ERR(priv->pdev_hotplug)) {
5515                         err = PTR_ERR(priv->pdev_hotplug);
5516                         goto fail_platform_mux_register;
5517                 }
5518         }
5519
5520         /* Set default registers. */
5521         for (j = 0; j <  mlxplat_regmap_config->num_reg_defaults; j++) {
5522                 err = regmap_write(priv->regmap,
5523                                    mlxplat_regmap_config->reg_defaults[j].reg,
5524                                    mlxplat_regmap_config->reg_defaults[j].def);
5525                 if (err)
5526                         goto fail_platform_mux_register;
5527         }
5528
5529         /* Add LED driver. */
5530         if (mlxplat_led) {
5531                 mlxplat_led->regmap = priv->regmap;
5532                 priv->pdev_led =
5533                 platform_device_register_resndata(&mlxplat_dev->dev, "leds-mlxreg",
5534                                                   PLATFORM_DEVID_NONE, NULL, 0, mlxplat_led,
5535                                                   sizeof(*mlxplat_led));
5536                 if (IS_ERR(priv->pdev_led)) {
5537                         err = PTR_ERR(priv->pdev_led);
5538                         goto fail_platform_hotplug_register;
5539                 }
5540         }
5541
5542         /* Add registers io access driver. */
5543         if (mlxplat_regs_io) {
5544                 mlxplat_regs_io->regmap = priv->regmap;
5545                 priv->pdev_io_regs = platform_device_register_resndata(&mlxplat_dev->dev,
5546                                                                        "mlxreg-io",
5547                                                                        PLATFORM_DEVID_NONE, NULL,
5548                                                                        0, mlxplat_regs_io,
5549                                                                        sizeof(*mlxplat_regs_io));
5550                 if (IS_ERR(priv->pdev_io_regs)) {
5551                         err = PTR_ERR(priv->pdev_io_regs);
5552                         goto fail_platform_led_register;
5553                 }
5554         }
5555
5556         /* Add FAN driver. */
5557         if (mlxplat_fan) {
5558                 mlxplat_fan->regmap = priv->regmap;
5559                 priv->pdev_fan = platform_device_register_resndata(&mlxplat_dev->dev, "mlxreg-fan",
5560                                                                    PLATFORM_DEVID_NONE, NULL, 0,
5561                                                                    mlxplat_fan,
5562                                                                    sizeof(*mlxplat_fan));
5563                 if (IS_ERR(priv->pdev_fan)) {
5564                         err = PTR_ERR(priv->pdev_fan);
5565                         goto fail_platform_io_regs_register;
5566                 }
5567         }
5568
5569         /* Add WD drivers. */
5570         err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
5571         if (err)
5572                 goto fail_platform_wd_register;
5573         for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) {
5574                 if (mlxplat_wd_data[j]) {
5575                         mlxplat_wd_data[j]->regmap = priv->regmap;
5576                         priv->pdev_wd[j] =
5577                                 platform_device_register_resndata(&mlxplat_dev->dev, "mlx-wdt", j,
5578                                                                   NULL, 0, mlxplat_wd_data[j],
5579                                                                   sizeof(*mlxplat_wd_data[j]));
5580                         if (IS_ERR(priv->pdev_wd[j])) {
5581                                 err = PTR_ERR(priv->pdev_wd[j]);
5582                                 goto fail_platform_wd_register;
5583                         }
5584                 }
5585         }
5586
5587         /* Sync registers with hardware. */
5588         regcache_mark_dirty(priv->regmap);
5589         err = regcache_sync(priv->regmap);
5590         if (err)
5591                 goto fail_platform_wd_register;
5592
5593         return 0;
5594
5595 fail_platform_wd_register:
5596         while (--j >= 0)
5597                 platform_device_unregister(priv->pdev_wd[j]);
5598         if (mlxplat_fan)
5599                 platform_device_unregister(priv->pdev_fan);
5600 fail_platform_io_regs_register:
5601         if (mlxplat_regs_io)
5602                 platform_device_unregister(priv->pdev_io_regs);
5603 fail_platform_led_register:
5604         if (mlxplat_led)
5605                 platform_device_unregister(priv->pdev_led);
5606 fail_platform_hotplug_register:
5607         if (mlxplat_hotplug)
5608                 platform_device_unregister(priv->pdev_hotplug);
5609 fail_platform_mux_register:
5610         while (--i >= 0)
5611                 platform_device_unregister(priv->pdev_mux[i]);
5612         platform_device_unregister(priv->pdev_i2c);
5613 fail_alloc:
5614         platform_device_unregister(mlxplat_dev);
5615
5616         return err;
5617 }
5618 module_init(mlxplat_init);
5619
5620 static void __exit mlxplat_exit(void)
5621 {
5622         struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
5623         int i;
5624
5625         for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0 ; i--)
5626                 platform_device_unregister(priv->pdev_wd[i]);
5627         if (priv->pdev_fan)
5628                 platform_device_unregister(priv->pdev_fan);
5629         if (priv->pdev_io_regs)
5630                 platform_device_unregister(priv->pdev_io_regs);
5631         if (priv->pdev_led)
5632                 platform_device_unregister(priv->pdev_led);
5633         if (priv->pdev_hotplug)
5634                 platform_device_unregister(priv->pdev_hotplug);
5635
5636         for (i = mlxplat_mux_num - 1; i >= 0 ; i--)
5637                 platform_device_unregister(priv->pdev_mux[i]);
5638
5639         platform_device_unregister(priv->pdev_i2c);
5640         platform_device_unregister(mlxplat_dev);
5641 }
5642 module_exit(mlxplat_exit);
5643
5644 MODULE_AUTHOR("Vadim Pasternak (vadimp@mellanox.com)");
5645 MODULE_DESCRIPTION("Mellanox platform driver");
5646 MODULE_LICENSE("Dual BSD/GPL");