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