xref: /linux/drivers/platform/x86/mlx-platform.c (revision 4fd18fc38757217c746aa063ba9e4729814dc737)
1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /*
3  * Mellanox platform driver
4  *
5  * Copyright (C) 2016-2018 Mellanox Technologies
6  * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
7  */
8 
9 #include <linux/device.h>
10 #include <linux/dmi.h>
11 #include <linux/i2c.h>
12 #include <linux/i2c-mux.h>
13 #include <linux/io.h>
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/platform_data/i2c-mux-reg.h>
17 #include <linux/platform_data/mlxreg.h>
18 #include <linux/regmap.h>
19 
20 #define MLX_PLAT_DEVICE_NAME		"mlxplat"
21 
22 /* LPC bus IO offsets */
23 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR		0x2000
24 #define MLXPLAT_CPLD_LPC_REG_BASE_ADRR		0x2500
25 #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET	0x00
26 #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET	0x01
27 #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET	0x02
28 #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET	0x03
29 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET	0x04
30 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET	0x06
31 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET	0x08
32 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET	0x0a
33 #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET	0x1d
34 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET	0x1e
35 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET	0x1f
36 #define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET	0x20
37 #define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET	0x21
38 #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET	0x22
39 #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET	0x23
40 #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET	0x24
41 #define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION	0x2a
42 #define MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET	0x2b
43 #define MLXPLAT_CPLD_LPC_REG_GP0_OFFSET		0x2e
44 #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET		0x30
45 #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET		0x31
46 #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET		0x32
47 #define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET		0x33
48 #define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET	0x37
49 #define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET	0x3a
50 #define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET	0x3b
51 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET	0x40
52 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET	0x41
53 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET	0x42
54 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET	0x43
55 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET	0x44
56 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET 0x45
57 #define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
58 #define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET	0x51
59 #define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET	0x52
60 #define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET		0x58
61 #define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET	0x59
62 #define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET	0x5a
63 #define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET		0x64
64 #define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET	0x65
65 #define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET	0x66
66 #define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET		0x88
67 #define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET	0x89
68 #define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET	0x8a
69 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET	0xc7
70 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET	0xc8
71 #define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET	0xc9
72 #define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET	0xcb
73 #define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET	0xcd
74 #define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET	0xce
75 #define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET	0xcf
76 #define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET	0xd1
77 #define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET	0xd2
78 #define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET	0xd3
79 #define MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET	0xde
80 #define MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET	0xdf
81 #define MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET	0xe0
82 #define MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET	0xe1
83 #define MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET	0xe2
84 #define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET	0xe3
85 #define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET	0xe4
86 #define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET	0xe5
87 #define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET	0xe6
88 #define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET	0xe7
89 #define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET	0xe8
90 #define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET	0xe9
91 #define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET	0xeb
92 #define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET	0xec
93 #define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET	0xed
94 #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET	0xee
95 #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET	0xef
96 #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET	0xf0
97 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET	0xf5
98 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET	0xf6
99 #define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET	0xf7
100 #define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET	0xf8
101 #define MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET 0xf9
102 #define MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET	0xfb
103 #define MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET	0xfc
104 #define MLXPLAT_CPLD_LPC_IO_RANGE		0x100
105 #define MLXPLAT_CPLD_LPC_I2C_CH1_OFF		0xdb
106 #define MLXPLAT_CPLD_LPC_I2C_CH2_OFF		0xda
107 #define MLXPLAT_CPLD_LPC_I2C_CH3_OFF		0xdc
108 
109 #define MLXPLAT_CPLD_LPC_PIO_OFFSET		0x10000UL
110 #define MLXPLAT_CPLD_LPC_REG1	((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
111 				  MLXPLAT_CPLD_LPC_I2C_CH1_OFF) | \
112 				  MLXPLAT_CPLD_LPC_PIO_OFFSET)
113 #define MLXPLAT_CPLD_LPC_REG2	((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
114 				  MLXPLAT_CPLD_LPC_I2C_CH2_OFF) | \
115 				  MLXPLAT_CPLD_LPC_PIO_OFFSET)
116 #define MLXPLAT_CPLD_LPC_REG3	((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
117 				  MLXPLAT_CPLD_LPC_I2C_CH3_OFF) | \
118 				  MLXPLAT_CPLD_LPC_PIO_OFFSET)
119 
120 /* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
121 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF	0x04
122 #define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF	0x08
123 #define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF	0x08
124 #define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF	0x40
125 #define MLXPLAT_CPLD_AGGR_MASK_DEF	(MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
126 					 MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
127 					 MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
128 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG	0x01
129 #define MLXPLAT_CPLD_AGGR_MASK_NG_DEF	0x04
130 #define MLXPLAT_CPLD_AGGR_MASK_COMEX	BIT(0)
131 #define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW	0xc1
132 #define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C	BIT(6)
133 #define MLXPLAT_CPLD_PSU_MASK		GENMASK(1, 0)
134 #define MLXPLAT_CPLD_PWR_MASK		GENMASK(1, 0)
135 #define MLXPLAT_CPLD_PSU_EXT_MASK	GENMASK(3, 0)
136 #define MLXPLAT_CPLD_PWR_EXT_MASK	GENMASK(3, 0)
137 #define MLXPLAT_CPLD_FAN_MASK		GENMASK(3, 0)
138 #define MLXPLAT_CPLD_ASIC_MASK		GENMASK(1, 0)
139 #define MLXPLAT_CPLD_FAN_NG_MASK	GENMASK(5, 0)
140 #define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK	GENMASK(7, 4)
141 #define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK	GENMASK(3, 0)
142 #define MLXPLAT_CPLD_VOLTREG_UPD_MASK	GENMASK(5, 4)
143 #define MLXPLAT_CPLD_I2C_CAP_BIT	0x04
144 #define MLXPLAT_CPLD_I2C_CAP_MASK	GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
145 
146 /* Masks for aggregation for comex carriers */
147 #define MLXPLAT_CPLD_AGGR_MASK_CARRIER	BIT(1)
148 #define MLXPLAT_CPLD_AGGR_MASK_CARR_DEF	(MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
149 					 MLXPLAT_CPLD_AGGR_MASK_CARRIER)
150 #define MLXPLAT_CPLD_LOW_AGGRCX_MASK	0xc1
151 
152 /* Default I2C parent bus number */
153 #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR	1
154 
155 /* Maximum number of possible physical buses equipped on system */
156 #define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM	16
157 #define MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM	24
158 
159 /* Number of channels in group */
160 #define MLXPLAT_CPLD_GRP_CHNL_NUM		8
161 
162 /* Start channel numbers */
163 #define MLXPLAT_CPLD_CH1			2
164 #define MLXPLAT_CPLD_CH2			10
165 #define MLXPLAT_CPLD_CH3			18
166 
167 /* Number of LPC attached MUX platform devices */
168 #define MLXPLAT_CPLD_LPC_MUX_DEVS		3
169 
170 /* Hotplug devices adapter numbers */
171 #define MLXPLAT_CPLD_NR_NONE			-1
172 #define MLXPLAT_CPLD_PSU_DEFAULT_NR		10
173 #define MLXPLAT_CPLD_PSU_MSNXXXX_NR		4
174 #define MLXPLAT_CPLD_FAN1_DEFAULT_NR		11
175 #define MLXPLAT_CPLD_FAN2_DEFAULT_NR		12
176 #define MLXPLAT_CPLD_FAN3_DEFAULT_NR		13
177 #define MLXPLAT_CPLD_FAN4_DEFAULT_NR		14
178 
179 /* Masks and default values for watchdogs */
180 #define MLXPLAT_CPLD_WD1_CLEAR_MASK	GENMASK(7, 1)
181 #define MLXPLAT_CPLD_WD2_CLEAR_MASK	(GENMASK(7, 0) & ~BIT(1))
182 
183 #define MLXPLAT_CPLD_WD_TYPE1_TO_MASK	GENMASK(7, 4)
184 #define MLXPLAT_CPLD_WD_TYPE2_TO_MASK	0
185 #define MLXPLAT_CPLD_WD_RESET_ACT_MASK	GENMASK(7, 1)
186 #define MLXPLAT_CPLD_WD_FAN_ACT_MASK	(GENMASK(7, 0) & ~BIT(4))
187 #define MLXPLAT_CPLD_WD_COUNT_ACT_MASK	(GENMASK(7, 0) & ~BIT(7))
188 #define MLXPLAT_CPLD_WD_CPBLTY_MASK	(GENMASK(7, 0) & ~BIT(6))
189 #define MLXPLAT_CPLD_WD_DFLT_TIMEOUT	30
190 #define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT	600
191 #define MLXPLAT_CPLD_WD_MAX_DEVS	2
192 
193 /* mlxplat_priv - platform private data
194  * @pdev_i2c - i2c controller platform device
195  * @pdev_mux - array of mux platform devices
196  * @pdev_hotplug - hotplug platform devices
197  * @pdev_led - led platform devices
198  * @pdev_io_regs - register access platform devices
199  * @pdev_fan - FAN platform devices
200  * @pdev_wd - array of watchdog platform devices
201  * @regmap: device register map
202  */
203 struct mlxplat_priv {
204 	struct platform_device *pdev_i2c;
205 	struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
206 	struct platform_device *pdev_hotplug;
207 	struct platform_device *pdev_led;
208 	struct platform_device *pdev_io_regs;
209 	struct platform_device *pdev_fan;
210 	struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
211 	void *regmap;
212 };
213 
214 /* Regions for LPC I2C controller and LPC base register space */
215 static const struct resource mlxplat_lpc_resources[] = {
216 	[0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
217 			       MLXPLAT_CPLD_LPC_IO_RANGE,
218 			       "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
219 	[1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
220 			       MLXPLAT_CPLD_LPC_IO_RANGE,
221 			       "mlxplat_cpld_lpc_regs",
222 			       IORESOURCE_IO),
223 };
224 
225 /* Platform i2c next generation systems data */
226 static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
227 	{
228 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
229 		.mask = MLXPLAT_CPLD_I2C_CAP_MASK,
230 		.bit = MLXPLAT_CPLD_I2C_CAP_BIT,
231 	},
232 };
233 
234 static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
235 	{
236 		.data = mlxplat_mlxcpld_i2c_ng_items_data,
237 	},
238 };
239 
240 /* Platform next generation systems i2c data */
241 static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
242 	.items = mlxplat_mlxcpld_i2c_ng_items,
243 	.cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
244 	.mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
245 	.cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
246 	.mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
247 };
248 
249 /* Platform default channels */
250 static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
251 	{
252 		MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
253 		MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
254 		5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
255 	},
256 	{
257 		MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
258 		MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
259 		5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
260 	},
261 };
262 
263 /* Platform channels for MSN21xx system family */
264 static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
265 
266 /* Platform mux data */
267 static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
268 	{
269 		.parent = 1,
270 		.base_nr = MLXPLAT_CPLD_CH1,
271 		.write_only = 1,
272 		.reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
273 		.reg_size = 1,
274 		.idle_in_use = 1,
275 	},
276 	{
277 		.parent = 1,
278 		.base_nr = MLXPLAT_CPLD_CH2,
279 		.write_only = 1,
280 		.reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
281 		.reg_size = 1,
282 		.idle_in_use = 1,
283 	},
284 
285 };
286 
287 /* Platform mux configuration variables */
288 static int mlxplat_max_adap_num;
289 static int mlxplat_mux_num;
290 static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
291 
292 /* Platform extended mux data */
293 static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
294 	{
295 		.parent = 1,
296 		.base_nr = MLXPLAT_CPLD_CH1,
297 		.write_only = 1,
298 		.reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
299 		.reg_size = 1,
300 		.idle_in_use = 1,
301 	},
302 	{
303 		.parent = 1,
304 		.base_nr = MLXPLAT_CPLD_CH2,
305 		.write_only = 1,
306 		.reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
307 		.reg_size = 1,
308 		.idle_in_use = 1,
309 	},
310 	{
311 		.parent = 1,
312 		.base_nr = MLXPLAT_CPLD_CH3,
313 		.write_only = 1,
314 		.reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
315 		.reg_size = 1,
316 		.idle_in_use = 1,
317 	},
318 
319 };
320 
321 /* Platform hotplug devices */
322 static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
323 	{
324 		I2C_BOARD_INFO("dps460", 0x59),
325 	},
326 	{
327 		I2C_BOARD_INFO("dps460", 0x58),
328 	},
329 };
330 
331 static struct i2c_board_info mlxplat_mlxcpld_ext_pwr[] = {
332 	{
333 		I2C_BOARD_INFO("dps460", 0x5b),
334 	},
335 	{
336 		I2C_BOARD_INFO("dps460", 0x5a),
337 	},
338 };
339 
340 static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
341 	{
342 		I2C_BOARD_INFO("24c32", 0x50),
343 	},
344 	{
345 		I2C_BOARD_INFO("24c32", 0x50),
346 	},
347 	{
348 		I2C_BOARD_INFO("24c32", 0x50),
349 	},
350 	{
351 		I2C_BOARD_INFO("24c32", 0x50),
352 	},
353 };
354 
355 /* Platform hotplug comex carrier system family data */
356 static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
357 	{
358 		.label = "psu1",
359 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
360 		.mask = BIT(0),
361 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
362 	},
363 	{
364 		.label = "psu2",
365 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
366 		.mask = BIT(1),
367 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
368 	},
369 };
370 
371 /* Platform hotplug default data */
372 static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
373 	{
374 		.label = "psu1",
375 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
376 		.mask = BIT(0),
377 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
378 	},
379 	{
380 		.label = "psu2",
381 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
382 		.mask = BIT(1),
383 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
384 	},
385 };
386 
387 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
388 	{
389 		.label = "pwr1",
390 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
391 		.mask = BIT(0),
392 		.hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
393 		.hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
394 	},
395 	{
396 		.label = "pwr2",
397 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
398 		.mask = BIT(1),
399 		.hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
400 		.hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
401 	},
402 };
403 
404 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
405 	{
406 		.label = "fan1",
407 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
408 		.mask = BIT(0),
409 		.hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
410 		.hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
411 	},
412 	{
413 		.label = "fan2",
414 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
415 		.mask = BIT(1),
416 		.hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
417 		.hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
418 	},
419 	{
420 		.label = "fan3",
421 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
422 		.mask = BIT(2),
423 		.hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
424 		.hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
425 	},
426 	{
427 		.label = "fan4",
428 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
429 		.mask = BIT(3),
430 		.hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
431 		.hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
432 	},
433 };
434 
435 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
436 	{
437 		.label = "asic1",
438 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
439 		.mask = MLXPLAT_CPLD_ASIC_MASK,
440 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
441 	},
442 };
443 
444 static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
445 	{
446 		.data = mlxplat_mlxcpld_default_psu_items_data,
447 		.aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
448 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
449 		.mask = MLXPLAT_CPLD_PSU_MASK,
450 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
451 		.inversed = 1,
452 		.health = false,
453 	},
454 	{
455 		.data = mlxplat_mlxcpld_default_pwr_items_data,
456 		.aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
457 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
458 		.mask = MLXPLAT_CPLD_PWR_MASK,
459 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
460 		.inversed = 0,
461 		.health = false,
462 	},
463 	{
464 		.data = mlxplat_mlxcpld_default_fan_items_data,
465 		.aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
466 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
467 		.mask = MLXPLAT_CPLD_FAN_MASK,
468 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
469 		.inversed = 1,
470 		.health = false,
471 	},
472 	{
473 		.data = mlxplat_mlxcpld_default_asic_items_data,
474 		.aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
475 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
476 		.mask = MLXPLAT_CPLD_ASIC_MASK,
477 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
478 		.inversed = 0,
479 		.health = true,
480 	},
481 };
482 
483 static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
484 	{
485 		.data = mlxplat_mlxcpld_comex_psu_items_data,
486 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
487 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
488 		.mask = MLXPLAT_CPLD_PSU_MASK,
489 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
490 		.inversed = 1,
491 		.health = false,
492 	},
493 	{
494 		.data = mlxplat_mlxcpld_default_pwr_items_data,
495 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
496 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
497 		.mask = MLXPLAT_CPLD_PWR_MASK,
498 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
499 		.inversed = 0,
500 		.health = false,
501 	},
502 	{
503 		.data = mlxplat_mlxcpld_default_fan_items_data,
504 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
505 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
506 		.mask = MLXPLAT_CPLD_FAN_MASK,
507 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
508 		.inversed = 1,
509 		.health = false,
510 	},
511 	{
512 		.data = mlxplat_mlxcpld_default_asic_items_data,
513 		.aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
514 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
515 		.mask = MLXPLAT_CPLD_ASIC_MASK,
516 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
517 		.inversed = 0,
518 		.health = true,
519 	},
520 };
521 
522 static
523 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
524 	.items = mlxplat_mlxcpld_default_items,
525 	.counter = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
526 	.cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
527 	.mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
528 	.cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
529 	.mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
530 };
531 
532 static
533 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
534 	.items = mlxplat_mlxcpld_comex_items,
535 	.counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
536 	.cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
537 	.mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
538 	.cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
539 	.mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
540 };
541 
542 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
543 	{
544 		.label = "pwr1",
545 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
546 		.mask = BIT(0),
547 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
548 	},
549 	{
550 		.label = "pwr2",
551 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
552 		.mask = BIT(1),
553 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
554 	},
555 };
556 
557 /* Platform hotplug MSN21xx system family data */
558 static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
559 	{
560 		.data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
561 		.aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
562 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
563 		.mask = MLXPLAT_CPLD_PWR_MASK,
564 		.count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
565 		.inversed = 0,
566 		.health = false,
567 	},
568 	{
569 		.data = mlxplat_mlxcpld_default_asic_items_data,
570 		.aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
571 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
572 		.mask = MLXPLAT_CPLD_ASIC_MASK,
573 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
574 		.inversed = 0,
575 		.health = true,
576 	},
577 };
578 
579 static
580 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
581 	.items = mlxplat_mlxcpld_msn21xx_items,
582 	.counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
583 	.cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
584 	.mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
585 	.cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
586 	.mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
587 };
588 
589 /* Platform hotplug msn274x system family data */
590 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
591 	{
592 		.label = "psu1",
593 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
594 		.mask = BIT(0),
595 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
596 	},
597 	{
598 		.label = "psu2",
599 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
600 		.mask = BIT(1),
601 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
602 	},
603 };
604 
605 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
606 	{
607 		.label = "pwr1",
608 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
609 		.mask = BIT(0),
610 		.hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
611 		.hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
612 	},
613 	{
614 		.label = "pwr2",
615 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
616 		.mask = BIT(1),
617 		.hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
618 		.hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
619 	},
620 };
621 
622 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
623 	{
624 		.label = "fan1",
625 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
626 		.mask = BIT(0),
627 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
628 	},
629 	{
630 		.label = "fan2",
631 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
632 		.mask = BIT(1),
633 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
634 	},
635 	{
636 		.label = "fan3",
637 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
638 		.mask = BIT(2),
639 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
640 	},
641 	{
642 		.label = "fan4",
643 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
644 		.mask = BIT(3),
645 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
646 	},
647 };
648 
649 static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
650 	{
651 		.data = mlxplat_mlxcpld_msn274x_psu_items_data,
652 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
653 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
654 		.mask = MLXPLAT_CPLD_PSU_MASK,
655 		.count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
656 		.inversed = 1,
657 		.health = false,
658 	},
659 	{
660 		.data = mlxplat_mlxcpld_default_ng_pwr_items_data,
661 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
662 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
663 		.mask = MLXPLAT_CPLD_PWR_MASK,
664 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
665 		.inversed = 0,
666 		.health = false,
667 	},
668 	{
669 		.data = mlxplat_mlxcpld_msn274x_fan_items_data,
670 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
671 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
672 		.mask = MLXPLAT_CPLD_FAN_MASK,
673 		.count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
674 		.inversed = 1,
675 		.health = false,
676 	},
677 	{
678 		.data = mlxplat_mlxcpld_default_asic_items_data,
679 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
680 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
681 		.mask = MLXPLAT_CPLD_ASIC_MASK,
682 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
683 		.inversed = 0,
684 		.health = true,
685 	},
686 };
687 
688 static
689 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
690 	.items = mlxplat_mlxcpld_msn274x_items,
691 	.counter = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
692 	.cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
693 	.mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
694 	.cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
695 	.mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
696 };
697 
698 /* Platform hotplug MSN201x system family data */
699 static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
700 	{
701 		.label = "pwr1",
702 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
703 		.mask = BIT(0),
704 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
705 	},
706 	{
707 		.label = "pwr2",
708 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
709 		.mask = BIT(1),
710 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
711 	},
712 };
713 
714 static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
715 	{
716 		.data = mlxplat_mlxcpld_msn201x_pwr_items_data,
717 		.aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
718 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
719 		.mask = MLXPLAT_CPLD_PWR_MASK,
720 		.count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
721 		.inversed = 0,
722 		.health = false,
723 	},
724 	{
725 		.data = mlxplat_mlxcpld_default_asic_items_data,
726 		.aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
727 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
728 		.mask = MLXPLAT_CPLD_ASIC_MASK,
729 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
730 		.inversed = 0,
731 		.health = true,
732 	},
733 };
734 
735 static
736 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
737 	.items = mlxplat_mlxcpld_msn201x_items,
738 	.counter = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
739 	.cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
740 	.mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
741 	.cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
742 	.mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
743 };
744 
745 /* Platform hotplug next generation system family data */
746 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
747 	{
748 		.label = "psu1",
749 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
750 		.mask = BIT(0),
751 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
752 	},
753 	{
754 		.label = "psu2",
755 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
756 		.mask = BIT(1),
757 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
758 	},
759 };
760 
761 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
762 	{
763 		.label = "fan1",
764 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
765 		.mask = BIT(0),
766 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
767 		.bit = BIT(0),
768 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
769 	},
770 	{
771 		.label = "fan2",
772 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
773 		.mask = BIT(1),
774 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
775 		.bit = BIT(1),
776 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
777 	},
778 	{
779 		.label = "fan3",
780 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
781 		.mask = BIT(2),
782 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
783 		.bit = BIT(2),
784 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
785 	},
786 	{
787 		.label = "fan4",
788 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
789 		.mask = BIT(3),
790 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
791 		.bit = BIT(3),
792 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
793 	},
794 	{
795 		.label = "fan5",
796 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
797 		.mask = BIT(4),
798 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
799 		.bit = BIT(4),
800 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
801 	},
802 	{
803 		.label = "fan6",
804 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
805 		.mask = BIT(5),
806 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
807 		.bit = BIT(5),
808 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
809 	},
810 };
811 
812 static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
813 	{
814 		.data = mlxplat_mlxcpld_default_ng_psu_items_data,
815 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
816 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
817 		.mask = MLXPLAT_CPLD_PSU_MASK,
818 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
819 		.inversed = 1,
820 		.health = false,
821 	},
822 	{
823 		.data = mlxplat_mlxcpld_default_ng_pwr_items_data,
824 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
825 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
826 		.mask = MLXPLAT_CPLD_PWR_MASK,
827 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
828 		.inversed = 0,
829 		.health = false,
830 	},
831 	{
832 		.data = mlxplat_mlxcpld_default_ng_fan_items_data,
833 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
834 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
835 		.mask = MLXPLAT_CPLD_FAN_NG_MASK,
836 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
837 		.inversed = 1,
838 		.health = false,
839 	},
840 	{
841 		.data = mlxplat_mlxcpld_default_asic_items_data,
842 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
843 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
844 		.mask = MLXPLAT_CPLD_ASIC_MASK,
845 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
846 		.inversed = 0,
847 		.health = true,
848 	},
849 };
850 
851 static
852 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
853 	.items = mlxplat_mlxcpld_default_ng_items,
854 	.counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
855 	.cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
856 	.mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
857 	.cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
858 	.mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
859 };
860 
861 /* Platform hotplug extended system family data */
862 static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
863 	{
864 		.label = "psu1",
865 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
866 		.mask = BIT(0),
867 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
868 	},
869 	{
870 		.label = "psu2",
871 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
872 		.mask = BIT(1),
873 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
874 	},
875 	{
876 		.label = "psu3",
877 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
878 		.mask = BIT(2),
879 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
880 	},
881 	{
882 		.label = "psu4",
883 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
884 		.mask = BIT(3),
885 		.hpdev.nr = MLXPLAT_CPLD_NR_NONE,
886 	},
887 };
888 
889 static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
890 	{
891 		.label = "pwr1",
892 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
893 		.mask = BIT(0),
894 		.hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
895 		.hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
896 	},
897 	{
898 		.label = "pwr2",
899 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
900 		.mask = BIT(1),
901 		.hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
902 		.hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
903 	},
904 	{
905 		.label = "pwr3",
906 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
907 		.mask = BIT(2),
908 		.hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
909 		.hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
910 	},
911 	{
912 		.label = "pwr4",
913 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
914 		.mask = BIT(3),
915 		.hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
916 		.hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
917 	},
918 };
919 
920 static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
921 	{
922 		.data = mlxplat_mlxcpld_ext_psu_items_data,
923 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
924 		.reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
925 		.mask = MLXPLAT_CPLD_PSU_EXT_MASK,
926 		.capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
927 		.count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
928 		.inversed = 1,
929 		.health = false,
930 	},
931 	{
932 		.data = mlxplat_mlxcpld_ext_pwr_items_data,
933 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
934 		.reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
935 		.mask = MLXPLAT_CPLD_PWR_EXT_MASK,
936 		.capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
937 		.count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
938 		.inversed = 0,
939 		.health = false,
940 	},
941 	{
942 		.data = mlxplat_mlxcpld_default_ng_fan_items_data,
943 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
944 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
945 		.mask = MLXPLAT_CPLD_FAN_NG_MASK,
946 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
947 		.inversed = 1,
948 		.health = false,
949 	},
950 	{
951 		.data = mlxplat_mlxcpld_default_asic_items_data,
952 		.aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
953 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
954 		.mask = MLXPLAT_CPLD_ASIC_MASK,
955 		.count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
956 		.inversed = 0,
957 		.health = true,
958 	},
959 };
960 
961 static
962 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
963 	.items = mlxplat_mlxcpld_ext_items,
964 	.counter = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
965 	.cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
966 	.mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
967 	.cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
968 	.mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
969 };
970 
971 /* Platform led default data */
972 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
973 	{
974 		.label = "status:green",
975 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
976 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
977 	},
978 	{
979 		.label = "status:red",
980 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
981 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
982 	},
983 	{
984 		.label = "psu:green",
985 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
986 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
987 	},
988 	{
989 		.label = "psu:red",
990 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
991 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
992 	},
993 	{
994 		.label = "fan1:green",
995 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
996 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
997 	},
998 	{
999 		.label = "fan1:red",
1000 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1001 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1002 	},
1003 	{
1004 		.label = "fan2:green",
1005 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1006 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1007 	},
1008 	{
1009 		.label = "fan2:red",
1010 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1011 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1012 	},
1013 	{
1014 		.label = "fan3:green",
1015 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1016 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1017 	},
1018 	{
1019 		.label = "fan3:red",
1020 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1021 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1022 	},
1023 	{
1024 		.label = "fan4:green",
1025 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1026 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1027 	},
1028 	{
1029 		.label = "fan4:red",
1030 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1031 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1032 	},
1033 };
1034 
1035 static struct mlxreg_core_platform_data mlxplat_default_led_data = {
1036 		.data = mlxplat_mlxcpld_default_led_data,
1037 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
1038 };
1039 
1040 /* Platform led MSN21xx system family data */
1041 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
1042 	{
1043 		.label = "status:green",
1044 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1045 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1046 	},
1047 	{
1048 		.label = "status:red",
1049 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1050 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1051 	},
1052 	{
1053 		.label = "fan:green",
1054 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1055 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1056 	},
1057 	{
1058 		.label = "fan:red",
1059 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1060 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1061 	},
1062 	{
1063 		.label = "psu1:green",
1064 		.reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1065 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1066 	},
1067 	{
1068 		.label = "psu1:red",
1069 		.reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1070 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1071 	},
1072 	{
1073 		.label = "psu2:green",
1074 		.reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1075 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1076 	},
1077 	{
1078 		.label = "psu2:red",
1079 		.reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1080 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1081 	},
1082 	{
1083 		.label = "uid:blue",
1084 		.reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1085 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1086 	},
1087 };
1088 
1089 static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
1090 		.data = mlxplat_mlxcpld_msn21xx_led_data,
1091 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
1092 };
1093 
1094 /* Platform led for default data for 200GbE systems */
1095 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
1096 	{
1097 		.label = "status:green",
1098 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1099 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1100 	},
1101 	{
1102 		.label = "status:orange",
1103 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1104 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1105 	},
1106 	{
1107 		.label = "psu:green",
1108 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1109 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1110 	},
1111 	{
1112 		.label = "psu:orange",
1113 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1114 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1115 	},
1116 	{
1117 		.label = "fan1:green",
1118 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1119 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1120 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1121 		.bit = BIT(0),
1122 	},
1123 	{
1124 		.label = "fan1:orange",
1125 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1126 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1127 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1128 		.bit = BIT(0),
1129 	},
1130 	{
1131 		.label = "fan2:green",
1132 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1133 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1134 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1135 		.bit = BIT(1),
1136 	},
1137 	{
1138 		.label = "fan2:orange",
1139 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1140 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1141 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1142 		.bit = BIT(1),
1143 	},
1144 	{
1145 		.label = "fan3:green",
1146 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1147 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1148 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1149 		.bit = BIT(2),
1150 	},
1151 	{
1152 		.label = "fan3:orange",
1153 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1154 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1155 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1156 		.bit = BIT(2),
1157 	},
1158 	{
1159 		.label = "fan4:green",
1160 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1161 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1162 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1163 		.bit = BIT(3),
1164 	},
1165 	{
1166 		.label = "fan4:orange",
1167 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1168 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1169 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1170 		.bit = BIT(3),
1171 	},
1172 	{
1173 		.label = "fan5:green",
1174 		.reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1175 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1176 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1177 		.bit = BIT(4),
1178 	},
1179 	{
1180 		.label = "fan5:orange",
1181 		.reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1182 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1183 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1184 		.bit = BIT(4),
1185 	},
1186 	{
1187 		.label = "fan6:green",
1188 		.reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1189 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1190 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1191 		.bit = BIT(5),
1192 	},
1193 	{
1194 		.label = "fan6:orange",
1195 		.reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1196 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1197 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1198 		.bit = BIT(5),
1199 	},
1200 	{
1201 		.label = "uid:blue",
1202 		.reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1203 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1204 	},
1205 };
1206 
1207 static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
1208 		.data = mlxplat_mlxcpld_default_ng_led_data,
1209 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
1210 };
1211 
1212 /* Platform led for Comex based 100GbE systems */
1213 static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
1214 	{
1215 		.label = "status:green",
1216 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1217 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1218 	},
1219 	{
1220 		.label = "status:red",
1221 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1222 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1223 	},
1224 	{
1225 		.label = "psu:green",
1226 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1227 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1228 	},
1229 	{
1230 		.label = "psu:red",
1231 		.reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1232 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1233 	},
1234 	{
1235 		.label = "fan1:green",
1236 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1237 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1238 	},
1239 	{
1240 		.label = "fan1:red",
1241 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1242 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1243 	},
1244 	{
1245 		.label = "fan2:green",
1246 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1247 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1248 	},
1249 	{
1250 		.label = "fan2:red",
1251 		.reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1252 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1253 	},
1254 	{
1255 		.label = "fan3:green",
1256 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1257 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1258 	},
1259 	{
1260 		.label = "fan3:red",
1261 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1262 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1263 	},
1264 	{
1265 		.label = "fan4:green",
1266 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1267 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1268 	},
1269 	{
1270 		.label = "fan4:red",
1271 		.reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1272 		.mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1273 	},
1274 	{
1275 		.label = "uid:blue",
1276 		.reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1277 		.mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1278 	},
1279 };
1280 
1281 static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
1282 		.data = mlxplat_mlxcpld_comex_100G_led_data,
1283 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
1284 };
1285 
1286 /* Platform register access default */
1287 static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
1288 	{
1289 		.label = "cpld1_version",
1290 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1291 		.bit = GENMASK(7, 0),
1292 		.mode = 0444,
1293 	},
1294 	{
1295 		.label = "cpld2_version",
1296 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1297 		.bit = GENMASK(7, 0),
1298 		.mode = 0444,
1299 	},
1300 	{
1301 		.label = "cpld1_pn",
1302 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1303 		.bit = GENMASK(15, 0),
1304 		.mode = 0444,
1305 		.regnum = 2,
1306 	},
1307 	{
1308 		.label = "cpld2_pn",
1309 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1310 		.bit = GENMASK(15, 0),
1311 		.mode = 0444,
1312 		.regnum = 2,
1313 	},
1314 	{
1315 		.label = "cpld1_version_min",
1316 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1317 		.bit = GENMASK(7, 0),
1318 		.mode = 0444,
1319 	},
1320 	{
1321 		.label = "cpld2_version_min",
1322 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1323 		.bit = GENMASK(7, 0),
1324 		.mode = 0444,
1325 	},
1326 	{
1327 		.label = "reset_long_pb",
1328 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1329 		.mask = GENMASK(7, 0) & ~BIT(0),
1330 		.mode = 0444,
1331 	},
1332 	{
1333 		.label = "reset_short_pb",
1334 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1335 		.mask = GENMASK(7, 0) & ~BIT(1),
1336 		.mode = 0444,
1337 	},
1338 	{
1339 		.label = "reset_aux_pwr_or_ref",
1340 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1341 		.mask = GENMASK(7, 0) & ~BIT(2),
1342 		.mode = 0444,
1343 	},
1344 	{
1345 		.label = "reset_main_pwr_fail",
1346 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1347 		.mask = GENMASK(7, 0) & ~BIT(3),
1348 		.mode = 0444,
1349 	},
1350 	{
1351 		.label = "reset_sw_reset",
1352 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1353 		.mask = GENMASK(7, 0) & ~BIT(4),
1354 		.mode = 0444,
1355 	},
1356 	{
1357 		.label = "reset_fw_reset",
1358 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1359 		.mask = GENMASK(7, 0) & ~BIT(5),
1360 		.mode = 0444,
1361 	},
1362 	{
1363 		.label = "reset_hotswap_or_wd",
1364 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1365 		.mask = GENMASK(7, 0) & ~BIT(6),
1366 		.mode = 0444,
1367 	},
1368 	{
1369 		.label = "reset_asic_thermal",
1370 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1371 		.mask = GENMASK(7, 0) & ~BIT(7),
1372 		.mode = 0444,
1373 	},
1374 	{
1375 		.label = "psu1_on",
1376 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1377 		.mask = GENMASK(7, 0) & ~BIT(0),
1378 		.mode = 0200,
1379 	},
1380 	{
1381 		.label = "psu2_on",
1382 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1383 		.mask = GENMASK(7, 0) & ~BIT(1),
1384 		.mode = 0200,
1385 	},
1386 	{
1387 		.label = "pwr_cycle",
1388 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1389 		.mask = GENMASK(7, 0) & ~BIT(2),
1390 		.mode = 0200,
1391 	},
1392 	{
1393 		.label = "pwr_down",
1394 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1395 		.mask = GENMASK(7, 0) & ~BIT(3),
1396 		.mode = 0200,
1397 	},
1398 	{
1399 		.label = "select_iio",
1400 		.reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1401 		.mask = GENMASK(7, 0) & ~BIT(6),
1402 		.mode = 0644,
1403 	},
1404 	{
1405 		.label = "asic_health",
1406 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1407 		.mask = MLXPLAT_CPLD_ASIC_MASK,
1408 		.bit = 1,
1409 		.mode = 0444,
1410 	},
1411 };
1412 
1413 static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
1414 		.data = mlxplat_mlxcpld_default_regs_io_data,
1415 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
1416 };
1417 
1418 /* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
1419 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
1420 	{
1421 		.label = "cpld1_version",
1422 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1423 		.bit = GENMASK(7, 0),
1424 		.mode = 0444,
1425 	},
1426 	{
1427 		.label = "cpld2_version",
1428 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1429 		.bit = GENMASK(7, 0),
1430 		.mode = 0444,
1431 	},
1432 	{
1433 		.label = "cpld1_pn",
1434 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1435 		.bit = GENMASK(15, 0),
1436 		.mode = 0444,
1437 		.regnum = 2,
1438 	},
1439 	{
1440 		.label = "cpld2_pn",
1441 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1442 		.bit = GENMASK(15, 0),
1443 		.mode = 0444,
1444 		.regnum = 2,
1445 	},
1446 	{
1447 		.label = "cpld1_version_min",
1448 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1449 		.bit = GENMASK(7, 0),
1450 		.mode = 0444,
1451 	},
1452 	{
1453 		.label = "cpld2_version_min",
1454 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1455 		.bit = GENMASK(7, 0),
1456 		.mode = 0444,
1457 	},
1458 	{
1459 		.label = "reset_long_pb",
1460 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1461 		.mask = GENMASK(7, 0) & ~BIT(0),
1462 		.mode = 0444,
1463 	},
1464 	{
1465 		.label = "reset_short_pb",
1466 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1467 		.mask = GENMASK(7, 0) & ~BIT(1),
1468 		.mode = 0444,
1469 	},
1470 	{
1471 		.label = "reset_aux_pwr_or_ref",
1472 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1473 		.mask = GENMASK(7, 0) & ~BIT(2),
1474 		.mode = 0444,
1475 	},
1476 	{
1477 		.label = "reset_sw_reset",
1478 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1479 		.mask = GENMASK(7, 0) & ~BIT(3),
1480 		.mode = 0444,
1481 	},
1482 	{
1483 		.label = "reset_main_pwr_fail",
1484 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1485 		.mask = GENMASK(7, 0) & ~BIT(4),
1486 		.mode = 0444,
1487 	},
1488 	{
1489 		.label = "reset_asic_thermal",
1490 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1491 		.mask = GENMASK(7, 0) & ~BIT(5),
1492 		.mode = 0444,
1493 	},
1494 	{
1495 		.label = "reset_hotswap_or_halt",
1496 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1497 		.mask = GENMASK(7, 0) & ~BIT(6),
1498 		.mode = 0444,
1499 	},
1500 	{
1501 		.label = "reset_sff_wd",
1502 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1503 		.mask = GENMASK(7, 0) & ~BIT(6),
1504 		.mode = 0444,
1505 	},
1506 	{
1507 		.label = "psu1_on",
1508 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1509 		.mask = GENMASK(7, 0) & ~BIT(0),
1510 		.mode = 0200,
1511 	},
1512 	{
1513 		.label = "psu2_on",
1514 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1515 		.mask = GENMASK(7, 0) & ~BIT(1),
1516 		.mode = 0200,
1517 	},
1518 	{
1519 		.label = "pwr_cycle",
1520 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1521 		.mask = GENMASK(7, 0) & ~BIT(2),
1522 		.mode = 0200,
1523 	},
1524 	{
1525 		.label = "pwr_down",
1526 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1527 		.mask = GENMASK(7, 0) & ~BIT(3),
1528 		.mode = 0200,
1529 	},
1530 	{
1531 		.label = "select_iio",
1532 		.reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1533 		.mask = GENMASK(7, 0) & ~BIT(6),
1534 		.mode = 0644,
1535 	},
1536 	{
1537 		.label = "asic_health",
1538 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1539 		.mask = MLXPLAT_CPLD_ASIC_MASK,
1540 		.bit = 1,
1541 		.mode = 0444,
1542 	},
1543 };
1544 
1545 static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
1546 		.data = mlxplat_mlxcpld_msn21xx_regs_io_data,
1547 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
1548 };
1549 
1550 /* Platform register access for next generation systems families data */
1551 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
1552 	{
1553 		.label = "cpld1_version",
1554 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1555 		.bit = GENMASK(7, 0),
1556 		.mode = 0444,
1557 	},
1558 	{
1559 		.label = "cpld2_version",
1560 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1561 		.bit = GENMASK(7, 0),
1562 		.mode = 0444,
1563 	},
1564 	{
1565 		.label = "cpld3_version",
1566 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
1567 		.bit = GENMASK(7, 0),
1568 		.mode = 0444,
1569 	},
1570 	{
1571 		.label = "cpld4_version",
1572 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
1573 		.bit = GENMASK(7, 0),
1574 		.mode = 0444,
1575 	},
1576 	{
1577 		.label = "cpld1_pn",
1578 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1579 		.bit = GENMASK(15, 0),
1580 		.mode = 0444,
1581 		.regnum = 2,
1582 	},
1583 	{
1584 		.label = "cpld2_pn",
1585 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1586 		.bit = GENMASK(15, 0),
1587 		.mode = 0444,
1588 		.regnum = 2,
1589 	},
1590 	{
1591 		.label = "cpld3_pn",
1592 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
1593 		.bit = GENMASK(15, 0),
1594 		.mode = 0444,
1595 		.regnum = 2,
1596 	},
1597 	{
1598 		.label = "cpld4_pn",
1599 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
1600 		.bit = GENMASK(15, 0),
1601 		.mode = 0444,
1602 		.regnum = 2,
1603 	},
1604 	{
1605 		.label = "cpld1_version_min",
1606 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1607 		.bit = GENMASK(7, 0),
1608 		.mode = 0444,
1609 	},
1610 	{
1611 		.label = "cpld2_version_min",
1612 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1613 		.bit = GENMASK(7, 0),
1614 		.mode = 0444,
1615 	},
1616 	{
1617 		.label = "cpld3_version_min",
1618 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
1619 		.bit = GENMASK(7, 0),
1620 		.mode = 0444,
1621 	},
1622 	{
1623 		.label = "cpld4_version_min",
1624 		.reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
1625 		.bit = GENMASK(7, 0),
1626 		.mode = 0444,
1627 	},
1628 	{
1629 		.label = "reset_long_pb",
1630 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1631 		.mask = GENMASK(7, 0) & ~BIT(0),
1632 		.mode = 0444,
1633 	},
1634 	{
1635 		.label = "reset_short_pb",
1636 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1637 		.mask = GENMASK(7, 0) & ~BIT(1),
1638 		.mode = 0444,
1639 	},
1640 	{
1641 		.label = "reset_aux_pwr_or_ref",
1642 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1643 		.mask = GENMASK(7, 0) & ~BIT(2),
1644 		.mode = 0444,
1645 	},
1646 	{
1647 		.label = "reset_from_comex",
1648 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1649 		.mask = GENMASK(7, 0) & ~BIT(4),
1650 		.mode = 0444,
1651 	},
1652 	{
1653 		.label = "reset_from_asic",
1654 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1655 		.mask = GENMASK(7, 0) & ~BIT(5),
1656 		.mode = 0444,
1657 	},
1658 	{
1659 		.label = "reset_swb_wd",
1660 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1661 		.mask = GENMASK(7, 0) & ~BIT(6),
1662 		.mode = 0444,
1663 	},
1664 	{
1665 		.label = "reset_asic_thermal",
1666 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1667 		.mask = GENMASK(7, 0) & ~BIT(7),
1668 		.mode = 0444,
1669 	},
1670 	{
1671 		.label = "reset_comex_pwr_fail",
1672 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1673 		.mask = GENMASK(7, 0) & ~BIT(3),
1674 		.mode = 0444,
1675 	},
1676 	{
1677 		.label = "reset_platform",
1678 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1679 		.mask = GENMASK(7, 0) & ~BIT(4),
1680 		.mode = 0444,
1681 	},
1682 	{
1683 		.label = "reset_soc",
1684 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1685 		.mask = GENMASK(7, 0) & ~BIT(5),
1686 		.mode = 0444,
1687 	},
1688 	{
1689 		.label = "reset_comex_wd",
1690 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1691 		.mask = GENMASK(7, 0) & ~BIT(6),
1692 		.mode = 0444,
1693 	},
1694 	{
1695 		.label = "reset_voltmon_upgrade_fail",
1696 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1697 		.mask = GENMASK(7, 0) & ~BIT(0),
1698 		.mode = 0444,
1699 	},
1700 	{
1701 		.label = "reset_system",
1702 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1703 		.mask = GENMASK(7, 0) & ~BIT(1),
1704 		.mode = 0444,
1705 	},
1706 	{
1707 		.label = "reset_sw_pwr_off",
1708 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1709 		.mask = GENMASK(7, 0) & ~BIT(2),
1710 		.mode = 0444,
1711 	},
1712 	{
1713 		.label = "reset_comex_thermal",
1714 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1715 		.mask = GENMASK(7, 0) & ~BIT(3),
1716 		.mode = 0444,
1717 	},
1718 	{
1719 		.label = "reset_reload_bios",
1720 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1721 		.mask = GENMASK(7, 0) & ~BIT(5),
1722 		.mode = 0444,
1723 	},
1724 	{
1725 		.label = "reset_ac_pwr_fail",
1726 		.reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1727 		.mask = GENMASK(7, 0) & ~BIT(6),
1728 		.mode = 0444,
1729 	},
1730 	{
1731 		.label = "psu1_on",
1732 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1733 		.mask = GENMASK(7, 0) & ~BIT(0),
1734 		.mode = 0200,
1735 	},
1736 	{
1737 		.label = "psu2_on",
1738 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1739 		.mask = GENMASK(7, 0) & ~BIT(1),
1740 		.mode = 0200,
1741 	},
1742 	{
1743 		.label = "pwr_cycle",
1744 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1745 		.mask = GENMASK(7, 0) & ~BIT(2),
1746 		.mode = 0200,
1747 	},
1748 	{
1749 		.label = "pwr_down",
1750 		.reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1751 		.mask = GENMASK(7, 0) & ~BIT(3),
1752 		.mode = 0200,
1753 	},
1754 	{
1755 		.label = "jtag_enable",
1756 		.reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1757 		.mask = GENMASK(7, 0) & ~BIT(4),
1758 		.mode = 0644,
1759 	},
1760 	{
1761 		.label = "asic_health",
1762 		.reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1763 		.mask = MLXPLAT_CPLD_ASIC_MASK,
1764 		.bit = 1,
1765 		.mode = 0444,
1766 	},
1767 	{
1768 		.label = "fan_dir",
1769 		.reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
1770 		.bit = GENMASK(7, 0),
1771 		.mode = 0444,
1772 	},
1773 	{
1774 		.label = "voltreg_update_status",
1775 		.reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
1776 		.mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
1777 		.bit = 5,
1778 		.mode = 0444,
1779 	},
1780 	{
1781 		.label = "vpd_wp",
1782 		.reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
1783 		.mask = GENMASK(7, 0) & ~BIT(3),
1784 		.mode = 0644,
1785 	},
1786 	{
1787 		.label = "pcie_asic_reset_dis",
1788 		.reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
1789 		.mask = GENMASK(7, 0) & ~BIT(4),
1790 		.mode = 0644,
1791 	},
1792 	{
1793 		.label = "config1",
1794 		.reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
1795 		.bit = GENMASK(7, 0),
1796 		.mode = 0444,
1797 	},
1798 	{
1799 		.label = "config2",
1800 		.reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
1801 		.bit = GENMASK(7, 0),
1802 		.mode = 0444,
1803 	},
1804 	{
1805 		.label = "ufm_version",
1806 		.reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
1807 		.bit = GENMASK(7, 0),
1808 		.mode = 0444,
1809 	},
1810 };
1811 
1812 static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
1813 		.data = mlxplat_mlxcpld_default_ng_regs_io_data,
1814 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
1815 };
1816 
1817 /* Platform FAN default */
1818 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
1819 	{
1820 		.label = "pwm1",
1821 		.reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
1822 	},
1823 	{
1824 		.label = "tacho1",
1825 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
1826 		.mask = GENMASK(7, 0),
1827 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1828 		.bit = BIT(0),
1829 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1830 
1831 	},
1832 	{
1833 		.label = "tacho2",
1834 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
1835 		.mask = GENMASK(7, 0),
1836 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1837 		.bit = BIT(1),
1838 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1839 	},
1840 	{
1841 		.label = "tacho3",
1842 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
1843 		.mask = GENMASK(7, 0),
1844 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1845 		.bit = BIT(2),
1846 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1847 	},
1848 	{
1849 		.label = "tacho4",
1850 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
1851 		.mask = GENMASK(7, 0),
1852 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1853 		.bit = BIT(3),
1854 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1855 	},
1856 	{
1857 		.label = "tacho5",
1858 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
1859 		.mask = GENMASK(7, 0),
1860 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1861 		.bit = BIT(4),
1862 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1863 	},
1864 	{
1865 		.label = "tacho6",
1866 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
1867 		.mask = GENMASK(7, 0),
1868 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1869 		.bit = BIT(5),
1870 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1871 	},
1872 	{
1873 		.label = "tacho7",
1874 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
1875 		.mask = GENMASK(7, 0),
1876 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1877 		.bit = BIT(6),
1878 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1879 	},
1880 	{
1881 		.label = "tacho8",
1882 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
1883 		.mask = GENMASK(7, 0),
1884 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1885 		.bit = BIT(7),
1886 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1887 	},
1888 	{
1889 		.label = "tacho9",
1890 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
1891 		.mask = GENMASK(7, 0),
1892 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1893 		.bit = BIT(0),
1894 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1895 	},
1896 	{
1897 		.label = "tacho10",
1898 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
1899 		.mask = GENMASK(7, 0),
1900 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1901 		.bit = BIT(1),
1902 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1903 	},
1904 	{
1905 		.label = "tacho11",
1906 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
1907 		.mask = GENMASK(7, 0),
1908 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1909 		.bit = BIT(2),
1910 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1911 	},
1912 	{
1913 		.label = "tacho12",
1914 		.reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
1915 		.mask = GENMASK(7, 0),
1916 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1917 		.bit = BIT(3),
1918 		.reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1919 	},
1920 	{
1921 		.label = "conf",
1922 		.capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
1923 	},
1924 };
1925 
1926 static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
1927 		.data = mlxplat_mlxcpld_default_fan_data,
1928 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
1929 		.capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1930 };
1931 
1932 /* Watchdog type1: hardware implementation version1
1933  * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
1934  */
1935 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
1936 	{
1937 		.label = "action",
1938 		.reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
1939 		.mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
1940 		.bit = 0,
1941 	},
1942 	{
1943 		.label = "timeout",
1944 		.reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
1945 		.mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
1946 		.health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
1947 	},
1948 	{
1949 		.label = "ping",
1950 		.reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
1951 		.mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
1952 		.bit = 0,
1953 	},
1954 	{
1955 		.label = "reset",
1956 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1957 		.mask = GENMASK(7, 0) & ~BIT(6),
1958 		.bit = 6,
1959 	},
1960 };
1961 
1962 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
1963 	{
1964 		.label = "action",
1965 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
1966 		.mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
1967 		.bit = 4,
1968 	},
1969 	{
1970 		.label = "timeout",
1971 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
1972 		.mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
1973 		.health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
1974 	},
1975 	{
1976 		.label = "ping",
1977 		.reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
1978 		.mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
1979 		.bit = 1,
1980 	},
1981 };
1982 
1983 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
1984 	{
1985 		.data = mlxplat_mlxcpld_wd_main_regs_type1,
1986 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
1987 		.version = MLX_WDT_TYPE1,
1988 		.identity = "mlx-wdt-main",
1989 	},
1990 	{
1991 		.data = mlxplat_mlxcpld_wd_aux_regs_type1,
1992 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
1993 		.version = MLX_WDT_TYPE1,
1994 		.identity = "mlx-wdt-aux",
1995 	},
1996 };
1997 
1998 /* Watchdog type2: hardware implementation version 2
1999  * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
2000  */
2001 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
2002 	{
2003 		.label = "action",
2004 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2005 		.mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2006 		.bit = 0,
2007 	},
2008 	{
2009 		.label = "timeout",
2010 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2011 		.mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2012 		.health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
2013 	},
2014 	{
2015 		.label = "timeleft",
2016 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
2017 		.mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2018 	},
2019 	{
2020 		.label = "ping",
2021 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2022 		.mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2023 		.bit = 0,
2024 	},
2025 	{
2026 		.label = "reset",
2027 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2028 		.mask = GENMASK(7, 0) & ~BIT(6),
2029 		.bit = 6,
2030 	},
2031 };
2032 
2033 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
2034 	{
2035 		.label = "action",
2036 		.reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2037 		.mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2038 		.bit = 4,
2039 	},
2040 	{
2041 		.label = "timeout",
2042 		.reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2043 		.mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2044 		.health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
2045 	},
2046 	{
2047 		.label = "timeleft",
2048 		.reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
2049 		.mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2050 	},
2051 	{
2052 		.label = "ping",
2053 		.reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2054 		.mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2055 		.bit = 4,
2056 	},
2057 };
2058 
2059 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
2060 	{
2061 		.data = mlxplat_mlxcpld_wd_main_regs_type2,
2062 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
2063 		.version = MLX_WDT_TYPE2,
2064 		.identity = "mlx-wdt-main",
2065 	},
2066 	{
2067 		.data = mlxplat_mlxcpld_wd_aux_regs_type2,
2068 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
2069 		.version = MLX_WDT_TYPE2,
2070 		.identity = "mlx-wdt-aux",
2071 	},
2072 };
2073 
2074 /* Watchdog type3: hardware implementation version 3
2075  * Can be on all systems. It's differentiated by WD capability bit.
2076  * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
2077  * still have only one main watchdog.
2078  */
2079 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
2080 	{
2081 		.label = "action",
2082 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2083 		.mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2084 		.bit = 0,
2085 	},
2086 	{
2087 		.label = "timeout",
2088 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2089 		.mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2090 		.health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
2091 	},
2092 	{
2093 		.label = "timeleft",
2094 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2095 		.mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2096 	},
2097 	{
2098 		.label = "ping",
2099 		.reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2100 		.mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2101 		.bit = 0,
2102 	},
2103 	{
2104 		.label = "reset",
2105 		.reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2106 		.mask = GENMASK(7, 0) & ~BIT(6),
2107 		.bit = 6,
2108 	},
2109 };
2110 
2111 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
2112 	{
2113 		.label = "action",
2114 		.reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2115 		.mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2116 		.bit = 4,
2117 	},
2118 	{
2119 		.label = "timeout",
2120 		.reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2121 		.mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2122 		.health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
2123 	},
2124 	{
2125 		.label = "timeleft",
2126 		.reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2127 		.mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2128 	},
2129 	{
2130 		.label = "ping",
2131 		.reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2132 		.mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2133 		.bit = 4,
2134 	},
2135 };
2136 
2137 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
2138 	{
2139 		.data = mlxplat_mlxcpld_wd_main_regs_type3,
2140 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
2141 		.version = MLX_WDT_TYPE3,
2142 		.identity = "mlx-wdt-main",
2143 	},
2144 	{
2145 		.data = mlxplat_mlxcpld_wd_aux_regs_type3,
2146 		.counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
2147 		.version = MLX_WDT_TYPE3,
2148 		.identity = "mlx-wdt-aux",
2149 	},
2150 };
2151 
2152 static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
2153 {
2154 	switch (reg) {
2155 	case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2156 	case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2157 	case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2158 	case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2159 	case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2160 	case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2161 	case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2162 	case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
2163 	case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2164 	case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
2165 	case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2166 	case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2167 	case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2168 	case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2169 	case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2170 	case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2171 	case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2172 	case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2173 	case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2174 	case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2175 	case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2176 	case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2177 	case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
2178 	case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
2179 	case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
2180 	case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
2181 	case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2182 	case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2183 	case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
2184 	case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2185 	case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2186 	case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
2187 	case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2188 	case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2189 		return true;
2190 	}
2191 	return false;
2192 }
2193 
2194 static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
2195 {
2196 	switch (reg) {
2197 	case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
2198 	case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
2199 	case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
2200 	case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
2201 	case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
2202 	case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
2203 	case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
2204 	case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
2205 	case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
2206 	case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
2207 	case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
2208 	case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2209 	case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2210 	case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2211 	case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2212 	case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2213 	case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
2214 	case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
2215 	case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2216 	case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2217 	case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
2218 	case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2219 	case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
2220 	case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
2221 	case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2222 	case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
2223 	case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2224 	case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
2225 	case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2226 	case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
2227 	case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2228 	case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
2229 	case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2230 	case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2231 	case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
2232 	case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2233 	case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2234 	case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
2235 	case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2236 	case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2237 	case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
2238 	case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2239 	case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2240 	case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
2241 	case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
2242 	case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
2243 	case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
2244 	case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2245 	case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2246 	case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
2247 	case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2248 	case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2249 	case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
2250 	case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
2251 	case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
2252 	case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
2253 	case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
2254 	case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2255 	case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
2256 	case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
2257 	case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
2258 	case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
2259 	case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
2260 	case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
2261 	case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
2262 	case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
2263 	case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
2264 	case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
2265 	case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
2266 	case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
2267 	case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2268 	case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
2269 	case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
2270 	case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
2271 	case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
2272 	case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
2273 	case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
2274 	case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
2275 	case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
2276 		return true;
2277 	}
2278 	return false;
2279 }
2280 
2281 static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
2282 {
2283 	switch (reg) {
2284 	case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
2285 	case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
2286 	case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
2287 	case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
2288 	case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
2289 	case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
2290 	case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
2291 	case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
2292 	case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
2293 	case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
2294 	case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
2295 	case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2296 	case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2297 	case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2298 	case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2299 	case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2300 	case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
2301 	case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
2302 	case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2303 	case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2304 	case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2305 	case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
2306 	case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2307 	case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
2308 	case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2309 	case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
2310 	case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2311 	case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
2312 	case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2313 	case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
2314 	case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2315 	case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2316 	case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
2317 	case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2318 	case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2319 	case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
2320 	case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2321 	case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2322 	case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
2323 	case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2324 	case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2325 	case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2326 	case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2327 	case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2328 	case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2329 	case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
2330 	case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
2331 	case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
2332 	case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
2333 	case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2334 	case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
2335 	case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
2336 	case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
2337 	case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
2338 	case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
2339 	case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
2340 	case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
2341 	case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
2342 	case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
2343 	case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
2344 	case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
2345 	case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
2346 	case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2347 	case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
2348 	case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
2349 	case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
2350 	case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
2351 	case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
2352 	case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
2353 	case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
2354 	case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
2355 		return true;
2356 	}
2357 	return false;
2358 }
2359 
2360 static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
2361 	{ MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
2362 	{ MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
2363 	{ MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2364 	{ MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
2365 };
2366 
2367 static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
2368 	{ MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2369 	{ MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
2370 };
2371 
2372 static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
2373 	{ MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
2374 	  MLXPLAT_CPLD_LOW_AGGRCX_MASK },
2375 	{ MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2376 };
2377 
2378 static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
2379 	{ MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2380 	{ MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
2381 	{ MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
2382 	{ MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
2383 };
2384 
2385 struct mlxplat_mlxcpld_regmap_context {
2386 	void __iomem *base;
2387 };
2388 
2389 static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
2390 
2391 static int
2392 mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
2393 {
2394 	struct mlxplat_mlxcpld_regmap_context *ctx = context;
2395 
2396 	*val = ioread8(ctx->base + reg);
2397 	return 0;
2398 }
2399 
2400 static int
2401 mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
2402 {
2403 	struct mlxplat_mlxcpld_regmap_context *ctx = context;
2404 
2405 	iowrite8(val, ctx->base + reg);
2406 	return 0;
2407 }
2408 
2409 static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
2410 	.reg_bits = 8,
2411 	.val_bits = 8,
2412 	.max_register = 255,
2413 	.cache_type = REGCACHE_FLAT,
2414 	.writeable_reg = mlxplat_mlxcpld_writeable_reg,
2415 	.readable_reg = mlxplat_mlxcpld_readable_reg,
2416 	.volatile_reg = mlxplat_mlxcpld_volatile_reg,
2417 	.reg_defaults = mlxplat_mlxcpld_regmap_default,
2418 	.num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
2419 	.reg_read = mlxplat_mlxcpld_reg_read,
2420 	.reg_write = mlxplat_mlxcpld_reg_write,
2421 };
2422 
2423 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
2424 	.reg_bits = 8,
2425 	.val_bits = 8,
2426 	.max_register = 255,
2427 	.cache_type = REGCACHE_FLAT,
2428 	.writeable_reg = mlxplat_mlxcpld_writeable_reg,
2429 	.readable_reg = mlxplat_mlxcpld_readable_reg,
2430 	.volatile_reg = mlxplat_mlxcpld_volatile_reg,
2431 	.reg_defaults = mlxplat_mlxcpld_regmap_ng,
2432 	.num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
2433 	.reg_read = mlxplat_mlxcpld_reg_read,
2434 	.reg_write = mlxplat_mlxcpld_reg_write,
2435 };
2436 
2437 static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
2438 	.reg_bits = 8,
2439 	.val_bits = 8,
2440 	.max_register = 255,
2441 	.cache_type = REGCACHE_FLAT,
2442 	.writeable_reg = mlxplat_mlxcpld_writeable_reg,
2443 	.readable_reg = mlxplat_mlxcpld_readable_reg,
2444 	.volatile_reg = mlxplat_mlxcpld_volatile_reg,
2445 	.reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
2446 	.num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
2447 	.reg_read = mlxplat_mlxcpld_reg_read,
2448 	.reg_write = mlxplat_mlxcpld_reg_write,
2449 };
2450 
2451 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
2452 	.reg_bits = 8,
2453 	.val_bits = 8,
2454 	.max_register = 255,
2455 	.cache_type = REGCACHE_FLAT,
2456 	.writeable_reg = mlxplat_mlxcpld_writeable_reg,
2457 	.readable_reg = mlxplat_mlxcpld_readable_reg,
2458 	.volatile_reg = mlxplat_mlxcpld_volatile_reg,
2459 	.reg_defaults = mlxplat_mlxcpld_regmap_ng400,
2460 	.num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
2461 	.reg_read = mlxplat_mlxcpld_reg_read,
2462 	.reg_write = mlxplat_mlxcpld_reg_write,
2463 };
2464 
2465 static struct resource mlxplat_mlxcpld_resources[] = {
2466 	[0] = DEFINE_RES_IRQ_NAMED(17, "mlxreg-hotplug"),
2467 };
2468 
2469 static struct platform_device *mlxplat_dev;
2470 static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
2471 static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
2472 static struct mlxreg_core_platform_data *mlxplat_led;
2473 static struct mlxreg_core_platform_data *mlxplat_regs_io;
2474 static struct mlxreg_core_platform_data *mlxplat_fan;
2475 static struct mlxreg_core_platform_data
2476 	*mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
2477 static const struct regmap_config *mlxplat_regmap_config;
2478 
2479 static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
2480 {
2481 	int i;
2482 
2483 	mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2484 	mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2485 	mlxplat_mux_data = mlxplat_default_mux_data;
2486 	for (i = 0; i < mlxplat_mux_num; i++) {
2487 		mlxplat_mux_data[i].values = mlxplat_default_channels[i];
2488 		mlxplat_mux_data[i].n_values =
2489 				ARRAY_SIZE(mlxplat_default_channels[i]);
2490 	}
2491 	mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
2492 	mlxplat_hotplug->deferred_nr =
2493 		mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2494 	mlxplat_led = &mlxplat_default_led_data;
2495 	mlxplat_regs_io = &mlxplat_default_regs_io_data;
2496 	mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2497 
2498 	return 1;
2499 }
2500 
2501 static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
2502 {
2503 	int i;
2504 
2505 	mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2506 	mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2507 	mlxplat_mux_data = mlxplat_default_mux_data;
2508 	for (i = 0; i < mlxplat_mux_num; i++) {
2509 		mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2510 		mlxplat_mux_data[i].n_values =
2511 				ARRAY_SIZE(mlxplat_msn21xx_channels);
2512 	}
2513 	mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
2514 	mlxplat_hotplug->deferred_nr =
2515 		mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2516 	mlxplat_led = &mlxplat_msn21xx_led_data;
2517 	mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2518 	mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2519 
2520 	return 1;
2521 }
2522 
2523 static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
2524 {
2525 	int i;
2526 
2527 	mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2528 	mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2529 	mlxplat_mux_data = mlxplat_default_mux_data;
2530 	for (i = 0; i < mlxplat_mux_num; i++) {
2531 		mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2532 		mlxplat_mux_data[i].n_values =
2533 				ARRAY_SIZE(mlxplat_msn21xx_channels);
2534 	}
2535 	mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
2536 	mlxplat_hotplug->deferred_nr =
2537 		mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2538 	mlxplat_led = &mlxplat_default_led_data;
2539 	mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2540 	mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2541 
2542 	return 1;
2543 }
2544 
2545 static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
2546 {
2547 	int i;
2548 
2549 	mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2550 	mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2551 	mlxplat_mux_data = mlxplat_default_mux_data;
2552 	for (i = 0; i < mlxplat_mux_num; i++) {
2553 		mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2554 		mlxplat_mux_data[i].n_values =
2555 				ARRAY_SIZE(mlxplat_msn21xx_channels);
2556 	}
2557 	mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
2558 	mlxplat_hotplug->deferred_nr =
2559 		mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2560 	mlxplat_led = &mlxplat_msn21xx_led_data;
2561 	mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2562 	mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2563 
2564 	return 1;
2565 }
2566 
2567 static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
2568 {
2569 	int i;
2570 
2571 	mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2572 	mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2573 	mlxplat_mux_data = mlxplat_default_mux_data;
2574 	for (i = 0; i < mlxplat_mux_num; i++) {
2575 		mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2576 		mlxplat_mux_data[i].n_values =
2577 				ARRAY_SIZE(mlxplat_msn21xx_channels);
2578 	}
2579 	mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
2580 	mlxplat_hotplug->deferred_nr =
2581 		mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2582 	mlxplat_led = &mlxplat_default_ng_led_data;
2583 	mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2584 	mlxplat_fan = &mlxplat_default_fan_data;
2585 	for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2586 		mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2587 	mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
2588 	mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
2589 
2590 	return 1;
2591 }
2592 
2593 static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
2594 {
2595 	int i;
2596 
2597 	mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
2598 	mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
2599 	mlxplat_mux_data = mlxplat_extended_mux_data;
2600 	for (i = 0; i < mlxplat_mux_num; i++) {
2601 		mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2602 		mlxplat_mux_data[i].n_values =
2603 				ARRAY_SIZE(mlxplat_msn21xx_channels);
2604 	}
2605 	mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
2606 	mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
2607 	mlxplat_led = &mlxplat_comex_100G_led_data;
2608 	mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2609 	mlxplat_fan = &mlxplat_default_fan_data;
2610 	for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2611 		mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2612 	mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
2613 
2614 	return 1;
2615 }
2616 
2617 static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
2618 {
2619 	int i;
2620 
2621 	mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2622 	mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2623 	mlxplat_mux_data = mlxplat_default_mux_data;
2624 	for (i = 0; i < mlxplat_mux_num; i++) {
2625 		mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2626 		mlxplat_mux_data[i].n_values =
2627 				ARRAY_SIZE(mlxplat_msn21xx_channels);
2628 	}
2629 	mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
2630 	mlxplat_hotplug->deferred_nr =
2631 		mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2632 	mlxplat_led = &mlxplat_default_ng_led_data;
2633 	mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2634 	mlxplat_fan = &mlxplat_default_fan_data;
2635 	for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2636 		mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2637 	mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
2638 	mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
2639 
2640 	return 1;
2641 }
2642 
2643 static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
2644 	{
2645 		.callback = mlxplat_dmi_default_matched,
2646 		.matches = {
2647 			DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
2648 		},
2649 	},
2650 	{
2651 		.callback = mlxplat_dmi_msn21xx_matched,
2652 		.matches = {
2653 			DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
2654 		},
2655 	},
2656 	{
2657 		.callback = mlxplat_dmi_msn274x_matched,
2658 		.matches = {
2659 			DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
2660 		},
2661 	},
2662 	{
2663 		.callback = mlxplat_dmi_msn201x_matched,
2664 		.matches = {
2665 			DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
2666 		},
2667 	},
2668 	{
2669 		.callback = mlxplat_dmi_qmb7xx_matched,
2670 		.matches = {
2671 			DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
2672 		},
2673 	},
2674 	{
2675 		.callback = mlxplat_dmi_qmb7xx_matched,
2676 		.matches = {
2677 			DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
2678 		},
2679 	},
2680 	{
2681 		.callback = mlxplat_dmi_comex_matched,
2682 		.matches = {
2683 			DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
2684 		},
2685 	},
2686 	{
2687 		.callback = mlxplat_dmi_ng400_matched,
2688 		.matches = {
2689 			DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
2690 		},
2691 	},
2692 	{
2693 		.callback = mlxplat_dmi_msn274x_matched,
2694 		.matches = {
2695 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2696 			DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
2697 		},
2698 	},
2699 	{
2700 		.callback = mlxplat_dmi_default_matched,
2701 		.matches = {
2702 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2703 			DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
2704 		},
2705 	},
2706 	{
2707 		.callback = mlxplat_dmi_default_matched,
2708 		.matches = {
2709 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2710 			DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
2711 		},
2712 	},
2713 	{
2714 		.callback = mlxplat_dmi_default_matched,
2715 		.matches = {
2716 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2717 			DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
2718 		},
2719 	},
2720 	{
2721 		.callback = mlxplat_dmi_default_matched,
2722 		.matches = {
2723 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2724 			DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
2725 		},
2726 	},
2727 	{
2728 		.callback = mlxplat_dmi_msn21xx_matched,
2729 		.matches = {
2730 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2731 			DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
2732 		},
2733 	},
2734 	{
2735 		.callback = mlxplat_dmi_msn201x_matched,
2736 		.matches = {
2737 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2738 			DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
2739 		},
2740 	},
2741 	{
2742 		.callback = mlxplat_dmi_qmb7xx_matched,
2743 		.matches = {
2744 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2745 			DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
2746 		},
2747 	},
2748 	{
2749 		.callback = mlxplat_dmi_qmb7xx_matched,
2750 		.matches = {
2751 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2752 			DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
2753 		},
2754 	},
2755 	{
2756 		.callback = mlxplat_dmi_qmb7xx_matched,
2757 		.matches = {
2758 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2759 			DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
2760 		},
2761 	},
2762 	{
2763 		.callback = mlxplat_dmi_qmb7xx_matched,
2764 		.matches = {
2765 			DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2766 			DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
2767 		},
2768 	},
2769 	{ }
2770 };
2771 
2772 MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
2773 
2774 static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
2775 {
2776 	struct i2c_adapter *search_adap;
2777 	int shift, i;
2778 
2779 	/* Scan adapters from expected id to verify it is free. */
2780 	*nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
2781 	for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
2782 	     mlxplat_max_adap_num; i++) {
2783 		search_adap = i2c_get_adapter(i);
2784 		if (search_adap) {
2785 			i2c_put_adapter(search_adap);
2786 			continue;
2787 		}
2788 
2789 		/* Return if expected parent adapter is free. */
2790 		if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
2791 			return 0;
2792 		break;
2793 	}
2794 
2795 	/* Return with error if free id for adapter is not found. */
2796 	if (i == mlxplat_max_adap_num)
2797 		return -ENODEV;
2798 
2799 	/* Shift adapter ids, since expected parent adapter is not free. */
2800 	*nr = i;
2801 	for (i = 0; i < mlxplat_mux_num; i++) {
2802 		shift = *nr - mlxplat_mux_data[i].parent;
2803 		mlxplat_mux_data[i].parent = *nr;
2804 		mlxplat_mux_data[i].base_nr += shift;
2805 		if (shift > 0)
2806 			mlxplat_hotplug->shift_nr = shift;
2807 	}
2808 
2809 	return 0;
2810 }
2811 
2812 static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
2813 {
2814 	u32 regval;
2815 	int i, rc;
2816 
2817 	rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2818 			 &regval);
2819 	if (rc)
2820 		return rc;
2821 
2822 	if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
2823 		for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
2824 			if (mlxplat_wd_data[i])
2825 				mlxplat_wd_data[i] =
2826 					&mlxplat_mlxcpld_wd_set_type3[i];
2827 		}
2828 	}
2829 
2830 	return 0;
2831 }
2832 
2833 static int __init mlxplat_init(void)
2834 {
2835 	struct mlxplat_priv *priv;
2836 	int i, j, nr, err;
2837 
2838 	if (!dmi_check_system(mlxplat_dmi_table))
2839 		return -ENODEV;
2840 
2841 	mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, -1,
2842 					mlxplat_lpc_resources,
2843 					ARRAY_SIZE(mlxplat_lpc_resources));
2844 
2845 	if (IS_ERR(mlxplat_dev))
2846 		return PTR_ERR(mlxplat_dev);
2847 
2848 	priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
2849 			    GFP_KERNEL);
2850 	if (!priv) {
2851 		err = -ENOMEM;
2852 		goto fail_alloc;
2853 	}
2854 	platform_set_drvdata(mlxplat_dev, priv);
2855 
2856 	mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
2857 			       mlxplat_lpc_resources[1].start, 1);
2858 	if (!mlxplat_mlxcpld_regmap_ctx.base) {
2859 		err = -ENOMEM;
2860 		goto fail_alloc;
2861 	}
2862 
2863 	if (!mlxplat_regmap_config)
2864 		mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
2865 
2866 	priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
2867 					&mlxplat_mlxcpld_regmap_ctx,
2868 					mlxplat_regmap_config);
2869 	if (IS_ERR(priv->regmap)) {
2870 		err = PTR_ERR(priv->regmap);
2871 		goto fail_alloc;
2872 	}
2873 
2874 	err = mlxplat_mlxcpld_verify_bus_topology(&nr);
2875 	if (nr < 0)
2876 		goto fail_alloc;
2877 
2878 	nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
2879 	if (mlxplat_i2c)
2880 		mlxplat_i2c->regmap = priv->regmap;
2881 	priv->pdev_i2c = platform_device_register_resndata(
2882 					&mlxplat_dev->dev, "i2c_mlxcpld",
2883 					nr, mlxplat_mlxcpld_resources,
2884 					ARRAY_SIZE(mlxplat_mlxcpld_resources),
2885 					mlxplat_i2c, sizeof(*mlxplat_i2c));
2886 	if (IS_ERR(priv->pdev_i2c)) {
2887 		err = PTR_ERR(priv->pdev_i2c);
2888 		goto fail_alloc;
2889 	}
2890 
2891 	for (i = 0; i < mlxplat_mux_num; i++) {
2892 		priv->pdev_mux[i] = platform_device_register_resndata(
2893 						&priv->pdev_i2c->dev,
2894 						"i2c-mux-reg", i, NULL,
2895 						0, &mlxplat_mux_data[i],
2896 						sizeof(mlxplat_mux_data[i]));
2897 		if (IS_ERR(priv->pdev_mux[i])) {
2898 			err = PTR_ERR(priv->pdev_mux[i]);
2899 			goto fail_platform_mux_register;
2900 		}
2901 	}
2902 
2903 	/* Add hotplug driver */
2904 	mlxplat_hotplug->regmap = priv->regmap;
2905 	priv->pdev_hotplug = platform_device_register_resndata(
2906 				&mlxplat_dev->dev, "mlxreg-hotplug",
2907 				PLATFORM_DEVID_NONE,
2908 				mlxplat_mlxcpld_resources,
2909 				ARRAY_SIZE(mlxplat_mlxcpld_resources),
2910 				mlxplat_hotplug, sizeof(*mlxplat_hotplug));
2911 	if (IS_ERR(priv->pdev_hotplug)) {
2912 		err = PTR_ERR(priv->pdev_hotplug);
2913 		goto fail_platform_mux_register;
2914 	}
2915 
2916 	/* Set default registers. */
2917 	for (j = 0; j <  mlxplat_regmap_config->num_reg_defaults; j++) {
2918 		err = regmap_write(priv->regmap,
2919 				   mlxplat_regmap_config->reg_defaults[j].reg,
2920 				   mlxplat_regmap_config->reg_defaults[j].def);
2921 		if (err)
2922 			goto fail_platform_mux_register;
2923 	}
2924 
2925 	/* Add LED driver. */
2926 	mlxplat_led->regmap = priv->regmap;
2927 	priv->pdev_led = platform_device_register_resndata(
2928 				&mlxplat_dev->dev, "leds-mlxreg",
2929 				PLATFORM_DEVID_NONE, NULL, 0,
2930 				mlxplat_led, sizeof(*mlxplat_led));
2931 	if (IS_ERR(priv->pdev_led)) {
2932 		err = PTR_ERR(priv->pdev_led);
2933 		goto fail_platform_hotplug_register;
2934 	}
2935 
2936 	/* Add registers io access driver. */
2937 	if (mlxplat_regs_io) {
2938 		mlxplat_regs_io->regmap = priv->regmap;
2939 		priv->pdev_io_regs = platform_device_register_resndata(
2940 					&mlxplat_dev->dev, "mlxreg-io",
2941 					PLATFORM_DEVID_NONE, NULL, 0,
2942 					mlxplat_regs_io,
2943 					sizeof(*mlxplat_regs_io));
2944 		if (IS_ERR(priv->pdev_io_regs)) {
2945 			err = PTR_ERR(priv->pdev_io_regs);
2946 			goto fail_platform_led_register;
2947 		}
2948 	}
2949 
2950 	/* Add FAN driver. */
2951 	if (mlxplat_fan) {
2952 		mlxplat_fan->regmap = priv->regmap;
2953 		priv->pdev_fan = platform_device_register_resndata(
2954 					&mlxplat_dev->dev, "mlxreg-fan",
2955 					PLATFORM_DEVID_NONE, NULL, 0,
2956 					mlxplat_fan,
2957 					sizeof(*mlxplat_fan));
2958 		if (IS_ERR(priv->pdev_fan)) {
2959 			err = PTR_ERR(priv->pdev_fan);
2960 			goto fail_platform_io_regs_register;
2961 		}
2962 	}
2963 
2964 	/* Add WD drivers. */
2965 	err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
2966 	if (err)
2967 		goto fail_platform_wd_register;
2968 	for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) {
2969 		if (mlxplat_wd_data[j]) {
2970 			mlxplat_wd_data[j]->regmap = priv->regmap;
2971 			priv->pdev_wd[j] = platform_device_register_resndata(
2972 						&mlxplat_dev->dev, "mlx-wdt",
2973 						j, NULL, 0,
2974 						mlxplat_wd_data[j],
2975 						sizeof(*mlxplat_wd_data[j]));
2976 			if (IS_ERR(priv->pdev_wd[j])) {
2977 				err = PTR_ERR(priv->pdev_wd[j]);
2978 				goto fail_platform_wd_register;
2979 			}
2980 		}
2981 	}
2982 
2983 	/* Sync registers with hardware. */
2984 	regcache_mark_dirty(priv->regmap);
2985 	err = regcache_sync(priv->regmap);
2986 	if (err)
2987 		goto fail_platform_wd_register;
2988 
2989 	return 0;
2990 
2991 fail_platform_wd_register:
2992 	while (--j >= 0)
2993 		platform_device_unregister(priv->pdev_wd[j]);
2994 	if (mlxplat_fan)
2995 		platform_device_unregister(priv->pdev_fan);
2996 fail_platform_io_regs_register:
2997 	if (mlxplat_regs_io)
2998 		platform_device_unregister(priv->pdev_io_regs);
2999 fail_platform_led_register:
3000 	platform_device_unregister(priv->pdev_led);
3001 fail_platform_hotplug_register:
3002 	platform_device_unregister(priv->pdev_hotplug);
3003 fail_platform_mux_register:
3004 	while (--i >= 0)
3005 		platform_device_unregister(priv->pdev_mux[i]);
3006 	platform_device_unregister(priv->pdev_i2c);
3007 fail_alloc:
3008 	platform_device_unregister(mlxplat_dev);
3009 
3010 	return err;
3011 }
3012 module_init(mlxplat_init);
3013 
3014 static void __exit mlxplat_exit(void)
3015 {
3016 	struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
3017 	int i;
3018 
3019 	for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0 ; i--)
3020 		platform_device_unregister(priv->pdev_wd[i]);
3021 	if (priv->pdev_fan)
3022 		platform_device_unregister(priv->pdev_fan);
3023 	if (priv->pdev_io_regs)
3024 		platform_device_unregister(priv->pdev_io_regs);
3025 	platform_device_unregister(priv->pdev_led);
3026 	platform_device_unregister(priv->pdev_hotplug);
3027 
3028 	for (i = mlxplat_mux_num - 1; i >= 0 ; i--)
3029 		platform_device_unregister(priv->pdev_mux[i]);
3030 
3031 	platform_device_unregister(priv->pdev_i2c);
3032 	platform_device_unregister(mlxplat_dev);
3033 }
3034 module_exit(mlxplat_exit);
3035 
3036 MODULE_AUTHOR("Vadim Pasternak (vadimp@mellanox.com)");
3037 MODULE_DESCRIPTION("Mellanox platform driver");
3038 MODULE_LICENSE("Dual BSD/GPL");
3039