1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
3 * Mellanox platform driver
5 * Copyright (C) 2016-2018 Mellanox Technologies
6 * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
9 #include <linux/device.h>
10 #include <linux/dmi.h>
11 #include <linux/i2c.h>
12 #include <linux/i2c-mux.h>
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/platform_data/i2c-mux-reg.h>
17 #include <linux/platform_data/mlxreg.h>
18 #include <linux/regmap.h>
20 #define MLX_PLAT_DEVICE_NAME "mlxplat"
22 /* LPC bus IO offsets */
23 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000
24 #define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500
25 #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00
26 #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01
27 #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02
28 #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET 0x03
29 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET 0x04
30 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET 0x05
31 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET 0x06
32 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET 0x07
33 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET 0x08
34 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET 0x09
35 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET 0x0a
36 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET 0x0b
37 #define MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET 0x19
38 #define MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET 0x1c
39 #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
40 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET 0x1e
41 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET 0x1f
42 #define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET 0x20
43 #define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET 0x21
44 #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22
45 #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23
46 #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24
47 #define MLXPLAT_CPLD_LPC_REG_LED6_OFFSET 0x25
48 #define MLXPLAT_CPLD_LPC_REG_LED7_OFFSET 0x26
49 #define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION 0x2a
50 #define MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET 0x2b
51 #define MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET 0x2d
52 #define MLXPLAT_CPLD_LPC_REG_GP0_OFFSET 0x2e
53 #define MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET 0x2f
54 #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET 0x30
55 #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET 0x31
56 #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET 0x32
57 #define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET 0x33
58 #define MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE 0x34
59 #define MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET 0x35
60 #define MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET 0x36
61 #define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET 0x37
62 #define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a
63 #define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b
64 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40
65 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET 0x41
66 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET 0x42
67 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET 0x43
68 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET 0x44
69 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET 0x45
70 #define MLXPLAT_CPLD_LPC_REG_GWP_OFFSET 0x4a
71 #define MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET 0x4b
72 #define MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET 0x4c
73 #define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
74 #define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET 0x51
75 #define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET 0x52
76 #define MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET 0x53
77 #define MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET 0x54
78 #define MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET 0x55
79 #define MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET 0x56
80 #define MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET 0x57
81 #define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET 0x58
82 #define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET 0x59
83 #define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET 0x5a
84 #define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET 0x64
85 #define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET 0x65
86 #define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET 0x66
87 #define MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET 0x70
88 #define MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET 0x71
89 #define MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET 0x72
90 #define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET 0x88
91 #define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET 0x89
92 #define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET 0x8a
93 #define MLXPLAT_CPLD_LPC_REG_EROT_OFFSET 0x91
94 #define MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET 0x92
95 #define MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET 0x93
96 #define MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET 0x94
97 #define MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET 0x95
98 #define MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET 0x96
99 #define MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET 0x9a
100 #define MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET 0x9b
101 #define MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET 0x9c
102 #define MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET 0x9d
103 #define MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET 0x9e
104 #define MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET 0x9f
105 #define MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET 0xa0
106 #define MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET 0xa1
107 #define MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET 0xa2
108 #define MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET 0xa3
109 #define MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET 0xa4
110 #define MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET 0xa5
111 #define MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET 0xa6
112 #define MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET 0xa7
113 #define MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET 0xa8
114 #define MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET 0xa9
115 #define MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET 0xaa
116 #define MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET 0xab
117 #define MLXPLAT_CPLD_LPC_REG_LC_PWR_ON 0xb2
118 #define MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET 0xc2
119 #define MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT 0xc3
120 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET 0xc7
121 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET 0xc8
122 #define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET 0xc9
123 #define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET 0xcb
124 #define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET 0xcd
125 #define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET 0xce
126 #define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET 0xcf
127 #define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET 0xd1
128 #define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET 0xd2
129 #define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET 0xd3
130 #define MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET 0xde
131 #define MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET 0xdf
132 #define MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET 0xe0
133 #define MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET 0xe1
134 #define MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET 0xe2
135 #define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET 0xe3
136 #define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET 0xe4
137 #define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET 0xe5
138 #define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET 0xe6
139 #define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET 0xe7
140 #define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET 0xe8
141 #define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET 0xe9
142 #define MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET 0xea
143 #define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET 0xeb
144 #define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET 0xec
145 #define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET 0xed
146 #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee
147 #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef
148 #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0
149 #define MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET 0xf1
150 #define MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET 0xf2
151 #define MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET 0xf3
152 #define MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET 0xf4
153 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET 0xf5
154 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET 0xf6
155 #define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7
156 #define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET 0xf8
157 #define MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET 0xf9
158 #define MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET 0xfa
159 #define MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET 0xfb
160 #define MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET 0xfc
161 #define MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET 0xfd
162 #define MLXPLAT_CPLD_LPC_IO_RANGE 0x100
163 #define MLXPLAT_CPLD_LPC_I2C_CH1_OFF 0xdb
164 #define MLXPLAT_CPLD_LPC_I2C_CH2_OFF 0xda
165 #define MLXPLAT_CPLD_LPC_I2C_CH3_OFF 0xdc
166 #define MLXPLAT_CPLD_LPC_I2C_CH4_OFF 0xdd
168 #define MLXPLAT_CPLD_LPC_PIO_OFFSET 0x10000UL
169 #define MLXPLAT_CPLD_LPC_REG1 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
170 MLXPLAT_CPLD_LPC_I2C_CH1_OFF) | \
171 MLXPLAT_CPLD_LPC_PIO_OFFSET)
172 #define MLXPLAT_CPLD_LPC_REG2 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
173 MLXPLAT_CPLD_LPC_I2C_CH2_OFF) | \
174 MLXPLAT_CPLD_LPC_PIO_OFFSET)
175 #define MLXPLAT_CPLD_LPC_REG3 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
176 MLXPLAT_CPLD_LPC_I2C_CH3_OFF) | \
177 MLXPLAT_CPLD_LPC_PIO_OFFSET)
178 #define MLXPLAT_CPLD_LPC_REG4 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
179 MLXPLAT_CPLD_LPC_I2C_CH4_OFF) | \
180 MLXPLAT_CPLD_LPC_PIO_OFFSET)
182 /* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
183 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF 0x04
184 #define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF 0x08
185 #define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF 0x08
186 #define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF 0x40
187 #define MLXPLAT_CPLD_AGGR_MASK_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
188 MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
189 MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
190 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG 0x01
191 #define MLXPLAT_CPLD_AGGR_MASK_NG_DEF 0x04
192 #define MLXPLAT_CPLD_AGGR_MASK_COMEX BIT(0)
193 #define MLXPLAT_CPLD_AGGR_MASK_LC BIT(3)
194 #define MLXPLAT_CPLD_AGGR_MASK_MODULAR (MLXPLAT_CPLD_AGGR_MASK_NG_DEF | \
195 MLXPLAT_CPLD_AGGR_MASK_COMEX | \
196 MLXPLAT_CPLD_AGGR_MASK_LC)
197 #define MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT BIT(0)
198 #define MLXPLAT_CPLD_AGGR_MASK_LC_RDY BIT(1)
199 #define MLXPLAT_CPLD_AGGR_MASK_LC_PG BIT(2)
200 #define MLXPLAT_CPLD_AGGR_MASK_LC_SCRD BIT(3)
201 #define MLXPLAT_CPLD_AGGR_MASK_LC_SYNC BIT(4)
202 #define MLXPLAT_CPLD_AGGR_MASK_LC_ACT BIT(5)
203 #define MLXPLAT_CPLD_AGGR_MASK_LC_SDWN BIT(6)
204 #define MLXPLAT_CPLD_AGGR_MASK_LC_LOW (MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT | \
205 MLXPLAT_CPLD_AGGR_MASK_LC_RDY | \
206 MLXPLAT_CPLD_AGGR_MASK_LC_PG | \
207 MLXPLAT_CPLD_AGGR_MASK_LC_SCRD | \
208 MLXPLAT_CPLD_AGGR_MASK_LC_SYNC | \
209 MLXPLAT_CPLD_AGGR_MASK_LC_ACT | \
210 MLXPLAT_CPLD_AGGR_MASK_LC_SDWN)
211 #define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW 0xc1
212 #define MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2 BIT(2)
213 #define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C BIT(6)
214 #define MLXPLAT_CPLD_PSU_MASK GENMASK(1, 0)
215 #define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0)
216 #define MLXPLAT_CPLD_PSU_EXT_MASK GENMASK(3, 0)
217 #define MLXPLAT_CPLD_PWR_EXT_MASK GENMASK(3, 0)
218 #define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0)
219 #define MLXPLAT_CPLD_ASIC_MASK GENMASK(1, 0)
220 #define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(6, 0)
221 #define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
222 #define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
223 #define MLXPLAT_CPLD_VOLTREG_UPD_MASK GENMASK(5, 4)
224 #define MLXPLAT_CPLD_GWP_MASK GENMASK(0, 0)
225 #define MLXPLAT_CPLD_EROT_MASK GENMASK(1, 0)
226 #define MLXPLAT_CPLD_I2C_CAP_BIT 0x04
227 #define MLXPLAT_CPLD_I2C_CAP_MASK GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
229 /* Masks for aggregation for comex carriers */
230 #define MLXPLAT_CPLD_AGGR_MASK_CARRIER BIT(1)
231 #define MLXPLAT_CPLD_AGGR_MASK_CARR_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
232 MLXPLAT_CPLD_AGGR_MASK_CARRIER)
233 #define MLXPLAT_CPLD_LOW_AGGRCX_MASK 0xc1
235 /* Masks for aggregation for modular systems */
236 #define MLXPLAT_CPLD_LPC_LC_MASK GENMASK(7, 0)
238 /* Default I2C parent bus number */
239 #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
241 /* Maximum number of possible physical buses equipped on system */
242 #define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM 16
243 #define MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM 24
245 /* Number of channels in group */
246 #define MLXPLAT_CPLD_GRP_CHNL_NUM 8
248 /* Start channel numbers */
249 #define MLXPLAT_CPLD_CH1 2
250 #define MLXPLAT_CPLD_CH2 10
251 #define MLXPLAT_CPLD_CH3 18
252 #define MLXPLAT_CPLD_CH2_ETH_MODULAR 3
253 #define MLXPLAT_CPLD_CH3_ETH_MODULAR 43
254 #define MLXPLAT_CPLD_CH4_ETH_MODULAR 51
255 #define MLXPLAT_CPLD_CH2_RACK_SWITCH 18
257 /* Number of LPC attached MUX platform devices */
258 #define MLXPLAT_CPLD_LPC_MUX_DEVS 4
260 /* Hotplug devices adapter numbers */
261 #define MLXPLAT_CPLD_NR_NONE -1
262 #define MLXPLAT_CPLD_PSU_DEFAULT_NR 10
263 #define MLXPLAT_CPLD_PSU_MSNXXXX_NR 4
264 #define MLXPLAT_CPLD_FAN1_DEFAULT_NR 11
265 #define MLXPLAT_CPLD_FAN2_DEFAULT_NR 12
266 #define MLXPLAT_CPLD_FAN3_DEFAULT_NR 13
267 #define MLXPLAT_CPLD_FAN4_DEFAULT_NR 14
268 #define MLXPLAT_CPLD_NR_ASIC 3
269 #define MLXPLAT_CPLD_NR_LC_BASE 34
271 #define MLXPLAT_CPLD_NR_LC_SET(nr) (MLXPLAT_CPLD_NR_LC_BASE + (nr))
272 #define MLXPLAT_CPLD_LC_ADDR 0x32
274 /* Masks and default values for watchdogs */
275 #define MLXPLAT_CPLD_WD1_CLEAR_MASK GENMASK(7, 1)
276 #define MLXPLAT_CPLD_WD2_CLEAR_MASK (GENMASK(7, 0) & ~BIT(1))
278 #define MLXPLAT_CPLD_WD_TYPE1_TO_MASK GENMASK(7, 4)
279 #define MLXPLAT_CPLD_WD_TYPE2_TO_MASK 0
280 #define MLXPLAT_CPLD_WD_RESET_ACT_MASK GENMASK(7, 1)
281 #define MLXPLAT_CPLD_WD_FAN_ACT_MASK (GENMASK(7, 0) & ~BIT(4))
282 #define MLXPLAT_CPLD_WD_COUNT_ACT_MASK (GENMASK(7, 0) & ~BIT(7))
283 #define MLXPLAT_CPLD_WD_CPBLTY_MASK (GENMASK(7, 0) & ~BIT(6))
284 #define MLXPLAT_CPLD_WD_DFLT_TIMEOUT 30
285 #define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT 600
286 #define MLXPLAT_CPLD_WD_MAX_DEVS 2
288 #define MLXPLAT_CPLD_LPC_SYSIRQ 17
290 /* Minimum power required for turning on Ethernet modular system (WATT) */
291 #define MLXPLAT_CPLD_ETH_MODULAR_PWR_MIN 50
293 /* Default value for PWM control register for rack switch system */
294 #define MLXPLAT_REGMAP_NVSWITCH_PWM_DEFAULT 0xf4
296 /* mlxplat_priv - platform private data
297 * @pdev_i2c - i2c controller platform device
298 * @pdev_mux - array of mux platform devices
299 * @pdev_hotplug - hotplug platform devices
300 * @pdev_led - led platform devices
301 * @pdev_io_regs - register access platform devices
302 * @pdev_fan - FAN platform devices
303 * @pdev_wd - array of watchdog platform devices
304 * @regmap: device register map
306 struct mlxplat_priv {
307 struct platform_device *pdev_i2c;
308 struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
309 struct platform_device *pdev_hotplug;
310 struct platform_device *pdev_led;
311 struct platform_device *pdev_io_regs;
312 struct platform_device *pdev_fan;
313 struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
317 /* Regions for LPC I2C controller and LPC base register space */
318 static const struct resource mlxplat_lpc_resources[] = {
319 [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
320 MLXPLAT_CPLD_LPC_IO_RANGE,
321 "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
322 [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
323 MLXPLAT_CPLD_LPC_IO_RANGE,
324 "mlxplat_cpld_lpc_regs",
328 /* Platform i2c next generation systems data */
329 static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
331 .reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
332 .mask = MLXPLAT_CPLD_I2C_CAP_MASK,
333 .bit = MLXPLAT_CPLD_I2C_CAP_BIT,
337 static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
339 .data = mlxplat_mlxcpld_i2c_ng_items_data,
343 /* Platform next generation systems i2c data */
344 static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
345 .items = mlxplat_mlxcpld_i2c_ng_items,
346 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
347 .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
348 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
349 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
352 /* Platform default channels */
353 static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
355 MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
356 MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
357 5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
360 MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
361 MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
362 5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
366 /* Platform channels for MSN21xx system family */
367 static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
369 /* Platform mux data */
370 static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
373 .base_nr = MLXPLAT_CPLD_CH1,
375 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
381 .base_nr = MLXPLAT_CPLD_CH2,
383 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
390 /* Platform mux configuration variables */
391 static int mlxplat_max_adap_num;
392 static int mlxplat_mux_num;
393 static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
395 /* Platform extended mux data */
396 static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
399 .base_nr = MLXPLAT_CPLD_CH1,
401 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
407 .base_nr = MLXPLAT_CPLD_CH2,
409 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
415 .base_nr = MLXPLAT_CPLD_CH3,
417 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
424 /* Platform channels for modular system family */
425 static const int mlxplat_modular_upper_channel[] = { 1 };
426 static const int mlxplat_modular_channels[] = {
427 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
428 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
432 /* Platform modular mux data */
433 static struct i2c_mux_reg_platform_data mlxplat_modular_mux_data[] = {
436 .base_nr = MLXPLAT_CPLD_CH1,
438 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG4,
441 .values = mlxplat_modular_upper_channel,
442 .n_values = ARRAY_SIZE(mlxplat_modular_upper_channel),
446 .base_nr = MLXPLAT_CPLD_CH2_ETH_MODULAR,
448 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
451 .values = mlxplat_modular_channels,
452 .n_values = ARRAY_SIZE(mlxplat_modular_channels),
455 .parent = MLXPLAT_CPLD_CH1,
456 .base_nr = MLXPLAT_CPLD_CH3_ETH_MODULAR,
458 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
461 .values = mlxplat_msn21xx_channels,
462 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
466 .base_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR,
468 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
471 .values = mlxplat_msn21xx_channels,
472 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
476 /* Platform channels for rack swicth system family */
477 static const int mlxplat_rack_switch_channels[] = {
478 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
481 /* Platform rack switch mux data */
482 static struct i2c_mux_reg_platform_data mlxplat_rack_switch_mux_data[] = {
485 .base_nr = MLXPLAT_CPLD_CH1,
487 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
490 .values = mlxplat_rack_switch_channels,
491 .n_values = ARRAY_SIZE(mlxplat_rack_switch_channels),
495 .base_nr = MLXPLAT_CPLD_CH2_RACK_SWITCH,
497 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
500 .values = mlxplat_msn21xx_channels,
501 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
506 /* Platform hotplug devices */
507 static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
509 I2C_BOARD_INFO("dps460", 0x59),
512 I2C_BOARD_INFO("dps460", 0x58),
516 static struct i2c_board_info mlxplat_mlxcpld_ext_pwr[] = {
518 I2C_BOARD_INFO("dps460", 0x5b),
521 I2C_BOARD_INFO("dps460", 0x5a),
525 static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
527 I2C_BOARD_INFO("24c32", 0x50),
530 I2C_BOARD_INFO("24c32", 0x50),
533 I2C_BOARD_INFO("24c32", 0x50),
536 I2C_BOARD_INFO("24c32", 0x50),
540 /* Platform hotplug comex carrier system family data */
541 static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
544 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
546 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
550 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
552 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
556 /* Platform hotplug default data */
557 static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
560 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
562 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
566 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
568 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
572 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
575 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
577 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
578 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
582 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
584 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
585 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
589 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_wc_items_data[] = {
592 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
594 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
598 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
600 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
604 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
607 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
609 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
610 .hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
614 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
616 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
617 .hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
621 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
623 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
624 .hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
628 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
630 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
631 .hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
635 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
638 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
639 .mask = MLXPLAT_CPLD_ASIC_MASK,
640 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
644 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic2_items_data[] = {
647 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
648 .mask = MLXPLAT_CPLD_ASIC_MASK,
649 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
653 static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
655 .data = mlxplat_mlxcpld_default_psu_items_data,
656 .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
657 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
658 .mask = MLXPLAT_CPLD_PSU_MASK,
659 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
664 .data = mlxplat_mlxcpld_default_pwr_items_data,
665 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
666 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
667 .mask = MLXPLAT_CPLD_PWR_MASK,
668 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
673 .data = mlxplat_mlxcpld_default_fan_items_data,
674 .aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
675 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
676 .mask = MLXPLAT_CPLD_FAN_MASK,
677 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
682 .data = mlxplat_mlxcpld_default_asic_items_data,
683 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
684 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
685 .mask = MLXPLAT_CPLD_ASIC_MASK,
686 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
692 static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
694 .data = mlxplat_mlxcpld_comex_psu_items_data,
695 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
696 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
697 .mask = MLXPLAT_CPLD_PSU_MASK,
698 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
703 .data = mlxplat_mlxcpld_default_pwr_items_data,
704 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
705 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
706 .mask = MLXPLAT_CPLD_PWR_MASK,
707 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
712 .data = mlxplat_mlxcpld_default_fan_items_data,
713 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
714 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
715 .mask = MLXPLAT_CPLD_FAN_MASK,
716 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
721 .data = mlxplat_mlxcpld_default_asic_items_data,
722 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
723 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
724 .mask = MLXPLAT_CPLD_ASIC_MASK,
725 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
732 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
733 .items = mlxplat_mlxcpld_default_items,
734 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
735 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
736 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
737 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
738 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
741 static struct mlxreg_core_item mlxplat_mlxcpld_default_wc_items[] = {
743 .data = mlxplat_mlxcpld_comex_psu_items_data,
744 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
745 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
746 .mask = MLXPLAT_CPLD_PSU_MASK,
747 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
752 .data = mlxplat_mlxcpld_default_pwr_wc_items_data,
753 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
754 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
755 .mask = MLXPLAT_CPLD_PWR_MASK,
756 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
761 .data = mlxplat_mlxcpld_default_asic_items_data,
762 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
763 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
764 .mask = MLXPLAT_CPLD_ASIC_MASK,
765 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
772 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_wc_data = {
773 .items = mlxplat_mlxcpld_default_wc_items,
774 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_wc_items),
775 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
776 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
777 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
778 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
782 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
783 .items = mlxplat_mlxcpld_comex_items,
784 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
785 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
786 .mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
787 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
788 .mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
791 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
794 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
796 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
800 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
802 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
806 /* Platform hotplug MSN21xx system family data */
807 static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
809 .data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
810 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
811 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
812 .mask = MLXPLAT_CPLD_PWR_MASK,
813 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
818 .data = mlxplat_mlxcpld_default_asic_items_data,
819 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
820 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
821 .mask = MLXPLAT_CPLD_ASIC_MASK,
822 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
829 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
830 .items = mlxplat_mlxcpld_msn21xx_items,
831 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
832 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
833 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
834 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
835 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
838 /* Platform hotplug msn274x system family data */
839 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
842 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
844 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
848 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
850 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
854 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
857 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
859 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
860 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
864 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
866 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
867 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
871 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
874 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
876 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
880 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
882 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
886 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
888 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
892 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
894 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
898 static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
900 .data = mlxplat_mlxcpld_msn274x_psu_items_data,
901 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
902 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
903 .mask = MLXPLAT_CPLD_PSU_MASK,
904 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
909 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
910 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
911 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
912 .mask = MLXPLAT_CPLD_PWR_MASK,
913 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
918 .data = mlxplat_mlxcpld_msn274x_fan_items_data,
919 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
920 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
921 .mask = MLXPLAT_CPLD_FAN_MASK,
922 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
927 .data = mlxplat_mlxcpld_default_asic_items_data,
928 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
929 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
930 .mask = MLXPLAT_CPLD_ASIC_MASK,
931 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
938 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
939 .items = mlxplat_mlxcpld_msn274x_items,
940 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
941 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
942 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
943 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
944 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
947 /* Platform hotplug MSN201x system family data */
948 static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
951 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
953 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
957 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
959 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
963 static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
965 .data = mlxplat_mlxcpld_msn201x_pwr_items_data,
966 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
967 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
968 .mask = MLXPLAT_CPLD_PWR_MASK,
969 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
974 .data = mlxplat_mlxcpld_default_asic_items_data,
975 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
976 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
977 .mask = MLXPLAT_CPLD_ASIC_MASK,
978 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
985 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
986 .items = mlxplat_mlxcpld_msn201x_items,
987 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
988 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
989 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
990 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
991 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
994 /* Platform hotplug next generation system family data */
995 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
998 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1000 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1004 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1006 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1010 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
1013 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1015 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1017 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1021 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1023 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1025 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1029 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1031 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1033 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1037 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1039 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1041 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1045 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1047 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1049 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1053 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1055 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1057 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1061 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1063 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1065 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1069 static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
1071 .data = mlxplat_mlxcpld_default_ng_psu_items_data,
1072 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1073 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1074 .mask = MLXPLAT_CPLD_PSU_MASK,
1075 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
1080 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
1081 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1082 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1083 .mask = MLXPLAT_CPLD_PWR_MASK,
1084 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
1089 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1090 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1091 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1092 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1093 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1098 .data = mlxplat_mlxcpld_default_asic_items_data,
1099 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1100 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1101 .mask = MLXPLAT_CPLD_ASIC_MASK,
1102 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1109 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
1110 .items = mlxplat_mlxcpld_default_ng_items,
1111 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
1112 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1113 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1114 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1115 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
1118 /* Platform hotplug extended system family data */
1119 static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
1122 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1124 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1128 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1130 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1134 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1136 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1140 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1142 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1146 static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
1149 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1151 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1152 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1156 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1158 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1159 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1163 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1165 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1166 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1170 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1172 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1173 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1177 static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
1179 .data = mlxplat_mlxcpld_ext_psu_items_data,
1180 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1181 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1182 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1183 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1184 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1189 .data = mlxplat_mlxcpld_ext_pwr_items_data,
1190 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1191 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1192 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1193 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1194 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1199 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1200 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1201 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1202 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1203 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1208 .data = mlxplat_mlxcpld_default_asic_items_data,
1209 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1210 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1211 .mask = MLXPLAT_CPLD_ASIC_MASK,
1212 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1217 .data = mlxplat_mlxcpld_default_asic2_items_data,
1218 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1219 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
1220 .mask = MLXPLAT_CPLD_ASIC_MASK,
1221 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic2_items_data),
1228 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
1229 .items = mlxplat_mlxcpld_ext_items,
1230 .counter = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
1231 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1232 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1233 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1234 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
1237 static struct mlxreg_core_data mlxplat_mlxcpld_modular_pwr_items_data[] = {
1240 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1242 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1243 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1247 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1249 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1250 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1254 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1256 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1257 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1261 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1263 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1264 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1269 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_lc_act = {
1270 .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
1273 static struct mlxreg_core_data mlxplat_mlxcpld_modular_asic_items_data[] = {
1276 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1277 .mask = MLXPLAT_CPLD_ASIC_MASK,
1278 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1282 static struct i2c_board_info mlxplat_mlxcpld_lc_i2c_dev[] = {
1284 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1285 .platform_data = &mlxplat_mlxcpld_lc_act,
1288 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1289 .platform_data = &mlxplat_mlxcpld_lc_act,
1292 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1293 .platform_data = &mlxplat_mlxcpld_lc_act,
1296 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1297 .platform_data = &mlxplat_mlxcpld_lc_act,
1300 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1301 .platform_data = &mlxplat_mlxcpld_lc_act,
1304 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1305 .platform_data = &mlxplat_mlxcpld_lc_act,
1308 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1309 .platform_data = &mlxplat_mlxcpld_lc_act,
1312 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1313 .platform_data = &mlxplat_mlxcpld_lc_act,
1317 static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_modular_lc_notifier[] = {
1344 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pr_items_data[] = {
1346 .label = "lc1_present",
1347 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1349 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1350 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1351 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1352 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1356 .label = "lc2_present",
1357 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1359 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1360 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1361 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1362 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1366 .label = "lc3_present",
1367 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1369 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1370 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1371 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1372 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1376 .label = "lc4_present",
1377 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1379 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1380 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1381 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1382 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1386 .label = "lc5_present",
1387 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1389 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1390 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1391 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1392 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1396 .label = "lc6_present",
1397 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1399 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1400 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1401 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1402 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1406 .label = "lc7_present",
1407 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1409 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1410 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1411 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1412 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1416 .label = "lc8_present",
1417 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1419 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1420 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1421 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1422 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1427 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ver_items_data[] = {
1429 .label = "lc1_verified",
1430 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1432 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1433 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1434 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1435 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1436 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1437 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1438 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1439 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1443 .label = "lc2_verified",
1444 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1446 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1447 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1448 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1449 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1450 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1451 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1452 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1453 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1457 .label = "lc3_verified",
1458 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1460 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1461 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1462 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1463 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1464 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1465 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1466 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1467 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1471 .label = "lc4_verified",
1472 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1474 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1475 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1476 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1477 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1478 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1479 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1480 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1481 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1485 .label = "lc5_verified",
1486 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1488 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1489 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1490 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1491 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1492 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1493 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1494 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1495 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1499 .label = "lc6_verified",
1500 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1502 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1503 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1504 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1505 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1506 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1507 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1508 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1509 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1513 .label = "lc7_verified",
1514 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1516 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1517 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1518 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1519 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1520 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1521 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1522 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1523 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1527 .label = "lc8_verified",
1528 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1530 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1531 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1532 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1533 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1534 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1535 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1536 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1537 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1542 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pg_data[] = {
1544 .label = "lc1_powered",
1545 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1547 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1548 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1549 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1550 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1554 .label = "lc2_powered",
1555 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1557 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1558 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1559 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1560 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1564 .label = "lc3_powered",
1565 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1567 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1568 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1569 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1570 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1574 .label = "lc4_powered",
1575 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1577 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1578 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1579 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1580 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1584 .label = "lc5_powered",
1585 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1587 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1588 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1589 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1590 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1594 .label = "lc6_powered",
1595 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1597 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1598 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1599 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1600 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1604 .label = "lc7_powered",
1605 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1607 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1608 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1609 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1610 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1614 .label = "lc8_powered",
1615 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1617 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1618 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1619 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1620 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1625 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ready_data[] = {
1627 .label = "lc1_ready",
1628 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1630 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1631 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1632 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1633 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1637 .label = "lc2_ready",
1638 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1640 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1641 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1642 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1643 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1647 .label = "lc3_ready",
1648 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1650 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1651 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1652 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1653 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1657 .label = "lc4_ready",
1658 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1660 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1661 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1662 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1663 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1667 .label = "lc5_ready",
1668 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1670 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1671 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1672 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1673 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1677 .label = "lc6_ready",
1678 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1680 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1681 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1682 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1683 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1687 .label = "lc7_ready",
1688 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1690 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1691 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1692 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1693 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1697 .label = "lc8_ready",
1698 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1700 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1701 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1702 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1703 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1708 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_synced_data[] = {
1710 .label = "lc1_synced",
1711 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1713 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1714 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1715 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1716 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1720 .label = "lc2_synced",
1721 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1723 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1724 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1725 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1726 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1730 .label = "lc3_synced",
1731 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1733 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1734 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1735 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1736 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1740 .label = "lc4_synced",
1741 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1743 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1744 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1745 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1746 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1750 .label = "lc5_synced",
1751 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1753 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1754 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1755 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1756 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1760 .label = "lc6_synced",
1761 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1763 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1764 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1765 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1766 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1770 .label = "lc7_synced",
1771 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1773 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1774 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1775 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1776 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1780 .label = "lc8_synced",
1781 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1783 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1784 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1785 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1786 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1791 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_act_data[] = {
1793 .label = "lc1_active",
1794 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1796 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1797 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1798 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1799 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1803 .label = "lc2_active",
1804 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1806 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1807 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1808 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1809 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1813 .label = "lc3_active",
1814 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1816 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1817 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1818 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1819 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1823 .label = "lc4_active",
1824 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1826 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1827 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1828 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1829 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1833 .label = "lc5_active",
1834 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1836 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1837 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1838 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1839 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1843 .label = "lc6_active",
1844 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1846 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1847 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1848 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1849 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1853 .label = "lc7_active",
1854 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1856 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1857 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1858 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1859 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1863 .label = "lc8_active",
1864 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1866 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1867 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1868 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1869 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1874 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_sd_data[] = {
1876 .label = "lc1_shutdown",
1877 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1879 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1880 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1881 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1882 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1886 .label = "lc2_shutdown",
1887 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1889 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1890 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1891 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1892 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1896 .label = "lc3_shutdown",
1897 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1899 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1900 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1901 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1902 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1906 .label = "lc4_shutdown",
1907 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1909 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1910 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1911 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1912 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1916 .label = "lc5_shutdown",
1917 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1919 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1920 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1921 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1922 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1926 .label = "lc6_shutdown",
1927 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1929 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1930 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1931 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1932 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1936 .label = "lc7_shutdown",
1937 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1939 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1940 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1941 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1942 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1946 .label = "lc8_shutdown",
1947 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1949 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1950 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1951 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1952 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1957 static struct mlxreg_core_item mlxplat_mlxcpld_modular_items[] = {
1959 .data = mlxplat_mlxcpld_ext_psu_items_data,
1960 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1961 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1962 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1963 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1964 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1969 .data = mlxplat_mlxcpld_modular_pwr_items_data,
1970 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1971 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1972 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1973 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1974 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1979 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1980 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1981 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1982 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1983 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1988 .data = mlxplat_mlxcpld_modular_asic_items_data,
1989 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1990 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1991 .mask = MLXPLAT_CPLD_ASIC_MASK,
1992 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_asic_items_data),
1997 .data = mlxplat_mlxcpld_modular_lc_pr_items_data,
1998 .kind = MLXREG_HOTPLUG_LC_PRESENT,
1999 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2000 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
2001 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2002 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pr_items_data),
2007 .data = mlxplat_mlxcpld_modular_lc_ver_items_data,
2008 .kind = MLXREG_HOTPLUG_LC_VERIFIED,
2009 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2010 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
2011 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2012 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ver_items_data),
2017 .data = mlxplat_mlxcpld_modular_lc_pg_data,
2018 .kind = MLXREG_HOTPLUG_LC_POWERED,
2019 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2020 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
2021 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2022 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pg_data),
2027 .data = mlxplat_mlxcpld_modular_lc_ready_data,
2028 .kind = MLXREG_HOTPLUG_LC_READY,
2029 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2030 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
2031 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2032 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ready_data),
2037 .data = mlxplat_mlxcpld_modular_lc_synced_data,
2038 .kind = MLXREG_HOTPLUG_LC_SYNCED,
2039 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2040 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2041 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2042 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_synced_data),
2047 .data = mlxplat_mlxcpld_modular_lc_act_data,
2048 .kind = MLXREG_HOTPLUG_LC_ACTIVE,
2049 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2050 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2051 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2052 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_act_data),
2057 .data = mlxplat_mlxcpld_modular_lc_sd_data,
2058 .kind = MLXREG_HOTPLUG_LC_THERMAL,
2059 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2060 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2061 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2062 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_sd_data),
2069 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_modular_data = {
2070 .items = mlxplat_mlxcpld_modular_items,
2071 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_items),
2072 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2073 .mask = MLXPLAT_CPLD_AGGR_MASK_MODULAR,
2074 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2075 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2078 /* Platform hotplug for NVLink blade systems family data */
2079 static struct mlxreg_core_data mlxplat_mlxcpld_global_wp_items_data[] = {
2081 .label = "global_wp_grant",
2082 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2083 .mask = MLXPLAT_CPLD_GWP_MASK,
2084 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2088 static struct mlxreg_core_item mlxplat_mlxcpld_nvlink_blade_items[] = {
2090 .data = mlxplat_mlxcpld_global_wp_items_data,
2091 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2092 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2093 .mask = MLXPLAT_CPLD_GWP_MASK,
2094 .count = ARRAY_SIZE(mlxplat_mlxcpld_global_wp_items_data),
2101 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_nvlink_blade_data = {
2102 .items = mlxplat_mlxcpld_nvlink_blade_items,
2103 .counter = ARRAY_SIZE(mlxplat_mlxcpld_nvlink_blade_items),
2104 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2105 .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
2106 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2107 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2110 /* Platform hotplug for switch systems family data */
2111 static struct mlxreg_core_data mlxplat_mlxcpld_erot_ap_items_data[] = {
2113 .label = "erot1_ap",
2114 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2116 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2119 .label = "erot2_ap",
2120 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2122 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2126 static struct mlxreg_core_data mlxplat_mlxcpld_erot_error_items_data[] = {
2128 .label = "erot1_error",
2129 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2131 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2134 .label = "erot2_error",
2135 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2137 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2141 static struct mlxreg_core_item mlxplat_mlxcpld_rack_switch_items[] = {
2143 .data = mlxplat_mlxcpld_ext_psu_items_data,
2144 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2145 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2146 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
2147 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2148 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
2153 .data = mlxplat_mlxcpld_ext_pwr_items_data,
2154 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2155 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2156 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
2157 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2158 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
2163 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
2164 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2165 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2166 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
2167 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
2172 .data = mlxplat_mlxcpld_erot_ap_items_data,
2173 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2174 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2175 .mask = MLXPLAT_CPLD_EROT_MASK,
2176 .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_ap_items_data),
2181 .data = mlxplat_mlxcpld_erot_error_items_data,
2182 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2183 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2184 .mask = MLXPLAT_CPLD_EROT_MASK,
2185 .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_error_items_data),
2192 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_rack_switch_data = {
2193 .items = mlxplat_mlxcpld_rack_switch_items,
2194 .counter = ARRAY_SIZE(mlxplat_mlxcpld_rack_switch_items),
2195 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2196 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
2197 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2198 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2201 /* Platform led default data */
2202 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
2204 .label = "status:green",
2205 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2206 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2209 .label = "status:red",
2210 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2211 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2214 .label = "psu:green",
2215 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2216 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2220 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2221 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2224 .label = "fan1:green",
2225 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2226 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2229 .label = "fan1:red",
2230 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2231 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2234 .label = "fan2:green",
2235 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2236 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2239 .label = "fan2:red",
2240 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2241 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2244 .label = "fan3:green",
2245 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2246 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2249 .label = "fan3:red",
2250 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2251 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2254 .label = "fan4:green",
2255 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2256 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2259 .label = "fan4:red",
2260 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2261 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2265 static struct mlxreg_core_platform_data mlxplat_default_led_data = {
2266 .data = mlxplat_mlxcpld_default_led_data,
2267 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
2270 /* Platform led default data for water cooling */
2271 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_wc_data[] = {
2273 .label = "status:green",
2274 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2275 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2278 .label = "status:red",
2279 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2280 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2283 .label = "psu:green",
2284 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2285 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2289 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2290 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2294 static struct mlxreg_core_platform_data mlxplat_default_led_wc_data = {
2295 .data = mlxplat_mlxcpld_default_led_wc_data,
2296 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_wc_data),
2299 /* Platform led default data for water cooling Ethernet switch blade */
2300 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_eth_wc_blade_data[] = {
2302 .label = "status:green",
2303 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2304 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2307 .label = "status:red",
2308 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2309 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2313 static struct mlxreg_core_platform_data mlxplat_default_led_eth_wc_blade_data = {
2314 .data = mlxplat_mlxcpld_default_led_eth_wc_blade_data,
2315 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_eth_wc_blade_data),
2318 /* Platform led MSN21xx system family data */
2319 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
2321 .label = "status:green",
2322 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2323 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2326 .label = "status:red",
2327 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2328 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2331 .label = "fan:green",
2332 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2333 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2337 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2338 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2341 .label = "psu1:green",
2342 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2343 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2346 .label = "psu1:red",
2347 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2348 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2351 .label = "psu2:green",
2352 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2353 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2356 .label = "psu2:red",
2357 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2358 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2361 .label = "uid:blue",
2362 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2363 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2367 static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
2368 .data = mlxplat_mlxcpld_msn21xx_led_data,
2369 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
2372 /* Platform led for default data for 200GbE systems */
2373 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
2375 .label = "status:green",
2376 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2377 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2380 .label = "status:orange",
2381 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2382 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2385 .label = "psu:green",
2386 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2387 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2390 .label = "psu:orange",
2391 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2392 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2395 .label = "fan1:green",
2396 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2397 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2398 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2402 .label = "fan1:orange",
2403 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2404 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2405 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2409 .label = "fan2:green",
2410 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2411 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2412 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2416 .label = "fan2:orange",
2417 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2418 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2419 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2423 .label = "fan3:green",
2424 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2425 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2426 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2430 .label = "fan3:orange",
2431 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2432 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2433 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2437 .label = "fan4:green",
2438 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2439 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2440 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2444 .label = "fan4:orange",
2445 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2446 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2447 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2451 .label = "fan5:green",
2452 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2453 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2454 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2458 .label = "fan5:orange",
2459 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2460 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2461 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2465 .label = "fan6:green",
2466 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2467 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2468 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2472 .label = "fan6:orange",
2473 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2474 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2475 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2479 .label = "fan7:green",
2480 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2481 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2482 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2486 .label = "fan7:orange",
2487 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2488 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2489 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2493 .label = "uid:blue",
2494 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2495 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2499 static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
2500 .data = mlxplat_mlxcpld_default_ng_led_data,
2501 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
2504 /* Platform led for Comex based 100GbE systems */
2505 static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
2507 .label = "status:green",
2508 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2509 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2512 .label = "status:red",
2513 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2514 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2517 .label = "psu:green",
2518 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2519 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2523 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2524 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2527 .label = "fan1:green",
2528 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2529 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2532 .label = "fan1:red",
2533 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2534 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2537 .label = "fan2:green",
2538 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2539 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2542 .label = "fan2:red",
2543 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2544 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2547 .label = "fan3:green",
2548 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2549 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2552 .label = "fan3:red",
2553 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2554 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2557 .label = "fan4:green",
2558 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2559 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2562 .label = "fan4:red",
2563 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2564 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2567 .label = "uid:blue",
2568 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2569 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2573 static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
2574 .data = mlxplat_mlxcpld_comex_100G_led_data,
2575 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
2578 /* Platform led for data for modular systems */
2579 static struct mlxreg_core_data mlxplat_mlxcpld_modular_led_data[] = {
2581 .label = "status:green",
2582 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2583 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2586 .label = "status:orange",
2587 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2588 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2591 .label = "psu:green",
2592 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2593 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2596 .label = "psu:orange",
2597 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2598 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2601 .label = "fan1:green",
2602 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2603 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2604 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2608 .label = "fan1:orange",
2609 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2610 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2611 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2615 .label = "fan2:green",
2616 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2617 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2618 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2622 .label = "fan2:orange",
2623 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2624 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2625 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2629 .label = "fan3:green",
2630 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2631 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2632 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2636 .label = "fan3:orange",
2637 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2638 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2639 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2643 .label = "fan4:green",
2644 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2645 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2646 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2650 .label = "fan4:orange",
2651 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2652 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2653 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2657 .label = "fan5:green",
2658 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2659 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2660 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2664 .label = "fan5:orange",
2665 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2666 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2667 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2671 .label = "fan6:green",
2672 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2673 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2674 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2678 .label = "fan6:orange",
2679 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2680 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2681 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2685 .label = "fan7:green",
2686 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2687 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2688 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2692 .label = "fan7:orange",
2693 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2694 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2695 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2699 .label = "uid:blue",
2700 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2701 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2704 .label = "fan_front:green",
2705 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2706 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2709 .label = "fan_front:orange",
2710 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2711 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2714 .label = "mgmt:green",
2715 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
2716 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2719 .label = "mgmt:orange",
2720 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
2721 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2725 static struct mlxreg_core_platform_data mlxplat_modular_led_data = {
2726 .data = mlxplat_mlxcpld_modular_led_data,
2727 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_led_data),
2730 /* Platform register access default */
2731 static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
2733 .label = "cpld1_version",
2734 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2735 .bit = GENMASK(7, 0),
2739 .label = "cpld2_version",
2740 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2741 .bit = GENMASK(7, 0),
2745 .label = "cpld1_pn",
2746 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2747 .bit = GENMASK(15, 0),
2752 .label = "cpld2_pn",
2753 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2754 .bit = GENMASK(15, 0),
2759 .label = "cpld1_version_min",
2760 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2761 .bit = GENMASK(7, 0),
2765 .label = "cpld2_version_min",
2766 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2767 .bit = GENMASK(7, 0),
2771 .label = "reset_long_pb",
2772 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2773 .mask = GENMASK(7, 0) & ~BIT(0),
2777 .label = "reset_short_pb",
2778 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2779 .mask = GENMASK(7, 0) & ~BIT(1),
2783 .label = "reset_aux_pwr_or_ref",
2784 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2785 .mask = GENMASK(7, 0) & ~BIT(2),
2789 .label = "reset_main_pwr_fail",
2790 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2791 .mask = GENMASK(7, 0) & ~BIT(3),
2795 .label = "reset_sw_reset",
2796 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2797 .mask = GENMASK(7, 0) & ~BIT(4),
2801 .label = "reset_fw_reset",
2802 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2803 .mask = GENMASK(7, 0) & ~BIT(5),
2807 .label = "reset_hotswap_or_wd",
2808 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2809 .mask = GENMASK(7, 0) & ~BIT(6),
2813 .label = "reset_asic_thermal",
2814 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2815 .mask = GENMASK(7, 0) & ~BIT(7),
2820 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2821 .mask = GENMASK(7, 0) & ~BIT(0),
2826 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2827 .mask = GENMASK(7, 0) & ~BIT(1),
2831 .label = "pwr_cycle",
2832 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2833 .mask = GENMASK(7, 0) & ~BIT(2),
2837 .label = "pwr_down",
2838 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2839 .mask = GENMASK(7, 0) & ~BIT(3),
2843 .label = "select_iio",
2844 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
2845 .mask = GENMASK(7, 0) & ~BIT(6),
2849 .label = "asic_health",
2850 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2851 .mask = MLXPLAT_CPLD_ASIC_MASK,
2857 static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
2858 .data = mlxplat_mlxcpld_default_regs_io_data,
2859 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
2862 /* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
2863 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
2865 .label = "cpld1_version",
2866 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2867 .bit = GENMASK(7, 0),
2871 .label = "cpld2_version",
2872 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2873 .bit = GENMASK(7, 0),
2877 .label = "cpld1_pn",
2878 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2879 .bit = GENMASK(15, 0),
2884 .label = "cpld2_pn",
2885 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2886 .bit = GENMASK(15, 0),
2891 .label = "cpld1_version_min",
2892 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2893 .bit = GENMASK(7, 0),
2897 .label = "cpld2_version_min",
2898 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2899 .bit = GENMASK(7, 0),
2903 .label = "reset_long_pb",
2904 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2905 .mask = GENMASK(7, 0) & ~BIT(0),
2909 .label = "reset_short_pb",
2910 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2911 .mask = GENMASK(7, 0) & ~BIT(1),
2915 .label = "reset_aux_pwr_or_ref",
2916 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2917 .mask = GENMASK(7, 0) & ~BIT(2),
2921 .label = "reset_sw_reset",
2922 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2923 .mask = GENMASK(7, 0) & ~BIT(3),
2927 .label = "reset_main_pwr_fail",
2928 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2929 .mask = GENMASK(7, 0) & ~BIT(4),
2933 .label = "reset_asic_thermal",
2934 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2935 .mask = GENMASK(7, 0) & ~BIT(5),
2939 .label = "reset_hotswap_or_halt",
2940 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2941 .mask = GENMASK(7, 0) & ~BIT(6),
2945 .label = "reset_sff_wd",
2946 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
2947 .mask = GENMASK(7, 0) & ~BIT(6),
2952 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2953 .mask = GENMASK(7, 0) & ~BIT(0),
2958 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2959 .mask = GENMASK(7, 0) & ~BIT(1),
2963 .label = "pwr_cycle",
2964 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2965 .mask = GENMASK(7, 0) & ~BIT(2),
2969 .label = "pwr_down",
2970 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2971 .mask = GENMASK(7, 0) & ~BIT(3),
2975 .label = "select_iio",
2976 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
2977 .mask = GENMASK(7, 0) & ~BIT(6),
2981 .label = "asic_health",
2982 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2983 .mask = MLXPLAT_CPLD_ASIC_MASK,
2989 static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
2990 .data = mlxplat_mlxcpld_msn21xx_regs_io_data,
2991 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
2994 /* Platform register access for next generation systems families data */
2995 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
2997 .label = "cpld1_version",
2998 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2999 .bit = GENMASK(7, 0),
3003 .label = "cpld2_version",
3004 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
3005 .bit = GENMASK(7, 0),
3009 .label = "cpld3_version",
3010 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
3011 .bit = GENMASK(7, 0),
3015 .label = "cpld4_version",
3016 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
3017 .bit = GENMASK(7, 0),
3021 .label = "cpld1_pn",
3022 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3023 .bit = GENMASK(15, 0),
3028 .label = "cpld2_pn",
3029 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
3030 .bit = GENMASK(15, 0),
3035 .label = "cpld3_pn",
3036 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
3037 .bit = GENMASK(15, 0),
3042 .label = "cpld4_pn",
3043 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
3044 .bit = GENMASK(15, 0),
3049 .label = "cpld1_version_min",
3050 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3051 .bit = GENMASK(7, 0),
3055 .label = "cpld2_version_min",
3056 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
3057 .bit = GENMASK(7, 0),
3061 .label = "cpld3_version_min",
3062 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
3063 .bit = GENMASK(7, 0),
3067 .label = "cpld4_version_min",
3068 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
3069 .bit = GENMASK(7, 0),
3073 .label = "asic_reset",
3074 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
3075 .mask = GENMASK(7, 0) & ~BIT(3),
3079 .label = "asic2_reset",
3080 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
3081 .mask = GENMASK(7, 0) & ~BIT(2),
3085 .label = "erot1_reset",
3086 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
3087 .mask = GENMASK(7, 0) & ~BIT(6),
3091 .label = "erot2_reset",
3092 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
3093 .mask = GENMASK(7, 0) & ~BIT(7),
3097 .label = "erot1_recovery",
3098 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
3099 .mask = GENMASK(7, 0) & ~BIT(6),
3103 .label = "erot2_recovery",
3104 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
3105 .mask = GENMASK(7, 0) & ~BIT(7),
3109 .label = "erot1_wp",
3110 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
3111 .mask = GENMASK(7, 0) & ~BIT(4),
3116 .label = "erot2_wp",
3117 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
3118 .mask = GENMASK(7, 0) & ~BIT(5),
3123 .label = "reset_long_pb",
3124 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3125 .mask = GENMASK(7, 0) & ~BIT(0),
3129 .label = "reset_short_pb",
3130 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3131 .mask = GENMASK(7, 0) & ~BIT(1),
3135 .label = "reset_aux_pwr_or_ref",
3136 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3137 .mask = GENMASK(7, 0) & ~BIT(2),
3141 .label = "reset_from_comex",
3142 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3143 .mask = GENMASK(7, 0) & ~BIT(4),
3147 .label = "reset_from_asic",
3148 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3149 .mask = GENMASK(7, 0) & ~BIT(5),
3153 .label = "reset_swb_wd",
3154 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3155 .mask = GENMASK(7, 0) & ~BIT(6),
3159 .label = "reset_asic_thermal",
3160 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3161 .mask = GENMASK(7, 0) & ~BIT(7),
3165 .label = "reset_comex_pwr_fail",
3166 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3167 .mask = GENMASK(7, 0) & ~BIT(3),
3171 .label = "reset_platform",
3172 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3173 .mask = GENMASK(7, 0) & ~BIT(4),
3177 .label = "reset_soc",
3178 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3179 .mask = GENMASK(7, 0) & ~BIT(5),
3183 .label = "reset_comex_wd",
3184 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3185 .mask = GENMASK(7, 0) & ~BIT(6),
3189 .label = "reset_voltmon_upgrade_fail",
3190 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3191 .mask = GENMASK(7, 0) & ~BIT(0),
3195 .label = "reset_system",
3196 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3197 .mask = GENMASK(7, 0) & ~BIT(1),
3201 .label = "reset_sw_pwr_off",
3202 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3203 .mask = GENMASK(7, 0) & ~BIT(2),
3207 .label = "reset_comex_thermal",
3208 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3209 .mask = GENMASK(7, 0) & ~BIT(3),
3213 .label = "reset_reload_bios",
3214 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3215 .mask = GENMASK(7, 0) & ~BIT(5),
3219 .label = "reset_ac_pwr_fail",
3220 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3221 .mask = GENMASK(7, 0) & ~BIT(6),
3226 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3227 .mask = GENMASK(7, 0) & ~BIT(0),
3232 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3233 .mask = GENMASK(7, 0) & ~BIT(1),
3237 .label = "pwr_cycle",
3238 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3239 .mask = GENMASK(7, 0) & ~BIT(2),
3243 .label = "pwr_down",
3244 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3245 .mask = GENMASK(7, 0) & ~BIT(3),
3249 .label = "jtag_enable",
3250 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3251 .mask = GENMASK(7, 0) & ~BIT(4),
3255 .label = "asic_health",
3256 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3257 .mask = MLXPLAT_CPLD_ASIC_MASK,
3262 .label = "asic2_health",
3263 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
3264 .mask = MLXPLAT_CPLD_ASIC_MASK,
3270 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
3271 .bit = GENMASK(7, 0),
3275 .label = "bios_safe_mode",
3276 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3277 .mask = GENMASK(7, 0) & ~BIT(4),
3281 .label = "bios_active_image",
3282 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3283 .mask = GENMASK(7, 0) & ~BIT(5),
3287 .label = "bios_auth_fail",
3288 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3289 .mask = GENMASK(7, 0) & ~BIT(6),
3293 .label = "bios_upgrade_fail",
3294 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3295 .mask = GENMASK(7, 0) & ~BIT(7),
3299 .label = "voltreg_update_status",
3300 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3301 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3307 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3308 .mask = GENMASK(7, 0) & ~BIT(3),
3312 .label = "pcie_asic_reset_dis",
3313 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3314 .mask = GENMASK(7, 0) & ~BIT(4),
3318 .label = "erot1_ap_reset",
3319 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
3320 .mask = GENMASK(7, 0) & ~BIT(0),
3324 .label = "erot2_ap_reset",
3325 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
3326 .mask = GENMASK(7, 0) & ~BIT(1),
3330 .label = "spi_chnl_select",
3331 .reg = MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT,
3332 .mask = GENMASK(7, 0),
3338 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3339 .bit = GENMASK(7, 0),
3344 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3345 .bit = GENMASK(7, 0),
3350 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3351 .bit = GENMASK(7, 0),
3355 .label = "ufm_version",
3356 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3357 .bit = GENMASK(7, 0),
3362 static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
3363 .data = mlxplat_mlxcpld_default_ng_regs_io_data,
3364 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
3367 /* Platform register access for modular systems families data */
3368 static struct mlxreg_core_data mlxplat_mlxcpld_modular_regs_io_data[] = {
3370 .label = "cpld1_version",
3371 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3372 .bit = GENMASK(7, 0),
3376 .label = "cpld2_version",
3377 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
3378 .bit = GENMASK(7, 0),
3382 .label = "cpld3_version",
3383 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
3384 .bit = GENMASK(7, 0),
3388 .label = "cpld4_version",
3389 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
3390 .bit = GENMASK(7, 0),
3394 .label = "cpld1_pn",
3395 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3396 .bit = GENMASK(15, 0),
3401 .label = "cpld2_pn",
3402 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
3403 .bit = GENMASK(15, 0),
3408 .label = "cpld3_pn",
3409 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
3410 .bit = GENMASK(15, 0),
3415 .label = "cpld4_pn",
3416 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
3417 .bit = GENMASK(15, 0),
3422 .label = "cpld1_version_min",
3423 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3424 .bit = GENMASK(7, 0),
3428 .label = "cpld2_version_min",
3429 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
3430 .bit = GENMASK(7, 0),
3434 .label = "cpld3_version_min",
3435 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
3436 .bit = GENMASK(7, 0),
3440 .label = "cpld4_version_min",
3441 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
3442 .bit = GENMASK(7, 0),
3446 .label = "lc1_enable",
3447 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3448 .mask = GENMASK(7, 0) & ~BIT(0),
3452 .label = "lc2_enable",
3453 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3454 .mask = GENMASK(7, 0) & ~BIT(1),
3458 .label = "lc3_enable",
3459 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3460 .mask = GENMASK(7, 0) & ~BIT(2),
3464 .label = "lc4_enable",
3465 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3466 .mask = GENMASK(7, 0) & ~BIT(3),
3470 .label = "lc5_enable",
3471 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3472 .mask = GENMASK(7, 0) & ~BIT(4),
3476 .label = "lc6_enable",
3477 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3478 .mask = GENMASK(7, 0) & ~BIT(5),
3482 .label = "lc7_enable",
3483 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3484 .mask = GENMASK(7, 0) & ~BIT(6),
3488 .label = "lc8_enable",
3489 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3490 .mask = GENMASK(7, 0) & ~BIT(7),
3494 .label = "reset_long_pb",
3495 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3496 .mask = GENMASK(7, 0) & ~BIT(0),
3500 .label = "reset_short_pb",
3501 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3502 .mask = GENMASK(7, 0) & ~BIT(1),
3506 .label = "reset_aux_pwr_or_fu",
3507 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3508 .mask = GENMASK(7, 0) & ~BIT(2),
3512 .label = "reset_mgmt_dc_dc_pwr_fail",
3513 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3514 .mask = GENMASK(7, 0) & ~BIT(3),
3518 .label = "reset_sys_comex_bios",
3519 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3520 .mask = GENMASK(7, 0) & ~BIT(5),
3524 .label = "reset_sw_reset",
3525 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3526 .mask = GENMASK(7, 0) & ~BIT(0),
3530 .label = "reset_aux_pwr_or_reload",
3531 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3532 .mask = GENMASK(7, 0) & ~BIT(2),
3536 .label = "reset_comex_pwr_fail",
3537 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3538 .mask = GENMASK(7, 0) & ~BIT(3),
3542 .label = "reset_platform",
3543 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3544 .mask = GENMASK(7, 0) & ~BIT(4),
3548 .label = "reset_soc",
3549 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3550 .mask = GENMASK(7, 0) & ~BIT(5),
3554 .label = "reset_pwr_off_from_carrier",
3555 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3556 .mask = GENMASK(7, 0) & ~BIT(7),
3560 .label = "reset_swb_wd",
3561 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3562 .mask = GENMASK(7, 0) & ~BIT(0),
3566 .label = "reset_swb_aux_pwr_or_fu",
3567 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3568 .mask = GENMASK(7, 0) & ~BIT(2),
3572 .label = "reset_swb_dc_dc_pwr_fail",
3573 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3574 .mask = GENMASK(7, 0) & ~BIT(3),
3578 .label = "reset_swb_12v_fail",
3579 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3580 .mask = GENMASK(7, 0) & ~BIT(4),
3584 .label = "reset_system",
3585 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3586 .mask = GENMASK(7, 0) & ~BIT(5),
3590 .label = "reset_thermal_spc_or_pciesw",
3591 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3592 .mask = GENMASK(7, 0) & ~BIT(7),
3596 .label = "bios_safe_mode",
3597 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3598 .mask = GENMASK(7, 0) & ~BIT(4),
3602 .label = "bios_active_image",
3603 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3604 .mask = GENMASK(7, 0) & ~BIT(5),
3608 .label = "bios_auth_fail",
3609 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3610 .mask = GENMASK(7, 0) & ~BIT(6),
3614 .label = "bios_upgrade_fail",
3615 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3616 .mask = GENMASK(7, 0) & ~BIT(7),
3620 .label = "voltreg_update_status",
3621 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3622 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3628 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3629 .mask = GENMASK(7, 0) & ~BIT(3),
3633 .label = "pcie_asic_reset_dis",
3634 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3635 .mask = GENMASK(7, 0) & ~BIT(4),
3639 .label = "shutdown_unlock",
3640 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3641 .mask = GENMASK(7, 0) & ~BIT(5),
3645 .label = "lc1_rst_mask",
3646 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3647 .mask = GENMASK(7, 0) & ~BIT(0),
3651 .label = "lc2_rst_mask",
3652 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3653 .mask = GENMASK(7, 0) & ~BIT(1),
3657 .label = "lc3_rst_mask",
3658 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3659 .mask = GENMASK(7, 0) & ~BIT(2),
3663 .label = "lc4_rst_mask",
3664 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3665 .mask = GENMASK(7, 0) & ~BIT(3),
3669 .label = "lc5_rst_mask",
3670 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3671 .mask = GENMASK(7, 0) & ~BIT(4),
3675 .label = "lc6_rst_mask",
3676 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3677 .mask = GENMASK(7, 0) & ~BIT(5),
3681 .label = "lc7_rst_mask",
3682 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3683 .mask = GENMASK(7, 0) & ~BIT(6),
3687 .label = "lc8_rst_mask",
3688 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3689 .mask = GENMASK(7, 0) & ~BIT(7),
3694 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3695 .mask = GENMASK(7, 0) & ~BIT(0),
3700 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3701 .mask = GENMASK(7, 0) & ~BIT(1),
3705 .label = "pwr_cycle",
3706 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3707 .mask = GENMASK(7, 0) & ~BIT(2),
3711 .label = "pwr_down",
3712 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3713 .mask = GENMASK(7, 0) & ~BIT(3),
3718 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3719 .mask = GENMASK(7, 0) & ~BIT(4),
3724 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3725 .mask = GENMASK(7, 0) & ~BIT(5),
3729 .label = "auto_power_mode",
3730 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3731 .mask = GENMASK(7, 0) & ~BIT(6),
3735 .label = "pm_mgmt_en",
3736 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3737 .mask = GENMASK(7, 0) & ~BIT(7),
3741 .label = "jtag_enable",
3742 .reg = MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE,
3743 .mask = GENMASK(3, 0),
3748 .label = "safe_bios_dis",
3749 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
3750 .mask = GENMASK(7, 0) & ~BIT(5),
3754 .label = "safe_bios_dis_wp",
3755 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET,
3756 .mask = GENMASK(7, 0) & ~BIT(5),
3760 .label = "asic_health",
3761 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3762 .mask = MLXPLAT_CPLD_ASIC_MASK,
3768 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
3769 .bit = GENMASK(7, 0),
3774 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3775 .mask = GENMASK(7, 0) & ~BIT(0),
3780 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3781 .mask = GENMASK(7, 0) & ~BIT(1),
3786 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3787 .mask = GENMASK(7, 0) & ~BIT(2),
3792 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3793 .mask = GENMASK(7, 0) & ~BIT(3),
3798 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3799 .mask = GENMASK(7, 0) & ~BIT(4),
3804 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3805 .mask = GENMASK(7, 0) & ~BIT(5),
3810 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3811 .mask = GENMASK(7, 0) & ~BIT(6),
3816 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3817 .mask = GENMASK(7, 0) & ~BIT(7),
3822 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3823 .bit = GENMASK(7, 0),
3828 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3829 .bit = GENMASK(7, 0),
3834 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3835 .bit = GENMASK(7, 0),
3839 .label = "ufm_version",
3840 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3841 .bit = GENMASK(7, 0),
3846 static struct mlxreg_core_platform_data mlxplat_modular_regs_io_data = {
3847 .data = mlxplat_mlxcpld_modular_regs_io_data,
3848 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_regs_io_data),
3851 /* Platform register access for NVLink blade systems family data */
3852 static struct mlxreg_core_data mlxplat_mlxcpld_nvlink_blade_regs_io_data[] = {
3854 .label = "cpld1_version",
3855 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3856 .bit = GENMASK(7, 0),
3860 .label = "cpld1_pn",
3861 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3862 .bit = GENMASK(15, 0),
3867 .label = "cpld1_version_min",
3868 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3869 .bit = GENMASK(7, 0),
3873 .label = "reset_aux_pwr_or_ref",
3874 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3875 .mask = GENMASK(7, 0) & ~BIT(2),
3879 .label = "reset_from_comex",
3880 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3881 .mask = GENMASK(7, 0) & ~BIT(4),
3885 .label = "reset_comex_pwr_fail",
3886 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3887 .mask = GENMASK(7, 0) & ~BIT(3),
3891 .label = "reset_platform",
3892 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3893 .mask = GENMASK(7, 0) & ~BIT(4),
3897 .label = "reset_soc",
3898 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3899 .mask = GENMASK(7, 0) & ~BIT(5),
3903 .label = "reset_comex_wd",
3904 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3905 .mask = GENMASK(7, 0) & ~BIT(6),
3909 .label = "reset_voltmon_upgrade_fail",
3910 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3911 .mask = GENMASK(7, 0) & ~BIT(0),
3915 .label = "reset_system",
3916 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3917 .mask = GENMASK(7, 0) & ~BIT(1),
3921 .label = "reset_sw_pwr_off",
3922 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3923 .mask = GENMASK(7, 0) & ~BIT(2),
3927 .label = "reset_comex_thermal",
3928 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3929 .mask = GENMASK(7, 0) & ~BIT(3),
3933 .label = "reset_reload_bios",
3934 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3935 .mask = GENMASK(7, 0) & ~BIT(5),
3939 .label = "reset_ac_pwr_fail",
3940 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3941 .mask = GENMASK(7, 0) & ~BIT(6),
3945 .label = "pwr_cycle",
3946 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3947 .mask = GENMASK(7, 0) & ~BIT(2),
3951 .label = "pwr_down",
3952 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3953 .mask = GENMASK(7, 0) & ~BIT(3),
3957 .label = "global_wp_request",
3958 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3959 .mask = GENMASK(7, 0) & ~BIT(0),
3963 .label = "jtag_enable",
3964 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3965 .mask = GENMASK(7, 0) & ~BIT(4),
3969 .label = "comm_chnl_ready",
3970 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3971 .mask = GENMASK(7, 0) & ~BIT(6),
3975 .label = "bios_safe_mode",
3976 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3977 .mask = GENMASK(7, 0) & ~BIT(4),
3981 .label = "bios_active_image",
3982 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3983 .mask = GENMASK(7, 0) & ~BIT(5),
3987 .label = "bios_auth_fail",
3988 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3989 .mask = GENMASK(7, 0) & ~BIT(6),
3993 .label = "bios_upgrade_fail",
3994 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3995 .mask = GENMASK(7, 0) & ~BIT(7),
3999 .label = "voltreg_update_status",
4000 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
4001 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
4007 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4008 .mask = GENMASK(7, 0) & ~BIT(3),
4012 .label = "pcie_asic_reset_dis",
4013 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4014 .mask = GENMASK(7, 0) & ~BIT(4),
4018 .label = "global_wp_response",
4019 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
4020 .mask = GENMASK(7, 0) & ~BIT(0),
4025 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
4026 .bit = GENMASK(7, 0),
4031 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
4032 .bit = GENMASK(7, 0),
4037 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
4038 .bit = GENMASK(7, 0),
4042 .label = "ufm_version",
4043 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
4044 .bit = GENMASK(7, 0),
4049 static struct mlxreg_core_platform_data mlxplat_nvlink_blade_regs_io_data = {
4050 .data = mlxplat_mlxcpld_nvlink_blade_regs_io_data,
4051 .counter = ARRAY_SIZE(mlxplat_mlxcpld_nvlink_blade_regs_io_data),
4054 /* Platform FAN default */
4055 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
4058 .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
4062 .reg = MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET,
4066 .reg = MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET,
4070 .reg = MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET,
4074 .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
4075 .mask = GENMASK(7, 0),
4076 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4078 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4083 .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
4084 .mask = GENMASK(7, 0),
4085 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4087 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4091 .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
4092 .mask = GENMASK(7, 0),
4093 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4095 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4099 .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
4100 .mask = GENMASK(7, 0),
4101 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4103 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4107 .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
4108 .mask = GENMASK(7, 0),
4109 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4111 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4115 .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
4116 .mask = GENMASK(7, 0),
4117 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4119 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4123 .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
4124 .mask = GENMASK(7, 0),
4125 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4127 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4131 .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
4132 .mask = GENMASK(7, 0),
4133 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
4135 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4139 .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
4140 .mask = GENMASK(7, 0),
4141 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4143 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4147 .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
4148 .mask = GENMASK(7, 0),
4149 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4151 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4155 .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
4156 .mask = GENMASK(7, 0),
4157 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4159 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4163 .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
4164 .mask = GENMASK(7, 0),
4165 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4167 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
4171 .reg = MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET,
4172 .mask = GENMASK(7, 0),
4173 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4178 .reg = MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET,
4179 .mask = GENMASK(7, 0),
4180 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
4185 .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
4189 static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
4190 .data = mlxplat_mlxcpld_default_fan_data,
4191 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
4192 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
4195 /* Watchdog type1: hardware implementation version1
4196 * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
4198 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
4201 .reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
4202 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4207 .reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
4208 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
4209 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4213 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
4214 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
4219 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4220 .mask = GENMASK(7, 0) & ~BIT(6),
4225 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
4228 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4229 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4234 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4235 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
4236 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4240 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
4241 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
4246 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
4248 .data = mlxplat_mlxcpld_wd_main_regs_type1,
4249 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
4250 .version = MLX_WDT_TYPE1,
4251 .identity = "mlx-wdt-main",
4254 .data = mlxplat_mlxcpld_wd_aux_regs_type1,
4255 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
4256 .version = MLX_WDT_TYPE1,
4257 .identity = "mlx-wdt-aux",
4261 /* Watchdog type2: hardware implementation version 2
4262 * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
4264 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
4267 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4268 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4273 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4274 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4275 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4278 .label = "timeleft",
4279 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
4280 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4284 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4285 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4290 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4291 .mask = GENMASK(7, 0) & ~BIT(6),
4296 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
4299 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4300 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4305 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4306 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4307 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4310 .label = "timeleft",
4311 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
4312 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4316 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4317 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4322 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
4324 .data = mlxplat_mlxcpld_wd_main_regs_type2,
4325 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
4326 .version = MLX_WDT_TYPE2,
4327 .identity = "mlx-wdt-main",
4330 .data = mlxplat_mlxcpld_wd_aux_regs_type2,
4331 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
4332 .version = MLX_WDT_TYPE2,
4333 .identity = "mlx-wdt-aux",
4337 /* Watchdog type3: hardware implementation version 3
4338 * Can be on all systems. It's differentiated by WD capability bit.
4339 * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
4340 * still have only one main watchdog.
4342 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
4345 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4346 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4351 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4352 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4353 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
4356 .label = "timeleft",
4357 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4358 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4362 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4363 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4368 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4369 .mask = GENMASK(7, 0) & ~BIT(6),
4374 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
4377 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4378 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4383 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4384 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4385 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
4388 .label = "timeleft",
4389 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4390 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4394 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4395 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4400 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
4402 .data = mlxplat_mlxcpld_wd_main_regs_type3,
4403 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
4404 .version = MLX_WDT_TYPE3,
4405 .identity = "mlx-wdt-main",
4408 .data = mlxplat_mlxcpld_wd_aux_regs_type3,
4409 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
4410 .version = MLX_WDT_TYPE3,
4411 .identity = "mlx-wdt-aux",
4415 static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
4418 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4419 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4420 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4421 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4422 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4423 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4424 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4425 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4426 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4427 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4428 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4429 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
4430 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4431 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
4432 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4433 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4434 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4435 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4436 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4437 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4438 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4439 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4440 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4441 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4442 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4443 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4444 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4445 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4446 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4447 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4448 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4449 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4450 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4451 case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
4452 case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
4453 case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
4454 case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
4455 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4456 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4457 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4458 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4459 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4460 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4461 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4462 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4463 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4464 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4465 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4466 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4467 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4468 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4469 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4470 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4471 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4472 case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
4473 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
4474 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
4475 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
4476 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
4477 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4478 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4479 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
4480 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4481 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4482 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
4483 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4484 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4485 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4486 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4487 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4493 static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
4496 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
4497 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
4498 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
4499 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
4500 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
4501 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
4502 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
4503 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
4504 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
4505 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
4506 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
4507 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
4508 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4509 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
4510 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
4511 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
4512 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4513 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4514 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4515 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4516 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4517 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4518 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4519 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
4520 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
4521 case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
4522 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4523 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4524 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4525 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
4526 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4527 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
4528 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4529 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4530 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4531 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
4532 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4533 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
4534 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4535 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
4536 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4537 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
4538 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4539 case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
4540 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4541 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4542 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
4543 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4544 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4545 case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
4546 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4547 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4548 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
4549 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4550 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4551 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
4552 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4553 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4554 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
4555 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4556 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4557 case MLXPLAT_CPLD_LPC_REG_EROT_OFFSET:
4558 case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
4559 case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
4560 case MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET:
4561 case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
4562 case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
4563 case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
4564 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4565 case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
4566 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4567 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4568 case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
4569 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4570 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4571 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4572 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4573 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4574 case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
4575 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4576 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4577 case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
4578 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4579 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4580 case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
4581 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4582 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4583 case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
4584 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4585 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4586 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4587 case MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET:
4588 case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
4589 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
4590 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
4591 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
4592 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
4593 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4594 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4595 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
4596 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4597 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4598 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
4599 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
4600 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
4601 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
4602 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
4603 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4604 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4605 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4606 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4607 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
4608 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
4609 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
4610 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
4611 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
4612 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
4613 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
4614 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
4615 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
4616 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
4617 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
4618 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
4619 case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
4620 case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
4621 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4622 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
4623 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
4624 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
4625 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
4626 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
4627 case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
4628 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
4629 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
4630 case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
4631 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
4637 static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
4640 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
4641 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
4642 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
4643 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
4644 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
4645 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
4646 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
4647 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
4648 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
4649 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
4650 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
4651 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
4652 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4653 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
4654 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
4655 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
4656 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4657 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4658 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4659 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4660 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4661 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4662 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4663 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
4664 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
4665 case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
4666 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4667 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4668 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4669 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4670 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4671 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4672 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4673 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
4674 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4675 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
4676 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4677 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
4678 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4679 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
4680 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4681 case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
4682 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4683 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4684 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
4685 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4686 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4687 case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
4688 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4689 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4690 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
4691 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4692 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4693 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
4694 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4695 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4696 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
4697 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4698 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4699 case MLXPLAT_CPLD_LPC_REG_EROT_OFFSET:
4700 case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
4701 case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
4702 case MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET:
4703 case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
4704 case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
4705 case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
4706 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4707 case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
4708 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4709 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4710 case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
4711 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4712 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4713 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4714 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4715 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4716 case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
4717 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4718 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4719 case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
4720 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4721 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4722 case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
4723 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4724 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4725 case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
4726 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4727 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4728 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4729 case MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET:
4730 case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
4731 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4732 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4733 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4734 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4735 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
4736 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
4737 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
4738 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
4739 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4740 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4741 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4742 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4743 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
4744 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
4745 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
4746 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
4747 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
4748 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
4749 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
4750 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
4751 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
4752 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
4753 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
4754 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
4755 case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
4756 case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
4757 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4758 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
4759 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
4760 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
4761 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
4762 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
4763 case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
4764 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
4765 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
4766 case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
4767 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
4773 static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
4774 { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
4775 { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
4776 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4777 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
4780 static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
4781 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4782 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
4785 static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
4786 { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
4787 MLXPLAT_CPLD_LOW_AGGRCX_MASK },
4788 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4791 static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
4792 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4793 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4794 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4795 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4798 static const struct reg_default mlxplat_mlxcpld_regmap_rack_switch[] = {
4799 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, MLXPLAT_REGMAP_NVSWITCH_PWM_DEFAULT },
4800 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4801 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4802 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4805 static const struct reg_default mlxplat_mlxcpld_regmap_eth_modular[] = {
4806 { MLXPLAT_CPLD_LPC_REG_GP2_OFFSET, 0x61 },
4807 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4808 { MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET, 0x00 },
4809 { MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET, 0x00 },
4810 { MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET, 0x00 },
4811 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4812 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4813 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4814 { MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET,
4815 MLXPLAT_CPLD_AGGR_MASK_LC_LOW },
4818 struct mlxplat_mlxcpld_regmap_context {
4822 static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
4825 mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
4827 struct mlxplat_mlxcpld_regmap_context *ctx = context;
4829 *val = ioread8(ctx->base + reg);
4834 mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
4836 struct mlxplat_mlxcpld_regmap_context *ctx = context;
4838 iowrite8(val, ctx->base + reg);
4842 static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
4845 .max_register = 255,
4846 .cache_type = REGCACHE_FLAT,
4847 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4848 .readable_reg = mlxplat_mlxcpld_readable_reg,
4849 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4850 .reg_defaults = mlxplat_mlxcpld_regmap_default,
4851 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
4852 .reg_read = mlxplat_mlxcpld_reg_read,
4853 .reg_write = mlxplat_mlxcpld_reg_write,
4856 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
4859 .max_register = 255,
4860 .cache_type = REGCACHE_FLAT,
4861 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4862 .readable_reg = mlxplat_mlxcpld_readable_reg,
4863 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4864 .reg_defaults = mlxplat_mlxcpld_regmap_ng,
4865 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
4866 .reg_read = mlxplat_mlxcpld_reg_read,
4867 .reg_write = mlxplat_mlxcpld_reg_write,
4870 static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
4873 .max_register = 255,
4874 .cache_type = REGCACHE_FLAT,
4875 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4876 .readable_reg = mlxplat_mlxcpld_readable_reg,
4877 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4878 .reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
4879 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
4880 .reg_read = mlxplat_mlxcpld_reg_read,
4881 .reg_write = mlxplat_mlxcpld_reg_write,
4884 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
4887 .max_register = 255,
4888 .cache_type = REGCACHE_FLAT,
4889 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4890 .readable_reg = mlxplat_mlxcpld_readable_reg,
4891 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4892 .reg_defaults = mlxplat_mlxcpld_regmap_ng400,
4893 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
4894 .reg_read = mlxplat_mlxcpld_reg_read,
4895 .reg_write = mlxplat_mlxcpld_reg_write,
4898 static const struct regmap_config mlxplat_mlxcpld_regmap_config_rack_switch = {
4901 .max_register = 255,
4902 .cache_type = REGCACHE_FLAT,
4903 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4904 .readable_reg = mlxplat_mlxcpld_readable_reg,
4905 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4906 .reg_defaults = mlxplat_mlxcpld_regmap_rack_switch,
4907 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_rack_switch),
4908 .reg_read = mlxplat_mlxcpld_reg_read,
4909 .reg_write = mlxplat_mlxcpld_reg_write,
4912 static const struct regmap_config mlxplat_mlxcpld_regmap_config_eth_modular = {
4915 .max_register = 255,
4916 .cache_type = REGCACHE_FLAT,
4917 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4918 .readable_reg = mlxplat_mlxcpld_readable_reg,
4919 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4920 .reg_defaults = mlxplat_mlxcpld_regmap_eth_modular,
4921 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_eth_modular),
4922 .reg_read = mlxplat_mlxcpld_reg_read,
4923 .reg_write = mlxplat_mlxcpld_reg_write,
4926 static struct resource mlxplat_mlxcpld_resources[] = {
4927 [0] = DEFINE_RES_IRQ_NAMED(MLXPLAT_CPLD_LPC_SYSIRQ, "mlxreg-hotplug"),
4930 static struct platform_device *mlxplat_dev;
4931 static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
4932 static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
4933 static struct mlxreg_core_platform_data *mlxplat_led;
4934 static struct mlxreg_core_platform_data *mlxplat_regs_io;
4935 static struct mlxreg_core_platform_data *mlxplat_fan;
4936 static struct mlxreg_core_platform_data
4937 *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
4938 static const struct regmap_config *mlxplat_regmap_config;
4940 static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
4944 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4945 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4946 mlxplat_mux_data = mlxplat_default_mux_data;
4947 for (i = 0; i < mlxplat_mux_num; i++) {
4948 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
4949 mlxplat_mux_data[i].n_values =
4950 ARRAY_SIZE(mlxplat_default_channels[i]);
4952 mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
4953 mlxplat_hotplug->deferred_nr =
4954 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4955 mlxplat_led = &mlxplat_default_led_data;
4956 mlxplat_regs_io = &mlxplat_default_regs_io_data;
4957 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4962 static int __init mlxplat_dmi_default_wc_matched(const struct dmi_system_id *dmi)
4966 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4967 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4968 mlxplat_mux_data = mlxplat_default_mux_data;
4969 for (i = 0; i < mlxplat_mux_num; i++) {
4970 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
4971 mlxplat_mux_data[i].n_values =
4972 ARRAY_SIZE(mlxplat_default_channels[i]);
4974 mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
4975 mlxplat_hotplug->deferred_nr =
4976 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4977 mlxplat_led = &mlxplat_default_led_wc_data;
4978 mlxplat_regs_io = &mlxplat_default_regs_io_data;
4979 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4984 static int __init mlxplat_dmi_default_eth_wc_blade_matched(const struct dmi_system_id *dmi)
4988 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4989 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4990 mlxplat_mux_data = mlxplat_default_mux_data;
4991 for (i = 0; i < mlxplat_mux_num; i++) {
4992 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4993 mlxplat_mux_data[i].n_values =
4994 ARRAY_SIZE(mlxplat_msn21xx_channels);
4996 mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
4997 mlxplat_hotplug->deferred_nr =
4998 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4999 mlxplat_led = &mlxplat_default_led_eth_wc_blade_data;
5000 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5001 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5002 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5003 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5004 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
5009 static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
5013 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5014 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5015 mlxplat_mux_data = mlxplat_default_mux_data;
5016 for (i = 0; i < mlxplat_mux_num; i++) {
5017 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5018 mlxplat_mux_data[i].n_values =
5019 ARRAY_SIZE(mlxplat_msn21xx_channels);
5021 mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
5022 mlxplat_hotplug->deferred_nr =
5023 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5024 mlxplat_led = &mlxplat_msn21xx_led_data;
5025 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
5026 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
5031 static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
5035 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5036 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5037 mlxplat_mux_data = mlxplat_default_mux_data;
5038 for (i = 0; i < mlxplat_mux_num; i++) {
5039 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5040 mlxplat_mux_data[i].n_values =
5041 ARRAY_SIZE(mlxplat_msn21xx_channels);
5043 mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
5044 mlxplat_hotplug->deferred_nr =
5045 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5046 mlxplat_led = &mlxplat_default_led_data;
5047 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
5048 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
5053 static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
5057 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5058 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5059 mlxplat_mux_data = mlxplat_default_mux_data;
5060 for (i = 0; i < mlxplat_mux_num; i++) {
5061 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5062 mlxplat_mux_data[i].n_values =
5063 ARRAY_SIZE(mlxplat_msn21xx_channels);
5065 mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
5066 mlxplat_hotplug->deferred_nr =
5067 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5068 mlxplat_led = &mlxplat_msn21xx_led_data;
5069 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
5070 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
5075 static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
5079 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5080 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5081 mlxplat_mux_data = mlxplat_default_mux_data;
5082 for (i = 0; i < mlxplat_mux_num; i++) {
5083 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5084 mlxplat_mux_data[i].n_values =
5085 ARRAY_SIZE(mlxplat_msn21xx_channels);
5087 mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
5088 mlxplat_hotplug->deferred_nr =
5089 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5090 mlxplat_led = &mlxplat_default_ng_led_data;
5091 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5092 mlxplat_fan = &mlxplat_default_fan_data;
5093 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5094 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5095 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5096 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
5101 static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
5105 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
5106 mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
5107 mlxplat_mux_data = mlxplat_extended_mux_data;
5108 for (i = 0; i < mlxplat_mux_num; i++) {
5109 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5110 mlxplat_mux_data[i].n_values =
5111 ARRAY_SIZE(mlxplat_msn21xx_channels);
5113 mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
5114 mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
5115 mlxplat_led = &mlxplat_comex_100G_led_data;
5116 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5117 mlxplat_fan = &mlxplat_default_fan_data;
5118 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5119 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5120 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
5125 static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
5129 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5130 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5131 mlxplat_mux_data = mlxplat_default_mux_data;
5132 for (i = 0; i < mlxplat_mux_num; i++) {
5133 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5134 mlxplat_mux_data[i].n_values =
5135 ARRAY_SIZE(mlxplat_msn21xx_channels);
5137 mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
5138 mlxplat_hotplug->deferred_nr =
5139 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5140 mlxplat_led = &mlxplat_default_ng_led_data;
5141 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5142 mlxplat_fan = &mlxplat_default_fan_data;
5143 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5144 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5145 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5146 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
5151 static int __init mlxplat_dmi_modular_matched(const struct dmi_system_id *dmi)
5155 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5156 mlxplat_mux_num = ARRAY_SIZE(mlxplat_modular_mux_data);
5157 mlxplat_mux_data = mlxplat_modular_mux_data;
5158 mlxplat_hotplug = &mlxplat_mlxcpld_modular_data;
5159 mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR;
5160 mlxplat_led = &mlxplat_modular_led_data;
5161 mlxplat_regs_io = &mlxplat_modular_regs_io_data;
5162 mlxplat_fan = &mlxplat_default_fan_data;
5163 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5164 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5165 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5166 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_eth_modular;
5171 static int __init mlxplat_dmi_nvlink_blade_matched(const struct dmi_system_id *dmi)
5175 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5176 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
5177 mlxplat_mux_data = mlxplat_default_mux_data;
5178 mlxplat_hotplug = &mlxplat_mlxcpld_nvlink_blade_data;
5179 mlxplat_hotplug->deferred_nr =
5180 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5181 for (i = 0; i < mlxplat_mux_num; i++) {
5182 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
5183 mlxplat_mux_data[i].n_values =
5184 ARRAY_SIZE(mlxplat_msn21xx_channels);
5186 mlxplat_regs_io = &mlxplat_nvlink_blade_regs_io_data;
5187 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5188 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
5193 static int __init mlxplat_dmi_rack_switch_matched(const struct dmi_system_id *dmi)
5197 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
5198 mlxplat_mux_num = ARRAY_SIZE(mlxplat_rack_switch_mux_data);
5199 mlxplat_mux_data = mlxplat_rack_switch_mux_data;
5200 mlxplat_hotplug = &mlxplat_mlxcpld_rack_switch_data;
5201 mlxplat_hotplug->deferred_nr =
5202 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
5203 mlxplat_led = &mlxplat_default_ng_led_data;
5204 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
5205 mlxplat_fan = &mlxplat_default_fan_data;
5206 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
5207 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
5208 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
5209 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_rack_switch;
5214 static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
5216 .callback = mlxplat_dmi_default_wc_matched,
5218 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
5219 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI138"),
5223 .callback = mlxplat_dmi_default_matched,
5225 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
5229 .callback = mlxplat_dmi_msn21xx_matched,
5231 DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
5235 .callback = mlxplat_dmi_msn274x_matched,
5237 DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
5241 .callback = mlxplat_dmi_msn201x_matched,
5243 DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
5247 .callback = mlxplat_dmi_default_eth_wc_blade_matched,
5249 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
5250 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI139"),
5254 .callback = mlxplat_dmi_qmb7xx_matched,
5256 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
5260 .callback = mlxplat_dmi_qmb7xx_matched,
5262 DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
5266 .callback = mlxplat_dmi_comex_matched,
5268 DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
5272 .callback = mlxplat_dmi_rack_switch_matched,
5274 DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
5275 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI142"),
5279 .callback = mlxplat_dmi_ng400_matched,
5281 DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
5285 .callback = mlxplat_dmi_modular_matched,
5287 DMI_MATCH(DMI_BOARD_NAME, "VMOD0011"),
5291 .callback = mlxplat_dmi_nvlink_blade_matched,
5293 DMI_MATCH(DMI_BOARD_NAME, "VMOD0015"),
5297 .callback = mlxplat_dmi_msn274x_matched,
5299 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5300 DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
5304 .callback = mlxplat_dmi_default_matched,
5306 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5307 DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
5311 .callback = mlxplat_dmi_default_matched,
5313 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5314 DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
5318 .callback = mlxplat_dmi_default_matched,
5320 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5321 DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
5325 .callback = mlxplat_dmi_default_matched,
5327 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5328 DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
5332 .callback = mlxplat_dmi_msn21xx_matched,
5334 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5335 DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
5339 .callback = mlxplat_dmi_msn201x_matched,
5341 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5342 DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
5346 .callback = mlxplat_dmi_qmb7xx_matched,
5348 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5349 DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
5353 .callback = mlxplat_dmi_qmb7xx_matched,
5355 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5356 DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
5360 .callback = mlxplat_dmi_qmb7xx_matched,
5362 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5363 DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
5367 .callback = mlxplat_dmi_qmb7xx_matched,
5369 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5370 DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
5376 MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
5378 static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
5380 struct i2c_adapter *search_adap;
5383 /* Scan adapters from expected id to verify it is free. */
5384 *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
5385 for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
5386 mlxplat_max_adap_num; i++) {
5387 search_adap = i2c_get_adapter(i);
5389 i2c_put_adapter(search_adap);
5393 /* Return if expected parent adapter is free. */
5394 if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
5399 /* Return with error if free id for adapter is not found. */
5400 if (i == mlxplat_max_adap_num)
5403 /* Shift adapter ids, since expected parent adapter is not free. */
5405 for (i = 0; i < mlxplat_mux_num; i++) {
5406 shift = *nr - mlxplat_mux_data[i].parent;
5407 mlxplat_mux_data[i].parent = *nr;
5408 mlxplat_mux_data[i].base_nr += shift;
5410 mlxplat_hotplug->shift_nr = shift;
5416 static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
5421 rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
5426 if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
5427 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
5428 if (mlxplat_wd_data[i])
5429 mlxplat_wd_data[i] =
5430 &mlxplat_mlxcpld_wd_set_type3[i];
5437 static int __init mlxplat_init(void)
5439 struct mlxplat_priv *priv;
5442 if (!dmi_check_system(mlxplat_dmi_table))
5445 mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, PLATFORM_DEVID_NONE,
5446 mlxplat_lpc_resources,
5447 ARRAY_SIZE(mlxplat_lpc_resources));
5449 if (IS_ERR(mlxplat_dev))
5450 return PTR_ERR(mlxplat_dev);
5452 priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
5458 platform_set_drvdata(mlxplat_dev, priv);
5460 mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
5461 mlxplat_lpc_resources[1].start, 1);
5462 if (!mlxplat_mlxcpld_regmap_ctx.base) {
5467 if (!mlxplat_regmap_config)
5468 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
5470 priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
5471 &mlxplat_mlxcpld_regmap_ctx,
5472 mlxplat_regmap_config);
5473 if (IS_ERR(priv->regmap)) {
5474 err = PTR_ERR(priv->regmap);
5478 err = mlxplat_mlxcpld_verify_bus_topology(&nr);
5482 nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
5484 mlxplat_i2c->regmap = priv->regmap;
5485 priv->pdev_i2c = platform_device_register_resndata(&mlxplat_dev->dev, "i2c_mlxcpld",
5486 nr, mlxplat_mlxcpld_resources,
5487 ARRAY_SIZE(mlxplat_mlxcpld_resources),
5488 mlxplat_i2c, sizeof(*mlxplat_i2c));
5489 if (IS_ERR(priv->pdev_i2c)) {
5490 err = PTR_ERR(priv->pdev_i2c);
5494 for (i = 0; i < mlxplat_mux_num; i++) {
5495 priv->pdev_mux[i] = platform_device_register_resndata(&priv->pdev_i2c->dev,
5496 "i2c-mux-reg", i, NULL, 0,
5497 &mlxplat_mux_data[i],
5498 sizeof(mlxplat_mux_data[i]));
5499 if (IS_ERR(priv->pdev_mux[i])) {
5500 err = PTR_ERR(priv->pdev_mux[i]);
5501 goto fail_platform_mux_register;
5505 /* Add hotplug driver */
5506 if (mlxplat_hotplug) {
5507 mlxplat_hotplug->regmap = priv->regmap;
5508 priv->pdev_hotplug =
5509 platform_device_register_resndata(&mlxplat_dev->dev,
5510 "mlxreg-hotplug", PLATFORM_DEVID_NONE,
5511 mlxplat_mlxcpld_resources,
5512 ARRAY_SIZE(mlxplat_mlxcpld_resources),
5513 mlxplat_hotplug, sizeof(*mlxplat_hotplug));
5514 if (IS_ERR(priv->pdev_hotplug)) {
5515 err = PTR_ERR(priv->pdev_hotplug);
5516 goto fail_platform_mux_register;
5520 /* Set default registers. */
5521 for (j = 0; j < mlxplat_regmap_config->num_reg_defaults; j++) {
5522 err = regmap_write(priv->regmap,
5523 mlxplat_regmap_config->reg_defaults[j].reg,
5524 mlxplat_regmap_config->reg_defaults[j].def);
5526 goto fail_platform_mux_register;
5529 /* Add LED driver. */
5531 mlxplat_led->regmap = priv->regmap;
5533 platform_device_register_resndata(&mlxplat_dev->dev, "leds-mlxreg",
5534 PLATFORM_DEVID_NONE, NULL, 0, mlxplat_led,
5535 sizeof(*mlxplat_led));
5536 if (IS_ERR(priv->pdev_led)) {
5537 err = PTR_ERR(priv->pdev_led);
5538 goto fail_platform_hotplug_register;
5542 /* Add registers io access driver. */
5543 if (mlxplat_regs_io) {
5544 mlxplat_regs_io->regmap = priv->regmap;
5545 priv->pdev_io_regs = platform_device_register_resndata(&mlxplat_dev->dev,
5547 PLATFORM_DEVID_NONE, NULL,
5549 sizeof(*mlxplat_regs_io));
5550 if (IS_ERR(priv->pdev_io_regs)) {
5551 err = PTR_ERR(priv->pdev_io_regs);
5552 goto fail_platform_led_register;
5556 /* Add FAN driver. */
5558 mlxplat_fan->regmap = priv->regmap;
5559 priv->pdev_fan = platform_device_register_resndata(&mlxplat_dev->dev, "mlxreg-fan",
5560 PLATFORM_DEVID_NONE, NULL, 0,
5562 sizeof(*mlxplat_fan));
5563 if (IS_ERR(priv->pdev_fan)) {
5564 err = PTR_ERR(priv->pdev_fan);
5565 goto fail_platform_io_regs_register;
5569 /* Add WD drivers. */
5570 err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
5572 goto fail_platform_wd_register;
5573 for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) {
5574 if (mlxplat_wd_data[j]) {
5575 mlxplat_wd_data[j]->regmap = priv->regmap;
5577 platform_device_register_resndata(&mlxplat_dev->dev, "mlx-wdt", j,
5578 NULL, 0, mlxplat_wd_data[j],
5579 sizeof(*mlxplat_wd_data[j]));
5580 if (IS_ERR(priv->pdev_wd[j])) {
5581 err = PTR_ERR(priv->pdev_wd[j]);
5582 goto fail_platform_wd_register;
5587 /* Sync registers with hardware. */
5588 regcache_mark_dirty(priv->regmap);
5589 err = regcache_sync(priv->regmap);
5591 goto fail_platform_wd_register;
5595 fail_platform_wd_register:
5597 platform_device_unregister(priv->pdev_wd[j]);
5599 platform_device_unregister(priv->pdev_fan);
5600 fail_platform_io_regs_register:
5601 if (mlxplat_regs_io)
5602 platform_device_unregister(priv->pdev_io_regs);
5603 fail_platform_led_register:
5605 platform_device_unregister(priv->pdev_led);
5606 fail_platform_hotplug_register:
5607 if (mlxplat_hotplug)
5608 platform_device_unregister(priv->pdev_hotplug);
5609 fail_platform_mux_register:
5611 platform_device_unregister(priv->pdev_mux[i]);
5612 platform_device_unregister(priv->pdev_i2c);
5614 platform_device_unregister(mlxplat_dev);
5618 module_init(mlxplat_init);
5620 static void __exit mlxplat_exit(void)
5622 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
5625 for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0 ; i--)
5626 platform_device_unregister(priv->pdev_wd[i]);
5628 platform_device_unregister(priv->pdev_fan);
5629 if (priv->pdev_io_regs)
5630 platform_device_unregister(priv->pdev_io_regs);
5632 platform_device_unregister(priv->pdev_led);
5633 if (priv->pdev_hotplug)
5634 platform_device_unregister(priv->pdev_hotplug);
5636 for (i = mlxplat_mux_num - 1; i >= 0 ; i--)
5637 platform_device_unregister(priv->pdev_mux[i]);
5639 platform_device_unregister(priv->pdev_i2c);
5640 platform_device_unregister(mlxplat_dev);
5642 module_exit(mlxplat_exit);
5644 MODULE_AUTHOR("Vadim Pasternak (vadimp@mellanox.com)");
5645 MODULE_DESCRIPTION("Mellanox platform driver");
5646 MODULE_LICENSE("Dual BSD/GPL");