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