1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /*
3 * Mellanox platform driver
4 *
5 * Copyright (C) 2016-2018 Mellanox Technologies
6 * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
7 */
8
9 #include <linux/array_size.h>
10 #include <linux/bits.h>
11 #include <linux/device.h>
12 #include <linux/dmi.h>
13 #include <linux/i2c.h>
14 #include <linux/i2c-mux.h>
15 #include <linux/io.h>
16 #include <linux/module.h>
17 #include <linux/pci.h>
18 #include <linux/platform_device.h>
19 #include <linux/platform_data/i2c-mux-reg.h>
20 #include <linux/platform_data/mlxreg.h>
21 #include <linux/reboot.h>
22 #include <linux/regmap.h>
23
24 #define MLX_PLAT_DEVICE_NAME "mlxplat"
25
26 /* LPC bus IO offsets */
27 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000
28 #define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500
29 #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00
30 #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01
31 #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02
32 #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET 0x03
33 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET 0x04
34 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET 0x05
35 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET 0x06
36 #define MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET 0x07
37 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET 0x08
38 #define MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET 0x09
39 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET 0x0a
40 #define MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET 0x0b
41 #define MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET 0x17
42 #define MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET 0x19
43 #define MLXPLAT_CPLD_LPC_REG_RESET_GP3_OFFSET 0x1b
44 #define MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET 0x1c
45 #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
46 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET 0x1e
47 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET 0x1f
48 #define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET 0x20
49 #define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET 0x21
50 #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22
51 #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23
52 #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24
53 #define MLXPLAT_CPLD_LPC_REG_LED6_OFFSET 0x25
54 #define MLXPLAT_CPLD_LPC_REG_LED7_OFFSET 0x26
55 #define MLXPLAT_CPLD_LPC_REG_LED8_OFFSET 0x27
56 #define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION 0x2a
57 #define MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET 0x2b
58 #define MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET 0x2d
59 #define MLXPLAT_CPLD_LPC_REG_GP1_RO_OFFSET 0x2c
60 #define MLXPLAT_CPLD_LPC_REG_GP0_OFFSET 0x2e
61 #define MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET 0x2f
62 #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET 0x30
63 #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET 0x31
64 #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET 0x32
65 #define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET 0x33
66 #define MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE 0x34
67 #define MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET 0x35
68 #define MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET 0x36
69 #define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET 0x37
70 #define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a
71 #define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b
72 #define MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET 0x3c
73 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40
74 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET 0x41
75 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET 0x42
76 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET 0x43
77 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET 0x44
78 #define MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET 0x45
79 #define MLXPLAT_CPLD_LPC_REG_GP3_OFFSET 0x46
80 #define MLXPLAT_CPLD_LPC_REG_BRD_OFFSET 0x47
81 #define MLXPLAT_CPLD_LPC_REG_BRD_EVENT_OFFSET 0x48
82 #define MLXPLAT_CPLD_LPC_REG_BRD_MASK_OFFSET 0x49
83 #define MLXPLAT_CPLD_LPC_REG_GWP_OFFSET 0x4a
84 #define MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET 0x4b
85 #define MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET 0x4c
86 #define MLXPLAT_CPLD_LPC_REG_GPI_MASK_OFFSET 0x4e
87 #define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
88 #define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET 0x51
89 #define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET 0x52
90 #define MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET 0x53
91 #define MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET 0x54
92 #define MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET 0x55
93 #define MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET 0x56
94 #define MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET 0x57
95 #define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET 0x58
96 #define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET 0x59
97 #define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET 0x5a
98 #define MLXPLAT_CPLD_LPC_REG_PSU_AC_OFFSET 0x5e
99 #define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET 0x64
100 #define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET 0x65
101 #define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET 0x66
102 #define MLXPLAT_CPLD_LPC_REG_PSU_ALERT_OFFSET 0x6a
103 #define MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET 0x70
104 #define MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET 0x71
105 #define MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET 0x72
106 #define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET 0x88
107 #define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET 0x89
108 #define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET 0x8a
109 #define MLXPLAT_CPLD_LPC_REG_FAN2_OFFSET 0x8b
110 #define MLXPLAT_CPLD_LPC_REG_FAN2_EVENT_OFFSET 0x8c
111 #define MLXPLAT_CPLD_LPC_REG_FAN2_MASK_OFFSET 0x8d
112 #define MLXPLAT_CPLD_LPC_REG_CPLD5_VER_OFFSET 0x8e
113 #define MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET 0x8f
114 #define MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET 0x90
115 #define MLXPLAT_CPLD_LPC_REG_EROT_OFFSET 0x91
116 #define MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET 0x92
117 #define MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET 0x93
118 #define MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET 0x94
119 #define MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET 0x95
120 #define MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET 0x96
121 #define MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET 0x97
122 #define MLXPLAT_CPLD_LPC_REG_PWRB_EVENT_OFFSET 0x98
123 #define MLXPLAT_CPLD_LPC_REG_PWRB_MASK_OFFSET 0x99
124 #define MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET 0x9a
125 #define MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET 0x9b
126 #define MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET 0x9c
127 #define MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET 0x9d
128 #define MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET 0x9e
129 #define MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET 0x9f
130 #define MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET 0xa0
131 #define MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET 0xa1
132 #define MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET 0xa2
133 #define MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET 0xa3
134 #define MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET 0xa4
135 #define MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET 0xa5
136 #define MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET 0xa6
137 #define MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET 0xa7
138 #define MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET 0xa8
139 #define MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET 0xa9
140 #define MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET 0xaa
141 #define MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET 0xab
142 #define MLXPLAT_CPLD_LPC_REG_LC_PWR_ON 0xb2
143 #define MLXPLAT_CPLD_LPC_REG_TACHO19_OFFSET 0xb4
144 #define MLXPLAT_CPLD_LPC_REG_TACHO20_OFFSET 0xb5
145 #define MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET 0xb6
146 #define MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET 0xb7
147 #define MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET 0xb8
148 #define MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET 0xb9
149 #define MLXPLAT_CPLD_LPC_REG_TACHO17_OFFSET 0xba
150 #define MLXPLAT_CPLD_LPC_REG_TACHO18_OFFSET 0xbb
151 #define MLXPLAT_CPLD_LPC_REG_ASIC_CAP_OFFSET 0xc1
152 #define MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET 0xc2
153 #define MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT 0xc3
154 #define MLXPLAT_CPLD_LPC_REG_CPLD5_MVER_OFFSET 0xc4
155 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET 0xc7
156 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET 0xc8
157 #define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET 0xc9
158 #define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET 0xcb
159 #define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET 0xcd
160 #define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET 0xce
161 #define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET 0xcf
162 #define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET 0xd1
163 #define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET 0xd2
164 #define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET 0xd3
165 #define MLXPLAT_CPLD_LPC_REG_CPLD6_MVER_OFFSET 0xd9
166 #define MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET 0xdb
167 #define MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET 0xda
168 #define MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET 0xdc
169 #define MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET 0xdd
170 #define MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET 0xde
171 #define MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET 0xdf
172 #define MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET 0xe0
173 #define MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET 0xe1
174 #define MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET 0xe2
175 #define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET 0xe3
176 #define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET 0xe4
177 #define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET 0xe5
178 #define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET 0xe6
179 #define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET 0xe7
180 #define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET 0xe8
181 #define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET 0xe9
182 #define MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET 0xea
183 #define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET 0xeb
184 #define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET 0xec
185 #define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET 0xed
186 #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee
187 #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef
188 #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0
189 #define MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET 0xf1
190 #define MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET 0xf2
191 #define MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET 0xf3
192 #define MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET 0xf4
193 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET 0xf5
194 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET 0xf6
195 #define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7
196 #define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET 0xf8
197 #define MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET 0xf9
198 #define MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET 0xfa
199 #define MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET 0xfb
200 #define MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET 0xfc
201 #define MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET 0xfd
202 #define MLXPLAT_CPLD_LPC_REG_TACHO15_OFFSET 0xfe
203 #define MLXPLAT_CPLD_LPC_REG_TACHO16_OFFSET 0xff
204
205 #define MLXPLAT_CPLD_LPC_IO_RANGE 0x100
206
207 #define MLXPLAT_CPLD_LPC_PIO_OFFSET 0x10000UL
208 #define MLXPLAT_CPLD_LPC_REG1 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
209 MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET) | \
210 MLXPLAT_CPLD_LPC_PIO_OFFSET)
211 #define MLXPLAT_CPLD_LPC_REG2 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
212 MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET) | \
213 MLXPLAT_CPLD_LPC_PIO_OFFSET)
214 #define MLXPLAT_CPLD_LPC_REG3 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
215 MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET) | \
216 MLXPLAT_CPLD_LPC_PIO_OFFSET)
217 #define MLXPLAT_CPLD_LPC_REG4 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
218 MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET) | \
219 MLXPLAT_CPLD_LPC_PIO_OFFSET)
220
221 /* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
222 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF 0x04
223 #define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF 0x08
224 #define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF 0x08
225 #define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF 0x40
226 #define MLXPLAT_CPLD_AGGR_MASK_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
227 MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
228 MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
229 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG 0x01
230 #define MLXPLAT_CPLD_AGGR_MASK_NG_DEF 0x04
231 #define MLXPLAT_CPLD_AGGR_MASK_COMEX BIT(0)
232 #define MLXPLAT_CPLD_AGGR_MASK_LC BIT(3)
233 #define MLXPLAT_CPLD_AGGR_MASK_DPU_BRD BIT(4)
234 #define MLXPLAT_CPLD_AGGR_MASK_DPU_CORE BIT(5)
235 #define MLXPLAT_CPLD_AGGR_MASK_MODULAR (MLXPLAT_CPLD_AGGR_MASK_NG_DEF | \
236 MLXPLAT_CPLD_AGGR_MASK_COMEX | \
237 MLXPLAT_CPLD_AGGR_MASK_LC)
238 #define MLXPLAT_CPLD_AGGR_MASK_SMART_SW (MLXPLAT_CPLD_AGGR_MASK_COMEX | \
239 MLXPLAT_CPLD_AGGR_MASK_NG_DEF | \
240 MLXPLAT_CPLD_AGGR_MASK_DPU_BRD | \
241 MLXPLAT_CPLD_AGGR_MASK_DPU_CORE)
242 #define MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT BIT(0)
243 #define MLXPLAT_CPLD_AGGR_MASK_LC_RDY BIT(1)
244 #define MLXPLAT_CPLD_AGGR_MASK_LC_PG BIT(2)
245 #define MLXPLAT_CPLD_AGGR_MASK_LC_SCRD BIT(3)
246 #define MLXPLAT_CPLD_AGGR_MASK_LC_SYNC BIT(4)
247 #define MLXPLAT_CPLD_AGGR_MASK_LC_ACT BIT(5)
248 #define MLXPLAT_CPLD_AGGR_MASK_LC_SDWN BIT(6)
249 #define MLXPLAT_CPLD_AGGR_MASK_LC_LOW (MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT | \
250 MLXPLAT_CPLD_AGGR_MASK_LC_RDY | \
251 MLXPLAT_CPLD_AGGR_MASK_LC_PG | \
252 MLXPLAT_CPLD_AGGR_MASK_LC_SCRD | \
253 MLXPLAT_CPLD_AGGR_MASK_LC_SYNC | \
254 MLXPLAT_CPLD_AGGR_MASK_LC_ACT | \
255 MLXPLAT_CPLD_AGGR_MASK_LC_SDWN)
256 #define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW 0xc1
257 #define MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2 BIT(2)
258 #define MLXPLAT_CPLD_LOW_AGGR_MASK_PWR_BUT GENMASK(5, 4)
259 #define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C BIT(6)
260 #define MLXPLAT_CPLD_PSU_MASK GENMASK(1, 0)
261 #define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0)
262 #define MLXPLAT_CPLD_PSU_EXT_MASK GENMASK(3, 0)
263 #define MLXPLAT_CPLD_PWR_EXT_MASK GENMASK(3, 0)
264 #define MLXPLAT_CPLD_PSU_XDR_MASK GENMASK(7, 0)
265 #define MLXPLAT_CPLD_PWR_XDR_MASK GENMASK(7, 0)
266 #define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0)
267 #define MLXPLAT_CPLD_ASIC_MASK GENMASK(1, 0)
268 #define MLXPLAT_CPLD_ASIC_XDR_MASK GENMASK(3, 0)
269 #define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(6, 0)
270 #define MLXPLAT_CPLD_FAN_XDR_MASK GENMASK(7, 0)
271 #define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
272 #define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
273 #define MLXPLAT_CPLD_VOLTREG_UPD_MASK GENMASK(5, 4)
274 #define MLXPLAT_CPLD_GWP_MASK GENMASK(0, 0)
275 #define MLXPLAT_CPLD_EROT_MASK GENMASK(1, 0)
276 #define MLXPLAT_CPLD_FU_CAP_MASK GENMASK(1, 0)
277 #define MLXPLAT_CPLD_BIOS_STATUS_MASK GENMASK(3, 1)
278 #define MLXPLAT_CPLD_DPU_MASK GENMASK(3, 0)
279 #define MLXPLAT_CPLD_PWR_BUTTON_MASK BIT(0)
280 #define MLXPLAT_CPLD_LATCH_RST_MASK BIT(6)
281 #define MLXPLAT_CPLD_THERMAL1_PDB_MASK BIT(3)
282 #define MLXPLAT_CPLD_THERMAL2_PDB_MASK BIT(4)
283 #define MLXPLAT_CPLD_INTRUSION_MASK BIT(6)
284 #define MLXPLAT_CPLD_PWM_PG_MASK BIT(7)
285 #define MLXPLAT_CPLD_L1_CHA_HEALTH_MASK (MLXPLAT_CPLD_THERMAL1_PDB_MASK | \
286 MLXPLAT_CPLD_THERMAL2_PDB_MASK | \
287 MLXPLAT_CPLD_INTRUSION_MASK |\
288 MLXPLAT_CPLD_PWM_PG_MASK)
289 #define MLXPLAT_CPLD_I2C_CAP_BIT 0x04
290 #define MLXPLAT_CPLD_I2C_CAP_MASK GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
291 #define MLXPLAT_CPLD_SYS_RESET_MASK BIT(0)
292
293 /* Masks for aggregation for comex carriers */
294 #define MLXPLAT_CPLD_AGGR_MASK_CARRIER BIT(1)
295 #define MLXPLAT_CPLD_AGGR_MASK_CARR_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
296 MLXPLAT_CPLD_AGGR_MASK_CARRIER)
297 #define MLXPLAT_CPLD_LOW_AGGRCX_MASK 0xc1
298
299 /* Masks for aggregation for modular systems */
300 #define MLXPLAT_CPLD_LPC_LC_MASK GENMASK(7, 0)
301
302 /* Masks for aggregation for smart switch systems */
303 #define MLXPLAT_CPLD_LPC_SM_SW_MASK GENMASK(7, 0)
304
305 #define MLXPLAT_CPLD_HALT_MASK BIT(3)
306 #define MLXPLAT_CPLD_RESET_MASK GENMASK(7, 1)
307
308 /* Default I2C parent bus number */
309 #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
310
311 /* Maximum number of possible physical buses equipped on system */
312 #define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM 16
313 #define MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM 24
314
315 /* Number of channels in group */
316 #define MLXPLAT_CPLD_GRP_CHNL_NUM 8
317
318 /* Start channel numbers */
319 #define MLXPLAT_CPLD_CH1 2
320 #define MLXPLAT_CPLD_CH2 10
321 #define MLXPLAT_CPLD_CH3 18
322 #define MLXPLAT_CPLD_CH2_ETH_MODULAR 3
323 #define MLXPLAT_CPLD_CH3_ETH_MODULAR 43
324 #define MLXPLAT_CPLD_CH4_ETH_MODULAR 51
325 #define MLXPLAT_CPLD_CH2_RACK_SWITCH 18
326 #define MLXPLAT_CPLD_CH2_NG800 34
327
328 /* Number of LPC attached MUX platform devices */
329 #define MLXPLAT_CPLD_LPC_MUX_DEVS 4
330
331 /* Hotplug devices adapter numbers */
332 #define MLXPLAT_CPLD_NR_NONE -1
333 #define MLXPLAT_CPLD_PSU_DEFAULT_NR 10
334 #define MLXPLAT_CPLD_PSU_MSNXXXX_NR 4
335 #define MLXPLAT_CPLD_PSU_XDR_NR 3
336 #define MLXPLAT_CPLD_FAN1_DEFAULT_NR 11
337 #define MLXPLAT_CPLD_FAN2_DEFAULT_NR 12
338 #define MLXPLAT_CPLD_FAN3_DEFAULT_NR 13
339 #define MLXPLAT_CPLD_FAN4_DEFAULT_NR 14
340 #define MLXPLAT_CPLD_NR_ASIC 3
341 #define MLXPLAT_CPLD_NR_LC_BASE 34
342 #define MLXPLAT_CPLD_NR_DPU_BASE 18
343
344 #define MLXPLAT_CPLD_NR_LC_SET(nr) (MLXPLAT_CPLD_NR_LC_BASE + (nr))
345 #define MLXPLAT_CPLD_LC_ADDR 0x32
346 #define MLXPLAT_CPLD_DPU_ADDR 0x68
347
348 /* Masks and default values for watchdogs */
349 #define MLXPLAT_CPLD_WD1_CLEAR_MASK GENMASK(7, 1)
350 #define MLXPLAT_CPLD_WD2_CLEAR_MASK (GENMASK(7, 0) & ~BIT(1))
351
352 #define MLXPLAT_CPLD_WD_TYPE1_TO_MASK GENMASK(7, 4)
353 #define MLXPLAT_CPLD_WD_TYPE2_TO_MASK 0
354 #define MLXPLAT_CPLD_WD_RESET_ACT_MASK GENMASK(7, 1)
355 #define MLXPLAT_CPLD_WD_FAN_ACT_MASK (GENMASK(7, 0) & ~BIT(4))
356 #define MLXPLAT_CPLD_WD_COUNT_ACT_MASK (GENMASK(7, 0) & ~BIT(7))
357 #define MLXPLAT_CPLD_WD_CPBLTY_MASK (GENMASK(7, 0) & ~BIT(6))
358 #define MLXPLAT_CPLD_WD_DFLT_TIMEOUT 30
359 #define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT 600
360 #define MLXPLAT_CPLD_WD_MAX_DEVS 2
361 #define MLXPLAT_CPLD_DPU_MAX_DEVS 4
362
363 #define MLXPLAT_CPLD_LPC_SYSIRQ 17
364
365 /* Minimum power required for turning on Ethernet modular system (WATT) */
366 #define MLXPLAT_CPLD_ETH_MODULAR_PWR_MIN 50
367
368 /* Default value for PWM control register for rack switch system */
369 #define MLXPLAT_REGMAP_NVSWITCH_PWM_DEFAULT 0xf4
370
371 #define MLXPLAT_I2C_MAIN_BUS_NOTIFIED 0x01
372 #define MLXPLAT_I2C_MAIN_BUS_HANDLE_CREATED 0x02
373
374 /* Lattice FPGA PCI configuration */
375 #define PCI_VENDOR_ID_LATTICE 0x1204
376 #define PCI_DEVICE_ID_LATTICE_I2C_BRIDGE 0x9c2f
377 #define PCI_DEVICE_ID_LATTICE_JTAG_BRIDGE 0x9c30
378 #define PCI_DEVICE_ID_LATTICE_LPC_BRIDGE 0x9c32
379
380 /* mlxplat_priv - platform private data
381 * @pdev_i2c - i2c controller platform device
382 * @pdev_mux - array of mux platform devices
383 * @pdev_hotplug - hotplug platform devices
384 * @pdev_led - led platform devices
385 * @pdev_io_regs - register access platform devices
386 * @pdev_fan - FAN platform devices
387 * @pdev_wd - array of watchdog platform devices
388 * pdev_dpu - array of Data Processor Unit platform devices
389 * @regmap: device register map
390 * @hotplug_resources: system hotplug resources
391 * @hotplug_resources_size: size of system hotplug resources
392 * @hi2c_main_init_status: init status of I2C main bus
393 * @irq_fpga: FPGA IRQ number
394 */
395 struct mlxplat_priv {
396 struct platform_device *pdev_i2c;
397 struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
398 struct platform_device *pdev_hotplug;
399 struct platform_device *pdev_led;
400 struct platform_device *pdev_io_regs;
401 struct platform_device *pdev_fan;
402 struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
403 struct platform_device *pdev_dpu[MLXPLAT_CPLD_DPU_MAX_DEVS];
404 void *regmap;
405 struct resource *hotplug_resources;
406 unsigned int hotplug_resources_size;
407 u8 i2c_main_init_status;
408 int irq_fpga;
409 };
410
411 static struct platform_device *mlxplat_dev;
412 static int mlxplat_i2c_main_completion_notify(void *handle, int id);
413 static void __iomem *i2c_bridge_addr, *jtag_bridge_addr;
414
415 /* Regions for LPC I2C controller and LPC base register space */
416 static const struct resource mlxplat_lpc_resources[] = {
417 [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
418 MLXPLAT_CPLD_LPC_IO_RANGE,
419 "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
420 [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
421 MLXPLAT_CPLD_LPC_IO_RANGE,
422 "mlxplat_cpld_lpc_regs",
423 IORESOURCE_IO),
424 };
425
426 /* Platform systems default i2c data */
427 static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_default_data = {
428 .completion_notify = mlxplat_i2c_main_completion_notify,
429 };
430
431 /* Platform i2c next generation systems data */
432 static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
433 {
434 .reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
435 .mask = MLXPLAT_CPLD_I2C_CAP_MASK,
436 .bit = MLXPLAT_CPLD_I2C_CAP_BIT,
437 },
438 };
439
440 static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
441 {
442 .data = mlxplat_mlxcpld_i2c_ng_items_data,
443 },
444 };
445
446 /* Platform next generation systems i2c data */
447 static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
448 .items = mlxplat_mlxcpld_i2c_ng_items,
449 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
450 .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
451 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
452 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
453 .completion_notify = mlxplat_i2c_main_completion_notify,
454 };
455
456 /* Platform default channels */
457 static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
458 {
459 MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
460 MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
461 5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
462 },
463 {
464 MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
465 MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
466 5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
467 },
468 };
469
470 /* Platform channels for MSN21xx system family */
471 static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
472
473 /* Platform mux data */
474 static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
475 {
476 .parent = 1,
477 .base_nr = MLXPLAT_CPLD_CH1,
478 .write_only = 1,
479 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
480 .reg_size = 1,
481 .idle_in_use = 1,
482 },
483 {
484 .parent = 1,
485 .base_nr = MLXPLAT_CPLD_CH2,
486 .write_only = 1,
487 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
488 .reg_size = 1,
489 .idle_in_use = 1,
490 },
491
492 };
493
494 /* Platform mux configuration variables */
495 static int mlxplat_max_adap_num;
496 static int mlxplat_mux_num;
497 static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
498 static struct notifier_block *mlxplat_reboot_nb;
499
500 /* Platform extended mux data */
501 static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
502 {
503 .parent = 1,
504 .base_nr = MLXPLAT_CPLD_CH1,
505 .write_only = 1,
506 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
507 .reg_size = 1,
508 .idle_in_use = 1,
509 },
510 {
511 .parent = 1,
512 .base_nr = MLXPLAT_CPLD_CH2,
513 .write_only = 1,
514 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
515 .reg_size = 1,
516 .idle_in_use = 1,
517 },
518 {
519 .parent = 1,
520 .base_nr = MLXPLAT_CPLD_CH3,
521 .write_only = 1,
522 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
523 .reg_size = 1,
524 .idle_in_use = 1,
525 },
526
527 };
528
529 /* Platform channels for modular system family */
530 static const int mlxplat_modular_upper_channel[] = { 1 };
531 static const int mlxplat_modular_channels[] = {
532 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
533 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
534 38, 39, 40
535 };
536
537 /* Platform modular mux data */
538 static struct i2c_mux_reg_platform_data mlxplat_modular_mux_data[] = {
539 {
540 .parent = 1,
541 .base_nr = MLXPLAT_CPLD_CH1,
542 .write_only = 1,
543 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG4,
544 .reg_size = 1,
545 .idle_in_use = 1,
546 .values = mlxplat_modular_upper_channel,
547 .n_values = ARRAY_SIZE(mlxplat_modular_upper_channel),
548 },
549 {
550 .parent = 1,
551 .base_nr = MLXPLAT_CPLD_CH2_ETH_MODULAR,
552 .write_only = 1,
553 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
554 .reg_size = 1,
555 .idle_in_use = 1,
556 .values = mlxplat_modular_channels,
557 .n_values = ARRAY_SIZE(mlxplat_modular_channels),
558 },
559 {
560 .parent = MLXPLAT_CPLD_CH1,
561 .base_nr = MLXPLAT_CPLD_CH3_ETH_MODULAR,
562 .write_only = 1,
563 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
564 .reg_size = 1,
565 .idle_in_use = 1,
566 .values = mlxplat_msn21xx_channels,
567 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
568 },
569 {
570 .parent = 1,
571 .base_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR,
572 .write_only = 1,
573 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
574 .reg_size = 1,
575 .idle_in_use = 1,
576 .values = mlxplat_msn21xx_channels,
577 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
578 },
579 };
580
581 /* Platform channels for rack switch system family */
582 static const int mlxplat_rack_switch_channels[] = {
583 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
584 };
585
586 /* Platform rack switch mux data */
587 static struct i2c_mux_reg_platform_data mlxplat_rack_switch_mux_data[] = {
588 {
589 .parent = 1,
590 .base_nr = MLXPLAT_CPLD_CH1,
591 .write_only = 1,
592 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
593 .reg_size = 1,
594 .idle_in_use = 1,
595 .values = mlxplat_rack_switch_channels,
596 .n_values = ARRAY_SIZE(mlxplat_rack_switch_channels),
597 },
598 {
599 .parent = 1,
600 .base_nr = MLXPLAT_CPLD_CH2_RACK_SWITCH,
601 .write_only = 1,
602 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
603 .reg_size = 1,
604 .idle_in_use = 1,
605 .values = mlxplat_msn21xx_channels,
606 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
607 },
608
609 };
610
611 /* Platform channels for ng800 system family */
612 static const int mlxplat_ng800_channels[] = {
613 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
614 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
615 };
616
617 /* Platform ng800 mux data */
618 static struct i2c_mux_reg_platform_data mlxplat_ng800_mux_data[] = {
619 {
620 .parent = 1,
621 .base_nr = MLXPLAT_CPLD_CH1,
622 .write_only = 1,
623 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
624 .reg_size = 1,
625 .idle_in_use = 1,
626 .values = mlxplat_ng800_channels,
627 .n_values = ARRAY_SIZE(mlxplat_ng800_channels),
628 },
629 {
630 .parent = 1,
631 .base_nr = MLXPLAT_CPLD_CH2_NG800,
632 .write_only = 1,
633 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
634 .reg_size = 1,
635 .idle_in_use = 1,
636 .values = mlxplat_msn21xx_channels,
637 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
638 },
639
640 };
641
642 /* Platform hotplug devices */
643 static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
644 {
645 I2C_BOARD_INFO("dps460", 0x59),
646 },
647 {
648 I2C_BOARD_INFO("dps460", 0x58),
649 },
650 };
651
652 static struct i2c_board_info mlxplat_mlxcpld_ext_pwr[] = {
653 {
654 I2C_BOARD_INFO("dps460", 0x5b),
655 },
656 {
657 I2C_BOARD_INFO("dps460", 0x5a),
658 },
659 };
660
661 static struct i2c_board_info mlxplat_mlxcpld_pwr_ng800[] = {
662 {
663 I2C_BOARD_INFO("dps460", 0x59),
664 },
665 {
666 I2C_BOARD_INFO("dps460", 0x5a),
667 },
668 };
669
670 static struct i2c_board_info mlxplat_mlxcpld_xdr_pwr[] = {
671 {
672 I2C_BOARD_INFO("dps460", 0x5d),
673 },
674 {
675 I2C_BOARD_INFO("dps460", 0x5c),
676 },
677 {
678 I2C_BOARD_INFO("dps460", 0x5e),
679 },
680 {
681 I2C_BOARD_INFO("dps460", 0x5f),
682 },
683 };
684
685 static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
686 {
687 I2C_BOARD_INFO("24c32", 0x50),
688 },
689 {
690 I2C_BOARD_INFO("24c32", 0x50),
691 },
692 {
693 I2C_BOARD_INFO("24c32", 0x50),
694 },
695 {
696 I2C_BOARD_INFO("24c32", 0x50),
697 },
698 };
699
700 /* Platform hotplug comex carrier system family data */
701 static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
702 {
703 .label = "psu1",
704 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
705 .mask = BIT(0),
706 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
707 },
708 {
709 .label = "psu2",
710 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
711 .mask = BIT(1),
712 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
713 },
714 };
715
716 /* Platform hotplug default data */
717 static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
718 {
719 .label = "psu1",
720 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
721 .mask = BIT(0),
722 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
723 },
724 {
725 .label = "psu2",
726 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
727 .mask = BIT(1),
728 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
729 },
730 };
731
732 /* Platform hotplug dgx data */
733 static struct mlxreg_core_data mlxplat_mlxcpld_dgx_pdb_items_data[] = {
734 {
735 .label = "pdb1",
736 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
737 .mask = BIT(0),
738 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
739 },
740 };
741
742 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
743 {
744 .label = "pwr1",
745 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
746 .mask = BIT(0),
747 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
748 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
749 },
750 {
751 .label = "pwr2",
752 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
753 .mask = BIT(1),
754 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
755 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
756 },
757 };
758
759 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_wc_items_data[] = {
760 {
761 .label = "pwr1",
762 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
763 .mask = BIT(0),
764 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
765 },
766 {
767 .label = "pwr2",
768 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
769 .mask = BIT(1),
770 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
771 },
772 };
773
774 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_ng800_items_data[] = {
775 {
776 .label = "pwr1",
777 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
778 .mask = BIT(0),
779 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr_ng800[0],
780 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
781 },
782 {
783 .label = "pwr2",
784 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
785 .mask = BIT(1),
786 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr_ng800[1],
787 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
788 },
789 };
790
791 static struct mlxreg_core_data mlxplat_mlxcpld_dgx_pwr_items_data[] = {
792 {
793 .label = "pwr1",
794 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
795 .mask = BIT(0),
796 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
797 },
798 };
799
800 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
801 {
802 .label = "fan1",
803 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
804 .mask = BIT(0),
805 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
806 .hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
807 },
808 {
809 .label = "fan2",
810 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
811 .mask = BIT(1),
812 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
813 .hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
814 },
815 {
816 .label = "fan3",
817 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
818 .mask = BIT(2),
819 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
820 .hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
821 },
822 {
823 .label = "fan4",
824 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
825 .mask = BIT(3),
826 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
827 .hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
828 },
829 };
830
831 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
832 {
833 .label = "asic1",
834 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
835 .mask = MLXPLAT_CPLD_ASIC_MASK,
836 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
837 },
838 };
839
840 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic2_items_data[] = {
841 {
842 .label = "asic2",
843 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
844 .mask = MLXPLAT_CPLD_ASIC_MASK,
845 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
846 },
847 };
848
849 static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
850 {
851 .data = mlxplat_mlxcpld_default_psu_items_data,
852 .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
853 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
854 .mask = MLXPLAT_CPLD_PSU_MASK,
855 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
856 .inversed = 1,
857 .health = false,
858 },
859 {
860 .data = mlxplat_mlxcpld_default_pwr_items_data,
861 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
862 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
863 .mask = MLXPLAT_CPLD_PWR_MASK,
864 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
865 .inversed = 0,
866 .health = false,
867 },
868 {
869 .data = mlxplat_mlxcpld_default_fan_items_data,
870 .aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
871 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
872 .mask = MLXPLAT_CPLD_FAN_MASK,
873 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
874 .inversed = 1,
875 .health = false,
876 },
877 {
878 .data = mlxplat_mlxcpld_default_asic_items_data,
879 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
880 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
881 .mask = MLXPLAT_CPLD_ASIC_MASK,
882 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
883 .inversed = 0,
884 .health = true,
885 },
886 };
887
888 static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
889 {
890 .data = mlxplat_mlxcpld_comex_psu_items_data,
891 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
892 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
893 .mask = MLXPLAT_CPLD_PSU_MASK,
894 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
895 .inversed = 1,
896 .health = false,
897 },
898 {
899 .data = mlxplat_mlxcpld_default_pwr_items_data,
900 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
901 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
902 .mask = MLXPLAT_CPLD_PWR_MASK,
903 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
904 .inversed = 0,
905 .health = false,
906 },
907 {
908 .data = mlxplat_mlxcpld_default_fan_items_data,
909 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
910 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
911 .mask = MLXPLAT_CPLD_FAN_MASK,
912 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
913 .inversed = 1,
914 .health = false,
915 },
916 {
917 .data = mlxplat_mlxcpld_default_asic_items_data,
918 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
919 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
920 .mask = MLXPLAT_CPLD_ASIC_MASK,
921 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
922 .inversed = 0,
923 .health = true,
924 },
925 };
926
927 static
928 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
929 .items = mlxplat_mlxcpld_default_items,
930 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
931 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
932 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
933 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
934 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
935 };
936
937 static struct mlxreg_core_item mlxplat_mlxcpld_default_wc_items[] = {
938 {
939 .data = mlxplat_mlxcpld_comex_psu_items_data,
940 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
941 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
942 .mask = MLXPLAT_CPLD_PSU_MASK,
943 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
944 .inversed = 1,
945 .health = false,
946 },
947 {
948 .data = mlxplat_mlxcpld_default_pwr_wc_items_data,
949 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
950 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
951 .mask = MLXPLAT_CPLD_PWR_MASK,
952 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
953 .inversed = 0,
954 .health = false,
955 },
956 {
957 .data = mlxplat_mlxcpld_default_asic_items_data,
958 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
959 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
960 .mask = MLXPLAT_CPLD_ASIC_MASK,
961 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
962 .inversed = 0,
963 .health = true,
964 },
965 };
966
967 static
968 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_wc_data = {
969 .items = mlxplat_mlxcpld_default_wc_items,
970 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_wc_items),
971 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
972 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
973 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
974 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
975 };
976
977 static
978 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
979 .items = mlxplat_mlxcpld_comex_items,
980 .count = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
981 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
982 .mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
983 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
984 .mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
985 };
986
987 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
988 {
989 .label = "pwr1",
990 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
991 .mask = BIT(0),
992 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
993 },
994 {
995 .label = "pwr2",
996 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
997 .mask = BIT(1),
998 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
999 },
1000 };
1001
1002 /* Platform hotplug MSN21xx system family data */
1003 static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
1004 {
1005 .data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
1006 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
1007 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1008 .mask = MLXPLAT_CPLD_PWR_MASK,
1009 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
1010 .inversed = 0,
1011 .health = false,
1012 },
1013 {
1014 .data = mlxplat_mlxcpld_default_asic_items_data,
1015 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
1016 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1017 .mask = MLXPLAT_CPLD_ASIC_MASK,
1018 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1019 .inversed = 0,
1020 .health = true,
1021 },
1022 };
1023
1024 static
1025 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
1026 .items = mlxplat_mlxcpld_msn21xx_items,
1027 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
1028 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1029 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
1030 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1031 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
1032 };
1033
1034 /* Platform hotplug msn274x system family data */
1035 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
1036 {
1037 .label = "psu1",
1038 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1039 .mask = BIT(0),
1040 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1041 },
1042 {
1043 .label = "psu2",
1044 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1045 .mask = BIT(1),
1046 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1047 },
1048 };
1049
1050 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
1051 {
1052 .label = "pwr1",
1053 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1054 .mask = BIT(0),
1055 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1056 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1057 },
1058 {
1059 .label = "pwr2",
1060 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1061 .mask = BIT(1),
1062 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1063 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1064 },
1065 };
1066
1067 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
1068 {
1069 .label = "fan1",
1070 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1071 .mask = BIT(0),
1072 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1073 },
1074 {
1075 .label = "fan2",
1076 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1077 .mask = BIT(1),
1078 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1079 },
1080 {
1081 .label = "fan3",
1082 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1083 .mask = BIT(2),
1084 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1085 },
1086 {
1087 .label = "fan4",
1088 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1089 .mask = BIT(3),
1090 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1091 },
1092 };
1093
1094 static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
1095 {
1096 .data = mlxplat_mlxcpld_msn274x_psu_items_data,
1097 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1098 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1099 .mask = MLXPLAT_CPLD_PSU_MASK,
1100 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
1101 .inversed = 1,
1102 .health = false,
1103 },
1104 {
1105 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
1106 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1107 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1108 .mask = MLXPLAT_CPLD_PWR_MASK,
1109 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
1110 .inversed = 0,
1111 .health = false,
1112 },
1113 {
1114 .data = mlxplat_mlxcpld_msn274x_fan_items_data,
1115 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1116 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1117 .mask = MLXPLAT_CPLD_FAN_MASK,
1118 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
1119 .inversed = 1,
1120 .health = false,
1121 },
1122 {
1123 .data = mlxplat_mlxcpld_default_asic_items_data,
1124 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1125 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1126 .mask = MLXPLAT_CPLD_ASIC_MASK,
1127 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1128 .inversed = 0,
1129 .health = true,
1130 },
1131 };
1132
1133 static
1134 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
1135 .items = mlxplat_mlxcpld_msn274x_items,
1136 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
1137 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1138 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1139 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1140 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
1141 };
1142
1143 /* Platform hotplug MSN201x system family data */
1144 static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
1145 {
1146 .label = "pwr1",
1147 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1148 .mask = BIT(0),
1149 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1150 },
1151 {
1152 .label = "pwr2",
1153 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1154 .mask = BIT(1),
1155 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1156 },
1157 };
1158
1159 static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
1160 {
1161 .data = mlxplat_mlxcpld_msn201x_pwr_items_data,
1162 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
1163 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1164 .mask = MLXPLAT_CPLD_PWR_MASK,
1165 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
1166 .inversed = 0,
1167 .health = false,
1168 },
1169 {
1170 .data = mlxplat_mlxcpld_default_asic_items_data,
1171 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
1172 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1173 .mask = MLXPLAT_CPLD_ASIC_MASK,
1174 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1175 .inversed = 0,
1176 .health = true,
1177 },
1178 };
1179
1180 static
1181 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
1182 .items = mlxplat_mlxcpld_msn201x_items,
1183 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
1184 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1185 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
1186 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1187 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
1188 };
1189
1190 /* Platform hotplug next generation system family data */
1191 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
1192 {
1193 .label = "psu1",
1194 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1195 .mask = BIT(0),
1196 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1197 },
1198 {
1199 .label = "psu2",
1200 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1201 .mask = BIT(1),
1202 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1203 },
1204 };
1205
1206 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
1207 {
1208 .label = "fan1",
1209 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1210 .mask = BIT(0),
1211 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1212 .bit = BIT(0),
1213 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1214 },
1215 {
1216 .label = "fan2",
1217 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1218 .mask = BIT(1),
1219 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1220 .bit = BIT(1),
1221 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1222 },
1223 {
1224 .label = "fan3",
1225 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1226 .mask = BIT(2),
1227 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1228 .bit = BIT(2),
1229 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1230 },
1231 {
1232 .label = "fan4",
1233 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1234 .mask = BIT(3),
1235 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1236 .bit = BIT(3),
1237 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1238 },
1239 {
1240 .label = "fan5",
1241 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1242 .mask = BIT(4),
1243 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1244 .bit = BIT(4),
1245 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1246 },
1247 {
1248 .label = "fan6",
1249 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1250 .mask = BIT(5),
1251 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1252 .bit = BIT(5),
1253 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1254 },
1255 {
1256 .label = "fan7",
1257 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1258 .mask = BIT(6),
1259 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1260 .bit = BIT(6),
1261 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1262 },
1263 };
1264
1265 static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
1266 {
1267 .data = mlxplat_mlxcpld_default_ng_psu_items_data,
1268 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1269 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1270 .mask = MLXPLAT_CPLD_PSU_MASK,
1271 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
1272 .inversed = 1,
1273 .health = false,
1274 },
1275 {
1276 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
1277 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1278 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1279 .mask = MLXPLAT_CPLD_PWR_MASK,
1280 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
1281 .inversed = 0,
1282 .health = false,
1283 },
1284 {
1285 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1286 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1287 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1288 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1289 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1290 .inversed = 1,
1291 .health = false,
1292 },
1293 {
1294 .data = mlxplat_mlxcpld_default_asic_items_data,
1295 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1296 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1297 .mask = MLXPLAT_CPLD_ASIC_MASK,
1298 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1299 .inversed = 0,
1300 .health = true,
1301 },
1302 };
1303
1304 static
1305 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
1306 .items = mlxplat_mlxcpld_default_ng_items,
1307 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
1308 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1309 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1310 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1311 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
1312 };
1313
1314 /* Platform hotplug extended system family data */
1315 static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
1316 {
1317 .label = "psu1",
1318 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1319 .mask = BIT(0),
1320 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1321 },
1322 {
1323 .label = "psu2",
1324 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1325 .mask = BIT(1),
1326 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1327 },
1328 {
1329 .label = "psu3",
1330 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1331 .mask = BIT(2),
1332 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1333 },
1334 {
1335 .label = "psu4",
1336 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1337 .mask = BIT(3),
1338 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1339 },
1340 };
1341
1342 static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
1343 {
1344 .label = "pwr1",
1345 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1346 .mask = BIT(0),
1347 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1348 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1349 },
1350 {
1351 .label = "pwr2",
1352 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1353 .mask = BIT(1),
1354 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1355 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1356 },
1357 {
1358 .label = "pwr3",
1359 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1360 .mask = BIT(2),
1361 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1362 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1363 },
1364 {
1365 .label = "pwr4",
1366 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1367 .mask = BIT(3),
1368 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1369 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1370 },
1371 };
1372
1373 static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
1374 {
1375 .data = mlxplat_mlxcpld_ext_psu_items_data,
1376 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1377 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1378 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1379 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1380 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1381 .inversed = 1,
1382 .health = false,
1383 },
1384 {
1385 .data = mlxplat_mlxcpld_ext_pwr_items_data,
1386 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1387 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1388 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1389 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1390 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1391 .inversed = 0,
1392 .health = false,
1393 },
1394 {
1395 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1396 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1397 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1398 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1399 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1400 .inversed = 1,
1401 .health = false,
1402 },
1403 {
1404 .data = mlxplat_mlxcpld_default_asic_items_data,
1405 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1406 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1407 .mask = MLXPLAT_CPLD_ASIC_MASK,
1408 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1409 .inversed = 0,
1410 .health = true,
1411 },
1412 {
1413 .data = mlxplat_mlxcpld_default_asic2_items_data,
1414 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1415 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
1416 .mask = MLXPLAT_CPLD_ASIC_MASK,
1417 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic2_items_data),
1418 .inversed = 0,
1419 .health = true,
1420 }
1421 };
1422
1423 static struct mlxreg_core_item mlxplat_mlxcpld_ext_dgx_items[] = {
1424 {
1425 .data = mlxplat_mlxcpld_dgx_pdb_items_data,
1426 .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
1427 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1428 .mask = MLXPLAT_CPLD_PSU_MASK,
1429 .count = ARRAY_SIZE(mlxplat_mlxcpld_dgx_pdb_items_data),
1430 .inversed = 1,
1431 .health = false,
1432 },
1433 {
1434 .data = mlxplat_mlxcpld_dgx_pwr_items_data,
1435 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
1436 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1437 .mask = MLXPLAT_CPLD_PWR_MASK,
1438 .count = ARRAY_SIZE(mlxplat_mlxcpld_dgx_pwr_items_data),
1439 .inversed = 0,
1440 .health = false,
1441 },
1442 {
1443 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1444 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1445 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1446 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1447 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1448 .inversed = 1,
1449 .health = false,
1450 },
1451 {
1452 .data = mlxplat_mlxcpld_default_asic_items_data,
1453 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1454 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1455 .mask = MLXPLAT_CPLD_ASIC_MASK,
1456 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1457 .inversed = 0,
1458 .health = true,
1459 },
1460 };
1461
1462 static struct mlxreg_core_item mlxplat_mlxcpld_ng800_items[] = {
1463 {
1464 .data = mlxplat_mlxcpld_default_ng_psu_items_data,
1465 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1466 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1467 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1468 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1469 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
1470 .inversed = 1,
1471 .health = false,
1472 },
1473 {
1474 .data = mlxplat_mlxcpld_default_pwr_ng800_items_data,
1475 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1476 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1477 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1478 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1479 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_ng800_items_data),
1480 .inversed = 0,
1481 .health = false,
1482 },
1483 {
1484 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1485 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1486 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1487 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1488 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1489 .inversed = 1,
1490 .health = false,
1491 },
1492 {
1493 .data = mlxplat_mlxcpld_default_asic_items_data,
1494 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1495 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1496 .mask = MLXPLAT_CPLD_ASIC_MASK,
1497 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1498 .inversed = 0,
1499 .health = true,
1500 },
1501 };
1502
1503 static
1504 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
1505 .items = mlxplat_mlxcpld_ext_items,
1506 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
1507 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1508 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1509 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1510 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
1511 };
1512
1513 static
1514 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_dgx_ext_data = {
1515 .items = mlxplat_mlxcpld_ext_dgx_items,
1516 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_dgx_items),
1517 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1518 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1519 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1520 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
1521 };
1522
1523 static
1524 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ng800_data = {
1525 .items = mlxplat_mlxcpld_ng800_items,
1526 .count = ARRAY_SIZE(mlxplat_mlxcpld_ng800_items),
1527 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1528 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1529 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1530 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
1531 };
1532
1533 static struct mlxreg_core_data mlxplat_mlxcpld_modular_pwr_items_data[] = {
1534 {
1535 .label = "pwr1",
1536 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1537 .mask = BIT(0),
1538 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1539 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1540 },
1541 {
1542 .label = "pwr2",
1543 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1544 .mask = BIT(1),
1545 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1546 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1547 },
1548 {
1549 .label = "pwr3",
1550 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1551 .mask = BIT(2),
1552 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1553 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1554 },
1555 {
1556 .label = "pwr4",
1557 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1558 .mask = BIT(3),
1559 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1560 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1561 },
1562 };
1563
1564 static
1565 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_lc_act = {
1566 .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
1567 };
1568
1569 static struct mlxreg_core_data mlxplat_mlxcpld_modular_asic_items_data[] = {
1570 {
1571 .label = "asic1",
1572 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1573 .mask = MLXPLAT_CPLD_ASIC_MASK,
1574 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1575 },
1576 };
1577
1578 static struct i2c_board_info mlxplat_mlxcpld_lc_i2c_dev[] = {
1579 {
1580 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1581 .platform_data = &mlxplat_mlxcpld_lc_act,
1582 },
1583 {
1584 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1585 .platform_data = &mlxplat_mlxcpld_lc_act,
1586 },
1587 {
1588 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1589 .platform_data = &mlxplat_mlxcpld_lc_act,
1590 },
1591 {
1592 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1593 .platform_data = &mlxplat_mlxcpld_lc_act,
1594 },
1595 {
1596 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1597 .platform_data = &mlxplat_mlxcpld_lc_act,
1598 },
1599 {
1600 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1601 .platform_data = &mlxplat_mlxcpld_lc_act,
1602 },
1603 {
1604 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1605 .platform_data = &mlxplat_mlxcpld_lc_act,
1606 },
1607 {
1608 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1609 .platform_data = &mlxplat_mlxcpld_lc_act,
1610 },
1611 };
1612
1613 static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_modular_lc_notifier[] = {
1614 {
1615 .identity = "lc1",
1616 },
1617 {
1618 .identity = "lc2",
1619 },
1620 {
1621 .identity = "lc3",
1622 },
1623 {
1624 .identity = "lc4",
1625 },
1626 {
1627 .identity = "lc5",
1628 },
1629 {
1630 .identity = "lc6",
1631 },
1632 {
1633 .identity = "lc7",
1634 },
1635 {
1636 .identity = "lc8",
1637 },
1638 };
1639
1640 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pr_items_data[] = {
1641 {
1642 .label = "lc1_present",
1643 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1644 .mask = BIT(0),
1645 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1646 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1647 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1648 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1649 .slot = 1,
1650 },
1651 {
1652 .label = "lc2_present",
1653 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1654 .mask = BIT(1),
1655 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1656 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1657 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1658 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1659 .slot = 2,
1660 },
1661 {
1662 .label = "lc3_present",
1663 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1664 .mask = BIT(2),
1665 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1666 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1667 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1668 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1669 .slot = 3,
1670 },
1671 {
1672 .label = "lc4_present",
1673 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1674 .mask = BIT(3),
1675 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1676 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1677 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1678 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1679 .slot = 4,
1680 },
1681 {
1682 .label = "lc5_present",
1683 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1684 .mask = BIT(4),
1685 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1686 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1687 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1688 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1689 .slot = 5,
1690 },
1691 {
1692 .label = "lc6_present",
1693 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1694 .mask = BIT(5),
1695 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1696 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1697 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1698 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1699 .slot = 6,
1700 },
1701 {
1702 .label = "lc7_present",
1703 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1704 .mask = BIT(6),
1705 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1706 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1707 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1708 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1709 .slot = 7,
1710 },
1711 {
1712 .label = "lc8_present",
1713 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1714 .mask = BIT(7),
1715 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1716 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1717 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1718 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1719 .slot = 8,
1720 },
1721 };
1722
1723 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ver_items_data[] = {
1724 {
1725 .label = "lc1_verified",
1726 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1727 .mask = BIT(0),
1728 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1729 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1730 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1731 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1732 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1733 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1734 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1735 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1736 .slot = 1,
1737 },
1738 {
1739 .label = "lc2_verified",
1740 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1741 .mask = BIT(1),
1742 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1743 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1744 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1745 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1746 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1747 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1748 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1749 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1750 .slot = 2,
1751 },
1752 {
1753 .label = "lc3_verified",
1754 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1755 .mask = BIT(2),
1756 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1757 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1758 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1759 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1760 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1761 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1762 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1763 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1764 .slot = 3,
1765 },
1766 {
1767 .label = "lc4_verified",
1768 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1769 .mask = BIT(3),
1770 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1771 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1772 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1773 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1774 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1775 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1776 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1777 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1778 .slot = 4,
1779 },
1780 {
1781 .label = "lc5_verified",
1782 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1783 .mask = BIT(4),
1784 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1785 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1786 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1787 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1788 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1789 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1790 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1791 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1792 .slot = 5,
1793 },
1794 {
1795 .label = "lc6_verified",
1796 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1797 .mask = BIT(5),
1798 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1799 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1800 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1801 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1802 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1803 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1804 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1805 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1806 .slot = 6,
1807 },
1808 {
1809 .label = "lc7_verified",
1810 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1811 .mask = BIT(6),
1812 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1813 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1814 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1815 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1816 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1817 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1818 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1819 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1820 .slot = 7,
1821 },
1822 {
1823 .label = "lc8_verified",
1824 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1825 .mask = BIT(7),
1826 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1827 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1828 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1829 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1830 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1831 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1832 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1833 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1834 .slot = 8,
1835 },
1836 };
1837
1838 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pg_data[] = {
1839 {
1840 .label = "lc1_powered",
1841 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1842 .mask = BIT(0),
1843 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1844 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1845 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1846 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1847 .slot = 1,
1848 },
1849 {
1850 .label = "lc2_powered",
1851 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1852 .mask = BIT(1),
1853 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1854 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1855 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1856 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1857 .slot = 2,
1858 },
1859 {
1860 .label = "lc3_powered",
1861 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1862 .mask = BIT(2),
1863 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1864 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1865 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1866 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1867 .slot = 3,
1868 },
1869 {
1870 .label = "lc4_powered",
1871 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1872 .mask = BIT(3),
1873 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1874 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1875 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1876 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1877 .slot = 4,
1878 },
1879 {
1880 .label = "lc5_powered",
1881 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1882 .mask = BIT(4),
1883 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1884 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1885 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1886 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1887 .slot = 5,
1888 },
1889 {
1890 .label = "lc6_powered",
1891 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1892 .mask = BIT(5),
1893 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1894 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1895 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1896 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1897 .slot = 6,
1898 },
1899 {
1900 .label = "lc7_powered",
1901 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1902 .mask = BIT(6),
1903 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1904 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1905 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1906 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1907 .slot = 7,
1908 },
1909 {
1910 .label = "lc8_powered",
1911 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1912 .mask = BIT(7),
1913 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1914 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1915 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1916 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1917 .slot = 8,
1918 },
1919 };
1920
1921 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ready_data[] = {
1922 {
1923 .label = "lc1_ready",
1924 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1925 .mask = BIT(0),
1926 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1927 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1928 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1929 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1930 .slot = 1,
1931 },
1932 {
1933 .label = "lc2_ready",
1934 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1935 .mask = BIT(1),
1936 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1937 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1938 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1939 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1940 .slot = 2,
1941 },
1942 {
1943 .label = "lc3_ready",
1944 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1945 .mask = BIT(2),
1946 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1947 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1948 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1949 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1950 .slot = 3,
1951 },
1952 {
1953 .label = "lc4_ready",
1954 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1955 .mask = BIT(3),
1956 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1957 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1958 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1959 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1960 .slot = 4,
1961 },
1962 {
1963 .label = "lc5_ready",
1964 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1965 .mask = BIT(4),
1966 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1967 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1968 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1969 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1970 .slot = 5,
1971 },
1972 {
1973 .label = "lc6_ready",
1974 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1975 .mask = BIT(5),
1976 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1977 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1978 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1979 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1980 .slot = 6,
1981 },
1982 {
1983 .label = "lc7_ready",
1984 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1985 .mask = BIT(6),
1986 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1987 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1988 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1989 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1990 .slot = 7,
1991 },
1992 {
1993 .label = "lc8_ready",
1994 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1995 .mask = BIT(7),
1996 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1997 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1998 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1999 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
2000 .slot = 8,
2001 },
2002 };
2003
2004 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_synced_data[] = {
2005 {
2006 .label = "lc1_synced",
2007 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2008 .mask = BIT(0),
2009 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
2010 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
2011 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2012 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
2013 .slot = 1,
2014 },
2015 {
2016 .label = "lc2_synced",
2017 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2018 .mask = BIT(1),
2019 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
2020 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
2021 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2022 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
2023 .slot = 2,
2024 },
2025 {
2026 .label = "lc3_synced",
2027 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2028 .mask = BIT(2),
2029 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
2030 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
2031 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2032 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
2033 .slot = 3,
2034 },
2035 {
2036 .label = "lc4_synced",
2037 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2038 .mask = BIT(3),
2039 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
2040 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
2041 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2042 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
2043 .slot = 4,
2044 },
2045 {
2046 .label = "lc5_synced",
2047 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2048 .mask = BIT(4),
2049 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
2050 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
2051 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2052 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
2053 .slot = 5,
2054 },
2055 {
2056 .label = "lc6_synced",
2057 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2058 .mask = BIT(5),
2059 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
2060 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
2061 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2062 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
2063 .slot = 6,
2064 },
2065 {
2066 .label = "lc7_synced",
2067 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2068 .mask = BIT(6),
2069 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
2070 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
2071 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2072 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
2073 .slot = 7,
2074 },
2075 {
2076 .label = "lc8_synced",
2077 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2078 .mask = BIT(7),
2079 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
2080 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
2081 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2082 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
2083 .slot = 8,
2084 },
2085 };
2086
2087 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_act_data[] = {
2088 {
2089 .label = "lc1_active",
2090 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2091 .mask = BIT(0),
2092 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
2093 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
2094 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2095 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
2096 .slot = 1,
2097 },
2098 {
2099 .label = "lc2_active",
2100 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2101 .mask = BIT(1),
2102 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
2103 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
2104 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2105 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
2106 .slot = 2,
2107 },
2108 {
2109 .label = "lc3_active",
2110 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2111 .mask = BIT(2),
2112 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
2113 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
2114 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2115 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
2116 .slot = 3,
2117 },
2118 {
2119 .label = "lc4_active",
2120 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2121 .mask = BIT(3),
2122 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
2123 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
2124 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2125 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
2126 .slot = 4,
2127 },
2128 {
2129 .label = "lc5_active",
2130 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2131 .mask = BIT(4),
2132 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
2133 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
2134 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2135 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
2136 .slot = 5,
2137 },
2138 {
2139 .label = "lc6_active",
2140 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2141 .mask = BIT(5),
2142 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
2143 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
2144 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2145 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
2146 .slot = 6,
2147 },
2148 {
2149 .label = "lc7_active",
2150 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2151 .mask = BIT(6),
2152 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
2153 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
2154 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2155 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
2156 .slot = 7,
2157 },
2158 {
2159 .label = "lc8_active",
2160 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2161 .mask = BIT(7),
2162 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
2163 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
2164 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2165 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
2166 .slot = 8,
2167 },
2168 };
2169
2170 static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_sd_data[] = {
2171 {
2172 .label = "lc1_shutdown",
2173 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2174 .mask = BIT(0),
2175 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
2176 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
2177 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2178 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
2179 .slot = 1,
2180 },
2181 {
2182 .label = "lc2_shutdown",
2183 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2184 .mask = BIT(1),
2185 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
2186 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
2187 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2188 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
2189 .slot = 2,
2190 },
2191 {
2192 .label = "lc3_shutdown",
2193 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2194 .mask = BIT(2),
2195 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
2196 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
2197 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2198 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
2199 .slot = 3,
2200 },
2201 {
2202 .label = "lc4_shutdown",
2203 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2204 .mask = BIT(3),
2205 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
2206 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
2207 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2208 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
2209 .slot = 4,
2210 },
2211 {
2212 .label = "lc5_shutdown",
2213 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2214 .mask = BIT(4),
2215 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
2216 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
2217 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2218 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
2219 .slot = 5,
2220 },
2221 {
2222 .label = "lc6_shutdown",
2223 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2224 .mask = BIT(5),
2225 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
2226 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
2227 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2228 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
2229 .slot = 6,
2230 },
2231 {
2232 .label = "lc7_shutdown",
2233 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2234 .mask = BIT(6),
2235 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
2236 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
2237 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2238 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
2239 .slot = 7,
2240 },
2241 {
2242 .label = "lc8_shutdown",
2243 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2244 .mask = BIT(7),
2245 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
2246 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
2247 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2248 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
2249 .slot = 8,
2250 },
2251 };
2252
2253 static struct mlxreg_core_item mlxplat_mlxcpld_modular_items[] = {
2254 {
2255 .data = mlxplat_mlxcpld_ext_psu_items_data,
2256 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2257 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2258 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
2259 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2260 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
2261 .inversed = 1,
2262 .health = false,
2263 },
2264 {
2265 .data = mlxplat_mlxcpld_modular_pwr_items_data,
2266 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2267 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2268 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
2269 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2270 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
2271 .inversed = 0,
2272 .health = false,
2273 },
2274 {
2275 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
2276 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2277 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2278 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
2279 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
2280 .inversed = 1,
2281 .health = false,
2282 },
2283 {
2284 .data = mlxplat_mlxcpld_modular_asic_items_data,
2285 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2286 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2287 .mask = MLXPLAT_CPLD_ASIC_MASK,
2288 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_asic_items_data),
2289 .inversed = 0,
2290 .health = true,
2291 },
2292 {
2293 .data = mlxplat_mlxcpld_modular_lc_pr_items_data,
2294 .kind = MLXREG_HOTPLUG_LC_PRESENT,
2295 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2296 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
2297 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2298 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pr_items_data),
2299 .inversed = 1,
2300 .health = false,
2301 },
2302 {
2303 .data = mlxplat_mlxcpld_modular_lc_ver_items_data,
2304 .kind = MLXREG_HOTPLUG_LC_VERIFIED,
2305 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2306 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
2307 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2308 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ver_items_data),
2309 .inversed = 0,
2310 .health = false,
2311 },
2312 {
2313 .data = mlxplat_mlxcpld_modular_lc_pg_data,
2314 .kind = MLXREG_HOTPLUG_LC_POWERED,
2315 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2316 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
2317 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2318 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pg_data),
2319 .inversed = 0,
2320 .health = false,
2321 },
2322 {
2323 .data = mlxplat_mlxcpld_modular_lc_ready_data,
2324 .kind = MLXREG_HOTPLUG_LC_READY,
2325 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2326 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
2327 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2328 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ready_data),
2329 .inversed = 0,
2330 .health = false,
2331 },
2332 {
2333 .data = mlxplat_mlxcpld_modular_lc_synced_data,
2334 .kind = MLXREG_HOTPLUG_LC_SYNCED,
2335 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2336 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2337 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2338 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_synced_data),
2339 .inversed = 0,
2340 .health = false,
2341 },
2342 {
2343 .data = mlxplat_mlxcpld_modular_lc_act_data,
2344 .kind = MLXREG_HOTPLUG_LC_ACTIVE,
2345 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2346 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2347 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2348 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_act_data),
2349 .inversed = 0,
2350 .health = false,
2351 },
2352 {
2353 .data = mlxplat_mlxcpld_modular_lc_sd_data,
2354 .kind = MLXREG_HOTPLUG_LC_THERMAL,
2355 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2356 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2357 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2358 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_sd_data),
2359 .inversed = 0,
2360 .health = false,
2361 },
2362 };
2363
2364 static
2365 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_modular_data = {
2366 .items = mlxplat_mlxcpld_modular_items,
2367 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_items),
2368 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2369 .mask = MLXPLAT_CPLD_AGGR_MASK_MODULAR,
2370 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2371 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2372 };
2373
2374 /* Platform hotplug for NVLink blade systems family data */
2375 static struct mlxreg_core_data mlxplat_mlxcpld_global_wp_items_data[] = {
2376 {
2377 .label = "global_wp_grant",
2378 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2379 .mask = MLXPLAT_CPLD_GWP_MASK,
2380 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2381 },
2382 };
2383
2384 static struct mlxreg_core_item mlxplat_mlxcpld_chassis_blade_items[] = {
2385 {
2386 .data = mlxplat_mlxcpld_global_wp_items_data,
2387 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2388 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2389 .mask = MLXPLAT_CPLD_GWP_MASK,
2390 .count = ARRAY_SIZE(mlxplat_mlxcpld_global_wp_items_data),
2391 .inversed = 0,
2392 .health = false,
2393 },
2394 };
2395
2396 static
2397 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_chassis_blade_data = {
2398 .items = mlxplat_mlxcpld_chassis_blade_items,
2399 .count = ARRAY_SIZE(mlxplat_mlxcpld_chassis_blade_items),
2400 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2401 .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
2402 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2403 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2404 };
2405
2406 /* Platform hotplug for switch systems family data */
2407 static struct mlxreg_core_data mlxplat_mlxcpld_erot_ap_items_data[] = {
2408 {
2409 .label = "erot1_ap",
2410 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2411 .mask = BIT(0),
2412 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2413 },
2414 {
2415 .label = "erot2_ap",
2416 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2417 .mask = BIT(1),
2418 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2419 },
2420 };
2421
2422 static struct mlxreg_core_data mlxplat_mlxcpld_erot_error_items_data[] = {
2423 {
2424 .label = "erot1_error",
2425 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2426 .mask = BIT(0),
2427 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2428 },
2429 {
2430 .label = "erot2_error",
2431 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2432 .mask = BIT(1),
2433 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2434 },
2435 };
2436
2437 static struct mlxreg_core_item mlxplat_mlxcpld_rack_switch_items[] = {
2438 {
2439 .data = mlxplat_mlxcpld_ext_psu_items_data,
2440 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2441 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2442 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
2443 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2444 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
2445 .inversed = 1,
2446 .health = false,
2447 },
2448 {
2449 .data = mlxplat_mlxcpld_ext_pwr_items_data,
2450 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2451 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2452 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
2453 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2454 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
2455 .inversed = 0,
2456 .health = false,
2457 },
2458 {
2459 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
2460 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2461 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2462 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
2463 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
2464 .inversed = 1,
2465 .health = false,
2466 },
2467 {
2468 .data = mlxplat_mlxcpld_erot_ap_items_data,
2469 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2470 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
2471 .mask = MLXPLAT_CPLD_EROT_MASK,
2472 .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_ap_items_data),
2473 .inversed = 1,
2474 .health = false,
2475 },
2476 {
2477 .data = mlxplat_mlxcpld_erot_error_items_data,
2478 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2479 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
2480 .mask = MLXPLAT_CPLD_EROT_MASK,
2481 .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_error_items_data),
2482 .inversed = 1,
2483 .health = false,
2484 },
2485 };
2486
2487 static
2488 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_rack_switch_data = {
2489 .items = mlxplat_mlxcpld_rack_switch_items,
2490 .count = ARRAY_SIZE(mlxplat_mlxcpld_rack_switch_items),
2491 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2492 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
2493 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2494 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2495 };
2496
2497 /* Platform hotplug XDR and smart switch system family data */
2498 static struct mlxreg_core_data mlxplat_mlxcpld_xdr_psu_items_data[] = {
2499 {
2500 .label = "psu1",
2501 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2502 .mask = BIT(0),
2503 .slot = 1,
2504 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2505 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2506 },
2507 {
2508 .label = "psu2",
2509 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2510 .mask = BIT(1),
2511 .slot = 2,
2512 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2513 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2514 },
2515 {
2516 .label = "psu3",
2517 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2518 .mask = BIT(2),
2519 .slot = 3,
2520 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2521 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2522 },
2523 {
2524 .label = "psu4",
2525 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2526 .mask = BIT(3),
2527 .slot = 4,
2528 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2529 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2530 },
2531 {
2532 .label = "psu5",
2533 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2534 .mask = BIT(4),
2535 .slot = 5,
2536 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2537 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2538 },
2539 {
2540 .label = "psu6",
2541 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2542 .mask = BIT(5),
2543 .slot = 6,
2544 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2545 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2546 },
2547 {
2548 .label = "psu7",
2549 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2550 .mask = BIT(6),
2551 .slot = 7,
2552 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2553 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2554 },
2555 {
2556 .label = "psu8",
2557 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2558 .mask = BIT(7),
2559 .slot = 8,
2560 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2561 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2562 },
2563 };
2564
2565 static struct mlxreg_core_data mlxplat_mlxcpld_xdr_pwr_items_data[] = {
2566 {
2567 .label = "pwr1",
2568 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2569 .mask = BIT(0),
2570 .slot = 1,
2571 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2572 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
2573 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
2574 },
2575 {
2576 .label = "pwr2",
2577 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2578 .mask = BIT(1),
2579 .slot = 2,
2580 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2581 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
2582 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
2583 },
2584 {
2585 .label = "pwr3",
2586 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2587 .mask = BIT(2),
2588 .slot = 3,
2589 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2590 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
2591 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
2592 },
2593 {
2594 .label = "pwr4",
2595 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2596 .mask = BIT(3),
2597 .slot = 4,
2598 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2599 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
2600 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
2601 },
2602 {
2603 .label = "pwr5",
2604 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2605 .mask = BIT(4),
2606 .slot = 5,
2607 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2608 .hpdev.brdinfo = &mlxplat_mlxcpld_xdr_pwr[0],
2609 .hpdev.nr = MLXPLAT_CPLD_PSU_XDR_NR,
2610 },
2611 {
2612 .label = "pwr6",
2613 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2614 .mask = BIT(5),
2615 .slot = 6,
2616 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2617 .hpdev.brdinfo = &mlxplat_mlxcpld_xdr_pwr[1],
2618 .hpdev.nr = MLXPLAT_CPLD_PSU_XDR_NR,
2619 },
2620 {
2621 .label = "pwr7",
2622 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2623 .mask = BIT(6),
2624 .slot = 7,
2625 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2626 .hpdev.brdinfo = &mlxplat_mlxcpld_xdr_pwr[2],
2627 .hpdev.nr = MLXPLAT_CPLD_PSU_XDR_NR,
2628 },
2629 {
2630 .label = "pwr8",
2631 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2632 .mask = BIT(7),
2633 .slot = 8,
2634 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2635 .hpdev.brdinfo = &mlxplat_mlxcpld_xdr_pwr[3],
2636 .hpdev.nr = MLXPLAT_CPLD_PSU_XDR_NR,
2637 },
2638 };
2639
2640 static struct mlxreg_core_data mlxplat_mlxcpld_xdr_fan_items_data[] = {
2641 {
2642 .label = "fan1",
2643 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2644 .mask = BIT(0),
2645 .slot = 1,
2646 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2647 .bit = BIT(0),
2648 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2649 },
2650 {
2651 .label = "fan2",
2652 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2653 .mask = BIT(1),
2654 .slot = 2,
2655 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2656 .bit = BIT(1),
2657 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2658 },
2659 {
2660 .label = "fan3",
2661 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2662 .mask = BIT(2),
2663 .slot = 3,
2664 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2665 .bit = BIT(2),
2666 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2667 },
2668 {
2669 .label = "fan4",
2670 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2671 .mask = BIT(3),
2672 .slot = 4,
2673 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2674 .bit = BIT(3),
2675 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2676 },
2677 {
2678 .label = "fan5",
2679 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2680 .mask = BIT(4),
2681 .slot = 5,
2682 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2683 .bit = BIT(4),
2684 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2685 },
2686 {
2687 .label = "fan6",
2688 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2689 .mask = BIT(5),
2690 .slot = 6,
2691 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2692 .bit = BIT(5),
2693 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2694 },
2695 {
2696 .label = "fan7",
2697 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2698 .mask = BIT(6),
2699 .slot = 7,
2700 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2701 .bit = BIT(6),
2702 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2703 },
2704 {
2705 .label = "fan8",
2706 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2707 .mask = BIT(7),
2708 .slot = 8,
2709 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2710 .bit = BIT(7),
2711 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2712 },
2713 };
2714
2715 static struct mlxreg_core_data mlxplat_mlxcpld_xdr_asic1_items_data[] = {
2716 {
2717 .label = "asic1",
2718 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2719 .mask = MLXPLAT_CPLD_ASIC_MASK,
2720 .slot = 1,
2721 .capability = MLXPLAT_CPLD_LPC_REG_ASIC_CAP_OFFSET,
2722 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2723 }
2724 };
2725
2726 /* Platform hotplug for smart switch systems families data */
2727 static struct mlxreg_core_data mlxplat_mlxcpld_smart_switch_dpu_ready_data[] = {
2728 {
2729 .label = "dpu1_ready",
2730 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
2731 .mask = BIT(0),
2732 .slot = 1,
2733 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2734 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2735 },
2736 {
2737 .label = "dpu2_ready",
2738 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
2739 .mask = BIT(1),
2740 .slot = 2,
2741 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2742 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2743 },
2744 {
2745 .label = "dpu3_ready",
2746 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
2747 .mask = BIT(2),
2748 .slot = 3,
2749 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2750 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2751 },
2752 {
2753 .label = "dpu4_ready",
2754 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
2755 .mask = BIT(3),
2756 .slot = 4,
2757 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2758 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2759 },
2760 };
2761
2762 static struct mlxreg_core_data mlxplat_mlxcpld_smart_switch_dpu_shtdn_ready_data[] = {
2763 {
2764 .label = "dpu1_shtdn_ready",
2765 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2766 .mask = BIT(0),
2767 .slot = 1,
2768 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2769 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2770 },
2771 {
2772 .label = "dpu2_shtdn_ready",
2773 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2774 .mask = BIT(1),
2775 .slot = 2,
2776 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2777 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2778 },
2779 {
2780 .label = "dpu3_shtdn_ready",
2781 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2782 .mask = BIT(2),
2783 .slot = 3,
2784 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2785 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2786 },
2787 {
2788 .label = "dpu4_shtdn_ready",
2789 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2790 .mask = BIT(3),
2791 .slot = 4,
2792 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2793 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2794 },
2795 };
2796
2797 static struct mlxreg_core_item mlxplat_mlxcpld_smart_switch_items[] = {
2798 {
2799 .data = mlxplat_mlxcpld_xdr_psu_items_data,
2800 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2801 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
2802 .mask = MLXPLAT_CPLD_PSU_XDR_MASK,
2803 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2804 .count = ARRAY_SIZE(mlxplat_mlxcpld_xdr_psu_items_data),
2805 .inversed = 1,
2806 .health = false,
2807 },
2808 {
2809 .data = mlxplat_mlxcpld_xdr_pwr_items_data,
2810 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2811 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
2812 .mask = MLXPLAT_CPLD_PWR_XDR_MASK,
2813 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2814 .count = ARRAY_SIZE(mlxplat_mlxcpld_xdr_pwr_items_data),
2815 .inversed = 0,
2816 .health = false,
2817 },
2818 {
2819 .data = mlxplat_mlxcpld_xdr_fan_items_data,
2820 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2821 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
2822 .mask = MLXPLAT_CPLD_FAN_XDR_MASK,
2823 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2824 .count = ARRAY_SIZE(mlxplat_mlxcpld_xdr_fan_items_data),
2825 .inversed = 1,
2826 .health = false,
2827 },
2828 {
2829 .data = mlxplat_mlxcpld_xdr_asic1_items_data,
2830 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2831 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2832 .mask = MLXPLAT_CPLD_ASIC_XDR_MASK,
2833 .capability = MLXPLAT_CPLD_LPC_REG_ASIC_CAP_OFFSET,
2834 .count = ARRAY_SIZE(mlxplat_mlxcpld_xdr_asic1_items_data),
2835 .inversed = 0,
2836 .health = true,
2837 },
2838 {
2839 .data = mlxplat_mlxcpld_smart_switch_dpu_ready_data,
2840 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_DPU_CORE,
2841 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
2842 .mask = MLXPLAT_CPLD_DPU_MASK,
2843 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2844 .count = ARRAY_SIZE(mlxplat_mlxcpld_smart_switch_dpu_ready_data),
2845 .inversed = 1,
2846 .health = false,
2847 },
2848 {
2849 .data = mlxplat_mlxcpld_smart_switch_dpu_shtdn_ready_data,
2850 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_DPU_CORE,
2851 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
2852 .mask = MLXPLAT_CPLD_DPU_MASK,
2853 .capability = MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET,
2854 .count = ARRAY_SIZE(mlxplat_mlxcpld_smart_switch_dpu_shtdn_ready_data),
2855 .inversed = 1,
2856 .health = false,
2857 },
2858 };
2859
2860 static
2861 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_smart_switch_data = {
2862 .items = mlxplat_mlxcpld_smart_switch_items,
2863 .count = ARRAY_SIZE(mlxplat_mlxcpld_smart_switch_items),
2864 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2865 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX |
2866 MLXPLAT_CPLD_AGGR_MASK_DPU_BRD | MLXPLAT_CPLD_AGGR_MASK_DPU_CORE,
2867 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2868 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2869 };
2870
2871 /* Smart switch data processor units data */
2872 static struct i2c_board_info mlxplat_mlxcpld_smart_switch_dpu_devs[] = {
2873 {
2874 I2C_BOARD_INFO("mlxreg-dpu", MLXPLAT_CPLD_DPU_ADDR),
2875 .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
2876 },
2877 {
2878 I2C_BOARD_INFO("mlxreg-dpu", MLXPLAT_CPLD_DPU_ADDR),
2879 .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
2880 },
2881 {
2882 I2C_BOARD_INFO("mlxreg-dpu", MLXPLAT_CPLD_DPU_ADDR),
2883 .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
2884 },
2885 {
2886 I2C_BOARD_INFO("mlxreg-dpu", MLXPLAT_CPLD_DPU_ADDR),
2887 .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
2888 },
2889 };
2890
2891 static struct mlxreg_core_data mlxplat_mlxcpld_smart_switch_dpu_data[] = {
2892 {
2893 .label = "dpu1",
2894 .hpdev.brdinfo = &mlxplat_mlxcpld_smart_switch_dpu_devs[0],
2895 .hpdev.nr = MLXPLAT_CPLD_NR_DPU_BASE,
2896 .slot = 1,
2897 },
2898 {
2899 .label = "dpu2",
2900 .hpdev.brdinfo = &mlxplat_mlxcpld_smart_switch_dpu_devs[1],
2901 .hpdev.nr = MLXPLAT_CPLD_NR_DPU_BASE + 1,
2902 .slot = 2,
2903 },
2904 {
2905 .label = "dpu3",
2906 .hpdev.brdinfo = &mlxplat_mlxcpld_smart_switch_dpu_devs[2],
2907 .hpdev.nr = MLXPLAT_CPLD_NR_DPU_BASE + 2,
2908 .slot = 3,
2909 },
2910 {
2911 .label = "dpu4",
2912 .hpdev.brdinfo = &mlxplat_mlxcpld_smart_switch_dpu_devs[3],
2913 .hpdev.nr = MLXPLAT_CPLD_NR_DPU_BASE + 3,
2914 .slot = 4,
2915 },
2916 };
2917
2918 /* Callback performs graceful shutdown after notification about power button event */
2919 static int
mlxplat_mlxcpld_l1_switch_pwr_events_handler(void * handle,enum mlxreg_hotplug_kind kind,u8 action)2920 mlxplat_mlxcpld_l1_switch_pwr_events_handler(void *handle, enum mlxreg_hotplug_kind kind,
2921 u8 action)
2922 {
2923 if (action) {
2924 dev_info(&mlxplat_dev->dev, "System shutdown due to short press of power button");
2925 kernel_power_off();
2926 }
2927
2928 return 0;
2929 }
2930
2931 static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_l1_switch_pwr_events_notifier = {
2932 .user_handler = mlxplat_mlxcpld_l1_switch_pwr_events_handler,
2933 };
2934
2935 /* Platform hotplug for l1 switch systems family data */
2936 static struct mlxreg_core_data mlxplat_mlxcpld_l1_switch_pwr_events_items_data[] = {
2937 {
2938 .label = "power_button",
2939 .reg = MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET,
2940 .mask = MLXPLAT_CPLD_PWR_BUTTON_MASK,
2941 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2942 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
2943 .hpdev.notifier = &mlxplat_mlxcpld_l1_switch_pwr_events_notifier,
2944 },
2945 };
2946
2947 /* Callback activates latch reset flow after notification about intrusion event */
2948 static int
mlxplat_mlxcpld_l1_switch_intrusion_events_handler(void * handle,enum mlxreg_hotplug_kind kind,u8 action)2949 mlxplat_mlxcpld_l1_switch_intrusion_events_handler(void *handle, enum mlxreg_hotplug_kind kind,
2950 u8 action)
2951 {
2952 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
2953 u32 regval;
2954 int err;
2955
2956 err = regmap_read(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET, ®val);
2957 if (err)
2958 goto fail_regmap_read;
2959
2960 if (action) {
2961 dev_info(&mlxplat_dev->dev, "Detected intrusion - system latch is opened");
2962 err = regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2963 regval | MLXPLAT_CPLD_LATCH_RST_MASK);
2964 } else {
2965 dev_info(&mlxplat_dev->dev, "System latch is properly closed");
2966 err = regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2967 regval & ~MLXPLAT_CPLD_LATCH_RST_MASK);
2968 }
2969
2970 if (err)
2971 goto fail_regmap_write;
2972
2973 return 0;
2974
2975 fail_regmap_read:
2976 fail_regmap_write:
2977 dev_err(&mlxplat_dev->dev, "Register access failed");
2978 return err;
2979 }
2980
2981 static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_l1_switch_intrusion_events_notifier = {
2982 .user_handler = mlxplat_mlxcpld_l1_switch_intrusion_events_handler,
2983 };
2984
2985 static struct mlxreg_core_data mlxplat_mlxcpld_l1_switch_health_events_items_data[] = {
2986 {
2987 .label = "thermal1_pdb",
2988 .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
2989 .mask = MLXPLAT_CPLD_THERMAL1_PDB_MASK,
2990 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2991 },
2992 {
2993 .label = "thermal2_pdb",
2994 .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
2995 .mask = MLXPLAT_CPLD_THERMAL2_PDB_MASK,
2996 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2997 },
2998 {
2999 .label = "intrusion",
3000 .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
3001 .mask = MLXPLAT_CPLD_INTRUSION_MASK,
3002 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
3003 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
3004 .hpdev.notifier = &mlxplat_mlxcpld_l1_switch_intrusion_events_notifier,
3005 },
3006 {
3007 .label = "pwm_pg",
3008 .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
3009 .mask = MLXPLAT_CPLD_PWM_PG_MASK,
3010 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
3011 },
3012 };
3013
3014 static struct mlxreg_core_item mlxplat_mlxcpld_l1_switch_events_items[] = {
3015 {
3016 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
3017 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3018 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3019 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
3020 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
3021 .inversed = 1,
3022 .health = false,
3023 },
3024 {
3025 .data = mlxplat_mlxcpld_erot_ap_items_data,
3026 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3027 .reg = MLXPLAT_CPLD_LPC_REG_EROT_OFFSET,
3028 .mask = MLXPLAT_CPLD_EROT_MASK,
3029 .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_ap_items_data),
3030 .inversed = 1,
3031 .health = false,
3032 },
3033 {
3034 .data = mlxplat_mlxcpld_erot_error_items_data,
3035 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3036 .reg = MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET,
3037 .mask = MLXPLAT_CPLD_EROT_MASK,
3038 .count = ARRAY_SIZE(mlxplat_mlxcpld_erot_error_items_data),
3039 .inversed = 1,
3040 .health = false,
3041 },
3042 {
3043 .data = mlxplat_mlxcpld_l1_switch_pwr_events_items_data,
3044 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3045 .reg = MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET,
3046 .mask = MLXPLAT_CPLD_PWR_BUTTON_MASK,
3047 .count = ARRAY_SIZE(mlxplat_mlxcpld_l1_switch_pwr_events_items_data),
3048 .inversed = 1,
3049 .health = false,
3050 },
3051 {
3052 .data = mlxplat_mlxcpld_l1_switch_health_events_items_data,
3053 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3054 .reg = MLXPLAT_CPLD_LPC_REG_BRD_OFFSET,
3055 .mask = MLXPLAT_CPLD_L1_CHA_HEALTH_MASK,
3056 .count = ARRAY_SIZE(mlxplat_mlxcpld_l1_switch_health_events_items_data),
3057 .inversed = 1,
3058 .health = false,
3059 .ind = 8,
3060 },
3061 };
3062
3063 static
3064 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_l1_switch_data = {
3065 .items = mlxplat_mlxcpld_l1_switch_events_items,
3066 .count = ARRAY_SIZE(mlxplat_mlxcpld_l1_switch_events_items),
3067 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
3068 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
3069 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
3070 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_PWR_BUT,
3071 };
3072
3073 /* Platform hotplug for 800G systems family data */
3074 static struct mlxreg_core_item mlxplat_mlxcpld_ng800_hi171_items[] = {
3075 {
3076 .data = mlxplat_mlxcpld_ext_psu_items_data,
3077 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3078 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
3079 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
3080 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
3081 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
3082 .inversed = 1,
3083 .health = false,
3084 },
3085 {
3086 .data = mlxplat_mlxcpld_modular_pwr_items_data,
3087 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3088 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
3089 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
3090 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
3091 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
3092 .inversed = 0,
3093 .health = false,
3094 },
3095 {
3096 .data = mlxplat_mlxcpld_xdr_fan_items_data,
3097 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3098 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3099 .mask = MLXPLAT_CPLD_FAN_XDR_MASK,
3100 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3101 .count = ARRAY_SIZE(mlxplat_mlxcpld_xdr_fan_items_data),
3102 .inversed = 1,
3103 .health = false,
3104 },
3105 {
3106 .data = mlxplat_mlxcpld_default_asic_items_data,
3107 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
3108 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3109 .mask = MLXPLAT_CPLD_ASIC_MASK,
3110 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
3111 .inversed = 0,
3112 .health = true,
3113 },
3114 };
3115
3116 static
3117 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ng800_hi171_data = {
3118 .items = mlxplat_mlxcpld_ng800_hi171_items,
3119 .count = ARRAY_SIZE(mlxplat_mlxcpld_ng800_hi171_items),
3120 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
3121 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
3122 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
3123 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
3124 };
3125
3126 /* Platform led default data */
3127 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
3128 {
3129 .label = "status:green",
3130 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3131 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3132 },
3133 {
3134 .label = "status:red",
3135 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3136 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
3137 },
3138 {
3139 .label = "psu:green",
3140 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3141 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3142 },
3143 {
3144 .label = "psu:red",
3145 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3146 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3147 },
3148 {
3149 .label = "fan1:green",
3150 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3151 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3152 },
3153 {
3154 .label = "fan1:red",
3155 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3156 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3157 },
3158 {
3159 .label = "fan2:green",
3160 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3161 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3162 },
3163 {
3164 .label = "fan2:red",
3165 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3166 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3167 },
3168 {
3169 .label = "fan3:green",
3170 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3171 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3172 },
3173 {
3174 .label = "fan3:red",
3175 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3176 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3177 },
3178 {
3179 .label = "fan4:green",
3180 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3181 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3182 },
3183 {
3184 .label = "fan4:red",
3185 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3186 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3187 },
3188 };
3189
3190 static struct mlxreg_core_platform_data mlxplat_default_led_data = {
3191 .data = mlxplat_mlxcpld_default_led_data,
3192 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
3193 };
3194
3195 /* Platform led default data for water cooling */
3196 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_wc_data[] = {
3197 {
3198 .label = "status:green",
3199 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3200 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3201 },
3202 {
3203 .label = "status:red",
3204 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3205 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
3206 },
3207 {
3208 .label = "psu:green",
3209 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3210 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3211 },
3212 {
3213 .label = "psu:red",
3214 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3215 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3216 },
3217 };
3218
3219 static struct mlxreg_core_platform_data mlxplat_default_led_wc_data = {
3220 .data = mlxplat_mlxcpld_default_led_wc_data,
3221 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_wc_data),
3222 };
3223
3224 /* Platform led default data for water cooling Ethernet switch blade */
3225 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_eth_wc_blade_data[] = {
3226 {
3227 .label = "status:green",
3228 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3229 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3230 },
3231 {
3232 .label = "status:red",
3233 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3234 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
3235 },
3236 };
3237
3238 static struct mlxreg_core_platform_data mlxplat_default_led_eth_wc_blade_data = {
3239 .data = mlxplat_mlxcpld_default_led_eth_wc_blade_data,
3240 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_eth_wc_blade_data),
3241 };
3242
3243 /* Platform led MSN21xx system family data */
3244 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
3245 {
3246 .label = "status:green",
3247 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3248 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3249 },
3250 {
3251 .label = "status:red",
3252 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3253 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
3254 },
3255 {
3256 .label = "fan:green",
3257 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3258 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3259 },
3260 {
3261 .label = "fan:red",
3262 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3263 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3264 },
3265 {
3266 .label = "psu1:green",
3267 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3268 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3269 },
3270 {
3271 .label = "psu1:red",
3272 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3273 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3274 },
3275 {
3276 .label = "psu2:green",
3277 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3278 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3279 },
3280 {
3281 .label = "psu2:red",
3282 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3283 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3284 },
3285 {
3286 .label = "uid:blue",
3287 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
3288 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3289 },
3290 };
3291
3292 static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
3293 .data = mlxplat_mlxcpld_msn21xx_led_data,
3294 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
3295 };
3296
3297 /* Platform led for default data for 200GbE systems */
3298 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
3299 {
3300 .label = "status:green",
3301 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3302 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3303 },
3304 {
3305 .label = "status:orange",
3306 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3307 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
3308 },
3309 {
3310 .label = "psu:green",
3311 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3312 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3313 },
3314 {
3315 .label = "psu:orange",
3316 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3317 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3318 },
3319 {
3320 .label = "fan1:green",
3321 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3322 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3323 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3324 .bit = BIT(0),
3325 },
3326 {
3327 .label = "fan1:orange",
3328 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3329 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3330 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3331 .bit = BIT(0),
3332 },
3333 {
3334 .label = "fan2:green",
3335 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3336 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3337 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3338 .bit = BIT(1),
3339 },
3340 {
3341 .label = "fan2:orange",
3342 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3343 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3344 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3345 .bit = BIT(1),
3346 },
3347 {
3348 .label = "fan3:green",
3349 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3350 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3351 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3352 .bit = BIT(2),
3353 },
3354 {
3355 .label = "fan3:orange",
3356 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3357 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3358 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3359 .bit = BIT(2),
3360 },
3361 {
3362 .label = "fan4:green",
3363 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3364 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3365 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3366 .bit = BIT(3),
3367 },
3368 {
3369 .label = "fan4:orange",
3370 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3371 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3372 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3373 .bit = BIT(3),
3374 },
3375 {
3376 .label = "fan5:green",
3377 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3378 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3379 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3380 .bit = BIT(4),
3381 },
3382 {
3383 .label = "fan5:orange",
3384 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3385 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3386 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3387 .bit = BIT(4),
3388 },
3389 {
3390 .label = "fan6:green",
3391 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3392 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3393 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3394 .bit = BIT(5),
3395 },
3396 {
3397 .label = "fan6:orange",
3398 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3399 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3400 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3401 .bit = BIT(5),
3402 },
3403 {
3404 .label = "fan7:green",
3405 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
3406 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3407 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3408 .bit = BIT(6),
3409 },
3410 {
3411 .label = "fan7:orange",
3412 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
3413 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3414 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3415 .bit = BIT(6),
3416 },
3417 {
3418 .label = "uid:blue",
3419 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
3420 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3421 },
3422 };
3423
3424 static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
3425 .data = mlxplat_mlxcpld_default_ng_led_data,
3426 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
3427 };
3428
3429 /* Platform led for Comex based 100GbE systems */
3430 static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
3431 {
3432 .label = "status:green",
3433 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3434 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3435 },
3436 {
3437 .label = "status:red",
3438 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3439 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
3440 },
3441 {
3442 .label = "psu:green",
3443 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3444 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3445 },
3446 {
3447 .label = "psu:red",
3448 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3449 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3450 },
3451 {
3452 .label = "fan1:green",
3453 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3454 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3455 },
3456 {
3457 .label = "fan1:red",
3458 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3459 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3460 },
3461 {
3462 .label = "fan2:green",
3463 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3464 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3465 },
3466 {
3467 .label = "fan2:red",
3468 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3469 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3470 },
3471 {
3472 .label = "fan3:green",
3473 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3474 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3475 },
3476 {
3477 .label = "fan3:red",
3478 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3479 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3480 },
3481 {
3482 .label = "fan4:green",
3483 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3484 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3485 },
3486 {
3487 .label = "fan4:red",
3488 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3489 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3490 },
3491 {
3492 .label = "uid:blue",
3493 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
3494 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3495 },
3496 };
3497
3498 static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
3499 .data = mlxplat_mlxcpld_comex_100G_led_data,
3500 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
3501 };
3502
3503 /* Platform led for data for modular systems */
3504 static struct mlxreg_core_data mlxplat_mlxcpld_modular_led_data[] = {
3505 {
3506 .label = "status:green",
3507 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3508 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3509 },
3510 {
3511 .label = "status:orange",
3512 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3513 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
3514 },
3515 {
3516 .label = "psu:green",
3517 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3518 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3519 },
3520 {
3521 .label = "psu:orange",
3522 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3523 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3524 },
3525 {
3526 .label = "fan1:green",
3527 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3528 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3529 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3530 .bit = BIT(0),
3531 },
3532 {
3533 .label = "fan1:orange",
3534 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3535 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3536 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3537 .bit = BIT(0),
3538 },
3539 {
3540 .label = "fan2:green",
3541 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3542 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3543 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3544 .bit = BIT(1),
3545 },
3546 {
3547 .label = "fan2:orange",
3548 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3549 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3550 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3551 .bit = BIT(1),
3552 },
3553 {
3554 .label = "fan3:green",
3555 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3556 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3557 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3558 .bit = BIT(2),
3559 },
3560 {
3561 .label = "fan3:orange",
3562 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3563 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3564 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3565 .bit = BIT(2),
3566 },
3567 {
3568 .label = "fan4:green",
3569 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3570 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3571 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3572 .bit = BIT(3),
3573 },
3574 {
3575 .label = "fan4:orange",
3576 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3577 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3578 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3579 .bit = BIT(3),
3580 },
3581 {
3582 .label = "fan5:green",
3583 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3584 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3585 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3586 .bit = BIT(4),
3587 },
3588 {
3589 .label = "fan5:orange",
3590 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3591 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3592 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3593 .bit = BIT(4),
3594 },
3595 {
3596 .label = "fan6:green",
3597 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3598 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3599 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3600 .bit = BIT(5),
3601 },
3602 {
3603 .label = "fan6:orange",
3604 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3605 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3606 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3607 .bit = BIT(5),
3608 },
3609 {
3610 .label = "fan7:green",
3611 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
3612 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3613 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3614 .bit = BIT(6),
3615 },
3616 {
3617 .label = "fan7:orange",
3618 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
3619 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3620 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3621 .bit = BIT(6),
3622 },
3623 {
3624 .label = "uid:blue",
3625 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
3626 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3627 },
3628 {
3629 .label = "fan_front:green",
3630 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
3631 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3632 },
3633 {
3634 .label = "fan_front:orange",
3635 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
3636 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3637 },
3638 {
3639 .label = "mgmt:green",
3640 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
3641 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3642 },
3643 {
3644 .label = "mgmt:orange",
3645 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
3646 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3647 },
3648 };
3649
3650 static struct mlxreg_core_platform_data mlxplat_modular_led_data = {
3651 .data = mlxplat_mlxcpld_modular_led_data,
3652 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_led_data),
3653 };
3654
3655 /* Platform led data for chassis system */
3656 static struct mlxreg_core_data mlxplat_mlxcpld_l1_switch_led_data[] = {
3657 {
3658 .label = "status:green",
3659 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3660 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3661 },
3662 {
3663 .label = "status:orange",
3664 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3665 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
3666 },
3667 {
3668 .label = "fan1:green",
3669 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3670 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3671 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3672 .bit = BIT(0),
3673 },
3674 {
3675 .label = "fan1:orange",
3676 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3677 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3678 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3679 .bit = BIT(0),
3680 },
3681 {
3682 .label = "fan2:green",
3683 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3684 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3685 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3686 .bit = BIT(1),
3687 },
3688 {
3689 .label = "fan2:orange",
3690 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3691 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3692 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3693 .bit = BIT(1),
3694 },
3695 {
3696 .label = "fan3:green",
3697 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3698 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3699 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3700 .bit = BIT(2),
3701 },
3702 {
3703 .label = "fan3:orange",
3704 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3705 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3706 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3707 .bit = BIT(2),
3708 },
3709 {
3710 .label = "fan4:green",
3711 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3712 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3713 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3714 .bit = BIT(3),
3715 },
3716 {
3717 .label = "fan4:orange",
3718 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3719 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3720 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3721 .bit = BIT(3),
3722 },
3723 {
3724 .label = "fan5:green",
3725 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3726 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3727 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3728 .bit = BIT(4),
3729 },
3730 {
3731 .label = "fan5:orange",
3732 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3733 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3734 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3735 .bit = BIT(4),
3736 },
3737 {
3738 .label = "fan6:green",
3739 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3740 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3741 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3742 .bit = BIT(5),
3743 },
3744 {
3745 .label = "fan6:orange",
3746 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3747 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3748 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3749 .bit = BIT(5),
3750 },
3751 {
3752 .label = "uid:blue",
3753 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
3754 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3755 },
3756 };
3757
3758 static struct mlxreg_core_platform_data mlxplat_l1_switch_led_data = {
3759 .data = mlxplat_mlxcpld_l1_switch_led_data,
3760 .counter = ARRAY_SIZE(mlxplat_mlxcpld_l1_switch_led_data),
3761 };
3762
3763 /* Platform led data for XDR and smart switch systems */
3764 static struct mlxreg_core_data mlxplat_mlxcpld_xdr_led_data[] = {
3765 {
3766 .label = "status:green",
3767 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3768 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3769 },
3770 {
3771 .label = "status:orange",
3772 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3773 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3774 },
3775 {
3776 .label = "psu:green",
3777 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3778 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3779 },
3780 {
3781 .label = "psu:orange",
3782 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
3783 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3784 },
3785 {
3786 .label = "fan1:green",
3787 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3788 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3789 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3790 .slot = 1,
3791 },
3792 {
3793 .label = "fan1:orange",
3794 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3795 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3796 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3797 .slot = 1,
3798 },
3799 {
3800 .label = "fan2:green",
3801 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3802 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3803 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3804 .slot = 2,
3805 },
3806 {
3807 .label = "fan2:orange",
3808 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
3809 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3810 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3811 .slot = 2,
3812 },
3813 {
3814 .label = "fan3:green",
3815 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3816 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3817 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3818 .slot = 3,
3819 },
3820 {
3821 .label = "fan3:orange",
3822 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3823 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3824 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3825 .slot = 3,
3826 },
3827 {
3828 .label = "fan4:green",
3829 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3830 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3831 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3832 .slot = 4,
3833 },
3834 {
3835 .label = "fan4:orange",
3836 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
3837 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3838 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3839 .slot = 4,
3840 },
3841 {
3842 .label = "fan5:green",
3843 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3844 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3845 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3846 .slot = 5,
3847 },
3848 {
3849 .label = "fan5:orange",
3850 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3851 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3852 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3853 .slot = 5,
3854 },
3855 {
3856 .label = "fan6:green",
3857 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3858 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3859 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3860 .slot = 6,
3861 },
3862 {
3863 .label = "fan6:orange",
3864 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
3865 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3866 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3867 .slot = 6,
3868 },
3869 {
3870 .label = "fan7:green",
3871 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
3872 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3873 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3874 .slot = 7,
3875 },
3876 {
3877 .label = "fan7:orange",
3878 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
3879 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3880 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3881 .slot = 7,
3882 },
3883 {
3884 .label = "fan8:green",
3885 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
3886 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3887 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3888 .slot = 8,
3889 },
3890 {
3891 .label = "fan8:orange",
3892 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
3893 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3894 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3895 .slot = 8,
3896 },
3897 {
3898 .label = "fan9:green",
3899 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
3900 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3901 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3902 .slot = 9,
3903 },
3904 {
3905 .label = "fan9:orange",
3906 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
3907 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
3908 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3909 .slot = 9,
3910 },
3911 {
3912 .label = "fan10:green",
3913 .reg = MLXPLAT_CPLD_LPC_REG_LED8_OFFSET,
3914 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3915 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3916 .slot = 10,
3917 },
3918 {
3919 .label = "fan10:orange",
3920 .reg = MLXPLAT_CPLD_LPC_REG_LED8_OFFSET,
3921 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3922 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
3923 .slot = 10,
3924 },
3925 {
3926 .label = "uid:blue",
3927 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
3928 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
3929 },
3930 };
3931
3932 static struct mlxreg_core_platform_data mlxplat_xdr_led_data = {
3933 .data = mlxplat_mlxcpld_xdr_led_data,
3934 .counter = ARRAY_SIZE(mlxplat_mlxcpld_xdr_led_data),
3935 };
3936
3937 /* Platform register access default */
3938 static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
3939 {
3940 .label = "cpld1_version",
3941 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3942 .bit = GENMASK(7, 0),
3943 .mode = 0444,
3944 },
3945 {
3946 .label = "cpld2_version",
3947 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
3948 .bit = GENMASK(7, 0),
3949 .mode = 0444,
3950 },
3951 {
3952 .label = "cpld1_pn",
3953 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3954 .bit = GENMASK(15, 0),
3955 .mode = 0444,
3956 .regnum = 2,
3957 },
3958 {
3959 .label = "cpld2_pn",
3960 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
3961 .bit = GENMASK(15, 0),
3962 .mode = 0444,
3963 .regnum = 2,
3964 },
3965 {
3966 .label = "cpld1_version_min",
3967 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3968 .bit = GENMASK(7, 0),
3969 .mode = 0444,
3970 },
3971 {
3972 .label = "cpld2_version_min",
3973 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
3974 .bit = GENMASK(7, 0),
3975 .mode = 0444,
3976 },
3977 {
3978 .label = "reset_long_pb",
3979 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3980 .mask = GENMASK(7, 0) & ~BIT(0),
3981 .mode = 0444,
3982 },
3983 {
3984 .label = "reset_short_pb",
3985 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3986 .mask = GENMASK(7, 0) & ~BIT(1),
3987 .mode = 0444,
3988 },
3989 {
3990 .label = "reset_aux_pwr_or_ref",
3991 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3992 .mask = GENMASK(7, 0) & ~BIT(2),
3993 .mode = 0444,
3994 },
3995 {
3996 .label = "reset_main_pwr_fail",
3997 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3998 .mask = GENMASK(7, 0) & ~BIT(3),
3999 .mode = 0444,
4000 },
4001 {
4002 .label = "reset_sw_reset",
4003 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4004 .mask = GENMASK(7, 0) & ~BIT(4),
4005 .mode = 0444,
4006 },
4007 {
4008 .label = "reset_fw_reset",
4009 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4010 .mask = GENMASK(7, 0) & ~BIT(5),
4011 .mode = 0444,
4012 },
4013 {
4014 .label = "reset_hotswap_or_wd",
4015 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4016 .mask = GENMASK(7, 0) & ~BIT(6),
4017 .mode = 0444,
4018 },
4019 {
4020 .label = "reset_asic_thermal",
4021 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4022 .mask = GENMASK(7, 0) & ~BIT(7),
4023 .mode = 0444,
4024 },
4025 {
4026 .label = "psu1_on",
4027 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4028 .mask = GENMASK(7, 0) & ~BIT(0),
4029 .mode = 0200,
4030 },
4031 {
4032 .label = "psu2_on",
4033 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4034 .mask = GENMASK(7, 0) & ~BIT(1),
4035 .mode = 0200,
4036 },
4037 {
4038 .label = "pwr_cycle",
4039 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4040 .mask = GENMASK(7, 0) & ~BIT(2),
4041 .mode = 0200,
4042 },
4043 {
4044 .label = "pwr_down",
4045 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4046 .mask = GENMASK(7, 0) & ~BIT(3),
4047 .mode = 0200,
4048 },
4049 {
4050 .label = "select_iio",
4051 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
4052 .mask = GENMASK(7, 0) & ~BIT(6),
4053 .mode = 0644,
4054 },
4055 {
4056 .label = "asic_health",
4057 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
4058 .mask = MLXPLAT_CPLD_ASIC_MASK,
4059 .bit = 1,
4060 .mode = 0444,
4061 },
4062 };
4063
4064 static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
4065 .data = mlxplat_mlxcpld_default_regs_io_data,
4066 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
4067 };
4068
4069 /* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
4070 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
4071 {
4072 .label = "cpld1_version",
4073 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
4074 .bit = GENMASK(7, 0),
4075 .mode = 0444,
4076 },
4077 {
4078 .label = "cpld2_version",
4079 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
4080 .bit = GENMASK(7, 0),
4081 .mode = 0444,
4082 },
4083 {
4084 .label = "cpld1_pn",
4085 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
4086 .bit = GENMASK(15, 0),
4087 .mode = 0444,
4088 .regnum = 2,
4089 },
4090 {
4091 .label = "cpld2_pn",
4092 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
4093 .bit = GENMASK(15, 0),
4094 .mode = 0444,
4095 .regnum = 2,
4096 },
4097 {
4098 .label = "cpld1_version_min",
4099 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
4100 .bit = GENMASK(7, 0),
4101 .mode = 0444,
4102 },
4103 {
4104 .label = "cpld2_version_min",
4105 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
4106 .bit = GENMASK(7, 0),
4107 .mode = 0444,
4108 },
4109 {
4110 .label = "reset_long_pb",
4111 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4112 .mask = GENMASK(7, 0) & ~BIT(0),
4113 .mode = 0444,
4114 },
4115 {
4116 .label = "reset_short_pb",
4117 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4118 .mask = GENMASK(7, 0) & ~BIT(1),
4119 .mode = 0444,
4120 },
4121 {
4122 .label = "reset_aux_pwr_or_ref",
4123 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4124 .mask = GENMASK(7, 0) & ~BIT(2),
4125 .mode = 0444,
4126 },
4127 {
4128 .label = "reset_sw_reset",
4129 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4130 .mask = GENMASK(7, 0) & ~BIT(3),
4131 .mode = 0444,
4132 },
4133 {
4134 .label = "reset_main_pwr_fail",
4135 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4136 .mask = GENMASK(7, 0) & ~BIT(4),
4137 .mode = 0444,
4138 },
4139 {
4140 .label = "reset_asic_thermal",
4141 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4142 .mask = GENMASK(7, 0) & ~BIT(5),
4143 .mode = 0444,
4144 },
4145 {
4146 .label = "reset_hotswap_or_halt",
4147 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4148 .mask = GENMASK(7, 0) & ~BIT(6),
4149 .mode = 0444,
4150 },
4151 {
4152 .label = "reset_sff_wd",
4153 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4154 .mask = GENMASK(7, 0) & ~BIT(6),
4155 .mode = 0444,
4156 },
4157 {
4158 .label = "psu1_on",
4159 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4160 .mask = GENMASK(7, 0) & ~BIT(0),
4161 .mode = 0200,
4162 },
4163 {
4164 .label = "psu2_on",
4165 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4166 .mask = GENMASK(7, 0) & ~BIT(1),
4167 .mode = 0200,
4168 },
4169 {
4170 .label = "pwr_cycle",
4171 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4172 .mask = GENMASK(7, 0) & ~BIT(2),
4173 .mode = 0200,
4174 },
4175 {
4176 .label = "pwr_down",
4177 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4178 .mask = GENMASK(7, 0) & ~BIT(3),
4179 .mode = 0200,
4180 },
4181 {
4182 .label = "select_iio",
4183 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
4184 .mask = GENMASK(7, 0) & ~BIT(6),
4185 .mode = 0644,
4186 },
4187 {
4188 .label = "asic_health",
4189 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
4190 .mask = MLXPLAT_CPLD_ASIC_MASK,
4191 .bit = 1,
4192 .mode = 0444,
4193 },
4194 };
4195
4196 static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
4197 .data = mlxplat_mlxcpld_msn21xx_regs_io_data,
4198 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
4199 };
4200
4201 /* Platform register access for next generation systems families data */
4202 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
4203 {
4204 .label = "cpld1_version",
4205 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
4206 .bit = GENMASK(7, 0),
4207 .mode = 0444,
4208 },
4209 {
4210 .label = "cpld2_version",
4211 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
4212 .bit = GENMASK(7, 0),
4213 .mode = 0444,
4214 },
4215 {
4216 .label = "cpld3_version",
4217 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
4218 .bit = GENMASK(7, 0),
4219 .mode = 0444,
4220 },
4221 {
4222 .label = "cpld4_version",
4223 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
4224 .bit = GENMASK(7, 0),
4225 .mode = 0444,
4226 },
4227 {
4228 .label = "cpld5_version",
4229 .reg = MLXPLAT_CPLD_LPC_REG_CPLD5_VER_OFFSET,
4230 .bit = GENMASK(7, 0),
4231 .mode = 0444,
4232 },
4233 {
4234 .label = "cpld1_pn",
4235 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
4236 .bit = GENMASK(15, 0),
4237 .mode = 0444,
4238 .regnum = 2,
4239 },
4240 {
4241 .label = "cpld2_pn",
4242 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
4243 .bit = GENMASK(15, 0),
4244 .mode = 0444,
4245 .regnum = 2,
4246 },
4247 {
4248 .label = "cpld3_pn",
4249 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
4250 .bit = GENMASK(15, 0),
4251 .mode = 0444,
4252 .regnum = 2,
4253 },
4254 {
4255 .label = "cpld4_pn",
4256 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
4257 .bit = GENMASK(15, 0),
4258 .mode = 0444,
4259 .regnum = 2,
4260 },
4261 {
4262 .label = "cpld5_pn",
4263 .reg = MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET,
4264 .bit = GENMASK(15, 0),
4265 .mode = 0444,
4266 .regnum = 2,
4267 },
4268 {
4269 .label = "cpld1_version_min",
4270 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
4271 .bit = GENMASK(7, 0),
4272 .mode = 0444,
4273 },
4274 {
4275 .label = "cpld2_version_min",
4276 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
4277 .bit = GENMASK(7, 0),
4278 .mode = 0444,
4279 },
4280 {
4281 .label = "cpld3_version_min",
4282 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
4283 .bit = GENMASK(7, 0),
4284 .mode = 0444,
4285 },
4286 {
4287 .label = "cpld4_version_min",
4288 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
4289 .bit = GENMASK(7, 0),
4290 .mode = 0444,
4291 },
4292 {
4293 .label = "cpld5_version_min",
4294 .reg = MLXPLAT_CPLD_LPC_REG_CPLD5_MVER_OFFSET,
4295 .bit = GENMASK(7, 0),
4296 .mode = 0444,
4297 },
4298 {
4299 .label = "asic_reset",
4300 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
4301 .mask = GENMASK(7, 0) & ~BIT(3),
4302 .mode = 0200,
4303 },
4304 {
4305 .label = "asic2_reset",
4306 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
4307 .mask = GENMASK(7, 0) & ~BIT(2),
4308 .mode = 0200,
4309 },
4310 {
4311 .label = "erot1_reset",
4312 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
4313 .mask = GENMASK(7, 0) & ~BIT(6),
4314 .mode = 0644,
4315 },
4316 {
4317 .label = "erot2_reset",
4318 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
4319 .mask = GENMASK(7, 0) & ~BIT(7),
4320 .mode = 0644,
4321 },
4322 {
4323 .label = "clk_brd_prog_en",
4324 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
4325 .mask = GENMASK(7, 0) & ~BIT(1),
4326 .mode = 0644,
4327 .secured = 1,
4328 },
4329 {
4330 .label = "erot1_recovery",
4331 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
4332 .mask = GENMASK(7, 0) & ~BIT(6),
4333 .mode = 0644,
4334 },
4335 {
4336 .label = "erot2_recovery",
4337 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
4338 .mask = GENMASK(7, 0) & ~BIT(7),
4339 .mode = 0644,
4340 },
4341 {
4342 .label = "erot1_wp",
4343 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
4344 .mask = GENMASK(7, 0) & ~BIT(4),
4345 .mode = 0644,
4346 .secured = 1,
4347 },
4348 {
4349 .label = "erot2_wp",
4350 .reg = MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET,
4351 .mask = GENMASK(7, 0) & ~BIT(5),
4352 .mode = 0644,
4353 .secured = 1,
4354 },
4355 {
4356 .label = "reset_long_pb",
4357 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4358 .mask = GENMASK(7, 0) & ~BIT(0),
4359 .mode = 0444,
4360 },
4361 {
4362 .label = "reset_short_pb",
4363 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4364 .mask = GENMASK(7, 0) & ~BIT(1),
4365 .mode = 0444,
4366 },
4367 {
4368 .label = "reset_aux_pwr_or_ref",
4369 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4370 .mask = GENMASK(7, 0) & ~BIT(2),
4371 .mode = 0444,
4372 },
4373 {
4374 .label = "reset_swb_dc_dc_pwr_fail",
4375 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4376 .mask = GENMASK(7, 0) & ~BIT(3),
4377 .mode = 0444,
4378 },
4379 {
4380 .label = "reset_from_asic",
4381 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4382 .mask = GENMASK(7, 0) & ~BIT(5),
4383 .mode = 0444,
4384 },
4385 {
4386 .label = "reset_swb_wd",
4387 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4388 .mask = GENMASK(7, 0) & ~BIT(6),
4389 .mode = 0444,
4390 },
4391 {
4392 .label = "reset_asic_thermal",
4393 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4394 .mask = GENMASK(7, 0) & ~BIT(7),
4395 .mode = 0444,
4396 },
4397 {
4398 .label = "reset_sw_reset",
4399 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4400 .mask = GENMASK(7, 0) & ~BIT(0),
4401 .mode = 0444,
4402 },
4403 {
4404 .label = "reset_comex_pwr_fail",
4405 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4406 .mask = GENMASK(7, 0) & ~BIT(3),
4407 .mode = 0444,
4408 },
4409 {
4410 .label = "reset_platform",
4411 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4412 .mask = GENMASK(7, 0) & ~BIT(4),
4413 .mode = 0444,
4414 },
4415 {
4416 .label = "reset_soc",
4417 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4418 .mask = GENMASK(7, 0) & ~BIT(5),
4419 .mode = 0444,
4420 },
4421 {
4422 .label = "reset_comex_wd",
4423 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4424 .mask = GENMASK(7, 0) & ~BIT(6),
4425 .mode = 0444,
4426 },
4427 {
4428 .label = "reset_pwr_converter_fail",
4429 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4430 .mask = GENMASK(7, 0) & ~BIT(0),
4431 .mode = 0444,
4432 },
4433 {
4434 .label = "reset_system",
4435 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4436 .mask = GENMASK(7, 0) & ~BIT(1),
4437 .mode = 0444,
4438 },
4439 {
4440 .label = "reset_sw_pwr_off",
4441 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4442 .mask = GENMASK(7, 0) & ~BIT(2),
4443 .mode = 0444,
4444 },
4445 {
4446 .label = "reset_comex_thermal",
4447 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4448 .mask = GENMASK(7, 0) & ~BIT(3),
4449 .mode = 0444,
4450 },
4451 {
4452 .label = "reset_reload_bios",
4453 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4454 .mask = GENMASK(7, 0) & ~BIT(5),
4455 .mode = 0444,
4456 },
4457 {
4458 .label = "reset_ac_pwr_fail",
4459 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4460 .mask = GENMASK(7, 0) & ~BIT(6),
4461 .mode = 0444,
4462 },
4463 {
4464 .label = "reset_ac_ok_fail",
4465 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4466 .mask = GENMASK(7, 0) & ~BIT(7),
4467 .mode = 0444,
4468 },
4469 {
4470 .label = "psu1_on",
4471 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4472 .mask = GENMASK(7, 0) & ~BIT(0),
4473 .mode = 0200,
4474 },
4475 {
4476 .label = "psu2_on",
4477 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4478 .mask = GENMASK(7, 0) & ~BIT(1),
4479 .mode = 0200,
4480 },
4481 {
4482 .label = "pwr_cycle",
4483 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4484 .mask = GENMASK(7, 0) & ~BIT(2),
4485 .mode = 0200,
4486 },
4487 {
4488 .label = "pwr_down",
4489 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4490 .mask = GENMASK(7, 0) & ~BIT(3),
4491 .mode = 0200,
4492 },
4493 {
4494 .label = "deep_pwr_cycle",
4495 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4496 .mask = GENMASK(7, 0) & ~BIT(5),
4497 .mode = 0200,
4498 },
4499 {
4500 .label = "latch_reset",
4501 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4502 .mask = GENMASK(7, 0) & ~BIT(6),
4503 .mode = 0200,
4504 },
4505 {
4506 .label = "jtag_cap",
4507 .reg = MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET,
4508 .mask = MLXPLAT_CPLD_FU_CAP_MASK,
4509 .bit = 1,
4510 .mode = 0444,
4511 },
4512 {
4513 .label = "jtag_enable",
4514 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
4515 .mask = GENMASK(7, 0) & ~BIT(4),
4516 .mode = 0644,
4517 },
4518 {
4519 .label = "dbg1",
4520 .reg = MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET,
4521 .bit = GENMASK(7, 0),
4522 .mode = 0644,
4523 },
4524 {
4525 .label = "dbg2",
4526 .reg = MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET,
4527 .bit = GENMASK(7, 0),
4528 .mode = 0644,
4529 },
4530 {
4531 .label = "dbg3",
4532 .reg = MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET,
4533 .bit = GENMASK(7, 0),
4534 .mode = 0644,
4535 },
4536 {
4537 .label = "dbg4",
4538 .reg = MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET,
4539 .bit = GENMASK(7, 0),
4540 .mode = 0644,
4541 },
4542 {
4543 .label = "asic_health",
4544 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
4545 .mask = MLXPLAT_CPLD_ASIC_MASK,
4546 .bit = 1,
4547 .mode = 0444,
4548 },
4549 {
4550 .label = "asic2_health",
4551 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
4552 .mask = MLXPLAT_CPLD_ASIC_MASK,
4553 .bit = 1,
4554 .mode = 0444,
4555 },
4556 {
4557 .label = "fan_dir",
4558 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
4559 .bit = GENMASK(7, 0),
4560 .mode = 0444,
4561 },
4562 {
4563 .label = "bios_safe_mode",
4564 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
4565 .mask = GENMASK(7, 0) & ~BIT(4),
4566 .mode = 0444,
4567 },
4568 {
4569 .label = "bios_active_image",
4570 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
4571 .mask = GENMASK(7, 0) & ~BIT(5),
4572 .mode = 0444,
4573 },
4574 {
4575 .label = "bios_auth_fail",
4576 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
4577 .mask = GENMASK(7, 0) & ~BIT(6),
4578 .mode = 0444,
4579 },
4580 {
4581 .label = "bios_upgrade_fail",
4582 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
4583 .mask = GENMASK(7, 0) & ~BIT(7),
4584 .mode = 0444,
4585 },
4586 {
4587 .label = "voltreg_update_status",
4588 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
4589 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
4590 .bit = 5,
4591 .mode = 0444,
4592 },
4593 {
4594 .label = "pwr_converter_prog_en",
4595 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4596 .mask = GENMASK(7, 0) & ~BIT(0),
4597 .mode = 0644,
4598 .secured = 1,
4599 },
4600 {
4601 .label = "vpd_wp",
4602 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4603 .mask = GENMASK(7, 0) & ~BIT(3),
4604 .mode = 0644,
4605 },
4606 {
4607 .label = "pcie_asic_reset_dis",
4608 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4609 .mask = GENMASK(7, 0) & ~BIT(4),
4610 .mode = 0644,
4611 },
4612 {
4613 .label = "shutdown_unlock",
4614 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4615 .mask = GENMASK(7, 0) & ~BIT(5),
4616 .mode = 0644,
4617 },
4618 {
4619 .label = "erot1_ap_reset",
4620 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
4621 .mask = GENMASK(7, 0) & ~BIT(0),
4622 .mode = 0444,
4623 },
4624 {
4625 .label = "erot2_ap_reset",
4626 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
4627 .mask = GENMASK(7, 0) & ~BIT(1),
4628 .mode = 0444,
4629 },
4630 {
4631 .label = "lid_open",
4632 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
4633 .mask = GENMASK(7, 0) & ~BIT(2),
4634 .mode = 0444,
4635 },
4636 {
4637 .label = "clk_brd1_boot_fail",
4638 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
4639 .mask = GENMASK(7, 0) & ~BIT(4),
4640 .mode = 0444,
4641 },
4642 {
4643 .label = "clk_brd2_boot_fail",
4644 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
4645 .mask = GENMASK(7, 0) & ~BIT(5),
4646 .mode = 0444,
4647 },
4648 {
4649 .label = "clk_brd_fail",
4650 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
4651 .mask = GENMASK(7, 0) & ~BIT(6),
4652 .mode = 0444,
4653 },
4654 {
4655 .label = "asic_pg_fail",
4656 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
4657 .mask = GENMASK(7, 0) & ~BIT(7),
4658 .mode = 0444,
4659 },
4660 {
4661 .label = "spi_chnl_select",
4662 .reg = MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT,
4663 .mask = GENMASK(7, 0),
4664 .bit = 1,
4665 .mode = 0644,
4666 },
4667 {
4668 .label = "config1",
4669 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
4670 .bit = GENMASK(7, 0),
4671 .mode = 0444,
4672 },
4673 {
4674 .label = "config2",
4675 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
4676 .bit = GENMASK(7, 0),
4677 .mode = 0444,
4678 },
4679 {
4680 .label = "config3",
4681 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
4682 .bit = GENMASK(7, 0),
4683 .mode = 0444,
4684 },
4685 {
4686 .label = "ufm_version",
4687 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
4688 .bit = GENMASK(7, 0),
4689 .mode = 0444,
4690 },
4691 };
4692
4693 static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
4694 .data = mlxplat_mlxcpld_default_ng_regs_io_data,
4695 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
4696 };
4697
4698 /* Platform register access for next generation systems families data */
4699 static struct mlxreg_core_data mlxplat_mlxcpld_dgx_ng_regs_io_data[] = {
4700 {
4701 .label = "cpld1_version",
4702 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
4703 .bit = GENMASK(7, 0),
4704 .mode = 0444,
4705 },
4706 {
4707 .label = "cpld2_version",
4708 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
4709 .bit = GENMASK(7, 0),
4710 .mode = 0444,
4711 },
4712 {
4713 .label = "cpld3_version",
4714 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
4715 .bit = GENMASK(7, 0),
4716 .mode = 0444,
4717 },
4718 {
4719 .label = "cpld4_version",
4720 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
4721 .bit = GENMASK(7, 0),
4722 .mode = 0444,
4723 },
4724 {
4725 .label = "cpld1_pn",
4726 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
4727 .bit = GENMASK(15, 0),
4728 .mode = 0444,
4729 .regnum = 2,
4730 },
4731 {
4732 .label = "cpld2_pn",
4733 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
4734 .bit = GENMASK(15, 0),
4735 .mode = 0444,
4736 .regnum = 2,
4737 },
4738 {
4739 .label = "cpld3_pn",
4740 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
4741 .bit = GENMASK(15, 0),
4742 .mode = 0444,
4743 .regnum = 2,
4744 },
4745 {
4746 .label = "cpld4_pn",
4747 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
4748 .bit = GENMASK(15, 0),
4749 .mode = 0444,
4750 .regnum = 2,
4751 },
4752 {
4753 .label = "cpld1_version_min",
4754 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
4755 .bit = GENMASK(7, 0),
4756 .mode = 0444,
4757 },
4758 {
4759 .label = "cpld2_version_min",
4760 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
4761 .bit = GENMASK(7, 0),
4762 .mode = 0444,
4763 },
4764 {
4765 .label = "cpld3_version_min",
4766 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
4767 .bit = GENMASK(7, 0),
4768 .mode = 0444,
4769 },
4770 {
4771 .label = "cpld4_version_min",
4772 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
4773 .bit = GENMASK(7, 0),
4774 .mode = 0444,
4775 },
4776 {
4777 .label = "asic_reset",
4778 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
4779 .mask = GENMASK(7, 0) & ~BIT(3),
4780 .mode = 0200,
4781 },
4782 {
4783 .label = "reset_long_pb",
4784 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4785 .mask = GENMASK(7, 0) & ~BIT(0),
4786 .mode = 0444,
4787 },
4788 {
4789 .label = "reset_short_pb",
4790 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4791 .mask = GENMASK(7, 0) & ~BIT(1),
4792 .mode = 0444,
4793 },
4794 {
4795 .label = "reset_aux_pwr_or_ref",
4796 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4797 .mask = GENMASK(7, 0) & ~BIT(2),
4798 .mode = 0444,
4799 },
4800 {
4801 .label = "reset_swb_dc_dc_pwr_fail",
4802 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4803 .mask = GENMASK(7, 0) & ~BIT(3),
4804 .mode = 0444,
4805 },
4806 {
4807 .label = "reset_from_asic",
4808 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4809 .mask = GENMASK(7, 0) & ~BIT(5),
4810 .mode = 0444,
4811 },
4812 {
4813 .label = "reset_swb_wd",
4814 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4815 .mask = GENMASK(7, 0) & ~BIT(6),
4816 .mode = 0444,
4817 },
4818 {
4819 .label = "reset_asic_thermal",
4820 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4821 .mask = GENMASK(7, 0) & ~BIT(7),
4822 .mode = 0444,
4823 },
4824 {
4825 .label = "reset_sw_reset",
4826 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4827 .mask = GENMASK(7, 0) & ~BIT(0),
4828 .mode = 0444,
4829 },
4830 {
4831 .label = "reset_comex_pwr_fail",
4832 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4833 .mask = GENMASK(7, 0) & ~BIT(3),
4834 .mode = 0444,
4835 },
4836 {
4837 .label = "reset_platform",
4838 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4839 .mask = GENMASK(7, 0) & ~BIT(4),
4840 .mode = 0444,
4841 },
4842 {
4843 .label = "reset_soc",
4844 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4845 .mask = GENMASK(7, 0) & ~BIT(5),
4846 .mode = 0444,
4847 },
4848 {
4849 .label = "reset_comex_wd",
4850 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
4851 .mask = GENMASK(7, 0) & ~BIT(6),
4852 .mode = 0444,
4853 },
4854 {
4855 .label = "reset_system",
4856 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4857 .mask = GENMASK(7, 0) & ~BIT(1),
4858 .mode = 0444,
4859 },
4860 {
4861 .label = "reset_sw_pwr_off",
4862 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4863 .mask = GENMASK(7, 0) & ~BIT(2),
4864 .mode = 0444,
4865 },
4866 {
4867 .label = "reset_comex_thermal",
4868 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4869 .mask = GENMASK(7, 0) & ~BIT(3),
4870 .mode = 0444,
4871 },
4872 {
4873 .label = "reset_reload_bios",
4874 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4875 .mask = GENMASK(7, 0) & ~BIT(5),
4876 .mode = 0444,
4877 },
4878 {
4879 .label = "reset_pdb_pwr_fail",
4880 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
4881 .mask = GENMASK(7, 0) & ~BIT(6),
4882 .mode = 0444,
4883 },
4884 {
4885 .label = "pdb_reset_stby",
4886 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4887 .mask = GENMASK(7, 0) & ~BIT(0),
4888 .mode = 0200,
4889 },
4890 {
4891 .label = "pwr_cycle",
4892 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4893 .mask = GENMASK(7, 0) & ~BIT(2),
4894 .mode = 0200,
4895 },
4896 {
4897 .label = "pwr_down",
4898 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4899 .mask = GENMASK(7, 0) & ~BIT(3),
4900 .mode = 0200,
4901 },
4902 {
4903 .label = "deep_pwr_cycle",
4904 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4905 .mask = GENMASK(7, 0) & ~BIT(5),
4906 .mode = 0200,
4907 },
4908 {
4909 .label = "latch_reset",
4910 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
4911 .mask = GENMASK(7, 0) & ~BIT(6),
4912 .mode = 0200,
4913 },
4914 {
4915 .label = "jtag_cap",
4916 .reg = MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET,
4917 .mask = MLXPLAT_CPLD_FU_CAP_MASK,
4918 .bit = 1,
4919 .mode = 0444,
4920 },
4921 {
4922 .label = "jtag_enable",
4923 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
4924 .mask = GENMASK(7, 0) & ~BIT(4),
4925 .mode = 0644,
4926 },
4927 {
4928 .label = "dbg1",
4929 .reg = MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET,
4930 .bit = GENMASK(7, 0),
4931 .mode = 0644,
4932 },
4933 {
4934 .label = "dbg2",
4935 .reg = MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET,
4936 .bit = GENMASK(7, 0),
4937 .mode = 0644,
4938 },
4939 {
4940 .label = "dbg3",
4941 .reg = MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET,
4942 .bit = GENMASK(7, 0),
4943 .mode = 0644,
4944 },
4945 {
4946 .label = "dbg4",
4947 .reg = MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET,
4948 .bit = GENMASK(7, 0),
4949 .mode = 0644,
4950 },
4951 {
4952 .label = "asic_health",
4953 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
4954 .mask = MLXPLAT_CPLD_ASIC_MASK,
4955 .bit = 1,
4956 .mode = 0444,
4957 },
4958 {
4959 .label = "fan_dir",
4960 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
4961 .bit = GENMASK(7, 0),
4962 .mode = 0444,
4963 },
4964 {
4965 .label = "bios_safe_mode",
4966 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
4967 .mask = GENMASK(7, 0) & ~BIT(4),
4968 .mode = 0444,
4969 },
4970 {
4971 .label = "bios_active_image",
4972 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
4973 .mask = GENMASK(7, 0) & ~BIT(5),
4974 .mode = 0444,
4975 },
4976 {
4977 .label = "bios_auth_fail",
4978 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
4979 .mask = GENMASK(7, 0) & ~BIT(6),
4980 .mode = 0444,
4981 },
4982 {
4983 .label = "bios_upgrade_fail",
4984 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
4985 .mask = GENMASK(7, 0) & ~BIT(7),
4986 .mode = 0444,
4987 },
4988 {
4989 .label = "voltreg_update_status",
4990 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
4991 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
4992 .bit = 5,
4993 .mode = 0444,
4994 },
4995 {
4996 .label = "pwr_converter_prog_en",
4997 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
4998 .mask = GENMASK(7, 0) & ~BIT(0),
4999 .mode = 0644,
5000 .secured = 1,
5001 },
5002 {
5003 .label = "vpd_wp",
5004 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
5005 .mask = GENMASK(7, 0) & ~BIT(3),
5006 .mode = 0644,
5007 },
5008 {
5009 .label = "pcie_asic_reset_dis",
5010 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
5011 .mask = GENMASK(7, 0) & ~BIT(4),
5012 .mode = 0644,
5013 },
5014 {
5015 .label = "shutdown_unlock",
5016 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
5017 .mask = GENMASK(7, 0) & ~BIT(5),
5018 .mode = 0644,
5019 },
5020 {
5021 .label = "config1",
5022 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
5023 .bit = GENMASK(7, 0),
5024 .mode = 0444,
5025 },
5026 {
5027 .label = "config2",
5028 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
5029 .bit = GENMASK(7, 0),
5030 .mode = 0444,
5031 },
5032 {
5033 .label = "config3",
5034 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
5035 .bit = GENMASK(7, 0),
5036 .mode = 0444,
5037 },
5038 {
5039 .label = "ufm_version",
5040 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
5041 .bit = GENMASK(7, 0),
5042 .mode = 0444,
5043 },
5044 };
5045
5046 static struct mlxreg_core_platform_data mlxplat_dgx_ng_regs_io_data = {
5047 .data = mlxplat_mlxcpld_dgx_ng_regs_io_data,
5048 .counter = ARRAY_SIZE(mlxplat_mlxcpld_dgx_ng_regs_io_data),
5049 };
5050
5051 /* Platform register access for modular systems families data */
5052 static struct mlxreg_core_data mlxplat_mlxcpld_modular_regs_io_data[] = {
5053 {
5054 .label = "cpld1_version",
5055 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
5056 .bit = GENMASK(7, 0),
5057 .mode = 0444,
5058 },
5059 {
5060 .label = "cpld2_version",
5061 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
5062 .bit = GENMASK(7, 0),
5063 .mode = 0444,
5064 },
5065 {
5066 .label = "cpld3_version",
5067 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
5068 .bit = GENMASK(7, 0),
5069 .mode = 0444,
5070 },
5071 {
5072 .label = "cpld4_version",
5073 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
5074 .bit = GENMASK(7, 0),
5075 .mode = 0444,
5076 },
5077 {
5078 .label = "cpld1_pn",
5079 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
5080 .bit = GENMASK(15, 0),
5081 .mode = 0444,
5082 .regnum = 2,
5083 },
5084 {
5085 .label = "cpld2_pn",
5086 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
5087 .bit = GENMASK(15, 0),
5088 .mode = 0444,
5089 .regnum = 2,
5090 },
5091 {
5092 .label = "cpld3_pn",
5093 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
5094 .bit = GENMASK(15, 0),
5095 .mode = 0444,
5096 .regnum = 2,
5097 },
5098 {
5099 .label = "cpld4_pn",
5100 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
5101 .bit = GENMASK(15, 0),
5102 .mode = 0444,
5103 .regnum = 2,
5104 },
5105 {
5106 .label = "cpld1_version_min",
5107 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
5108 .bit = GENMASK(7, 0),
5109 .mode = 0444,
5110 },
5111 {
5112 .label = "cpld2_version_min",
5113 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
5114 .bit = GENMASK(7, 0),
5115 .mode = 0444,
5116 },
5117 {
5118 .label = "cpld3_version_min",
5119 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
5120 .bit = GENMASK(7, 0),
5121 .mode = 0444,
5122 },
5123 {
5124 .label = "cpld4_version_min",
5125 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
5126 .bit = GENMASK(7, 0),
5127 .mode = 0444,
5128 },
5129 {
5130 .label = "lc1_enable",
5131 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5132 .mask = GENMASK(7, 0) & ~BIT(0),
5133 .mode = 0644,
5134 },
5135 {
5136 .label = "lc2_enable",
5137 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5138 .mask = GENMASK(7, 0) & ~BIT(1),
5139 .mode = 0644,
5140 },
5141 {
5142 .label = "lc3_enable",
5143 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5144 .mask = GENMASK(7, 0) & ~BIT(2),
5145 .mode = 0644,
5146 },
5147 {
5148 .label = "lc4_enable",
5149 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5150 .mask = GENMASK(7, 0) & ~BIT(3),
5151 .mode = 0644,
5152 },
5153 {
5154 .label = "lc5_enable",
5155 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5156 .mask = GENMASK(7, 0) & ~BIT(4),
5157 .mode = 0644,
5158 },
5159 {
5160 .label = "lc6_enable",
5161 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5162 .mask = GENMASK(7, 0) & ~BIT(5),
5163 .mode = 0644,
5164 },
5165 {
5166 .label = "lc7_enable",
5167 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5168 .mask = GENMASK(7, 0) & ~BIT(6),
5169 .mode = 0644,
5170 },
5171 {
5172 .label = "lc8_enable",
5173 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5174 .mask = GENMASK(7, 0) & ~BIT(7),
5175 .mode = 0644,
5176 },
5177 {
5178 .label = "reset_long_pb",
5179 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5180 .mask = GENMASK(7, 0) & ~BIT(0),
5181 .mode = 0444,
5182 },
5183 {
5184 .label = "reset_short_pb",
5185 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5186 .mask = GENMASK(7, 0) & ~BIT(1),
5187 .mode = 0444,
5188 },
5189 {
5190 .label = "reset_aux_pwr_or_fu",
5191 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5192 .mask = GENMASK(7, 0) & ~BIT(2),
5193 .mode = 0444,
5194 },
5195 {
5196 .label = "reset_mgmt_dc_dc_pwr_fail",
5197 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5198 .mask = GENMASK(7, 0) & ~BIT(3),
5199 .mode = 0444,
5200 },
5201 {
5202 .label = "reset_sys_comex_bios",
5203 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5204 .mask = GENMASK(7, 0) & ~BIT(5),
5205 .mode = 0444,
5206 },
5207 {
5208 .label = "reset_sw_reset",
5209 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5210 .mask = GENMASK(7, 0) & ~BIT(0),
5211 .mode = 0444,
5212 },
5213 {
5214 .label = "reset_aux_pwr_or_reload",
5215 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5216 .mask = GENMASK(7, 0) & ~BIT(2),
5217 .mode = 0444,
5218 },
5219 {
5220 .label = "reset_comex_pwr_fail",
5221 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5222 .mask = GENMASK(7, 0) & ~BIT(3),
5223 .mode = 0444,
5224 },
5225 {
5226 .label = "reset_platform",
5227 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5228 .mask = GENMASK(7, 0) & ~BIT(4),
5229 .mode = 0444,
5230 },
5231 {
5232 .label = "reset_soc",
5233 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5234 .mask = GENMASK(7, 0) & ~BIT(5),
5235 .mode = 0444,
5236 },
5237 {
5238 .label = "reset_pwr_off_from_carrier",
5239 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5240 .mask = GENMASK(7, 0) & ~BIT(7),
5241 .mode = 0444,
5242 },
5243 {
5244 .label = "reset_swb_wd",
5245 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5246 .mask = GENMASK(7, 0) & ~BIT(0),
5247 .mode = 0444,
5248 },
5249 {
5250 .label = "reset_swb_aux_pwr_or_fu",
5251 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5252 .mask = GENMASK(7, 0) & ~BIT(2),
5253 .mode = 0444,
5254 },
5255 {
5256 .label = "reset_swb_dc_dc_pwr_fail",
5257 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5258 .mask = GENMASK(7, 0) & ~BIT(3),
5259 .mode = 0444,
5260 },
5261 {
5262 .label = "reset_swb_12v_fail",
5263 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5264 .mask = GENMASK(7, 0) & ~BIT(4),
5265 .mode = 0444,
5266 },
5267 {
5268 .label = "reset_system",
5269 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5270 .mask = GENMASK(7, 0) & ~BIT(5),
5271 .mode = 0444,
5272 },
5273 {
5274 .label = "reset_thermal_spc_or_pciesw",
5275 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5276 .mask = GENMASK(7, 0) & ~BIT(7),
5277 .mode = 0444,
5278 },
5279 {
5280 .label = "bios_safe_mode",
5281 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5282 .mask = GENMASK(7, 0) & ~BIT(4),
5283 .mode = 0444,
5284 },
5285 {
5286 .label = "bios_active_image",
5287 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5288 .mask = GENMASK(7, 0) & ~BIT(5),
5289 .mode = 0444,
5290 },
5291 {
5292 .label = "bios_auth_fail",
5293 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5294 .mask = GENMASK(7, 0) & ~BIT(6),
5295 .mode = 0444,
5296 },
5297 {
5298 .label = "bios_upgrade_fail",
5299 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5300 .mask = GENMASK(7, 0) & ~BIT(7),
5301 .mode = 0444,
5302 },
5303 {
5304 .label = "voltreg_update_status",
5305 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
5306 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
5307 .bit = 5,
5308 .mode = 0444,
5309 },
5310 {
5311 .label = "vpd_wp",
5312 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
5313 .mask = GENMASK(7, 0) & ~BIT(3),
5314 .mode = 0644,
5315 },
5316 {
5317 .label = "pcie_asic_reset_dis",
5318 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
5319 .mask = GENMASK(7, 0) & ~BIT(4),
5320 .mode = 0644,
5321 },
5322 {
5323 .label = "shutdown_unlock",
5324 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
5325 .mask = GENMASK(7, 0) & ~BIT(5),
5326 .mode = 0644,
5327 },
5328 {
5329 .label = "lc1_rst_mask",
5330 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
5331 .mask = GENMASK(7, 0) & ~BIT(0),
5332 .mode = 0200,
5333 },
5334 {
5335 .label = "lc2_rst_mask",
5336 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
5337 .mask = GENMASK(7, 0) & ~BIT(1),
5338 .mode = 0200,
5339 },
5340 {
5341 .label = "lc3_rst_mask",
5342 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
5343 .mask = GENMASK(7, 0) & ~BIT(2),
5344 .mode = 0200,
5345 },
5346 {
5347 .label = "lc4_rst_mask",
5348 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
5349 .mask = GENMASK(7, 0) & ~BIT(3),
5350 .mode = 0200,
5351 },
5352 {
5353 .label = "lc5_rst_mask",
5354 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
5355 .mask = GENMASK(7, 0) & ~BIT(4),
5356 .mode = 0200,
5357 },
5358 {
5359 .label = "lc6_rst_mask",
5360 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
5361 .mask = GENMASK(7, 0) & ~BIT(5),
5362 .mode = 0200,
5363 },
5364 {
5365 .label = "lc7_rst_mask",
5366 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
5367 .mask = GENMASK(7, 0) & ~BIT(6),
5368 .mode = 0200,
5369 },
5370 {
5371 .label = "lc8_rst_mask",
5372 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
5373 .mask = GENMASK(7, 0) & ~BIT(7),
5374 .mode = 0200,
5375 },
5376 {
5377 .label = "psu1_on",
5378 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5379 .mask = GENMASK(7, 0) & ~BIT(0),
5380 .mode = 0200,
5381 },
5382 {
5383 .label = "psu2_on",
5384 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5385 .mask = GENMASK(7, 0) & ~BIT(1),
5386 .mode = 0200,
5387 },
5388 {
5389 .label = "pwr_cycle",
5390 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5391 .mask = GENMASK(7, 0) & ~BIT(2),
5392 .mode = 0200,
5393 },
5394 {
5395 .label = "pwr_down",
5396 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5397 .mask = GENMASK(7, 0) & ~BIT(3),
5398 .mode = 0200,
5399 },
5400 {
5401 .label = "psu3_on",
5402 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5403 .mask = GENMASK(7, 0) & ~BIT(4),
5404 .mode = 0200,
5405 },
5406 {
5407 .label = "psu4_on",
5408 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5409 .mask = GENMASK(7, 0) & ~BIT(5),
5410 .mode = 0200,
5411 },
5412 {
5413 .label = "auto_power_mode",
5414 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5415 .mask = GENMASK(7, 0) & ~BIT(6),
5416 .mode = 0644,
5417 },
5418 {
5419 .label = "pm_mgmt_en",
5420 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5421 .mask = GENMASK(7, 0) & ~BIT(7),
5422 .mode = 0644,
5423 },
5424 {
5425 .label = "jtag_enable",
5426 .reg = MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE,
5427 .mask = GENMASK(3, 0),
5428 .bit = 1,
5429 .mode = 0644,
5430 },
5431 {
5432 .label = "safe_bios_dis",
5433 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
5434 .mask = GENMASK(7, 0) & ~BIT(5),
5435 .mode = 0644,
5436 },
5437 {
5438 .label = "safe_bios_dis_wp",
5439 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET,
5440 .mask = GENMASK(7, 0) & ~BIT(5),
5441 .mode = 0644,
5442 },
5443 {
5444 .label = "asic_health",
5445 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
5446 .mask = MLXPLAT_CPLD_ASIC_MASK,
5447 .bit = 1,
5448 .mode = 0444,
5449 },
5450 {
5451 .label = "fan_dir",
5452 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
5453 .bit = GENMASK(7, 0),
5454 .mode = 0444,
5455 },
5456 {
5457 .label = "lc1_pwr",
5458 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
5459 .mask = GENMASK(7, 0) & ~BIT(0),
5460 .mode = 0644,
5461 },
5462 {
5463 .label = "lc2_pwr",
5464 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
5465 .mask = GENMASK(7, 0) & ~BIT(1),
5466 .mode = 0644,
5467 },
5468 {
5469 .label = "lc3_pwr",
5470 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
5471 .mask = GENMASK(7, 0) & ~BIT(2),
5472 .mode = 0644,
5473 },
5474 {
5475 .label = "lc4_pwr",
5476 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
5477 .mask = GENMASK(7, 0) & ~BIT(3),
5478 .mode = 0644,
5479 },
5480 {
5481 .label = "lc5_pwr",
5482 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
5483 .mask = GENMASK(7, 0) & ~BIT(4),
5484 .mode = 0644,
5485 },
5486 {
5487 .label = "lc6_pwr",
5488 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
5489 .mask = GENMASK(7, 0) & ~BIT(5),
5490 .mode = 0644,
5491 },
5492 {
5493 .label = "lc7_pwr",
5494 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
5495 .mask = GENMASK(7, 0) & ~BIT(6),
5496 .mode = 0644,
5497 },
5498 {
5499 .label = "lc8_pwr",
5500 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
5501 .mask = GENMASK(7, 0) & ~BIT(7),
5502 .mode = 0644,
5503 },
5504 {
5505 .label = "config1",
5506 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
5507 .bit = GENMASK(7, 0),
5508 .mode = 0444,
5509 },
5510 {
5511 .label = "config2",
5512 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
5513 .bit = GENMASK(7, 0),
5514 .mode = 0444,
5515 },
5516 {
5517 .label = "config3",
5518 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
5519 .bit = GENMASK(7, 0),
5520 .mode = 0444,
5521 },
5522 {
5523 .label = "ufm_version",
5524 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
5525 .bit = GENMASK(7, 0),
5526 .mode = 0444,
5527 },
5528 };
5529
5530 static struct mlxreg_core_platform_data mlxplat_modular_regs_io_data = {
5531 .data = mlxplat_mlxcpld_modular_regs_io_data,
5532 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_regs_io_data),
5533 };
5534
5535 /* Platform register access for chassis blade systems family data */
5536 static struct mlxreg_core_data mlxplat_mlxcpld_chassis_blade_regs_io_data[] = {
5537 {
5538 .label = "cpld1_version",
5539 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
5540 .bit = GENMASK(7, 0),
5541 .mode = 0444,
5542 },
5543 {
5544 .label = "cpld1_pn",
5545 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
5546 .bit = GENMASK(15, 0),
5547 .mode = 0444,
5548 .regnum = 2,
5549 },
5550 {
5551 .label = "cpld1_version_min",
5552 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
5553 .bit = GENMASK(7, 0),
5554 .mode = 0444,
5555 },
5556 {
5557 .label = "reset_aux_pwr_or_ref",
5558 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5559 .mask = GENMASK(7, 0) & ~BIT(2),
5560 .mode = 0444,
5561 },
5562 {
5563 .label = "reset_from_comex",
5564 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5565 .mask = GENMASK(7, 0) & ~BIT(4),
5566 .mode = 0444,
5567 },
5568 {
5569 .label = "reset_comex_pwr_fail",
5570 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5571 .mask = GENMASK(7, 0) & ~BIT(3),
5572 .mode = 0444,
5573 },
5574 {
5575 .label = "reset_platform",
5576 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5577 .mask = GENMASK(7, 0) & ~BIT(4),
5578 .mode = 0444,
5579 },
5580 {
5581 .label = "reset_soc",
5582 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5583 .mask = GENMASK(7, 0) & ~BIT(5),
5584 .mode = 0444,
5585 },
5586 {
5587 .label = "reset_comex_wd",
5588 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5589 .mask = GENMASK(7, 0) & ~BIT(6),
5590 .mode = 0444,
5591 },
5592 {
5593 .label = "reset_voltmon_upgrade_fail",
5594 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5595 .mask = GENMASK(7, 0) & ~BIT(0),
5596 .mode = 0444,
5597 },
5598 {
5599 .label = "reset_system",
5600 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5601 .mask = GENMASK(7, 0) & ~BIT(1),
5602 .mode = 0444,
5603 },
5604 {
5605 .label = "reset_sw_pwr_off",
5606 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5607 .mask = GENMASK(7, 0) & ~BIT(2),
5608 .mode = 0444,
5609 },
5610 {
5611 .label = "reset_comex_thermal",
5612 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5613 .mask = GENMASK(7, 0) & ~BIT(3),
5614 .mode = 0444,
5615 },
5616 {
5617 .label = "reset_reload_bios",
5618 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5619 .mask = GENMASK(7, 0) & ~BIT(5),
5620 .mode = 0444,
5621 },
5622 {
5623 .label = "reset_ac_pwr_fail",
5624 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5625 .mask = GENMASK(7, 0) & ~BIT(6),
5626 .mode = 0444,
5627 },
5628 {
5629 .label = "reset_long_pwr_pb",
5630 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5631 .mask = GENMASK(7, 0) & ~BIT(7),
5632 .mode = 0444,
5633 },
5634 {
5635 .label = "pwr_cycle",
5636 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5637 .mask = GENMASK(7, 0) & ~BIT(2),
5638 .mode = 0200,
5639 },
5640 {
5641 .label = "pwr_down",
5642 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
5643 .mask = GENMASK(7, 0) & ~BIT(3),
5644 .mode = 0200,
5645 },
5646 {
5647 .label = "global_wp_request",
5648 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
5649 .mask = GENMASK(7, 0) & ~BIT(0),
5650 .mode = 0644,
5651 },
5652 {
5653 .label = "jtag_enable",
5654 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
5655 .mask = GENMASK(7, 0) & ~BIT(4),
5656 .mode = 0644,
5657 },
5658 {
5659 .label = "comm_chnl_ready",
5660 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
5661 .mask = GENMASK(7, 0) & ~BIT(6),
5662 .mode = 0200,
5663 },
5664 {
5665 .label = "bios_safe_mode",
5666 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5667 .mask = GENMASK(7, 0) & ~BIT(4),
5668 .mode = 0444,
5669 },
5670 {
5671 .label = "bios_active_image",
5672 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5673 .mask = GENMASK(7, 0) & ~BIT(5),
5674 .mode = 0444,
5675 },
5676 {
5677 .label = "bios_auth_fail",
5678 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5679 .mask = GENMASK(7, 0) & ~BIT(6),
5680 .mode = 0444,
5681 },
5682 {
5683 .label = "bios_upgrade_fail",
5684 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5685 .mask = GENMASK(7, 0) & ~BIT(7),
5686 .mode = 0444,
5687 },
5688 {
5689 .label = "voltreg_update_status",
5690 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
5691 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
5692 .bit = 5,
5693 .mode = 0444,
5694 },
5695 {
5696 .label = "vpd_wp",
5697 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
5698 .mask = GENMASK(7, 0) & ~BIT(3),
5699 .mode = 0644,
5700 },
5701 {
5702 .label = "pcie_asic_reset_dis",
5703 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
5704 .mask = GENMASK(7, 0) & ~BIT(4),
5705 .mode = 0644,
5706 },
5707 {
5708 .label = "global_wp_response",
5709 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
5710 .mask = GENMASK(7, 0) & ~BIT(0),
5711 .mode = 0444,
5712 },
5713 {
5714 .label = "config1",
5715 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
5716 .bit = GENMASK(7, 0),
5717 .mode = 0444,
5718 },
5719 {
5720 .label = "config2",
5721 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
5722 .bit = GENMASK(7, 0),
5723 .mode = 0444,
5724 },
5725 {
5726 .label = "config3",
5727 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
5728 .bit = GENMASK(7, 0),
5729 .mode = 0444,
5730 },
5731 {
5732 .label = "ufm_version",
5733 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
5734 .bit = GENMASK(7, 0),
5735 .mode = 0444,
5736 },
5737 };
5738
5739 static struct mlxreg_core_platform_data mlxplat_chassis_blade_regs_io_data = {
5740 .data = mlxplat_mlxcpld_chassis_blade_regs_io_data,
5741 .counter = ARRAY_SIZE(mlxplat_mlxcpld_chassis_blade_regs_io_data),
5742 };
5743
5744 /* Platform register access for smart switch systems families data */
5745 static struct mlxreg_core_data mlxplat_mlxcpld_smart_switch_regs_io_data[] = {
5746 {
5747 .label = "cpld1_version",
5748 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
5749 .bit = GENMASK(7, 0),
5750 .mode = 0444,
5751 },
5752 {
5753 .label = "cpld2_version",
5754 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
5755 .bit = GENMASK(7, 0),
5756 .mode = 0444,
5757 },
5758 {
5759 .label = "cpld3_version",
5760 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
5761 .bit = GENMASK(7, 0),
5762 .mode = 0444,
5763 },
5764 {
5765 .label = "cpld1_pn",
5766 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
5767 .bit = GENMASK(15, 0),
5768 .mode = 0444,
5769 .regnum = 2,
5770 },
5771 {
5772 .label = "cpld2_pn",
5773 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
5774 .bit = GENMASK(15, 0),
5775 .mode = 0444,
5776 .regnum = 2,
5777 },
5778 {
5779 .label = "cpld3_pn",
5780 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
5781 .bit = GENMASK(15, 0),
5782 .mode = 0444,
5783 .regnum = 2,
5784 },
5785 {
5786 .label = "cpld1_version_min",
5787 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
5788 .bit = GENMASK(7, 0),
5789 .mode = 0444,
5790 },
5791 {
5792 .label = "cpld2_version_min",
5793 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
5794 .bit = GENMASK(7, 0),
5795 .mode = 0444,
5796 },
5797 {
5798 .label = "cpld3_version_min",
5799 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
5800 .bit = GENMASK(7, 0),
5801 .mode = 0444,
5802 },
5803 {
5804 .label = "kexec_activated",
5805 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET,
5806 .mask = GENMASK(7, 0) & ~BIT(1),
5807 .mode = 0644,
5808 },
5809 {
5810 .label = "asic_reset",
5811 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
5812 .mask = GENMASK(7, 0) & ~BIT(3),
5813 .mode = 0644,
5814 },
5815 {
5816 .label = "eth_switch_reset",
5817 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
5818 .mask = GENMASK(7, 0) & ~BIT(4),
5819 .mode = 0644,
5820 },
5821 {
5822 .label = "dpu1_rst",
5823 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP3_OFFSET,
5824 .mask = GENMASK(7, 0) & ~BIT(0),
5825 .mode = 0200,
5826 },
5827 {
5828 .label = "dpu2_rst",
5829 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP3_OFFSET,
5830 .mask = GENMASK(7, 0) & ~BIT(1),
5831 .mode = 0200,
5832 },
5833 {
5834 .label = "dpu3_rst",
5835 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP3_OFFSET,
5836 .mask = GENMASK(7, 0) & ~BIT(2),
5837 .mode = 0200,
5838 },
5839 {
5840 .label = "dpu4_rst",
5841 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP3_OFFSET,
5842 .mask = GENMASK(7, 0) & ~BIT(3),
5843 .mode = 0200,
5844 },
5845 {
5846 .label = "dpu1_pwr",
5847 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5848 .mask = GENMASK(7, 0) & ~BIT(0),
5849 .mode = 0200,
5850 },
5851 {
5852 .label = "dpu2_pwr",
5853 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5854 .mask = GENMASK(7, 0) & ~BIT(1),
5855 .mode = 0200,
5856 },
5857 {
5858 .label = "dpu3_pwr",
5859 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5860 .mask = GENMASK(7, 0) & ~BIT(2),
5861 .mode = 0200,
5862 },
5863 {
5864 .label = "dpu4_pwr",
5865 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
5866 .mask = GENMASK(7, 0) & ~BIT(3),
5867 .mode = 0200,
5868 },
5869 {
5870 .label = "reset_long_pb",
5871 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5872 .mask = GENMASK(7, 0) & ~BIT(0),
5873 .mode = 0444,
5874 },
5875 {
5876 .label = "reset_short_pb",
5877 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5878 .mask = GENMASK(7, 0) & ~BIT(1),
5879 .mode = 0444,
5880 },
5881 {
5882 .label = "reset_aux_pwr_or_ref",
5883 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5884 .mask = GENMASK(7, 0) & ~BIT(2),
5885 .mode = 0444,
5886 },
5887 {
5888 .label = "reset_swb_dc_dc_pwr_fail",
5889 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5890 .mask = GENMASK(7, 0) & ~BIT(3),
5891 .mode = 0444,
5892 },
5893 {
5894 .label = "reset_swb_wd",
5895 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5896 .mask = GENMASK(7, 0) & ~BIT(6),
5897 .mode = 0444,
5898 },
5899 {
5900 .label = "reset_asic_thermal",
5901 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
5902 .mask = GENMASK(7, 0) & ~BIT(7),
5903 .mode = 0444,
5904 },
5905 {
5906 .label = "reset_sw_reset",
5907 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5908 .mask = GENMASK(7, 0) & ~BIT(0),
5909 .mode = 0444,
5910 },
5911 {
5912 .label = "reset_aux_pwr_or_reload",
5913 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5914 .mask = GENMASK(7, 0) & ~BIT(2),
5915 .mode = 0444,
5916 },
5917 {
5918 .label = "reset_comex_pwr_fail",
5919 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5920 .mask = GENMASK(7, 0) & ~BIT(3),
5921 .mode = 0444,
5922 },
5923 {
5924 .label = "reset_platform",
5925 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5926 .mask = GENMASK(7, 0) & ~BIT(4),
5927 .mode = 0444,
5928 },
5929 {
5930 .label = "reset_soc",
5931 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5932 .mask = GENMASK(7, 0) & ~BIT(5),
5933 .mode = 0444,
5934 },
5935 {
5936 .label = "reset_pwr",
5937 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
5938 .mask = GENMASK(7, 0) & ~BIT(7),
5939 .mode = 0444,
5940 },
5941 {
5942 .label = "reset_pwr_converter_fail",
5943 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5944 .mask = GENMASK(7, 0) & ~BIT(0),
5945 .mode = 0444,
5946 },
5947 {
5948 .label = "reset_system",
5949 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5950 .mask = GENMASK(7, 0) & ~BIT(1),
5951 .mode = 0444,
5952 },
5953 {
5954 .label = "reset_sw_pwr_off",
5955 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5956 .mask = GENMASK(7, 0) & ~BIT(2),
5957 .mode = 0444,
5958 },
5959 {
5960 .label = "reset_comex_thermal",
5961 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5962 .mask = GENMASK(7, 0) & ~BIT(3),
5963 .mode = 0444,
5964 },
5965 {
5966 .label = "reset_ac_pwr_fail",
5967 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
5968 .mask = GENMASK(7, 0) & ~BIT(6),
5969 .mode = 0444,
5970 },
5971 {
5972 .label = "voltreg_update_status",
5973 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
5974 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
5975 .bit = 5,
5976 .mode = 0444,
5977 },
5978 {
5979 .label = "port80",
5980 .reg = MLXPLAT_CPLD_LPC_REG_GP1_RO_OFFSET,
5981 .bit = GENMASK(7, 0),
5982 .mode = 0444,
5983 },
5984 {
5985 .label = "bios_status",
5986 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5987 .mask = MLXPLAT_CPLD_BIOS_STATUS_MASK,
5988 .bit = 2,
5989 .mode = 0444,
5990 },
5991 {
5992 .label = "bios_start_retry",
5993 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
5994 .mask = GENMASK(7, 0) & ~BIT(4),
5995 .mode = 0444,
5996 },
5997 {
5998 .label = "bios_active_image",
5999 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
6000 .mask = GENMASK(7, 0) & ~BIT(5),
6001 .mode = 0444,
6002 },
6003 {
6004 .label = "vpd_wp",
6005 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
6006 .mask = GENMASK(7, 0) & ~BIT(3),
6007 .mode = 0644,
6008 },
6009 {
6010 .label = "pcie_asic_reset_dis",
6011 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
6012 .mask = GENMASK(7, 0) & ~BIT(4),
6013 .mode = 0644,
6014 },
6015 {
6016 .label = "shutdown_unlock",
6017 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
6018 .mask = GENMASK(7, 0) & ~BIT(5),
6019 .mode = 0644,
6020 },
6021 {
6022 .label = "fan_dir",
6023 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
6024 .bit = GENMASK(7, 0),
6025 .mode = 0444,
6026 },
6027 {
6028 .label = "dpu1_rst_en",
6029 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
6030 .mask = GENMASK(7, 0) & ~BIT(0),
6031 .mode = 0200,
6032 },
6033 {
6034 .label = "dpu2_rst_en",
6035 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
6036 .mask = GENMASK(7, 0) & ~BIT(1),
6037 .mode = 0200,
6038 },
6039 {
6040 .label = "dpu3_rst_en",
6041 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
6042 .mask = GENMASK(7, 0) & ~BIT(2),
6043 .mode = 0200,
6044 },
6045 {
6046 .label = "dpu4_rst_en",
6047 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
6048 .mask = GENMASK(7, 0) & ~BIT(3),
6049 .mode = 0200,
6050 },
6051 {
6052 .label = "psu1_on",
6053 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
6054 .mask = GENMASK(7, 0) & ~BIT(0),
6055 .mode = 0200,
6056 },
6057 {
6058 .label = "psu2_on",
6059 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
6060 .mask = GENMASK(7, 0) & ~BIT(1),
6061 .mode = 0200,
6062 },
6063 {
6064 .label = "pwr_cycle",
6065 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
6066 .mask = GENMASK(7, 0) & ~BIT(2),
6067 .mode = 0200,
6068 },
6069 {
6070 .label = "pwr_down",
6071 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
6072 .mask = GENMASK(7, 0) & ~BIT(3),
6073 .mode = 0200,
6074 },
6075 {
6076 .label = "jtag_cap",
6077 .reg = MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET,
6078 .mask = MLXPLAT_CPLD_FU_CAP_MASK,
6079 .bit = 1,
6080 .mode = 0444,
6081 },
6082 {
6083 .label = "jtag_enable",
6084 .reg = MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE,
6085 .mask = GENMASK(1, 0),
6086 .bit = 1,
6087 .mode = 0644,
6088 },
6089 {
6090 .label = "non_active_bios_select",
6091 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
6092 .mask = GENMASK(7, 0) & ~BIT(4),
6093 .mode = 0644,
6094 },
6095 {
6096 .label = "bios_upgrade_fail",
6097 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
6098 .mask = GENMASK(7, 0) & ~BIT(5),
6099 .mode = 0444,
6100 },
6101 {
6102 .label = "bios_image_invert",
6103 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
6104 .mask = GENMASK(7, 0) & ~BIT(6),
6105 .mode = 0644,
6106 },
6107 {
6108 .label = "me_reboot",
6109 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
6110 .mask = GENMASK(7, 0) & ~BIT(7),
6111 .mode = 0644,
6112 },
6113 {
6114 .label = "dpu1_pwr_force",
6115 .reg = MLXPLAT_CPLD_LPC_REG_GP3_OFFSET,
6116 .mask = GENMASK(7, 0) & ~BIT(0),
6117 .mode = 0200,
6118 },
6119 {
6120 .label = "dpu2_pwr_force",
6121 .reg = MLXPLAT_CPLD_LPC_REG_GP3_OFFSET,
6122 .mask = GENMASK(7, 0) & ~BIT(1),
6123 .mode = 0200,
6124 },
6125 {
6126 .label = "dpu3_pwr_force",
6127 .reg = MLXPLAT_CPLD_LPC_REG_GP3_OFFSET,
6128 .mask = GENMASK(7, 0) & ~BIT(2),
6129 .mode = 0200,
6130 },
6131 {
6132 .label = "dpu4_pwr_force",
6133 .reg = MLXPLAT_CPLD_LPC_REG_GP3_OFFSET,
6134 .mask = GENMASK(7, 0) & ~BIT(3),
6135 .mode = 0200,
6136 },
6137 {
6138 .label = "ufm_done",
6139 .reg = MLXPLAT_CPLD_LPC_REG_GPI_MASK_OFFSET,
6140 .bit = GENMASK(7, 0),
6141 .mode = 0444,
6142 },
6143 {
6144 .label = "asic_health",
6145 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
6146 .mask = MLXPLAT_CPLD_ASIC_MASK,
6147 .bit = 1,
6148 .mode = 0444,
6149 },
6150 {
6151 .label = "psu1_ac_ok",
6152 .reg = MLXPLAT_CPLD_LPC_REG_PSU_AC_OFFSET,
6153 .mask = GENMASK(7, 0) & ~BIT(0),
6154 .mode = 0644,
6155 },
6156 {
6157 .label = "psu2_ac_ok",
6158 .reg = MLXPLAT_CPLD_LPC_REG_PSU_AC_OFFSET,
6159 .mask = GENMASK(7, 0) & ~BIT(1),
6160 .mode = 0644,
6161 },
6162 {
6163 .label = "psu1_no_alert",
6164 .reg = MLXPLAT_CPLD_LPC_REG_PSU_ALERT_OFFSET,
6165 .mask = GENMASK(7, 0) & ~BIT(0),
6166 .mode = 0644,
6167 },
6168 {
6169 .label = "psu2_no_alert",
6170 .reg = MLXPLAT_CPLD_LPC_REG_PSU_ALERT_OFFSET,
6171 .mask = GENMASK(7, 0) & ~BIT(1),
6172 .mode = 0644,
6173 },
6174 {
6175 .label = "asic_pg_fail",
6176 .reg = MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET,
6177 .mask = GENMASK(7, 0) & ~BIT(7),
6178 .mode = 0444,
6179 },
6180 {
6181 .label = "spi_chnl_select",
6182 .reg = MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT,
6183 .mask = GENMASK(7, 0),
6184 .bit = 1,
6185 .mode = 0644,
6186 },
6187 {
6188 .label = "config1",
6189 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
6190 .bit = GENMASK(7, 0),
6191 .mode = 0444,
6192 },
6193 {
6194 .label = "config2",
6195 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
6196 .bit = GENMASK(7, 0),
6197 .mode = 0444,
6198 },
6199 {
6200 .label = "config3",
6201 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
6202 .bit = GENMASK(7, 0),
6203 .mode = 0444,
6204 },
6205 {
6206 .label = "ufm_version",
6207 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
6208 .bit = GENMASK(7, 0),
6209 .mode = 0444,
6210 },
6211 };
6212
6213 static struct mlxreg_core_platform_data mlxplat_smart_switch_regs_io_data = {
6214 .data = mlxplat_mlxcpld_smart_switch_regs_io_data,
6215 .counter = ARRAY_SIZE(mlxplat_mlxcpld_smart_switch_regs_io_data),
6216 };
6217
6218 /* Platform FAN default */
6219 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
6220 {
6221 .label = "pwm1",
6222 .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
6223 },
6224 {
6225 .label = "pwm2",
6226 .reg = MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET,
6227 },
6228 {
6229 .label = "pwm3",
6230 .reg = MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET,
6231 },
6232 {
6233 .label = "pwm4",
6234 .reg = MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET,
6235 },
6236 {
6237 .label = "tacho1",
6238 .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
6239 .mask = GENMASK(7, 0),
6240 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6241 .bit = BIT(0),
6242 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6243
6244 },
6245 {
6246 .label = "tacho2",
6247 .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
6248 .mask = GENMASK(7, 0),
6249 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6250 .bit = BIT(1),
6251 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6252 },
6253 {
6254 .label = "tacho3",
6255 .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
6256 .mask = GENMASK(7, 0),
6257 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6258 .bit = BIT(2),
6259 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6260 },
6261 {
6262 .label = "tacho4",
6263 .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
6264 .mask = GENMASK(7, 0),
6265 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6266 .bit = BIT(3),
6267 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6268 },
6269 {
6270 .label = "tacho5",
6271 .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
6272 .mask = GENMASK(7, 0),
6273 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6274 .bit = BIT(4),
6275 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6276 },
6277 {
6278 .label = "tacho6",
6279 .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
6280 .mask = GENMASK(7, 0),
6281 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6282 .bit = BIT(5),
6283 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6284 },
6285 {
6286 .label = "tacho7",
6287 .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
6288 .mask = GENMASK(7, 0),
6289 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6290 .bit = BIT(6),
6291 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6292 },
6293 {
6294 .label = "tacho8",
6295 .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
6296 .mask = GENMASK(7, 0),
6297 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6298 .bit = BIT(7),
6299 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6300 },
6301 {
6302 .label = "tacho9",
6303 .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
6304 .mask = GENMASK(7, 0),
6305 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
6306 .bit = BIT(0),
6307 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6308 },
6309 {
6310 .label = "tacho10",
6311 .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
6312 .mask = GENMASK(7, 0),
6313 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
6314 .bit = BIT(1),
6315 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6316 },
6317 {
6318 .label = "tacho11",
6319 .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
6320 .mask = GENMASK(7, 0),
6321 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
6322 .bit = BIT(2),
6323 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6324 },
6325 {
6326 .label = "tacho12",
6327 .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
6328 .mask = GENMASK(7, 0),
6329 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
6330 .bit = BIT(3),
6331 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6332 },
6333 {
6334 .label = "tacho13",
6335 .reg = MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET,
6336 .mask = GENMASK(7, 0),
6337 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
6338 .bit = BIT(4),
6339 },
6340 {
6341 .label = "tacho14",
6342 .reg = MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET,
6343 .mask = GENMASK(7, 0),
6344 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
6345 .bit = BIT(5),
6346 },
6347 {
6348 .label = "conf",
6349 .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
6350 },
6351 };
6352
6353 static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
6354 .data = mlxplat_mlxcpld_default_fan_data,
6355 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
6356 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
6357 };
6358
6359 /* XDR and smart switch platform fan data */
6360 static struct mlxreg_core_data mlxplat_mlxcpld_xdr_fan_data[] = {
6361 {
6362 .label = "pwm1",
6363 .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
6364 },
6365 {
6366 .label = "tacho1",
6367 .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
6368 .mask = GENMASK(7, 0),
6369 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6370 .slot = 1,
6371 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6372 },
6373 {
6374 .label = "tacho2",
6375 .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
6376 .mask = GENMASK(7, 0),
6377 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6378 .slot = 2,
6379 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6380 },
6381 {
6382 .label = "tacho3",
6383 .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
6384 .mask = GENMASK(7, 0),
6385 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6386 .slot = 3,
6387 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6388 },
6389 {
6390 .label = "tacho4",
6391 .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
6392 .mask = GENMASK(7, 0),
6393 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6394 .slot = 4,
6395 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6396 },
6397 {
6398 .label = "tacho5",
6399 .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
6400 .mask = GENMASK(7, 0),
6401 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6402 .slot = 5,
6403 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6404 },
6405 {
6406 .label = "tacho6",
6407 .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
6408 .mask = GENMASK(7, 0),
6409 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6410 .slot = 6,
6411 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6412 },
6413 {
6414 .label = "tacho7",
6415 .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
6416 .mask = GENMASK(7, 0),
6417 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6418 .slot = 7,
6419 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6420 },
6421 {
6422 .label = "tacho8",
6423 .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
6424 .mask = GENMASK(7, 0),
6425 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6426 .slot = 8,
6427 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6428 },
6429 {
6430 .label = "tacho9",
6431 .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
6432 .mask = GENMASK(7, 0),
6433 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6434 .slot = 9,
6435 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6436 },
6437 {
6438 .label = "tacho10",
6439 .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
6440 .mask = GENMASK(7, 0),
6441 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6442 .slot = 10,
6443 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6444 },
6445 {
6446 .label = "tacho11",
6447 .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
6448 .mask = GENMASK(7, 0),
6449 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6450 .slot = 11,
6451 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6452 },
6453 {
6454 .label = "tacho12",
6455 .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
6456 .mask = GENMASK(7, 0),
6457 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6458 .slot = 12,
6459 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6460 },
6461 {
6462 .label = "tacho13",
6463 .reg = MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET,
6464 .mask = GENMASK(7, 0),
6465 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6466 .slot = 13,
6467 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6468 },
6469 {
6470 .label = "tacho14",
6471 .reg = MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET,
6472 .mask = GENMASK(7, 0),
6473 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6474 .slot = 14,
6475 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6476 },
6477 {
6478 .label = "tacho15",
6479 .reg = MLXPLAT_CPLD_LPC_REG_TACHO15_OFFSET,
6480 .mask = GENMASK(7, 0),
6481 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6482 .slot = 15,
6483 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6484 },
6485 {
6486 .label = "tacho16",
6487 .reg = MLXPLAT_CPLD_LPC_REG_TACHO16_OFFSET,
6488 .mask = GENMASK(7, 0),
6489 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6490 .slot = 16,
6491 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
6492 },
6493 {
6494 .label = "tacho17",
6495 .reg = MLXPLAT_CPLD_LPC_REG_TACHO17_OFFSET,
6496 .mask = GENMASK(7, 0),
6497 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6498 .slot = 17,
6499 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN2_OFFSET,
6500 },
6501 {
6502 .label = "tacho18",
6503 .reg = MLXPLAT_CPLD_LPC_REG_TACHO18_OFFSET,
6504 .mask = GENMASK(7, 0),
6505 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6506 .slot = 18,
6507 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN2_OFFSET,
6508 },
6509 {
6510 .label = "tacho19",
6511 .reg = MLXPLAT_CPLD_LPC_REG_TACHO19_OFFSET,
6512 .mask = GENMASK(7, 0),
6513 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6514 .slot = 19,
6515 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN2_OFFSET,
6516 },
6517 {
6518 .label = "tacho20",
6519 .reg = MLXPLAT_CPLD_LPC_REG_TACHO20_OFFSET,
6520 .mask = GENMASK(7, 0),
6521 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
6522 .slot = 20,
6523 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN2_OFFSET,
6524 },
6525 {
6526 .label = "conf",
6527 .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
6528 },
6529 };
6530
6531 static struct mlxreg_core_platform_data mlxplat_xdr_fan_data = {
6532 .data = mlxplat_mlxcpld_xdr_fan_data,
6533 .counter = ARRAY_SIZE(mlxplat_mlxcpld_xdr_fan_data),
6534 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
6535 .version = 1,
6536 };
6537
6538 /* Watchdog type1: hardware implementation version1
6539 * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
6540 */
6541 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
6542 {
6543 .label = "action",
6544 .reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
6545 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
6546 .bit = 0,
6547 },
6548 {
6549 .label = "timeout",
6550 .reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
6551 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
6552 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
6553 },
6554 {
6555 .label = "ping",
6556 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
6557 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
6558 .bit = 0,
6559 },
6560 {
6561 .label = "reset",
6562 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
6563 .mask = GENMASK(7, 0) & ~BIT(6),
6564 .bit = 6,
6565 },
6566 };
6567
6568 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
6569 {
6570 .label = "action",
6571 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
6572 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
6573 .bit = 4,
6574 },
6575 {
6576 .label = "timeout",
6577 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
6578 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
6579 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
6580 },
6581 {
6582 .label = "ping",
6583 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
6584 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
6585 .bit = 1,
6586 },
6587 };
6588
6589 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
6590 {
6591 .data = mlxplat_mlxcpld_wd_main_regs_type1,
6592 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
6593 .version = MLX_WDT_TYPE1,
6594 .identity = "mlx-wdt-main",
6595 },
6596 {
6597 .data = mlxplat_mlxcpld_wd_aux_regs_type1,
6598 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
6599 .version = MLX_WDT_TYPE1,
6600 .identity = "mlx-wdt-aux",
6601 },
6602 };
6603
6604 /* Watchdog type2: hardware implementation version 2
6605 * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
6606 */
6607 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
6608 {
6609 .label = "action",
6610 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
6611 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
6612 .bit = 0,
6613 },
6614 {
6615 .label = "timeout",
6616 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
6617 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
6618 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
6619 },
6620 {
6621 .label = "timeleft",
6622 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
6623 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
6624 },
6625 {
6626 .label = "ping",
6627 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
6628 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
6629 .bit = 0,
6630 },
6631 {
6632 .label = "reset",
6633 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
6634 .mask = GENMASK(7, 0) & ~BIT(6),
6635 .bit = 6,
6636 },
6637 };
6638
6639 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
6640 {
6641 .label = "action",
6642 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
6643 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
6644 .bit = 4,
6645 },
6646 {
6647 .label = "timeout",
6648 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
6649 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
6650 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
6651 },
6652 {
6653 .label = "timeleft",
6654 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
6655 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
6656 },
6657 {
6658 .label = "ping",
6659 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
6660 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
6661 .bit = 4,
6662 },
6663 };
6664
6665 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
6666 {
6667 .data = mlxplat_mlxcpld_wd_main_regs_type2,
6668 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
6669 .version = MLX_WDT_TYPE2,
6670 .identity = "mlx-wdt-main",
6671 },
6672 {
6673 .data = mlxplat_mlxcpld_wd_aux_regs_type2,
6674 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
6675 .version = MLX_WDT_TYPE2,
6676 .identity = "mlx-wdt-aux",
6677 },
6678 };
6679
6680 /* Watchdog type3: hardware implementation version 3
6681 * Can be on all systems. It's differentiated by WD capability bit.
6682 * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
6683 * still have only one main watchdog.
6684 */
6685 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
6686 {
6687 .label = "action",
6688 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
6689 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
6690 .bit = 0,
6691 },
6692 {
6693 .label = "timeout",
6694 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
6695 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
6696 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
6697 },
6698 {
6699 .label = "timeleft",
6700 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
6701 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
6702 },
6703 {
6704 .label = "ping",
6705 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
6706 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
6707 .bit = 0,
6708 },
6709 {
6710 .label = "reset",
6711 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
6712 .mask = GENMASK(7, 0) & ~BIT(6),
6713 .bit = 6,
6714 },
6715 };
6716
6717 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
6718 {
6719 .label = "action",
6720 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
6721 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
6722 .bit = 4,
6723 },
6724 {
6725 .label = "timeout",
6726 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
6727 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
6728 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
6729 },
6730 {
6731 .label = "timeleft",
6732 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
6733 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
6734 },
6735 {
6736 .label = "ping",
6737 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
6738 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
6739 .bit = 4,
6740 },
6741 };
6742
6743 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
6744 {
6745 .data = mlxplat_mlxcpld_wd_main_regs_type3,
6746 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
6747 .version = MLX_WDT_TYPE3,
6748 .identity = "mlx-wdt-main",
6749 },
6750 {
6751 .data = mlxplat_mlxcpld_wd_aux_regs_type3,
6752 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
6753 .version = MLX_WDT_TYPE3,
6754 .identity = "mlx-wdt-aux",
6755 },
6756 };
6757
mlxplat_mlxcpld_writeable_reg(struct device * dev,unsigned int reg)6758 static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
6759 {
6760 switch (reg) {
6761 case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
6762 case MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET:
6763 case MLXPLAT_CPLD_LPC_REG_RESET_GP3_OFFSET:
6764 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
6765 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
6766 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
6767 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
6768 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
6769 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
6770 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
6771 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
6772 case MLXPLAT_CPLD_LPC_REG_LED8_OFFSET:
6773 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
6774 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
6775 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
6776 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
6777 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
6778 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
6779 case MLXPLAT_CPLD_LPC_REG_GP3_OFFSET:
6780 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
6781 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
6782 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
6783 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
6784 case MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET:
6785 case MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET:
6786 case MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET:
6787 case MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET:
6788 case MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET:
6789 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
6790 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
6791 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
6792 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
6793 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
6794 case MLXPLAT_CPLD_LPC_REG_BRD_OFFSET:
6795 case MLXPLAT_CPLD_LPC_REG_BRD_EVENT_OFFSET:
6796 case MLXPLAT_CPLD_LPC_REG_BRD_MASK_OFFSET:
6797 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
6798 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
6799 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
6800 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
6801 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
6802 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
6803 case MLXPLAT_CPLD_LPC_REG_PSU_AC_OFFSET:
6804 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
6805 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
6806 case MLXPLAT_CPLD_LPC_REG_PSU_ALERT_OFFSET:
6807 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
6808 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
6809 case MLXPLAT_CPLD_LPC_REG_FAN2_EVENT_OFFSET:
6810 case MLXPLAT_CPLD_LPC_REG_FAN2_MASK_OFFSET:
6811 case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
6812 case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
6813 case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
6814 case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
6815 case MLXPLAT_CPLD_LPC_REG_PWRB_EVENT_OFFSET:
6816 case MLXPLAT_CPLD_LPC_REG_PWRB_MASK_OFFSET:
6817 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
6818 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
6819 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
6820 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
6821 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
6822 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
6823 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
6824 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
6825 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
6826 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
6827 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
6828 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
6829 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
6830 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
6831 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
6832 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
6833 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
6834 case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
6835 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
6836 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
6837 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
6838 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
6839 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
6840 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
6841 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
6842 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
6843 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
6844 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
6845 case MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET:
6846 case MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET:
6847 case MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET:
6848 case MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET:
6849 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
6850 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
6851 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
6852 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
6853 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
6854 return true;
6855 }
6856 return false;
6857 }
6858
mlxplat_mlxcpld_readable_reg(struct device * dev,unsigned int reg)6859 static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
6860 {
6861 switch (reg) {
6862 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
6863 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
6864 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
6865 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
6866 case MLXPLAT_CPLD_LPC_REG_CPLD5_VER_OFFSET:
6867 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
6868 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
6869 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
6870 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
6871 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
6872 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
6873 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
6874 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
6875 case MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET:
6876 case MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET:
6877 case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
6878 case MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET:
6879 case MLXPLAT_CPLD_LPC_REG_RESET_GP3_OFFSET:
6880 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
6881 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
6882 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
6883 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
6884 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
6885 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
6886 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
6887 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
6888 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
6889 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
6890 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
6891 case MLXPLAT_CPLD_LPC_REG_LED8_OFFSET:
6892 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
6893 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
6894 case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
6895 case MLXPLAT_CPLD_LPC_REG_GP1_RO_OFFSET:
6896 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
6897 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
6898 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
6899 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
6900 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
6901 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
6902 case MLXPLAT_CPLD_LPC_REG_GP3_OFFSET:
6903 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
6904 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
6905 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
6906 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
6907 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
6908 case MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET:
6909 case MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET:
6910 case MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET:
6911 case MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET:
6912 case MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET:
6913 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
6914 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
6915 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
6916 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
6917 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
6918 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
6919 case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
6920 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
6921 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
6922 case MLXPLAT_CPLD_LPC_REG_GPI_MASK_OFFSET:
6923 case MLXPLAT_CPLD_LPC_REG_BRD_OFFSET:
6924 case MLXPLAT_CPLD_LPC_REG_BRD_EVENT_OFFSET:
6925 case MLXPLAT_CPLD_LPC_REG_BRD_MASK_OFFSET:
6926 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
6927 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
6928 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
6929 case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
6930 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
6931 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
6932 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
6933 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
6934 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
6935 case MLXPLAT_CPLD_LPC_REG_PSU_AC_OFFSET:
6936 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
6937 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
6938 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
6939 case MLXPLAT_CPLD_LPC_REG_PSU_ALERT_OFFSET:
6940 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
6941 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
6942 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
6943 case MLXPLAT_CPLD_LPC_REG_FAN2_OFFSET:
6944 case MLXPLAT_CPLD_LPC_REG_FAN2_EVENT_OFFSET:
6945 case MLXPLAT_CPLD_LPC_REG_FAN2_MASK_OFFSET:
6946 case MLXPLAT_CPLD_LPC_REG_EROT_OFFSET:
6947 case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
6948 case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
6949 case MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET:
6950 case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
6951 case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
6952 case MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET:
6953 case MLXPLAT_CPLD_LPC_REG_PWRB_EVENT_OFFSET:
6954 case MLXPLAT_CPLD_LPC_REG_PWRB_MASK_OFFSET:
6955 case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
6956 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
6957 case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
6958 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
6959 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
6960 case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
6961 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
6962 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
6963 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
6964 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
6965 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
6966 case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
6967 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
6968 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
6969 case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
6970 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
6971 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
6972 case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
6973 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
6974 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
6975 case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
6976 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
6977 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
6978 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
6979 case MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET:
6980 case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
6981 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
6982 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
6983 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
6984 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
6985 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
6986 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
6987 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
6988 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
6989 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
6990 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
6991 case MLXPLAT_CPLD_LPC_REG_CPLD6_MVER_OFFSET:
6992 case MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET:
6993 case MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET:
6994 case MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET:
6995 case MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET:
6996 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
6997 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
6998 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
6999 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
7000 case MLXPLAT_CPLD_LPC_REG_CPLD5_MVER_OFFSET:
7001 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
7002 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
7003 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
7004 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
7005 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
7006 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
7007 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
7008 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
7009 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
7010 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
7011 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
7012 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
7013 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
7014 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
7015 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
7016 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
7017 case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
7018 case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
7019 case MLXPLAT_CPLD_LPC_REG_TACHO15_OFFSET:
7020 case MLXPLAT_CPLD_LPC_REG_TACHO16_OFFSET:
7021 case MLXPLAT_CPLD_LPC_REG_TACHO17_OFFSET:
7022 case MLXPLAT_CPLD_LPC_REG_TACHO18_OFFSET:
7023 case MLXPLAT_CPLD_LPC_REG_TACHO19_OFFSET:
7024 case MLXPLAT_CPLD_LPC_REG_TACHO20_OFFSET:
7025 case MLXPLAT_CPLD_LPC_REG_ASIC_CAP_OFFSET:
7026 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
7027 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
7028 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
7029 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
7030 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
7031 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
7032 case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
7033 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
7034 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
7035 case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
7036 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
7037 return true;
7038 }
7039 return false;
7040 }
7041
mlxplat_mlxcpld_volatile_reg(struct device * dev,unsigned int reg)7042 static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
7043 {
7044 switch (reg) {
7045 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
7046 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
7047 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
7048 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
7049 case MLXPLAT_CPLD_LPC_REG_CPLD5_VER_OFFSET:
7050 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
7051 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
7052 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
7053 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
7054 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
7055 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
7056 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
7057 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
7058 case MLXPLAT_CPLD_LPC_REG_CPLD5_PN_OFFSET:
7059 case MLXPLAT_CPLD_LPC_REG_CPLD5_PN1_OFFSET:
7060 case MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET:
7061 case MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET:
7062 case MLXPLAT_CPLD_LPC_REG_RESET_GP3_OFFSET:
7063 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
7064 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
7065 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
7066 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
7067 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
7068 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
7069 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
7070 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
7071 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
7072 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
7073 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
7074 case MLXPLAT_CPLD_LPC_REG_LED8_OFFSET:
7075 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
7076 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
7077 case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
7078 case MLXPLAT_CPLD_LPC_REG_GP1_RO_OFFSET:
7079 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
7080 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
7081 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
7082 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
7083 case MLXPLAT_CPLD_LPC_REG_GP3_OFFSET:
7084 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
7085 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
7086 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
7087 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
7088 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
7089 case MLXPLAT_CPLD_LPC_REG_FU_CAP_OFFSET:
7090 case MLXPLAT_CPLD_LPC_REG_DBG1_OFFSET:
7091 case MLXPLAT_CPLD_LPC_REG_DBG2_OFFSET:
7092 case MLXPLAT_CPLD_LPC_REG_DBG3_OFFSET:
7093 case MLXPLAT_CPLD_LPC_REG_DBG4_OFFSET:
7094 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
7095 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
7096 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
7097 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
7098 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
7099 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
7100 case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
7101 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
7102 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
7103 case MLXPLAT_CPLD_LPC_REG_GPI_MASK_OFFSET:
7104 case MLXPLAT_CPLD_LPC_REG_BRD_OFFSET:
7105 case MLXPLAT_CPLD_LPC_REG_BRD_EVENT_OFFSET:
7106 case MLXPLAT_CPLD_LPC_REG_BRD_MASK_OFFSET:
7107 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
7108 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
7109 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
7110 case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
7111 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
7112 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
7113 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
7114 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
7115 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
7116 case MLXPLAT_CPLD_LPC_REG_PSU_AC_OFFSET:
7117 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
7118 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
7119 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
7120 case MLXPLAT_CPLD_LPC_REG_PSU_ALERT_OFFSET:
7121 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
7122 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
7123 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
7124 case MLXPLAT_CPLD_LPC_REG_EROT_OFFSET:
7125 case MLXPLAT_CPLD_LPC_REG_EROT_EVENT_OFFSET:
7126 case MLXPLAT_CPLD_LPC_REG_EROT_MASK_OFFSET:
7127 case MLXPLAT_CPLD_LPC_REG_EROTE_OFFSET:
7128 case MLXPLAT_CPLD_LPC_REG_EROTE_EVENT_OFFSET:
7129 case MLXPLAT_CPLD_LPC_REG_EROTE_MASK_OFFSET:
7130 case MLXPLAT_CPLD_LPC_REG_PWRB_OFFSET:
7131 case MLXPLAT_CPLD_LPC_REG_PWRB_EVENT_OFFSET:
7132 case MLXPLAT_CPLD_LPC_REG_PWRB_MASK_OFFSET:
7133 case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
7134 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
7135 case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
7136 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
7137 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
7138 case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
7139 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
7140 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
7141 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
7142 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
7143 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
7144 case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
7145 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
7146 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
7147 case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
7148 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
7149 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
7150 case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
7151 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
7152 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
7153 case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
7154 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
7155 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
7156 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
7157 case MLXPLAT_CPLD_LPC_REG_GP4_RO_OFFSET:
7158 case MLXPLAT_CPLD_LPC_REG_SPI_CHNL_SELECT:
7159 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
7160 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
7161 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
7162 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
7163 case MLXPLAT_CPLD_LPC_REG_CPLD6_MVER_OFFSET:
7164 case MLXPLAT_CPLD_LPC_REG_I2C_CH1_OFFSET:
7165 case MLXPLAT_CPLD_LPC_REG_I2C_CH2_OFFSET:
7166 case MLXPLAT_CPLD_LPC_REG_I2C_CH3_OFFSET:
7167 case MLXPLAT_CPLD_LPC_REG_I2C_CH4_OFFSET:
7168 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
7169 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
7170 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
7171 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
7172 case MLXPLAT_CPLD_LPC_REG_CPLD5_MVER_OFFSET:
7173 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
7174 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
7175 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
7176 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
7177 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
7178 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
7179 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
7180 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
7181 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
7182 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
7183 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
7184 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
7185 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
7186 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
7187 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
7188 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
7189 case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
7190 case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
7191 case MLXPLAT_CPLD_LPC_REG_TACHO15_OFFSET:
7192 case MLXPLAT_CPLD_LPC_REG_TACHO16_OFFSET:
7193 case MLXPLAT_CPLD_LPC_REG_TACHO17_OFFSET:
7194 case MLXPLAT_CPLD_LPC_REG_TACHO18_OFFSET:
7195 case MLXPLAT_CPLD_LPC_REG_TACHO19_OFFSET:
7196 case MLXPLAT_CPLD_LPC_REG_TACHO20_OFFSET:
7197 case MLXPLAT_CPLD_LPC_REG_ASIC_CAP_OFFSET:
7198 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
7199 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
7200 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
7201 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
7202 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
7203 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
7204 case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
7205 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
7206 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
7207 case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
7208 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
7209 return true;
7210 }
7211 return false;
7212 }
7213
7214 static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
7215 { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
7216 { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
7217 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
7218 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
7219 };
7220
7221 static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
7222 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
7223 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
7224 };
7225
7226 static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
7227 { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
7228 MLXPLAT_CPLD_LOW_AGGRCX_MASK },
7229 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
7230 };
7231
7232 static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
7233 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
7234 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
7235 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
7236 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
7237 };
7238
7239 static const struct reg_default mlxplat_mlxcpld_regmap_rack_switch[] = {
7240 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, MLXPLAT_REGMAP_NVSWITCH_PWM_DEFAULT },
7241 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
7242 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
7243 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
7244 };
7245
7246 static const struct reg_default mlxplat_mlxcpld_regmap_eth_modular[] = {
7247 { MLXPLAT_CPLD_LPC_REG_GP2_OFFSET, 0x61 },
7248 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
7249 { MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET, 0x00 },
7250 { MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET, 0x00 },
7251 { MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET, 0x00 },
7252 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
7253 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
7254 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
7255 { MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET,
7256 MLXPLAT_CPLD_AGGR_MASK_LC_LOW },
7257 };
7258
7259 static const struct reg_default mlxplat_mlxcpld_regmap_smart_switch[] = {
7260 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
7261 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
7262 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
7263 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
7264 { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET, MLXPLAT_CPLD_LPC_SM_SW_MASK },
7265 };
7266
7267 struct mlxplat_mlxcpld_regmap_context {
7268 void __iomem *base;
7269 };
7270
7271 static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
7272
7273 static int
mlxplat_mlxcpld_reg_read(void * context,unsigned int reg,unsigned int * val)7274 mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
7275 {
7276 struct mlxplat_mlxcpld_regmap_context *ctx = context;
7277
7278 *val = ioread8(ctx->base + reg);
7279 return 0;
7280 }
7281
7282 static int
mlxplat_mlxcpld_reg_write(void * context,unsigned int reg,unsigned int val)7283 mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
7284 {
7285 struct mlxplat_mlxcpld_regmap_context *ctx = context;
7286
7287 iowrite8(val, ctx->base + reg);
7288 return 0;
7289 }
7290
7291 static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
7292 .reg_bits = 8,
7293 .val_bits = 8,
7294 .max_register = 255,
7295 .cache_type = REGCACHE_FLAT,
7296 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
7297 .readable_reg = mlxplat_mlxcpld_readable_reg,
7298 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
7299 .reg_defaults = mlxplat_mlxcpld_regmap_default,
7300 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
7301 .reg_read = mlxplat_mlxcpld_reg_read,
7302 .reg_write = mlxplat_mlxcpld_reg_write,
7303 };
7304
7305 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
7306 .reg_bits = 8,
7307 .val_bits = 8,
7308 .max_register = 255,
7309 .cache_type = REGCACHE_FLAT,
7310 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
7311 .readable_reg = mlxplat_mlxcpld_readable_reg,
7312 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
7313 .reg_defaults = mlxplat_mlxcpld_regmap_ng,
7314 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
7315 .reg_read = mlxplat_mlxcpld_reg_read,
7316 .reg_write = mlxplat_mlxcpld_reg_write,
7317 };
7318
7319 static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
7320 .reg_bits = 8,
7321 .val_bits = 8,
7322 .max_register = 255,
7323 .cache_type = REGCACHE_FLAT,
7324 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
7325 .readable_reg = mlxplat_mlxcpld_readable_reg,
7326 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
7327 .reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
7328 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
7329 .reg_read = mlxplat_mlxcpld_reg_read,
7330 .reg_write = mlxplat_mlxcpld_reg_write,
7331 };
7332
7333 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
7334 .reg_bits = 8,
7335 .val_bits = 8,
7336 .max_register = 255,
7337 .cache_type = REGCACHE_FLAT,
7338 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
7339 .readable_reg = mlxplat_mlxcpld_readable_reg,
7340 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
7341 .reg_defaults = mlxplat_mlxcpld_regmap_ng400,
7342 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
7343 .reg_read = mlxplat_mlxcpld_reg_read,
7344 .reg_write = mlxplat_mlxcpld_reg_write,
7345 };
7346
7347 static const struct regmap_config mlxplat_mlxcpld_regmap_config_rack_switch = {
7348 .reg_bits = 8,
7349 .val_bits = 8,
7350 .max_register = 255,
7351 .cache_type = REGCACHE_FLAT,
7352 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
7353 .readable_reg = mlxplat_mlxcpld_readable_reg,
7354 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
7355 .reg_defaults = mlxplat_mlxcpld_regmap_rack_switch,
7356 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_rack_switch),
7357 .reg_read = mlxplat_mlxcpld_reg_read,
7358 .reg_write = mlxplat_mlxcpld_reg_write,
7359 };
7360
7361 static const struct regmap_config mlxplat_mlxcpld_regmap_config_eth_modular = {
7362 .reg_bits = 8,
7363 .val_bits = 8,
7364 .max_register = 255,
7365 .cache_type = REGCACHE_FLAT,
7366 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
7367 .readable_reg = mlxplat_mlxcpld_readable_reg,
7368 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
7369 .reg_defaults = mlxplat_mlxcpld_regmap_eth_modular,
7370 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_eth_modular),
7371 .reg_read = mlxplat_mlxcpld_reg_read,
7372 .reg_write = mlxplat_mlxcpld_reg_write,
7373 };
7374
7375 static const struct regmap_config mlxplat_mlxcpld_regmap_config_smart_switch = {
7376 .reg_bits = 8,
7377 .val_bits = 8,
7378 .max_register = 255,
7379 .cache_type = REGCACHE_FLAT,
7380 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
7381 .readable_reg = mlxplat_mlxcpld_readable_reg,
7382 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
7383 .reg_defaults = mlxplat_mlxcpld_regmap_smart_switch,
7384 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_smart_switch),
7385 .reg_read = mlxplat_mlxcpld_reg_read,
7386 .reg_write = mlxplat_mlxcpld_reg_write,
7387 };
7388
7389 static struct resource mlxplat_mlxcpld_resources[] = {
7390 [0] = DEFINE_RES_IRQ_NAMED(MLXPLAT_CPLD_LPC_SYSIRQ, "mlxreg-hotplug"),
7391 };
7392
7393 static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
7394 static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
7395 static struct mlxreg_core_platform_data *mlxplat_led;
7396 static struct mlxreg_core_platform_data *mlxplat_regs_io;
7397 static struct mlxreg_core_platform_data *mlxplat_fan;
7398 static struct mlxreg_core_platform_data
7399 *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
7400 static struct mlxreg_core_data *mlxplat_dpu_data[MLXPLAT_CPLD_DPU_MAX_DEVS];
7401 static const struct regmap_config *mlxplat_regmap_config;
7402 static struct pci_dev *lpc_bridge;
7403 static struct pci_dev *i2c_bridge;
7404 static struct pci_dev *jtag_bridge;
7405
7406 /* Platform default reset function */
mlxplat_reboot_notifier(struct notifier_block * nb,unsigned long action,void * unused)7407 static int mlxplat_reboot_notifier(struct notifier_block *nb, unsigned long action, void *unused)
7408 {
7409 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
7410 u32 regval;
7411 int ret;
7412
7413 ret = regmap_read(priv->regmap, MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET, ®val);
7414
7415 if (action == SYS_RESTART && !ret && regval & MLXPLAT_CPLD_SYS_RESET_MASK)
7416 regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_RESET_GP1_OFFSET,
7417 MLXPLAT_CPLD_RESET_MASK);
7418
7419 return NOTIFY_DONE;
7420 }
7421
7422 static struct notifier_block mlxplat_reboot_default_nb = {
7423 .notifier_call = mlxplat_reboot_notifier,
7424 };
7425
7426 /* Platform default poweroff function */
mlxplat_poweroff(void)7427 static void mlxplat_poweroff(void)
7428 {
7429 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
7430
7431 if (mlxplat_reboot_nb)
7432 unregister_reboot_notifier(mlxplat_reboot_nb);
7433 regmap_write(priv->regmap, MLXPLAT_CPLD_LPC_REG_GP1_OFFSET, MLXPLAT_CPLD_HALT_MASK);
7434 kernel_halt();
7435 }
7436
mlxplat_register_platform_device(void)7437 static int __init mlxplat_register_platform_device(void)
7438 {
7439 mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, -1,
7440 mlxplat_lpc_resources,
7441 ARRAY_SIZE(mlxplat_lpc_resources));
7442 if (IS_ERR(mlxplat_dev))
7443 return PTR_ERR(mlxplat_dev);
7444 else
7445 return 1;
7446 }
7447
mlxplat_dmi_default_matched(const struct dmi_system_id * dmi)7448 static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
7449 {
7450 int i;
7451
7452 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7453 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7454 mlxplat_mux_data = mlxplat_default_mux_data;
7455 for (i = 0; i < mlxplat_mux_num; i++) {
7456 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
7457 mlxplat_mux_data[i].n_values =
7458 ARRAY_SIZE(mlxplat_default_channels[i]);
7459 }
7460 mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
7461 mlxplat_hotplug->deferred_nr =
7462 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7463 mlxplat_led = &mlxplat_default_led_data;
7464 mlxplat_regs_io = &mlxplat_default_regs_io_data;
7465 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
7466 mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
7467
7468 return mlxplat_register_platform_device();
7469 }
7470
mlxplat_dmi_default_wc_matched(const struct dmi_system_id * dmi)7471 static int __init mlxplat_dmi_default_wc_matched(const struct dmi_system_id *dmi)
7472 {
7473 int i;
7474
7475 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7476 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7477 mlxplat_mux_data = mlxplat_default_mux_data;
7478 for (i = 0; i < mlxplat_mux_num; i++) {
7479 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
7480 mlxplat_mux_data[i].n_values =
7481 ARRAY_SIZE(mlxplat_default_channels[i]);
7482 }
7483 mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
7484 mlxplat_hotplug->deferred_nr =
7485 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7486 mlxplat_led = &mlxplat_default_led_wc_data;
7487 mlxplat_regs_io = &mlxplat_default_regs_io_data;
7488 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
7489 mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
7490
7491 return mlxplat_register_platform_device();
7492 }
7493
mlxplat_dmi_default_eth_wc_blade_matched(const struct dmi_system_id * dmi)7494 static int __init mlxplat_dmi_default_eth_wc_blade_matched(const struct dmi_system_id *dmi)
7495 {
7496 int i;
7497
7498 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7499 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7500 mlxplat_mux_data = mlxplat_default_mux_data;
7501 for (i = 0; i < mlxplat_mux_num; i++) {
7502 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7503 mlxplat_mux_data[i].n_values =
7504 ARRAY_SIZE(mlxplat_msn21xx_channels);
7505 }
7506 mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
7507 mlxplat_hotplug->deferred_nr =
7508 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7509 mlxplat_led = &mlxplat_default_led_eth_wc_blade_data;
7510 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
7511 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7512 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7513 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7514 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
7515
7516 return mlxplat_register_platform_device();
7517 }
7518
mlxplat_dmi_msn21xx_matched(const struct dmi_system_id * dmi)7519 static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
7520 {
7521 int i;
7522
7523 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7524 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7525 mlxplat_mux_data = mlxplat_default_mux_data;
7526 for (i = 0; i < mlxplat_mux_num; i++) {
7527 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7528 mlxplat_mux_data[i].n_values =
7529 ARRAY_SIZE(mlxplat_msn21xx_channels);
7530 }
7531 mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
7532 mlxplat_hotplug->deferred_nr =
7533 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7534 mlxplat_led = &mlxplat_msn21xx_led_data;
7535 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
7536 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
7537 mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
7538
7539 return mlxplat_register_platform_device();
7540 }
7541
mlxplat_dmi_msn274x_matched(const struct dmi_system_id * dmi)7542 static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
7543 {
7544 int i;
7545
7546 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7547 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7548 mlxplat_mux_data = mlxplat_default_mux_data;
7549 for (i = 0; i < mlxplat_mux_num; i++) {
7550 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7551 mlxplat_mux_data[i].n_values =
7552 ARRAY_SIZE(mlxplat_msn21xx_channels);
7553 }
7554 mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
7555 mlxplat_hotplug->deferred_nr =
7556 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7557 mlxplat_led = &mlxplat_default_led_data;
7558 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
7559 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
7560 mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
7561
7562 return mlxplat_register_platform_device();
7563 }
7564
mlxplat_dmi_msn201x_matched(const struct dmi_system_id * dmi)7565 static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
7566 {
7567 int i;
7568
7569 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7570 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7571 mlxplat_mux_data = mlxplat_default_mux_data;
7572 for (i = 0; i < mlxplat_mux_num; i++) {
7573 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7574 mlxplat_mux_data[i].n_values =
7575 ARRAY_SIZE(mlxplat_msn21xx_channels);
7576 }
7577 mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
7578 mlxplat_hotplug->deferred_nr =
7579 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7580 mlxplat_led = &mlxplat_msn21xx_led_data;
7581 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
7582 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
7583 mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
7584
7585 return mlxplat_register_platform_device();
7586 }
7587
mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id * dmi)7588 static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
7589 {
7590 int i;
7591
7592 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7593 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7594 mlxplat_mux_data = mlxplat_default_mux_data;
7595 for (i = 0; i < mlxplat_mux_num; i++) {
7596 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7597 mlxplat_mux_data[i].n_values =
7598 ARRAY_SIZE(mlxplat_msn21xx_channels);
7599 }
7600 mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
7601 mlxplat_hotplug->deferred_nr =
7602 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7603 mlxplat_led = &mlxplat_default_ng_led_data;
7604 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
7605 mlxplat_fan = &mlxplat_default_fan_data;
7606 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7607 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7608 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7609 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
7610
7611 return mlxplat_register_platform_device();
7612 }
7613
mlxplat_dmi_comex_matched(const struct dmi_system_id * dmi)7614 static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
7615 {
7616 int i;
7617
7618 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
7619 mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
7620 mlxplat_mux_data = mlxplat_extended_mux_data;
7621 for (i = 0; i < mlxplat_mux_num; i++) {
7622 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7623 mlxplat_mux_data[i].n_values =
7624 ARRAY_SIZE(mlxplat_msn21xx_channels);
7625 }
7626 mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
7627 mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
7628 mlxplat_led = &mlxplat_comex_100G_led_data;
7629 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
7630 mlxplat_fan = &mlxplat_default_fan_data;
7631 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7632 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7633 mlxplat_i2c = &mlxplat_mlxcpld_i2c_default_data;
7634 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
7635
7636 return mlxplat_register_platform_device();
7637 }
7638
mlxplat_dmi_ng400_matched(const struct dmi_system_id * dmi)7639 static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
7640 {
7641 int i;
7642
7643 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7644 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7645 mlxplat_mux_data = mlxplat_default_mux_data;
7646 for (i = 0; i < mlxplat_mux_num; i++) {
7647 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7648 mlxplat_mux_data[i].n_values =
7649 ARRAY_SIZE(mlxplat_msn21xx_channels);
7650 }
7651 mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
7652 mlxplat_hotplug->deferred_nr =
7653 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7654 mlxplat_led = &mlxplat_default_ng_led_data;
7655 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
7656 mlxplat_fan = &mlxplat_default_fan_data;
7657 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7658 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7659 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7660 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
7661
7662 return mlxplat_register_platform_device();
7663 }
7664
mlxplat_dmi_ng400_dgx_matched(const struct dmi_system_id * dmi)7665 static int __init mlxplat_dmi_ng400_dgx_matched(const struct dmi_system_id *dmi)
7666 {
7667 int i;
7668
7669 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7670 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7671 mlxplat_mux_data = mlxplat_default_mux_data;
7672 for (i = 0; i < mlxplat_mux_num; i++) {
7673 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7674 mlxplat_mux_data[i].n_values =
7675 ARRAY_SIZE(mlxplat_msn21xx_channels);
7676 }
7677 mlxplat_hotplug = &mlxplat_mlxcpld_dgx_ext_data;
7678 mlxplat_hotplug->deferred_nr =
7679 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7680 mlxplat_led = &mlxplat_default_ng_led_data;
7681 mlxplat_regs_io = &mlxplat_dgx_ng_regs_io_data;
7682 mlxplat_fan = &mlxplat_default_fan_data;
7683 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7684 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7685 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7686 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
7687
7688 return mlxplat_register_platform_device();
7689 }
7690
mlxplat_dmi_modular_matched(const struct dmi_system_id * dmi)7691 static int __init mlxplat_dmi_modular_matched(const struct dmi_system_id *dmi)
7692 {
7693 int i;
7694
7695 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7696 mlxplat_mux_num = ARRAY_SIZE(mlxplat_modular_mux_data);
7697 mlxplat_mux_data = mlxplat_modular_mux_data;
7698 mlxplat_hotplug = &mlxplat_mlxcpld_modular_data;
7699 mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR;
7700 mlxplat_led = &mlxplat_modular_led_data;
7701 mlxplat_regs_io = &mlxplat_modular_regs_io_data;
7702 mlxplat_fan = &mlxplat_default_fan_data;
7703 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7704 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7705 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7706 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_eth_modular;
7707
7708 return mlxplat_register_platform_device();
7709 }
7710
mlxplat_dmi_chassis_blade_matched(const struct dmi_system_id * dmi)7711 static int __init mlxplat_dmi_chassis_blade_matched(const struct dmi_system_id *dmi)
7712 {
7713 int i;
7714
7715 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7716 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
7717 mlxplat_mux_data = mlxplat_default_mux_data;
7718 mlxplat_hotplug = &mlxplat_mlxcpld_chassis_blade_data;
7719 mlxplat_hotplug->deferred_nr =
7720 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7721 for (i = 0; i < mlxplat_mux_num; i++) {
7722 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
7723 mlxplat_mux_data[i].n_values =
7724 ARRAY_SIZE(mlxplat_msn21xx_channels);
7725 }
7726 mlxplat_regs_io = &mlxplat_chassis_blade_regs_io_data;
7727 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7728 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
7729
7730 return mlxplat_register_platform_device();
7731 }
7732
mlxplat_dmi_rack_switch_matched(const struct dmi_system_id * dmi)7733 static int __init mlxplat_dmi_rack_switch_matched(const struct dmi_system_id *dmi)
7734 {
7735 int i;
7736
7737 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7738 mlxplat_mux_num = ARRAY_SIZE(mlxplat_rack_switch_mux_data);
7739 mlxplat_mux_data = mlxplat_rack_switch_mux_data;
7740 mlxplat_hotplug = &mlxplat_mlxcpld_rack_switch_data;
7741 mlxplat_hotplug->deferred_nr =
7742 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7743 mlxplat_led = &mlxplat_default_ng_led_data;
7744 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
7745 mlxplat_fan = &mlxplat_default_fan_data;
7746 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7747 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7748 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7749 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_rack_switch;
7750
7751 return mlxplat_register_platform_device();
7752 }
7753
mlxplat_dmi_ng800_matched(const struct dmi_system_id * dmi)7754 static int __init mlxplat_dmi_ng800_matched(const struct dmi_system_id *dmi)
7755 {
7756 int i;
7757
7758 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7759 mlxplat_mux_num = ARRAY_SIZE(mlxplat_ng800_mux_data);
7760 mlxplat_mux_data = mlxplat_ng800_mux_data;
7761 mlxplat_hotplug = &mlxplat_mlxcpld_ng800_data;
7762 mlxplat_hotplug->deferred_nr =
7763 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7764 mlxplat_led = &mlxplat_default_ng_led_data;
7765 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
7766 mlxplat_fan = &mlxplat_default_fan_data;
7767 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7768 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7769 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7770 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
7771
7772 return mlxplat_register_platform_device();
7773 }
7774
mlxplat_dmi_ng800_dgx_matched(const struct dmi_system_id * dmi)7775 static int __init mlxplat_dmi_ng800_dgx_matched(const struct dmi_system_id *dmi)
7776 {
7777 int i;
7778
7779 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7780 mlxplat_mux_num = ARRAY_SIZE(mlxplat_ng800_mux_data);
7781 mlxplat_mux_data = mlxplat_ng800_mux_data;
7782 mlxplat_hotplug = &mlxplat_mlxcpld_dgx_ext_data;
7783 mlxplat_hotplug->deferred_nr =
7784 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7785 mlxplat_led = &mlxplat_default_ng_led_data;
7786 mlxplat_regs_io = &mlxplat_dgx_ng_regs_io_data;
7787 mlxplat_fan = &mlxplat_default_fan_data;
7788 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7789 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7790 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7791 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
7792
7793 return mlxplat_register_platform_device();
7794 }
7795
mlxplat_dmi_l1_switch_matched(const struct dmi_system_id * dmi)7796 static int __init mlxplat_dmi_l1_switch_matched(const struct dmi_system_id *dmi)
7797 {
7798 int i;
7799
7800 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7801 mlxplat_mux_num = ARRAY_SIZE(mlxplat_rack_switch_mux_data);
7802 mlxplat_mux_data = mlxplat_rack_switch_mux_data;
7803 mlxplat_hotplug = &mlxplat_mlxcpld_l1_switch_data;
7804 mlxplat_hotplug->deferred_nr =
7805 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7806 mlxplat_led = &mlxplat_l1_switch_led_data;
7807 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
7808 mlxplat_fan = &mlxplat_default_fan_data;
7809 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7810 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7811 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7812 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_rack_switch;
7813 pm_power_off = mlxplat_poweroff;
7814 mlxplat_reboot_nb = &mlxplat_reboot_default_nb;
7815
7816 return mlxplat_register_platform_device();
7817 }
7818
mlxplat_dmi_smart_switch_matched(const struct dmi_system_id * dmi)7819 static int __init mlxplat_dmi_smart_switch_matched(const struct dmi_system_id *dmi)
7820 {
7821 int i;
7822
7823 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7824 mlxplat_mux_num = ARRAY_SIZE(mlxplat_ng800_mux_data);
7825 mlxplat_mux_data = mlxplat_ng800_mux_data;
7826 mlxplat_hotplug = &mlxplat_mlxcpld_smart_switch_data;
7827 mlxplat_hotplug->deferred_nr =
7828 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7829 mlxplat_led = &mlxplat_xdr_led_data;
7830 mlxplat_regs_io = &mlxplat_smart_switch_regs_io_data;
7831 mlxplat_fan = &mlxplat_xdr_fan_data;
7832
7833 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
7834 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
7835 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_smart_switch_dpu_data); i++)
7836 mlxplat_dpu_data[i] = &mlxplat_mlxcpld_smart_switch_dpu_data[i];
7837
7838 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7839 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_smart_switch;
7840
7841 return mlxplat_register_platform_device();
7842 }
7843
mlxplat_dmi_ng400_hi171_matched(const struct dmi_system_id * dmi)7844 static int __init mlxplat_dmi_ng400_hi171_matched(const struct dmi_system_id *dmi)
7845 {
7846 unsigned int i;
7847
7848 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
7849 mlxplat_mux_num = ARRAY_SIZE(mlxplat_ng800_mux_data);
7850 mlxplat_mux_data = mlxplat_ng800_mux_data;
7851 mlxplat_hotplug = &mlxplat_mlxcpld_ng800_hi171_data;
7852 mlxplat_hotplug->deferred_nr =
7853 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
7854 mlxplat_led = &mlxplat_xdr_led_data;
7855 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
7856 mlxplat_fan = &mlxplat_xdr_fan_data;
7857
7858 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++)
7859 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type3[i];
7860
7861 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
7862 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
7863
7864 return mlxplat_register_platform_device();
7865 }
7866
7867 static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
7868 {
7869 .callback = mlxplat_dmi_default_wc_matched,
7870 .matches = {
7871 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
7872 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI138"),
7873 },
7874 },
7875 {
7876 .callback = mlxplat_dmi_default_matched,
7877 .matches = {
7878 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
7879 },
7880 },
7881 {
7882 .callback = mlxplat_dmi_msn21xx_matched,
7883 .matches = {
7884 DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
7885 },
7886 },
7887 {
7888 .callback = mlxplat_dmi_msn274x_matched,
7889 .matches = {
7890 DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
7891 },
7892 },
7893 {
7894 .callback = mlxplat_dmi_msn201x_matched,
7895 .matches = {
7896 DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
7897 },
7898 },
7899 {
7900 .callback = mlxplat_dmi_default_eth_wc_blade_matched,
7901 .matches = {
7902 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
7903 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI139"),
7904 },
7905 },
7906 {
7907 .callback = mlxplat_dmi_qmb7xx_matched,
7908 .matches = {
7909 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
7910 },
7911 },
7912 {
7913 .callback = mlxplat_dmi_qmb7xx_matched,
7914 .matches = {
7915 DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
7916 },
7917 },
7918 {
7919 .callback = mlxplat_dmi_comex_matched,
7920 .matches = {
7921 DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
7922 },
7923 },
7924 {
7925 .callback = mlxplat_dmi_rack_switch_matched,
7926 .matches = {
7927 DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
7928 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI142"),
7929 },
7930 },
7931 {
7932 .callback = mlxplat_dmi_ng400_dgx_matched,
7933 .matches = {
7934 DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
7935 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI173"),
7936 },
7937 },
7938 {
7939 .callback = mlxplat_dmi_ng400_matched,
7940 .matches = {
7941 DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
7942 },
7943 },
7944 {
7945 .callback = mlxplat_dmi_modular_matched,
7946 .matches = {
7947 DMI_MATCH(DMI_BOARD_NAME, "VMOD0011"),
7948 },
7949 },
7950 {
7951 .callback = mlxplat_dmi_ng800_dgx_matched,
7952 .matches = {
7953 DMI_MATCH(DMI_BOARD_NAME, "VMOD0013"),
7954 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI174"),
7955 },
7956 },
7957 {
7958 .callback = mlxplat_dmi_ng800_matched,
7959 .matches = {
7960 DMI_MATCH(DMI_BOARD_NAME, "VMOD0013"),
7961 },
7962 },
7963 {
7964 .callback = mlxplat_dmi_chassis_blade_matched,
7965 .matches = {
7966 DMI_MATCH(DMI_BOARD_NAME, "VMOD0015"),
7967 },
7968 },
7969 {
7970 .callback = mlxplat_dmi_l1_switch_matched,
7971 .matches = {
7972 DMI_MATCH(DMI_BOARD_NAME, "VMOD0017"),
7973 },
7974 },
7975 {
7976 .callback = mlxplat_dmi_smart_switch_matched,
7977 .matches = {
7978 DMI_MATCH(DMI_BOARD_NAME, "VMOD0019"),
7979 },
7980 },
7981 {
7982 .callback = mlxplat_dmi_ng400_hi171_matched,
7983 .matches = {
7984 DMI_MATCH(DMI_BOARD_NAME, "VMOD0022"),
7985 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI171"),
7986 },
7987 },
7988 {
7989 .callback = mlxplat_dmi_ng400_hi171_matched,
7990 .matches = {
7991 DMI_MATCH(DMI_BOARD_NAME, "VMOD0022"),
7992 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI172"),
7993 },
7994 },
7995 {
7996 .callback = mlxplat_dmi_msn274x_matched,
7997 .matches = {
7998 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
7999 DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
8000 },
8001 },
8002 {
8003 .callback = mlxplat_dmi_default_matched,
8004 .matches = {
8005 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8006 DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
8007 },
8008 },
8009 {
8010 .callback = mlxplat_dmi_default_matched,
8011 .matches = {
8012 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8013 DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
8014 },
8015 },
8016 {
8017 .callback = mlxplat_dmi_default_matched,
8018 .matches = {
8019 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8020 DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
8021 },
8022 },
8023 {
8024 .callback = mlxplat_dmi_default_matched,
8025 .matches = {
8026 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8027 DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
8028 },
8029 },
8030 {
8031 .callback = mlxplat_dmi_msn21xx_matched,
8032 .matches = {
8033 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8034 DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
8035 },
8036 },
8037 {
8038 .callback = mlxplat_dmi_msn201x_matched,
8039 .matches = {
8040 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8041 DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
8042 },
8043 },
8044 {
8045 .callback = mlxplat_dmi_qmb7xx_matched,
8046 .matches = {
8047 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8048 DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
8049 },
8050 },
8051 {
8052 .callback = mlxplat_dmi_qmb7xx_matched,
8053 .matches = {
8054 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8055 DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
8056 },
8057 },
8058 {
8059 .callback = mlxplat_dmi_qmb7xx_matched,
8060 .matches = {
8061 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8062 DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
8063 },
8064 },
8065 {
8066 .callback = mlxplat_dmi_qmb7xx_matched,
8067 .matches = {
8068 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
8069 DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
8070 },
8071 },
8072 { }
8073 };
8074
8075 MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
8076
mlxplat_mlxcpld_verify_bus_topology(int * nr)8077 static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
8078 {
8079 struct i2c_adapter *search_adap;
8080 int i, shift = 0;
8081
8082 /* Scan adapters from expected id to verify it is free. */
8083 *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
8084 for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
8085 mlxplat_max_adap_num; i++) {
8086 search_adap = i2c_get_adapter(i);
8087 if (search_adap) {
8088 i2c_put_adapter(search_adap);
8089 continue;
8090 }
8091
8092 /* Return if expected parent adapter is free. */
8093 if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
8094 return 0;
8095 break;
8096 }
8097
8098 /* Return with error if free id for adapter is not found. */
8099 if (i == mlxplat_max_adap_num)
8100 return -ENODEV;
8101
8102 /* Shift adapter ids, since expected parent adapter is not free. */
8103 *nr = i;
8104 for (i = 0; i < mlxplat_mux_num; i++) {
8105 shift = *nr - mlxplat_mux_data[i].parent;
8106 mlxplat_mux_data[i].parent = *nr;
8107 mlxplat_mux_data[i].base_nr += shift;
8108 }
8109
8110 if (shift > 0)
8111 mlxplat_hotplug->shift_nr = shift;
8112
8113 return 0;
8114 }
8115
mlxplat_mlxcpld_check_wd_capability(void * regmap)8116 static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
8117 {
8118 u32 regval;
8119 int i, rc;
8120
8121 rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
8122 ®val);
8123 if (rc)
8124 return rc;
8125
8126 if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
8127 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
8128 if (mlxplat_wd_data[i])
8129 mlxplat_wd_data[i] =
8130 &mlxplat_mlxcpld_wd_set_type3[i];
8131 }
8132 }
8133
8134 return 0;
8135 }
8136
mlxplat_lpc_cpld_device_init(struct resource ** hotplug_resources,unsigned int * hotplug_resources_size)8137 static int mlxplat_lpc_cpld_device_init(struct resource **hotplug_resources,
8138 unsigned int *hotplug_resources_size)
8139 {
8140 int err;
8141
8142 mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
8143 mlxplat_lpc_resources[1].start, 1);
8144 if (!mlxplat_mlxcpld_regmap_ctx.base) {
8145 err = -ENOMEM;
8146 goto fail_devm_ioport_map;
8147 }
8148
8149 *hotplug_resources = mlxplat_mlxcpld_resources;
8150 *hotplug_resources_size = ARRAY_SIZE(mlxplat_mlxcpld_resources);
8151
8152 return 0;
8153
8154 fail_devm_ioport_map:
8155 return err;
8156 }
8157
mlxplat_lpc_cpld_device_exit(void)8158 static void mlxplat_lpc_cpld_device_exit(void)
8159 {
8160 }
8161
8162 static int
mlxplat_pci_fpga_device_init(unsigned int device,const char * res_name,struct pci_dev ** pci_bridge,void __iomem ** pci_bridge_addr)8163 mlxplat_pci_fpga_device_init(unsigned int device, const char *res_name, struct pci_dev **pci_bridge,
8164 void __iomem **pci_bridge_addr)
8165 {
8166 void __iomem *pci_mem_addr;
8167 struct pci_dev *pci_dev;
8168 int err;
8169
8170 pci_dev = pci_get_device(PCI_VENDOR_ID_LATTICE, device, NULL);
8171 if (!pci_dev)
8172 return -ENODEV;
8173
8174 err = pci_enable_device(pci_dev);
8175 if (err) {
8176 dev_err(&pci_dev->dev, "pci_enable_device failed with error %d\n", err);
8177 goto fail_pci_enable_device;
8178 }
8179
8180 err = pci_request_region(pci_dev, 0, res_name);
8181 if (err) {
8182 dev_err(&pci_dev->dev, "pci_request_regions failed with error %d\n", err);
8183 goto fail_pci_request_regions;
8184 }
8185
8186 err = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64));
8187 if (err) {
8188 err = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32));
8189 if (err) {
8190 dev_err(&pci_dev->dev, "dma_set_mask failed with error %d\n", err);
8191 goto fail_pci_set_dma_mask;
8192 }
8193 }
8194
8195 pci_set_master(pci_dev);
8196
8197 pci_mem_addr = devm_ioremap(&pci_dev->dev, pci_resource_start(pci_dev, 0),
8198 pci_resource_len(pci_dev, 0));
8199 if (!pci_mem_addr) {
8200 dev_err(&mlxplat_dev->dev, "ioremap failed\n");
8201 err = -EIO;
8202 goto fail_ioremap;
8203 }
8204
8205 *pci_bridge = pci_dev;
8206 *pci_bridge_addr = pci_mem_addr;
8207
8208 return 0;
8209
8210 fail_ioremap:
8211 fail_pci_set_dma_mask:
8212 pci_release_regions(pci_dev);
8213 fail_pci_request_regions:
8214 pci_disable_device(pci_dev);
8215 fail_pci_enable_device:
8216 pci_dev_put(pci_dev);
8217 return err;
8218 }
8219
8220 static void
mlxplat_pci_fpga_device_exit(struct pci_dev * pci_bridge,void __iomem * pci_bridge_addr)8221 mlxplat_pci_fpga_device_exit(struct pci_dev *pci_bridge,
8222 void __iomem *pci_bridge_addr)
8223 {
8224 iounmap(pci_bridge_addr);
8225 pci_release_regions(pci_bridge);
8226 pci_disable_device(pci_bridge);
8227 pci_dev_put(pci_bridge);
8228 }
8229
8230 static int
mlxplat_pci_fpga_devices_init(struct resource ** hotplug_resources,unsigned int * hotplug_resources_size)8231 mlxplat_pci_fpga_devices_init(struct resource **hotplug_resources,
8232 unsigned int *hotplug_resources_size)
8233 {
8234 int err;
8235
8236 err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_LPC_BRIDGE,
8237 "mlxplat_lpc_bridge", &lpc_bridge,
8238 &mlxplat_mlxcpld_regmap_ctx.base);
8239 if (err)
8240 goto mlxplat_pci_fpga_device_init_lpc_fail;
8241
8242 err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_I2C_BRIDGE,
8243 "mlxplat_i2c_bridge", &i2c_bridge,
8244 &i2c_bridge_addr);
8245 if (err)
8246 goto mlxplat_pci_fpga_device_init_i2c_fail;
8247
8248 err = mlxplat_pci_fpga_device_init(PCI_DEVICE_ID_LATTICE_JTAG_BRIDGE,
8249 "mlxplat_jtag_bridge", &jtag_bridge,
8250 &jtag_bridge_addr);
8251 if (err)
8252 goto mlxplat_pci_fpga_device_init_jtag_fail;
8253
8254 return 0;
8255
8256 mlxplat_pci_fpga_device_init_jtag_fail:
8257 mlxplat_pci_fpga_device_exit(i2c_bridge, i2c_bridge_addr);
8258 mlxplat_pci_fpga_device_init_i2c_fail:
8259 mlxplat_pci_fpga_device_exit(lpc_bridge, mlxplat_mlxcpld_regmap_ctx.base);
8260 mlxplat_pci_fpga_device_init_lpc_fail:
8261 return err;
8262 }
8263
mlxplat_pci_fpga_devices_exit(void)8264 static void mlxplat_pci_fpga_devices_exit(void)
8265 {
8266 mlxplat_pci_fpga_device_exit(jtag_bridge, jtag_bridge_addr);
8267 mlxplat_pci_fpga_device_exit(i2c_bridge, i2c_bridge_addr);
8268 mlxplat_pci_fpga_device_exit(lpc_bridge, mlxplat_mlxcpld_regmap_ctx.base);
8269 }
8270
8271 static int
mlxplat_logicdev_init(struct resource ** hotplug_resources,unsigned int * hotplug_resources_size)8272 mlxplat_logicdev_init(struct resource **hotplug_resources, unsigned int *hotplug_resources_size)
8273 {
8274 int err;
8275
8276 err = mlxplat_pci_fpga_devices_init(hotplug_resources, hotplug_resources_size);
8277 if (err == -ENODEV)
8278 return mlxplat_lpc_cpld_device_init(hotplug_resources, hotplug_resources_size);
8279
8280 return err;
8281 }
8282
mlxplat_logicdev_exit(void)8283 static void mlxplat_logicdev_exit(void)
8284 {
8285 if (lpc_bridge)
8286 mlxplat_pci_fpga_devices_exit();
8287 else
8288 mlxplat_lpc_cpld_device_exit();
8289 }
8290
mlxplat_platdevs_init(struct mlxplat_priv * priv)8291 static int mlxplat_platdevs_init(struct mlxplat_priv *priv)
8292 {
8293 int i = 0, err;
8294
8295 /* Add hotplug driver */
8296 if (mlxplat_hotplug) {
8297 mlxplat_hotplug->regmap = priv->regmap;
8298 if (priv->irq_fpga)
8299 mlxplat_hotplug->irq = priv->irq_fpga;
8300 priv->pdev_hotplug =
8301 platform_device_register_resndata(&mlxplat_dev->dev,
8302 "mlxreg-hotplug", PLATFORM_DEVID_NONE,
8303 priv->hotplug_resources,
8304 priv->hotplug_resources_size,
8305 mlxplat_hotplug, sizeof(*mlxplat_hotplug));
8306 if (IS_ERR(priv->pdev_hotplug)) {
8307 err = PTR_ERR(priv->pdev_hotplug);
8308 goto fail_platform_hotplug_register;
8309 }
8310 }
8311
8312 /* Add LED driver. */
8313 if (mlxplat_led) {
8314 mlxplat_led->regmap = priv->regmap;
8315 priv->pdev_led =
8316 platform_device_register_resndata(&mlxplat_dev->dev, "leds-mlxreg",
8317 PLATFORM_DEVID_NONE, NULL, 0, mlxplat_led,
8318 sizeof(*mlxplat_led));
8319 if (IS_ERR(priv->pdev_led)) {
8320 err = PTR_ERR(priv->pdev_led);
8321 goto fail_platform_leds_register;
8322 }
8323 }
8324
8325 /* Add registers io access driver. */
8326 if (mlxplat_regs_io) {
8327 mlxplat_regs_io->regmap = priv->regmap;
8328 priv->pdev_io_regs = platform_device_register_resndata(&mlxplat_dev->dev,
8329 "mlxreg-io",
8330 PLATFORM_DEVID_NONE, NULL,
8331 0, mlxplat_regs_io,
8332 sizeof(*mlxplat_regs_io));
8333 if (IS_ERR(priv->pdev_io_regs)) {
8334 err = PTR_ERR(priv->pdev_io_regs);
8335 goto fail_platform_io_register;
8336 }
8337 }
8338
8339 /* Add FAN driver. */
8340 if (mlxplat_fan) {
8341 mlxplat_fan->regmap = priv->regmap;
8342 priv->pdev_fan = platform_device_register_resndata(&mlxplat_dev->dev, "mlxreg-fan",
8343 PLATFORM_DEVID_NONE, NULL, 0,
8344 mlxplat_fan,
8345 sizeof(*mlxplat_fan));
8346 if (IS_ERR(priv->pdev_fan)) {
8347 err = PTR_ERR(priv->pdev_fan);
8348 goto fail_platform_fan_register;
8349 }
8350 }
8351
8352 /* Add WD drivers. */
8353 err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
8354 if (err)
8355 goto fail_platform_wd_register;
8356 for (i = 0; i < MLXPLAT_CPLD_WD_MAX_DEVS; i++) {
8357 if (mlxplat_wd_data[i]) {
8358 mlxplat_wd_data[i]->regmap = priv->regmap;
8359 priv->pdev_wd[i] =
8360 platform_device_register_resndata(&mlxplat_dev->dev, "mlx-wdt", i,
8361 NULL, 0, mlxplat_wd_data[i],
8362 sizeof(*mlxplat_wd_data[i]));
8363 if (IS_ERR(priv->pdev_wd[i])) {
8364 err = PTR_ERR(priv->pdev_wd[i]);
8365 goto fail_platform_wd_register;
8366 }
8367 }
8368 }
8369
8370 /* Add DPU drivers. */
8371 for (i = 0; i < MLXPLAT_CPLD_DPU_MAX_DEVS; i++) {
8372 if (!mlxplat_dpu_data[i])
8373 continue;
8374 priv->pdev_dpu[i] =
8375 platform_device_register_resndata(&mlxplat_dev->dev, "mlxreg-dpu",
8376 i, NULL, 0, mlxplat_dpu_data[i],
8377 sizeof(*mlxplat_dpu_data[i]));
8378 if (IS_ERR(priv->pdev_dpu[i])) {
8379 err = PTR_ERR(priv->pdev_dpu[i]);
8380 goto fail_platform_dpu_register;
8381 }
8382 }
8383
8384 return 0;
8385
8386 fail_platform_dpu_register:
8387 while (i--)
8388 platform_device_unregister(priv->pdev_dpu[i]);
8389 fail_platform_wd_register:
8390 while (i--)
8391 platform_device_unregister(priv->pdev_wd[i]);
8392 fail_platform_fan_register:
8393 if (mlxplat_regs_io)
8394 platform_device_unregister(priv->pdev_io_regs);
8395 fail_platform_io_register:
8396 if (mlxplat_led)
8397 platform_device_unregister(priv->pdev_led);
8398 fail_platform_leds_register:
8399 if (mlxplat_hotplug)
8400 platform_device_unregister(priv->pdev_hotplug);
8401 fail_platform_hotplug_register:
8402 return err;
8403 }
8404
mlxplat_platdevs_exit(struct mlxplat_priv * priv)8405 static void mlxplat_platdevs_exit(struct mlxplat_priv *priv)
8406 {
8407 int i;
8408
8409 for (i = MLXPLAT_CPLD_DPU_MAX_DEVS - 1; i >= 0; i--)
8410 platform_device_unregister(priv->pdev_dpu[i]);
8411 for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0; i--)
8412 platform_device_unregister(priv->pdev_wd[i]);
8413 if (priv->pdev_fan)
8414 platform_device_unregister(priv->pdev_fan);
8415 if (priv->pdev_io_regs)
8416 platform_device_unregister(priv->pdev_io_regs);
8417 if (priv->pdev_led)
8418 platform_device_unregister(priv->pdev_led);
8419 if (priv->pdev_hotplug)
8420 platform_device_unregister(priv->pdev_hotplug);
8421 }
8422
8423 static int
mlxplat_i2c_mux_complition_notify(void * handle,struct i2c_adapter * parent,struct i2c_adapter * adapters[])8424 mlxplat_i2c_mux_complition_notify(void *handle, struct i2c_adapter *parent,
8425 struct i2c_adapter *adapters[])
8426 {
8427 struct mlxplat_priv *priv = handle;
8428
8429 return mlxplat_platdevs_init(priv);
8430 }
8431
mlxplat_i2c_mux_topology_init(struct mlxplat_priv * priv)8432 static int mlxplat_i2c_mux_topology_init(struct mlxplat_priv *priv)
8433 {
8434 int i, err;
8435
8436 if (!priv->pdev_i2c) {
8437 priv->i2c_main_init_status = MLXPLAT_I2C_MAIN_BUS_NOTIFIED;
8438 return 0;
8439 }
8440
8441 priv->i2c_main_init_status = MLXPLAT_I2C_MAIN_BUS_HANDLE_CREATED;
8442 for (i = 0; i < mlxplat_mux_num; i++) {
8443 priv->pdev_mux[i] = platform_device_register_resndata(&priv->pdev_i2c->dev,
8444 "i2c-mux-reg", i, NULL, 0,
8445 &mlxplat_mux_data[i],
8446 sizeof(mlxplat_mux_data[i]));
8447 if (IS_ERR(priv->pdev_mux[i])) {
8448 err = PTR_ERR(priv->pdev_mux[i]);
8449 goto fail_platform_mux_register;
8450 }
8451 }
8452
8453 return mlxplat_i2c_mux_complition_notify(priv, NULL, NULL);
8454
8455 fail_platform_mux_register:
8456 while (i--)
8457 platform_device_unregister(priv->pdev_mux[i]);
8458 return err;
8459 }
8460
mlxplat_i2c_mux_topology_exit(struct mlxplat_priv * priv)8461 static void mlxplat_i2c_mux_topology_exit(struct mlxplat_priv *priv)
8462 {
8463 int i;
8464
8465 for (i = mlxplat_mux_num - 1; i >= 0; i--) {
8466 if (priv->pdev_mux[i])
8467 platform_device_unregister(priv->pdev_mux[i]);
8468 }
8469 }
8470
mlxplat_i2c_main_completion_notify(void * handle,int id)8471 static int mlxplat_i2c_main_completion_notify(void *handle, int id)
8472 {
8473 struct mlxplat_priv *priv = handle;
8474
8475 return mlxplat_i2c_mux_topology_init(priv);
8476 }
8477
mlxplat_i2c_main_init(struct mlxplat_priv * priv)8478 static int mlxplat_i2c_main_init(struct mlxplat_priv *priv)
8479 {
8480 int nr, err;
8481
8482 if (!mlxplat_i2c)
8483 return 0;
8484
8485 err = mlxplat_mlxcpld_verify_bus_topology(&nr);
8486 if (nr < 0)
8487 goto fail_mlxplat_mlxcpld_verify_bus_topology;
8488
8489 nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
8490 mlxplat_i2c->regmap = priv->regmap;
8491 mlxplat_i2c->handle = priv;
8492
8493 /* Set mapped base address of I2C-LPC bridge over PCIe */
8494 if (lpc_bridge)
8495 mlxplat_i2c->addr = i2c_bridge_addr;
8496 priv->pdev_i2c = platform_device_register_resndata(&mlxplat_dev->dev, "i2c_mlxcpld",
8497 nr, priv->hotplug_resources,
8498 priv->hotplug_resources_size,
8499 mlxplat_i2c, sizeof(*mlxplat_i2c));
8500 if (IS_ERR(priv->pdev_i2c)) {
8501 err = PTR_ERR(priv->pdev_i2c);
8502 goto fail_platform_i2c_register;
8503 }
8504
8505 if (priv->i2c_main_init_status == MLXPLAT_I2C_MAIN_BUS_NOTIFIED) {
8506 err = mlxplat_i2c_mux_topology_init(priv);
8507 if (err)
8508 goto fail_mlxplat_i2c_mux_topology_init;
8509 }
8510
8511 return 0;
8512
8513 fail_mlxplat_i2c_mux_topology_init:
8514 platform_device_unregister(priv->pdev_i2c);
8515 fail_platform_i2c_register:
8516 fail_mlxplat_mlxcpld_verify_bus_topology:
8517 return err;
8518 }
8519
mlxplat_i2c_main_exit(struct mlxplat_priv * priv)8520 static void mlxplat_i2c_main_exit(struct mlxplat_priv *priv)
8521 {
8522 mlxplat_platdevs_exit(priv);
8523 mlxplat_i2c_mux_topology_exit(priv);
8524 if (priv->pdev_i2c)
8525 platform_device_unregister(priv->pdev_i2c);
8526 }
8527
mlxplat_probe(struct platform_device * pdev)8528 static int mlxplat_probe(struct platform_device *pdev)
8529 {
8530 unsigned int hotplug_resources_size = 0;
8531 struct resource *hotplug_resources = NULL;
8532 struct acpi_device *acpi_dev;
8533 struct mlxplat_priv *priv;
8534 int irq_fpga = 0, i, err;
8535
8536 acpi_dev = ACPI_COMPANION(&pdev->dev);
8537 if (acpi_dev) {
8538 irq_fpga = acpi_dev_gpio_irq_get(acpi_dev, 0);
8539 if (irq_fpga < 0)
8540 return -ENODEV;
8541 mlxplat_dev = pdev;
8542 }
8543
8544 err = mlxplat_logicdev_init(&hotplug_resources, &hotplug_resources_size);
8545 if (err)
8546 return err;
8547
8548 priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
8549 GFP_KERNEL);
8550 if (!priv) {
8551 err = -ENOMEM;
8552 goto fail_alloc;
8553 }
8554 platform_set_drvdata(mlxplat_dev, priv);
8555 priv->hotplug_resources = hotplug_resources;
8556 priv->hotplug_resources_size = hotplug_resources_size;
8557 priv->irq_fpga = irq_fpga;
8558
8559 if (!mlxplat_regmap_config)
8560 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
8561
8562 priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
8563 &mlxplat_mlxcpld_regmap_ctx,
8564 mlxplat_regmap_config);
8565 if (IS_ERR(priv->regmap)) {
8566 err = PTR_ERR(priv->regmap);
8567 goto fail_alloc;
8568 }
8569
8570 /* Set default registers. */
8571 for (i = 0; i < mlxplat_regmap_config->num_reg_defaults; i++) {
8572 err = regmap_write(priv->regmap,
8573 mlxplat_regmap_config->reg_defaults[i].reg,
8574 mlxplat_regmap_config->reg_defaults[i].def);
8575 if (err)
8576 goto fail_regmap_write;
8577 }
8578
8579 err = mlxplat_i2c_main_init(priv);
8580 if (err)
8581 goto fail_mlxplat_i2c_main_init;
8582
8583 /* Sync registers with hardware. */
8584 regcache_mark_dirty(priv->regmap);
8585 err = regcache_sync(priv->regmap);
8586 if (err)
8587 goto fail_regcache_sync;
8588
8589 if (mlxplat_reboot_nb) {
8590 err = register_reboot_notifier(mlxplat_reboot_nb);
8591 if (err)
8592 goto fail_register_reboot_notifier;
8593 }
8594
8595 return 0;
8596
8597 fail_register_reboot_notifier:
8598 fail_regcache_sync:
8599 mlxplat_i2c_main_exit(priv);
8600 fail_mlxplat_i2c_main_init:
8601 fail_regmap_write:
8602 fail_alloc:
8603 mlxplat_logicdev_exit();
8604
8605 return err;
8606 }
8607
mlxplat_remove(struct platform_device * pdev)8608 static void mlxplat_remove(struct platform_device *pdev)
8609 {
8610 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
8611
8612 if (pm_power_off)
8613 pm_power_off = NULL;
8614 if (mlxplat_reboot_nb)
8615 unregister_reboot_notifier(mlxplat_reboot_nb);
8616 mlxplat_i2c_main_exit(priv);
8617 mlxplat_logicdev_exit();
8618 }
8619
8620 static const struct acpi_device_id mlxplat_acpi_table[] = {
8621 { "MLNXBF49", 0 },
8622 {}
8623 };
8624 MODULE_DEVICE_TABLE(acpi, mlxplat_acpi_table);
8625
8626 static struct platform_driver mlxplat_driver = {
8627 .driver = {
8628 .name = "mlxplat",
8629 .acpi_match_table = mlxplat_acpi_table,
8630 .probe_type = PROBE_FORCE_SYNCHRONOUS,
8631 },
8632 .probe = mlxplat_probe,
8633 .remove = mlxplat_remove,
8634 };
8635
mlxplat_init(void)8636 static int __init mlxplat_init(void)
8637 {
8638 int err;
8639
8640 if (!dmi_check_system(mlxplat_dmi_table))
8641 return -ENODEV;
8642
8643 err = platform_driver_register(&mlxplat_driver);
8644 if (err)
8645 return err;
8646 return 0;
8647 }
8648 module_init(mlxplat_init);
8649
mlxplat_exit(void)8650 static void __exit mlxplat_exit(void)
8651 {
8652 if (mlxplat_dev)
8653 platform_device_unregister(mlxplat_dev);
8654
8655 platform_driver_unregister(&mlxplat_driver);
8656 }
8657 module_exit(mlxplat_exit);
8658
8659 MODULE_AUTHOR("Vadim Pasternak <vadimp@mellanox.com>");
8660 MODULE_DESCRIPTION("Mellanox platform driver");
8661 MODULE_LICENSE("Dual BSD/GPL");
8662