Loading...
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2/*
3 * Mellanox platform driver
4 *
5 * Copyright (C) 2016-2018 Mellanox Technologies
6 * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
7 */
8
9#include <linux/device.h>
10#include <linux/dmi.h>
11#include <linux/i2c.h>
12#include <linux/i2c-mux.h>
13#include <linux/io.h>
14#include <linux/module.h>
15#include <linux/platform_device.h>
16#include <linux/platform_data/i2c-mux-reg.h>
17#include <linux/platform_data/mlxreg.h>
18#include <linux/regmap.h>
19
20#define MLX_PLAT_DEVICE_NAME "mlxplat"
21
22/* LPC bus IO offsets */
23#define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000
24#define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500
25#define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00
26#define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01
27#define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02
28#define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET 0x03
29#define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET 0x04
30#define MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET 0x05
31#define MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET 0x06
32#define MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET 0x07
33#define MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET 0x08
34#define MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET 0x09
35#define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET 0x0a
36#define MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET 0x0b
37#define MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET 0x19
38#define MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET 0x1c
39#define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
40#define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET 0x1e
41#define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET 0x1f
42#define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET 0x20
43#define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET 0x21
44#define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22
45#define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23
46#define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24
47#define MLXPLAT_CPLD_LPC_REG_LED6_OFFSET 0x25
48#define MLXPLAT_CPLD_LPC_REG_LED7_OFFSET 0x26
49#define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION 0x2a
50#define MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET 0x2b
51#define MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET 0x2d
52#define MLXPLAT_CPLD_LPC_REG_GP0_OFFSET 0x2e
53#define MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET 0x2f
54#define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET 0x30
55#define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET 0x31
56#define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET 0x32
57#define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET 0x33
58#define MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE 0x34
59#define MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET 0x35
60#define MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET 0x36
61#define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET 0x37
62#define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a
63#define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b
64#define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40
65#define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET 0x41
66#define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET 0x42
67#define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET 0x43
68#define MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET 0x44
69#define MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET 0x45
70#define MLXPLAT_CPLD_LPC_REG_GWP_OFFSET 0x4a
71#define MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET 0x4b
72#define MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET 0x4c
73#define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
74#define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET 0x51
75#define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET 0x52
76#define MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET 0x53
77#define MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET 0x54
78#define MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET 0x55
79#define MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET 0x56
80#define MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET 0x57
81#define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET 0x58
82#define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET 0x59
83#define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET 0x5a
84#define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET 0x64
85#define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET 0x65
86#define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET 0x66
87#define MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET 0x70
88#define MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET 0x71
89#define MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET 0x72
90#define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET 0x88
91#define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET 0x89
92#define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET 0x8a
93#define MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET 0x9a
94#define MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET 0x9b
95#define MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET 0x9c
96#define MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET 0x9d
97#define MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET 0x9e
98#define MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET 0x9f
99#define MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET 0xa0
100#define MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET 0xa1
101#define MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET 0xa2
102#define MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET 0xa3
103#define MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET 0xa4
104#define MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET 0xa5
105#define MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET 0xa6
106#define MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET 0xa7
107#define MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET 0xa8
108#define MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET 0xa9
109#define MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET 0xaa
110#define MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET 0xab
111#define MLXPLAT_CPLD_LPC_REG_LC_PWR_ON 0xb2
112#define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET 0xc7
113#define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET 0xc8
114#define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET 0xc9
115#define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET 0xcb
116#define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET 0xcd
117#define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET 0xce
118#define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET 0xcf
119#define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET 0xd1
120#define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET 0xd2
121#define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET 0xd3
122#define MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET 0xde
123#define MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET 0xdf
124#define MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET 0xe0
125#define MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET 0xe1
126#define MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET 0xe2
127#define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET 0xe3
128#define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET 0xe4
129#define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET 0xe5
130#define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET 0xe6
131#define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET 0xe7
132#define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET 0xe8
133#define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET 0xe9
134#define MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET 0xea
135#define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET 0xeb
136#define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET 0xec
137#define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET 0xed
138#define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee
139#define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef
140#define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0
141#define MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET 0xf1
142#define MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET 0xf2
143#define MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET 0xf3
144#define MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET 0xf4
145#define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET 0xf5
146#define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET 0xf6
147#define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7
148#define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET 0xf8
149#define MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET 0xf9
150#define MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET 0xfa
151#define MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET 0xfb
152#define MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET 0xfc
153#define MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET 0xfd
154#define MLXPLAT_CPLD_LPC_IO_RANGE 0x100
155#define MLXPLAT_CPLD_LPC_I2C_CH1_OFF 0xdb
156#define MLXPLAT_CPLD_LPC_I2C_CH2_OFF 0xda
157#define MLXPLAT_CPLD_LPC_I2C_CH3_OFF 0xdc
158#define MLXPLAT_CPLD_LPC_I2C_CH4_OFF 0xdd
159
160#define MLXPLAT_CPLD_LPC_PIO_OFFSET 0x10000UL
161#define MLXPLAT_CPLD_LPC_REG1 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
162 MLXPLAT_CPLD_LPC_I2C_CH1_OFF) | \
163 MLXPLAT_CPLD_LPC_PIO_OFFSET)
164#define MLXPLAT_CPLD_LPC_REG2 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
165 MLXPLAT_CPLD_LPC_I2C_CH2_OFF) | \
166 MLXPLAT_CPLD_LPC_PIO_OFFSET)
167#define MLXPLAT_CPLD_LPC_REG3 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
168 MLXPLAT_CPLD_LPC_I2C_CH3_OFF) | \
169 MLXPLAT_CPLD_LPC_PIO_OFFSET)
170#define MLXPLAT_CPLD_LPC_REG4 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
171 MLXPLAT_CPLD_LPC_I2C_CH4_OFF) | \
172 MLXPLAT_CPLD_LPC_PIO_OFFSET)
173
174/* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
175#define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF 0x04
176#define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF 0x08
177#define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF 0x08
178#define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF 0x40
179#define MLXPLAT_CPLD_AGGR_MASK_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
180 MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
181 MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
182#define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG 0x01
183#define MLXPLAT_CPLD_AGGR_MASK_NG_DEF 0x04
184#define MLXPLAT_CPLD_AGGR_MASK_COMEX BIT(0)
185#define MLXPLAT_CPLD_AGGR_MASK_LC BIT(3)
186#define MLXPLAT_CPLD_AGGR_MASK_MODULAR (MLXPLAT_CPLD_AGGR_MASK_NG_DEF | \
187 MLXPLAT_CPLD_AGGR_MASK_COMEX | \
188 MLXPLAT_CPLD_AGGR_MASK_LC)
189#define MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT BIT(0)
190#define MLXPLAT_CPLD_AGGR_MASK_LC_RDY BIT(1)
191#define MLXPLAT_CPLD_AGGR_MASK_LC_PG BIT(2)
192#define MLXPLAT_CPLD_AGGR_MASK_LC_SCRD BIT(3)
193#define MLXPLAT_CPLD_AGGR_MASK_LC_SYNC BIT(4)
194#define MLXPLAT_CPLD_AGGR_MASK_LC_ACT BIT(5)
195#define MLXPLAT_CPLD_AGGR_MASK_LC_SDWN BIT(6)
196#define MLXPLAT_CPLD_AGGR_MASK_LC_LOW (MLXPLAT_CPLD_AGGR_MASK_LC_PRSNT | \
197 MLXPLAT_CPLD_AGGR_MASK_LC_RDY | \
198 MLXPLAT_CPLD_AGGR_MASK_LC_PG | \
199 MLXPLAT_CPLD_AGGR_MASK_LC_SCRD | \
200 MLXPLAT_CPLD_AGGR_MASK_LC_SYNC | \
201 MLXPLAT_CPLD_AGGR_MASK_LC_ACT | \
202 MLXPLAT_CPLD_AGGR_MASK_LC_SDWN)
203#define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW 0xc1
204#define MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2 BIT(2)
205#define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C BIT(6)
206#define MLXPLAT_CPLD_PSU_MASK GENMASK(1, 0)
207#define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0)
208#define MLXPLAT_CPLD_PSU_EXT_MASK GENMASK(3, 0)
209#define MLXPLAT_CPLD_PWR_EXT_MASK GENMASK(3, 0)
210#define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0)
211#define MLXPLAT_CPLD_ASIC_MASK GENMASK(1, 0)
212#define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(6, 0)
213#define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
214#define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
215#define MLXPLAT_CPLD_VOLTREG_UPD_MASK GENMASK(5, 4)
216#define MLXPLAT_CPLD_GWP_MASK GENMASK(0, 0)
217#define MLXPLAT_CPLD_I2C_CAP_BIT 0x04
218#define MLXPLAT_CPLD_I2C_CAP_MASK GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
219
220/* Masks for aggregation for comex carriers */
221#define MLXPLAT_CPLD_AGGR_MASK_CARRIER BIT(1)
222#define MLXPLAT_CPLD_AGGR_MASK_CARR_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
223 MLXPLAT_CPLD_AGGR_MASK_CARRIER)
224#define MLXPLAT_CPLD_LOW_AGGRCX_MASK 0xc1
225
226/* Masks for aggregation for modular systems */
227#define MLXPLAT_CPLD_LPC_LC_MASK GENMASK(7, 0)
228
229/* Default I2C parent bus number */
230#define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
231
232/* Maximum number of possible physical buses equipped on system */
233#define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM 16
234#define MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM 24
235
236/* Number of channels in group */
237#define MLXPLAT_CPLD_GRP_CHNL_NUM 8
238
239/* Start channel numbers */
240#define MLXPLAT_CPLD_CH1 2
241#define MLXPLAT_CPLD_CH2 10
242#define MLXPLAT_CPLD_CH3 18
243#define MLXPLAT_CPLD_CH2_ETH_MODULAR 3
244#define MLXPLAT_CPLD_CH3_ETH_MODULAR 43
245#define MLXPLAT_CPLD_CH4_ETH_MODULAR 51
246
247/* Number of LPC attached MUX platform devices */
248#define MLXPLAT_CPLD_LPC_MUX_DEVS 4
249
250/* Hotplug devices adapter numbers */
251#define MLXPLAT_CPLD_NR_NONE -1
252#define MLXPLAT_CPLD_PSU_DEFAULT_NR 10
253#define MLXPLAT_CPLD_PSU_MSNXXXX_NR 4
254#define MLXPLAT_CPLD_FAN1_DEFAULT_NR 11
255#define MLXPLAT_CPLD_FAN2_DEFAULT_NR 12
256#define MLXPLAT_CPLD_FAN3_DEFAULT_NR 13
257#define MLXPLAT_CPLD_FAN4_DEFAULT_NR 14
258#define MLXPLAT_CPLD_NR_ASIC 3
259#define MLXPLAT_CPLD_NR_LC_BASE 34
260
261#define MLXPLAT_CPLD_NR_LC_SET(nr) (MLXPLAT_CPLD_NR_LC_BASE + (nr))
262#define MLXPLAT_CPLD_LC_ADDR 0x32
263
264/* Masks and default values for watchdogs */
265#define MLXPLAT_CPLD_WD1_CLEAR_MASK GENMASK(7, 1)
266#define MLXPLAT_CPLD_WD2_CLEAR_MASK (GENMASK(7, 0) & ~BIT(1))
267
268#define MLXPLAT_CPLD_WD_TYPE1_TO_MASK GENMASK(7, 4)
269#define MLXPLAT_CPLD_WD_TYPE2_TO_MASK 0
270#define MLXPLAT_CPLD_WD_RESET_ACT_MASK GENMASK(7, 1)
271#define MLXPLAT_CPLD_WD_FAN_ACT_MASK (GENMASK(7, 0) & ~BIT(4))
272#define MLXPLAT_CPLD_WD_COUNT_ACT_MASK (GENMASK(7, 0) & ~BIT(7))
273#define MLXPLAT_CPLD_WD_CPBLTY_MASK (GENMASK(7, 0) & ~BIT(6))
274#define MLXPLAT_CPLD_WD_DFLT_TIMEOUT 30
275#define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT 600
276#define MLXPLAT_CPLD_WD_MAX_DEVS 2
277
278#define MLXPLAT_CPLD_LPC_SYSIRQ 17
279
280/* Minimum power required for turning on Ethernet modular system (WATT) */
281#define MLXPLAT_CPLD_ETH_MODULAR_PWR_MIN 50
282
283/* mlxplat_priv - platform private data
284 * @pdev_i2c - i2c controller platform device
285 * @pdev_mux - array of mux platform devices
286 * @pdev_hotplug - hotplug platform devices
287 * @pdev_led - led platform devices
288 * @pdev_io_regs - register access platform devices
289 * @pdev_fan - FAN platform devices
290 * @pdev_wd - array of watchdog platform devices
291 * @regmap: device register map
292 */
293struct mlxplat_priv {
294 struct platform_device *pdev_i2c;
295 struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
296 struct platform_device *pdev_hotplug;
297 struct platform_device *pdev_led;
298 struct platform_device *pdev_io_regs;
299 struct platform_device *pdev_fan;
300 struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
301 void *regmap;
302};
303
304/* Regions for LPC I2C controller and LPC base register space */
305static const struct resource mlxplat_lpc_resources[] = {
306 [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
307 MLXPLAT_CPLD_LPC_IO_RANGE,
308 "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
309 [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
310 MLXPLAT_CPLD_LPC_IO_RANGE,
311 "mlxplat_cpld_lpc_regs",
312 IORESOURCE_IO),
313};
314
315/* Platform i2c next generation systems data */
316static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
317 {
318 .reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
319 .mask = MLXPLAT_CPLD_I2C_CAP_MASK,
320 .bit = MLXPLAT_CPLD_I2C_CAP_BIT,
321 },
322};
323
324static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
325 {
326 .data = mlxplat_mlxcpld_i2c_ng_items_data,
327 },
328};
329
330/* Platform next generation systems i2c data */
331static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
332 .items = mlxplat_mlxcpld_i2c_ng_items,
333 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
334 .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
335 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
336 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
337};
338
339/* Platform default channels */
340static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
341 {
342 MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
343 MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
344 5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
345 },
346 {
347 MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
348 MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
349 5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
350 },
351};
352
353/* Platform channels for MSN21xx system family */
354static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
355
356/* Platform mux data */
357static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
358 {
359 .parent = 1,
360 .base_nr = MLXPLAT_CPLD_CH1,
361 .write_only = 1,
362 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
363 .reg_size = 1,
364 .idle_in_use = 1,
365 },
366 {
367 .parent = 1,
368 .base_nr = MLXPLAT_CPLD_CH2,
369 .write_only = 1,
370 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
371 .reg_size = 1,
372 .idle_in_use = 1,
373 },
374
375};
376
377/* Platform mux configuration variables */
378static int mlxplat_max_adap_num;
379static int mlxplat_mux_num;
380static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
381
382/* Platform extended mux data */
383static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
384 {
385 .parent = 1,
386 .base_nr = MLXPLAT_CPLD_CH1,
387 .write_only = 1,
388 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
389 .reg_size = 1,
390 .idle_in_use = 1,
391 },
392 {
393 .parent = 1,
394 .base_nr = MLXPLAT_CPLD_CH2,
395 .write_only = 1,
396 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
397 .reg_size = 1,
398 .idle_in_use = 1,
399 },
400 {
401 .parent = 1,
402 .base_nr = MLXPLAT_CPLD_CH3,
403 .write_only = 1,
404 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
405 .reg_size = 1,
406 .idle_in_use = 1,
407 },
408
409};
410
411/* Platform channels for modular system family */
412static const int mlxplat_modular_upper_channel[] = { 1 };
413static const int mlxplat_modular_channels[] = {
414 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
415 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
416 38, 39, 40
417};
418
419/* Platform modular mux data */
420static struct i2c_mux_reg_platform_data mlxplat_modular_mux_data[] = {
421 {
422 .parent = 1,
423 .base_nr = MLXPLAT_CPLD_CH1,
424 .write_only = 1,
425 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG4,
426 .reg_size = 1,
427 .idle_in_use = 1,
428 .values = mlxplat_modular_upper_channel,
429 .n_values = ARRAY_SIZE(mlxplat_modular_upper_channel),
430 },
431 {
432 .parent = 1,
433 .base_nr = MLXPLAT_CPLD_CH2_ETH_MODULAR,
434 .write_only = 1,
435 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
436 .reg_size = 1,
437 .idle_in_use = 1,
438 .values = mlxplat_modular_channels,
439 .n_values = ARRAY_SIZE(mlxplat_modular_channels),
440 },
441 {
442 .parent = MLXPLAT_CPLD_CH1,
443 .base_nr = MLXPLAT_CPLD_CH3_ETH_MODULAR,
444 .write_only = 1,
445 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
446 .reg_size = 1,
447 .idle_in_use = 1,
448 .values = mlxplat_msn21xx_channels,
449 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
450 },
451 {
452 .parent = 1,
453 .base_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR,
454 .write_only = 1,
455 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
456 .reg_size = 1,
457 .idle_in_use = 1,
458 .values = mlxplat_msn21xx_channels,
459 .n_values = ARRAY_SIZE(mlxplat_msn21xx_channels),
460 },
461};
462
463/* Platform hotplug devices */
464static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
465 {
466 I2C_BOARD_INFO("dps460", 0x59),
467 },
468 {
469 I2C_BOARD_INFO("dps460", 0x58),
470 },
471};
472
473static struct i2c_board_info mlxplat_mlxcpld_ext_pwr[] = {
474 {
475 I2C_BOARD_INFO("dps460", 0x5b),
476 },
477 {
478 I2C_BOARD_INFO("dps460", 0x5a),
479 },
480};
481
482static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
483 {
484 I2C_BOARD_INFO("24c32", 0x50),
485 },
486 {
487 I2C_BOARD_INFO("24c32", 0x50),
488 },
489 {
490 I2C_BOARD_INFO("24c32", 0x50),
491 },
492 {
493 I2C_BOARD_INFO("24c32", 0x50),
494 },
495};
496
497/* Platform hotplug comex carrier system family data */
498static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
499 {
500 .label = "psu1",
501 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
502 .mask = BIT(0),
503 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
504 },
505 {
506 .label = "psu2",
507 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
508 .mask = BIT(1),
509 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
510 },
511};
512
513/* Platform hotplug default data */
514static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
515 {
516 .label = "psu1",
517 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
518 .mask = BIT(0),
519 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
520 },
521 {
522 .label = "psu2",
523 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
524 .mask = BIT(1),
525 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
526 },
527};
528
529static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
530 {
531 .label = "pwr1",
532 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
533 .mask = BIT(0),
534 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
535 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
536 },
537 {
538 .label = "pwr2",
539 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
540 .mask = BIT(1),
541 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
542 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
543 },
544};
545
546static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_wc_items_data[] = {
547 {
548 .label = "pwr1",
549 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
550 .mask = BIT(0),
551 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
552 },
553 {
554 .label = "pwr2",
555 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
556 .mask = BIT(1),
557 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
558 },
559};
560
561static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
562 {
563 .label = "fan1",
564 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
565 .mask = BIT(0),
566 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
567 .hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
568 },
569 {
570 .label = "fan2",
571 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
572 .mask = BIT(1),
573 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
574 .hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
575 },
576 {
577 .label = "fan3",
578 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
579 .mask = BIT(2),
580 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
581 .hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
582 },
583 {
584 .label = "fan4",
585 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
586 .mask = BIT(3),
587 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
588 .hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
589 },
590};
591
592static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
593 {
594 .label = "asic1",
595 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
596 .mask = MLXPLAT_CPLD_ASIC_MASK,
597 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
598 },
599};
600
601static struct mlxreg_core_data mlxplat_mlxcpld_default_asic2_items_data[] = {
602 {
603 .label = "asic2",
604 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
605 .mask = MLXPLAT_CPLD_ASIC_MASK,
606 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
607 },
608};
609
610static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
611 {
612 .data = mlxplat_mlxcpld_default_psu_items_data,
613 .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
614 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
615 .mask = MLXPLAT_CPLD_PSU_MASK,
616 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
617 .inversed = 1,
618 .health = false,
619 },
620 {
621 .data = mlxplat_mlxcpld_default_pwr_items_data,
622 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
623 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
624 .mask = MLXPLAT_CPLD_PWR_MASK,
625 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
626 .inversed = 0,
627 .health = false,
628 },
629 {
630 .data = mlxplat_mlxcpld_default_fan_items_data,
631 .aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
632 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
633 .mask = MLXPLAT_CPLD_FAN_MASK,
634 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
635 .inversed = 1,
636 .health = false,
637 },
638 {
639 .data = mlxplat_mlxcpld_default_asic_items_data,
640 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
641 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
642 .mask = MLXPLAT_CPLD_ASIC_MASK,
643 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
644 .inversed = 0,
645 .health = true,
646 },
647};
648
649static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
650 {
651 .data = mlxplat_mlxcpld_comex_psu_items_data,
652 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
653 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
654 .mask = MLXPLAT_CPLD_PSU_MASK,
655 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
656 .inversed = 1,
657 .health = false,
658 },
659 {
660 .data = mlxplat_mlxcpld_default_pwr_items_data,
661 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
662 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
663 .mask = MLXPLAT_CPLD_PWR_MASK,
664 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
665 .inversed = 0,
666 .health = false,
667 },
668 {
669 .data = mlxplat_mlxcpld_default_fan_items_data,
670 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
671 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
672 .mask = MLXPLAT_CPLD_FAN_MASK,
673 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_items_data),
674 .inversed = 1,
675 .health = false,
676 },
677 {
678 .data = mlxplat_mlxcpld_default_asic_items_data,
679 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
680 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
681 .mask = MLXPLAT_CPLD_ASIC_MASK,
682 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
683 .inversed = 0,
684 .health = true,
685 },
686};
687
688static
689struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
690 .items = mlxplat_mlxcpld_default_items,
691 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
692 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
693 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
694 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
695 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
696};
697
698static struct mlxreg_core_item mlxplat_mlxcpld_default_wc_items[] = {
699 {
700 .data = mlxplat_mlxcpld_comex_psu_items_data,
701 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
702 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
703 .mask = MLXPLAT_CPLD_PSU_MASK,
704 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_psu_items_data),
705 .inversed = 1,
706 .health = false,
707 },
708 {
709 .data = mlxplat_mlxcpld_default_pwr_wc_items_data,
710 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
711 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
712 .mask = MLXPLAT_CPLD_PWR_MASK,
713 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_pwr_items_data),
714 .inversed = 0,
715 .health = false,
716 },
717 {
718 .data = mlxplat_mlxcpld_default_asic_items_data,
719 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
720 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
721 .mask = MLXPLAT_CPLD_ASIC_MASK,
722 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
723 .inversed = 0,
724 .health = true,
725 },
726};
727
728static
729struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_wc_data = {
730 .items = mlxplat_mlxcpld_default_wc_items,
731 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_wc_items),
732 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
733 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
734 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
735 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
736};
737
738static
739struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
740 .items = mlxplat_mlxcpld_comex_items,
741 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
742 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
743 .mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
744 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
745 .mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
746};
747
748static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
749 {
750 .label = "pwr1",
751 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
752 .mask = BIT(0),
753 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
754 },
755 {
756 .label = "pwr2",
757 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
758 .mask = BIT(1),
759 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
760 },
761};
762
763/* Platform hotplug MSN21xx system family data */
764static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
765 {
766 .data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
767 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
768 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
769 .mask = MLXPLAT_CPLD_PWR_MASK,
770 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
771 .inversed = 0,
772 .health = false,
773 },
774 {
775 .data = mlxplat_mlxcpld_default_asic_items_data,
776 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
777 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
778 .mask = MLXPLAT_CPLD_ASIC_MASK,
779 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
780 .inversed = 0,
781 .health = true,
782 },
783};
784
785static
786struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
787 .items = mlxplat_mlxcpld_msn21xx_items,
788 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
789 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
790 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
791 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
792 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
793};
794
795/* Platform hotplug msn274x system family data */
796static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
797 {
798 .label = "psu1",
799 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
800 .mask = BIT(0),
801 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
802 },
803 {
804 .label = "psu2",
805 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
806 .mask = BIT(1),
807 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
808 },
809};
810
811static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
812 {
813 .label = "pwr1",
814 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
815 .mask = BIT(0),
816 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
817 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
818 },
819 {
820 .label = "pwr2",
821 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
822 .mask = BIT(1),
823 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
824 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
825 },
826};
827
828static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
829 {
830 .label = "fan1",
831 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
832 .mask = BIT(0),
833 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
834 },
835 {
836 .label = "fan2",
837 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
838 .mask = BIT(1),
839 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
840 },
841 {
842 .label = "fan3",
843 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
844 .mask = BIT(2),
845 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
846 },
847 {
848 .label = "fan4",
849 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
850 .mask = BIT(3),
851 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
852 },
853};
854
855static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
856 {
857 .data = mlxplat_mlxcpld_msn274x_psu_items_data,
858 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
859 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
860 .mask = MLXPLAT_CPLD_PSU_MASK,
861 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
862 .inversed = 1,
863 .health = false,
864 },
865 {
866 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
867 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
868 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
869 .mask = MLXPLAT_CPLD_PWR_MASK,
870 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
871 .inversed = 0,
872 .health = false,
873 },
874 {
875 .data = mlxplat_mlxcpld_msn274x_fan_items_data,
876 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
877 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
878 .mask = MLXPLAT_CPLD_FAN_MASK,
879 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
880 .inversed = 1,
881 .health = false,
882 },
883 {
884 .data = mlxplat_mlxcpld_default_asic_items_data,
885 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
886 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
887 .mask = MLXPLAT_CPLD_ASIC_MASK,
888 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
889 .inversed = 0,
890 .health = true,
891 },
892};
893
894static
895struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
896 .items = mlxplat_mlxcpld_msn274x_items,
897 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
898 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
899 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
900 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
901 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
902};
903
904/* Platform hotplug MSN201x system family data */
905static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
906 {
907 .label = "pwr1",
908 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
909 .mask = BIT(0),
910 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
911 },
912 {
913 .label = "pwr2",
914 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
915 .mask = BIT(1),
916 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
917 },
918};
919
920static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
921 {
922 .data = mlxplat_mlxcpld_msn201x_pwr_items_data,
923 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
924 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
925 .mask = MLXPLAT_CPLD_PWR_MASK,
926 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
927 .inversed = 0,
928 .health = false,
929 },
930 {
931 .data = mlxplat_mlxcpld_default_asic_items_data,
932 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
933 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
934 .mask = MLXPLAT_CPLD_ASIC_MASK,
935 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
936 .inversed = 0,
937 .health = true,
938 },
939};
940
941static
942struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
943 .items = mlxplat_mlxcpld_msn201x_items,
944 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
945 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
946 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
947 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
948 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
949};
950
951/* Platform hotplug next generation system family data */
952static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
953 {
954 .label = "psu1",
955 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
956 .mask = BIT(0),
957 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
958 },
959 {
960 .label = "psu2",
961 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
962 .mask = BIT(1),
963 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
964 },
965};
966
967static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
968 {
969 .label = "fan1",
970 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
971 .mask = BIT(0),
972 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
973 .bit = BIT(0),
974 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
975 },
976 {
977 .label = "fan2",
978 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
979 .mask = BIT(1),
980 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
981 .bit = BIT(1),
982 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
983 },
984 {
985 .label = "fan3",
986 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
987 .mask = BIT(2),
988 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
989 .bit = BIT(2),
990 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
991 },
992 {
993 .label = "fan4",
994 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
995 .mask = BIT(3),
996 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
997 .bit = BIT(3),
998 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
999 },
1000 {
1001 .label = "fan5",
1002 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1003 .mask = BIT(4),
1004 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1005 .bit = BIT(4),
1006 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1007 },
1008 {
1009 .label = "fan6",
1010 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1011 .mask = BIT(5),
1012 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1013 .bit = BIT(5),
1014 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1015 },
1016 {
1017 .label = "fan7",
1018 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1019 .mask = BIT(6),
1020 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1021 .bit = BIT(6),
1022 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1023 },
1024};
1025
1026static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
1027 {
1028 .data = mlxplat_mlxcpld_default_ng_psu_items_data,
1029 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1030 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1031 .mask = MLXPLAT_CPLD_PSU_MASK,
1032 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
1033 .inversed = 1,
1034 .health = false,
1035 },
1036 {
1037 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
1038 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1039 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1040 .mask = MLXPLAT_CPLD_PWR_MASK,
1041 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
1042 .inversed = 0,
1043 .health = false,
1044 },
1045 {
1046 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1047 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1048 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1049 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1050 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1051 .inversed = 1,
1052 .health = false,
1053 },
1054 {
1055 .data = mlxplat_mlxcpld_default_asic_items_data,
1056 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1057 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1058 .mask = MLXPLAT_CPLD_ASIC_MASK,
1059 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1060 .inversed = 0,
1061 .health = true,
1062 },
1063};
1064
1065static
1066struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
1067 .items = mlxplat_mlxcpld_default_ng_items,
1068 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
1069 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1070 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1071 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1072 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
1073};
1074
1075/* Platform hotplug extended system family data */
1076static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
1077 {
1078 .label = "psu1",
1079 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1080 .mask = BIT(0),
1081 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1082 },
1083 {
1084 .label = "psu2",
1085 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1086 .mask = BIT(1),
1087 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1088 },
1089 {
1090 .label = "psu3",
1091 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1092 .mask = BIT(2),
1093 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1094 },
1095 {
1096 .label = "psu4",
1097 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1098 .mask = BIT(3),
1099 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1100 },
1101};
1102
1103static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
1104 {
1105 .label = "pwr1",
1106 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1107 .mask = BIT(0),
1108 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1109 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1110 },
1111 {
1112 .label = "pwr2",
1113 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1114 .mask = BIT(1),
1115 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1116 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1117 },
1118 {
1119 .label = "pwr3",
1120 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1121 .mask = BIT(2),
1122 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1123 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1124 },
1125 {
1126 .label = "pwr4",
1127 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1128 .mask = BIT(3),
1129 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1130 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1131 },
1132};
1133
1134static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
1135 {
1136 .data = mlxplat_mlxcpld_ext_psu_items_data,
1137 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1138 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1139 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1140 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1141 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1142 .inversed = 1,
1143 .health = false,
1144 },
1145 {
1146 .data = mlxplat_mlxcpld_ext_pwr_items_data,
1147 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1148 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1149 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1150 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1151 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1152 .inversed = 0,
1153 .health = false,
1154 },
1155 {
1156 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1157 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1158 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1159 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1160 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1161 .inversed = 1,
1162 .health = false,
1163 },
1164 {
1165 .data = mlxplat_mlxcpld_default_asic_items_data,
1166 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1167 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1168 .mask = MLXPLAT_CPLD_ASIC_MASK,
1169 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
1170 .inversed = 0,
1171 .health = true,
1172 },
1173 {
1174 .data = mlxplat_mlxcpld_default_asic2_items_data,
1175 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1176 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
1177 .mask = MLXPLAT_CPLD_ASIC_MASK,
1178 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic2_items_data),
1179 .inversed = 0,
1180 .health = true,
1181 }
1182};
1183
1184static
1185struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
1186 .items = mlxplat_mlxcpld_ext_items,
1187 .counter = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
1188 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
1189 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
1190 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
1191 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW | MLXPLAT_CPLD_LOW_AGGR_MASK_ASIC2,
1192};
1193
1194static struct mlxreg_core_data mlxplat_mlxcpld_modular_pwr_items_data[] = {
1195 {
1196 .label = "pwr1",
1197 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1198 .mask = BIT(0),
1199 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
1200 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1201 },
1202 {
1203 .label = "pwr2",
1204 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1205 .mask = BIT(1),
1206 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
1207 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1208 },
1209 {
1210 .label = "pwr3",
1211 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1212 .mask = BIT(2),
1213 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
1214 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1215 },
1216 {
1217 .label = "pwr4",
1218 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1219 .mask = BIT(3),
1220 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
1221 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
1222 },
1223};
1224
1225static
1226struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_lc_act = {
1227 .irq = MLXPLAT_CPLD_LPC_SYSIRQ,
1228};
1229
1230static struct mlxreg_core_data mlxplat_mlxcpld_modular_asic_items_data[] = {
1231 {
1232 .label = "asic1",
1233 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1234 .mask = MLXPLAT_CPLD_ASIC_MASK,
1235 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
1236 },
1237};
1238
1239static struct i2c_board_info mlxplat_mlxcpld_lc_i2c_dev[] = {
1240 {
1241 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1242 .platform_data = &mlxplat_mlxcpld_lc_act,
1243 },
1244 {
1245 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1246 .platform_data = &mlxplat_mlxcpld_lc_act,
1247 },
1248 {
1249 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1250 .platform_data = &mlxplat_mlxcpld_lc_act,
1251 },
1252 {
1253 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1254 .platform_data = &mlxplat_mlxcpld_lc_act,
1255 },
1256 {
1257 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1258 .platform_data = &mlxplat_mlxcpld_lc_act,
1259 },
1260 {
1261 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1262 .platform_data = &mlxplat_mlxcpld_lc_act,
1263 },
1264 {
1265 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1266 .platform_data = &mlxplat_mlxcpld_lc_act,
1267 },
1268 {
1269 I2C_BOARD_INFO("mlxreg-lc", MLXPLAT_CPLD_LC_ADDR),
1270 .platform_data = &mlxplat_mlxcpld_lc_act,
1271 },
1272};
1273
1274static struct mlxreg_core_hotplug_notifier mlxplat_mlxcpld_modular_lc_notifier[] = {
1275 {
1276 .identity = "lc1",
1277 },
1278 {
1279 .identity = "lc2",
1280 },
1281 {
1282 .identity = "lc3",
1283 },
1284 {
1285 .identity = "lc4",
1286 },
1287 {
1288 .identity = "lc5",
1289 },
1290 {
1291 .identity = "lc6",
1292 },
1293 {
1294 .identity = "lc7",
1295 },
1296 {
1297 .identity = "lc8",
1298 },
1299};
1300
1301static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pr_items_data[] = {
1302 {
1303 .label = "lc1_present",
1304 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1305 .mask = BIT(0),
1306 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1307 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1308 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1309 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1310 .slot = 1,
1311 },
1312 {
1313 .label = "lc2_present",
1314 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1315 .mask = BIT(1),
1316 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1317 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1318 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1319 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1320 .slot = 2,
1321 },
1322 {
1323 .label = "lc3_present",
1324 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1325 .mask = BIT(2),
1326 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1327 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1328 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1329 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1330 .slot = 3,
1331 },
1332 {
1333 .label = "lc4_present",
1334 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1335 .mask = BIT(3),
1336 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1337 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1338 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1339 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1340 .slot = 4,
1341 },
1342 {
1343 .label = "lc5_present",
1344 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1345 .mask = BIT(4),
1346 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1347 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1348 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1349 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1350 .slot = 5,
1351 },
1352 {
1353 .label = "lc6_present",
1354 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1355 .mask = BIT(5),
1356 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1357 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1358 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1359 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1360 .slot = 6,
1361 },
1362 {
1363 .label = "lc7_present",
1364 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1365 .mask = BIT(6),
1366 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1367 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1368 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1369 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1370 .slot = 7,
1371 },
1372 {
1373 .label = "lc8_present",
1374 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1375 .mask = BIT(7),
1376 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1377 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1378 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1379 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1380 .slot = 8,
1381 },
1382};
1383
1384static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ver_items_data[] = {
1385 {
1386 .label = "lc1_verified",
1387 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1388 .mask = BIT(0),
1389 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1390 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1391 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1392 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1393 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1394 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1395 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1396 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1397 .slot = 1,
1398 },
1399 {
1400 .label = "lc2_verified",
1401 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1402 .mask = BIT(1),
1403 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1404 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1405 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1406 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1407 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1408 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1409 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1410 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1411 .slot = 2,
1412 },
1413 {
1414 .label = "lc3_verified",
1415 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1416 .mask = BIT(2),
1417 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1418 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1419 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1420 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1421 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1422 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1423 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1424 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1425 .slot = 3,
1426 },
1427 {
1428 .label = "lc4_verified",
1429 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1430 .mask = BIT(3),
1431 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1432 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1433 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1434 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1435 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1436 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1437 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1438 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1439 .slot = 4,
1440 },
1441 {
1442 .label = "lc5_verified",
1443 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1444 .mask = BIT(4),
1445 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1446 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1447 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1448 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1449 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1450 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1451 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1452 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1453 .slot = 5,
1454 },
1455 {
1456 .label = "lc6_verified",
1457 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1458 .mask = BIT(5),
1459 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1460 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1461 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1462 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1463 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1464 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1465 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1466 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1467 .slot = 6,
1468 },
1469 {
1470 .label = "lc7_verified",
1471 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1472 .mask = BIT(6),
1473 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1474 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1475 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1476 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1477 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1478 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1479 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1480 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1481 .slot = 7,
1482 },
1483 {
1484 .label = "lc8_verified",
1485 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1486 .mask = BIT(7),
1487 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1488 .reg_sync = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1489 .reg_pwr = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
1490 .reg_ena = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
1491 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1492 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1493 .hpdev.action = MLXREG_HOTPLUG_DEVICE_PLATFORM_ACTION,
1494 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1495 .slot = 8,
1496 },
1497};
1498
1499static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_pg_data[] = {
1500 {
1501 .label = "lc1_powered",
1502 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1503 .mask = BIT(0),
1504 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1505 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1506 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1507 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1508 .slot = 1,
1509 },
1510 {
1511 .label = "lc2_powered",
1512 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1513 .mask = BIT(1),
1514 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1515 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1516 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1517 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1518 .slot = 2,
1519 },
1520 {
1521 .label = "lc3_powered",
1522 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1523 .mask = BIT(2),
1524 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1525 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1526 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1527 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1528 .slot = 3,
1529 },
1530 {
1531 .label = "lc4_powered",
1532 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1533 .mask = BIT(3),
1534 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1535 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1536 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1537 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1538 .slot = 4,
1539 },
1540 {
1541 .label = "lc5_powered",
1542 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1543 .mask = BIT(4),
1544 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1545 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1546 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1547 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1548 .slot = 5,
1549 },
1550 {
1551 .label = "lc6_powered",
1552 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1553 .mask = BIT(5),
1554 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1555 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1556 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1557 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1558 .slot = 6,
1559 },
1560 {
1561 .label = "lc7_powered",
1562 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1563 .mask = BIT(6),
1564 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1565 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1566 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1567 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1568 .slot = 7,
1569 },
1570 {
1571 .label = "lc8_powered",
1572 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1573 .mask = BIT(7),
1574 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1575 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1576 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1577 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1578 .slot = 8,
1579 },
1580};
1581
1582static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_ready_data[] = {
1583 {
1584 .label = "lc1_ready",
1585 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1586 .mask = BIT(0),
1587 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1588 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1589 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1590 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1591 .slot = 1,
1592 },
1593 {
1594 .label = "lc2_ready",
1595 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1596 .mask = BIT(1),
1597 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1598 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1599 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1600 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1601 .slot = 2,
1602 },
1603 {
1604 .label = "lc3_ready",
1605 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1606 .mask = BIT(2),
1607 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1608 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1609 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1610 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1611 .slot = 3,
1612 },
1613 {
1614 .label = "lc4_ready",
1615 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1616 .mask = BIT(3),
1617 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1618 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1619 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1620 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1621 .slot = 4,
1622 },
1623 {
1624 .label = "lc5_ready",
1625 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1626 .mask = BIT(4),
1627 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1628 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1629 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1630 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1631 .slot = 5,
1632 },
1633 {
1634 .label = "lc6_ready",
1635 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1636 .mask = BIT(5),
1637 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1638 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1639 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1640 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1641 .slot = 6,
1642 },
1643 {
1644 .label = "lc7_ready",
1645 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1646 .mask = BIT(6),
1647 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1648 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1649 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1650 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1651 .slot = 7,
1652 },
1653 {
1654 .label = "lc8_ready",
1655 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1656 .mask = BIT(7),
1657 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1658 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1659 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1660 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1661 .slot = 8,
1662 },
1663};
1664
1665static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_synced_data[] = {
1666 {
1667 .label = "lc1_synced",
1668 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1669 .mask = BIT(0),
1670 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1671 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1672 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1673 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1674 .slot = 1,
1675 },
1676 {
1677 .label = "lc2_synced",
1678 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1679 .mask = BIT(1),
1680 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1681 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1682 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1683 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1684 .slot = 2,
1685 },
1686 {
1687 .label = "lc3_synced",
1688 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1689 .mask = BIT(2),
1690 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1691 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1692 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1693 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1694 .slot = 3,
1695 },
1696 {
1697 .label = "lc4_synced",
1698 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1699 .mask = BIT(3),
1700 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1701 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1702 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1703 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1704 .slot = 4,
1705 },
1706 {
1707 .label = "lc5_synced",
1708 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1709 .mask = BIT(4),
1710 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1711 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1712 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1713 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1714 .slot = 5,
1715 },
1716 {
1717 .label = "lc6_synced",
1718 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1719 .mask = BIT(5),
1720 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1721 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1722 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1723 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1724 .slot = 6,
1725 },
1726 {
1727 .label = "lc7_synced",
1728 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1729 .mask = BIT(6),
1730 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1731 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1732 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1733 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1734 .slot = 7,
1735 },
1736 {
1737 .label = "lc8_synced",
1738 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1739 .mask = BIT(7),
1740 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1741 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1742 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1743 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1744 .slot = 8,
1745 },
1746};
1747
1748static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_act_data[] = {
1749 {
1750 .label = "lc1_active",
1751 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1752 .mask = BIT(0),
1753 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1754 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1755 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1756 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1757 .slot = 1,
1758 },
1759 {
1760 .label = "lc2_active",
1761 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1762 .mask = BIT(1),
1763 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1764 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1765 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1766 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1767 .slot = 2,
1768 },
1769 {
1770 .label = "lc3_active",
1771 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1772 .mask = BIT(2),
1773 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1774 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1775 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1776 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1777 .slot = 3,
1778 },
1779 {
1780 .label = "lc4_active",
1781 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1782 .mask = BIT(3),
1783 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1784 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1785 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1786 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1787 .slot = 4,
1788 },
1789 {
1790 .label = "lc5_active",
1791 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1792 .mask = BIT(4),
1793 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1794 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1795 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1796 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1797 .slot = 5,
1798 },
1799 {
1800 .label = "lc6_active",
1801 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1802 .mask = BIT(5),
1803 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1804 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1805 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1806 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1807 .slot = 6,
1808 },
1809 {
1810 .label = "lc7_active",
1811 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1812 .mask = BIT(6),
1813 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1814 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1815 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1816 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1817 .slot = 7,
1818 },
1819 {
1820 .label = "lc8_active",
1821 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
1822 .mask = BIT(7),
1823 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1824 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1825 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1826 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1827 .slot = 8,
1828 },
1829};
1830
1831static struct mlxreg_core_data mlxplat_mlxcpld_modular_lc_sd_data[] = {
1832 {
1833 .label = "lc1_shutdown",
1834 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1835 .mask = BIT(0),
1836 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[0],
1837 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(0),
1838 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1839 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[0],
1840 .slot = 1,
1841 },
1842 {
1843 .label = "lc2_shutdown",
1844 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1845 .mask = BIT(1),
1846 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[1],
1847 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(1),
1848 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1849 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[1],
1850 .slot = 2,
1851 },
1852 {
1853 .label = "lc3_shutdown",
1854 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1855 .mask = BIT(2),
1856 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[2],
1857 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(2),
1858 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1859 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[2],
1860 .slot = 3,
1861 },
1862 {
1863 .label = "lc4_shutdown",
1864 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1865 .mask = BIT(3),
1866 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[3],
1867 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(3),
1868 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1869 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[3],
1870 .slot = 4,
1871 },
1872 {
1873 .label = "lc5_shutdown",
1874 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1875 .mask = BIT(4),
1876 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[4],
1877 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(4),
1878 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1879 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[4],
1880 .slot = 5,
1881 },
1882 {
1883 .label = "lc6_shutdown",
1884 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1885 .mask = BIT(5),
1886 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[5],
1887 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(5),
1888 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1889 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[5],
1890 .slot = 6,
1891 },
1892 {
1893 .label = "lc7_shutdown",
1894 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1895 .mask = BIT(6),
1896 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[6],
1897 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(6),
1898 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1899 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[6],
1900 .slot = 7,
1901 },
1902 {
1903 .label = "lc8_shutdown",
1904 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
1905 .mask = BIT(7),
1906 .hpdev.brdinfo = &mlxplat_mlxcpld_lc_i2c_dev[7],
1907 .hpdev.nr = MLXPLAT_CPLD_NR_LC_SET(7),
1908 .hpdev.action = MLXREG_HOTPLUG_DEVICE_NO_ACTION,
1909 .hpdev.notifier = &mlxplat_mlxcpld_modular_lc_notifier[7],
1910 .slot = 8,
1911 },
1912};
1913
1914static struct mlxreg_core_item mlxplat_mlxcpld_modular_items[] = {
1915 {
1916 .data = mlxplat_mlxcpld_ext_psu_items_data,
1917 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1918 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
1919 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
1920 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1921 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
1922 .inversed = 1,
1923 .health = false,
1924 },
1925 {
1926 .data = mlxplat_mlxcpld_modular_pwr_items_data,
1927 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1928 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
1929 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
1930 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
1931 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
1932 .inversed = 0,
1933 .health = false,
1934 },
1935 {
1936 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
1937 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1938 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1939 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
1940 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
1941 .inversed = 1,
1942 .health = false,
1943 },
1944 {
1945 .data = mlxplat_mlxcpld_modular_asic_items_data,
1946 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
1947 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1948 .mask = MLXPLAT_CPLD_ASIC_MASK,
1949 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_asic_items_data),
1950 .inversed = 0,
1951 .health = true,
1952 },
1953 {
1954 .data = mlxplat_mlxcpld_modular_lc_pr_items_data,
1955 .kind = MLXREG_HOTPLUG_LC_PRESENT,
1956 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1957 .reg = MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET,
1958 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1959 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pr_items_data),
1960 .inversed = 1,
1961 .health = false,
1962 },
1963 {
1964 .data = mlxplat_mlxcpld_modular_lc_ver_items_data,
1965 .kind = MLXREG_HOTPLUG_LC_VERIFIED,
1966 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1967 .reg = MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET,
1968 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1969 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ver_items_data),
1970 .inversed = 0,
1971 .health = false,
1972 },
1973 {
1974 .data = mlxplat_mlxcpld_modular_lc_pg_data,
1975 .kind = MLXREG_HOTPLUG_LC_POWERED,
1976 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1977 .reg = MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET,
1978 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1979 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_pg_data),
1980 .inversed = 0,
1981 .health = false,
1982 },
1983 {
1984 .data = mlxplat_mlxcpld_modular_lc_ready_data,
1985 .kind = MLXREG_HOTPLUG_LC_READY,
1986 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1987 .reg = MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET,
1988 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1989 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_ready_data),
1990 .inversed = 0,
1991 .health = false,
1992 },
1993 {
1994 .data = mlxplat_mlxcpld_modular_lc_synced_data,
1995 .kind = MLXREG_HOTPLUG_LC_SYNCED,
1996 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
1997 .reg = MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET,
1998 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
1999 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_synced_data),
2000 .inversed = 0,
2001 .health = false,
2002 },
2003 {
2004 .data = mlxplat_mlxcpld_modular_lc_act_data,
2005 .kind = MLXREG_HOTPLUG_LC_ACTIVE,
2006 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2007 .reg = MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET,
2008 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2009 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_act_data),
2010 .inversed = 0,
2011 .health = false,
2012 },
2013 {
2014 .data = mlxplat_mlxcpld_modular_lc_sd_data,
2015 .kind = MLXREG_HOTPLUG_LC_THERMAL,
2016 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_LC,
2017 .reg = MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET,
2018 .mask = MLXPLAT_CPLD_LPC_LC_MASK,
2019 .count = ARRAY_SIZE(mlxplat_mlxcpld_modular_lc_sd_data),
2020 .inversed = 0,
2021 .health = false,
2022 },
2023};
2024
2025static
2026struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_modular_data = {
2027 .items = mlxplat_mlxcpld_modular_items,
2028 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_items),
2029 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2030 .mask = MLXPLAT_CPLD_AGGR_MASK_MODULAR,
2031 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2032 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2033};
2034
2035/* Platform hotplug for NVLink blade systems family data */
2036static struct mlxreg_core_data mlxplat_mlxcpld_global_wp_items_data[] = {
2037 {
2038 .label = "global_wp_grant",
2039 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2040 .mask = MLXPLAT_CPLD_GWP_MASK,
2041 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
2042 },
2043};
2044
2045static struct mlxreg_core_item mlxplat_mlxcpld_nvlink_blade_items[] = {
2046 {
2047 .data = mlxplat_mlxcpld_global_wp_items_data,
2048 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
2049 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
2050 .mask = MLXPLAT_CPLD_GWP_MASK,
2051 .count = ARRAY_SIZE(mlxplat_mlxcpld_global_wp_items_data),
2052 .inversed = 0,
2053 .health = false,
2054 },
2055};
2056
2057static
2058struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_nvlink_blade_data = {
2059 .items = mlxplat_mlxcpld_nvlink_blade_items,
2060 .counter = ARRAY_SIZE(mlxplat_mlxcpld_nvlink_blade_items),
2061 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
2062 .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
2063 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
2064 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
2065};
2066
2067/* Platform led default data */
2068static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
2069 {
2070 .label = "status:green",
2071 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2072 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2073 },
2074 {
2075 .label = "status:red",
2076 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2077 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2078 },
2079 {
2080 .label = "psu:green",
2081 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2082 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2083 },
2084 {
2085 .label = "psu:red",
2086 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2087 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2088 },
2089 {
2090 .label = "fan1:green",
2091 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2092 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2093 },
2094 {
2095 .label = "fan1:red",
2096 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2097 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2098 },
2099 {
2100 .label = "fan2:green",
2101 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2102 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2103 },
2104 {
2105 .label = "fan2:red",
2106 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2107 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2108 },
2109 {
2110 .label = "fan3:green",
2111 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2112 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2113 },
2114 {
2115 .label = "fan3:red",
2116 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2117 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2118 },
2119 {
2120 .label = "fan4:green",
2121 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2122 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2123 },
2124 {
2125 .label = "fan4:red",
2126 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2127 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2128 },
2129};
2130
2131static struct mlxreg_core_platform_data mlxplat_default_led_data = {
2132 .data = mlxplat_mlxcpld_default_led_data,
2133 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
2134};
2135
2136/* Platform led default data for water cooling */
2137static struct mlxreg_core_data mlxplat_mlxcpld_default_led_wc_data[] = {
2138 {
2139 .label = "status:green",
2140 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2141 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2142 },
2143 {
2144 .label = "status:red",
2145 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2146 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2147 },
2148 {
2149 .label = "psu:green",
2150 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2151 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2152 },
2153 {
2154 .label = "psu:red",
2155 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2156 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2157 },
2158};
2159
2160static struct mlxreg_core_platform_data mlxplat_default_led_wc_data = {
2161 .data = mlxplat_mlxcpld_default_led_wc_data,
2162 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_wc_data),
2163};
2164
2165/* Platform led default data for water cooling Ethernet switch blade */
2166static struct mlxreg_core_data mlxplat_mlxcpld_default_led_eth_wc_blade_data[] = {
2167 {
2168 .label = "status:green",
2169 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2170 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2171 },
2172 {
2173 .label = "status:red",
2174 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2175 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2176 },
2177};
2178
2179static struct mlxreg_core_platform_data mlxplat_default_led_eth_wc_blade_data = {
2180 .data = mlxplat_mlxcpld_default_led_eth_wc_blade_data,
2181 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_eth_wc_blade_data),
2182};
2183
2184/* Platform led MSN21xx system family data */
2185static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
2186 {
2187 .label = "status:green",
2188 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2189 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2190 },
2191 {
2192 .label = "status:red",
2193 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2194 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2195 },
2196 {
2197 .label = "fan:green",
2198 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2199 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2200 },
2201 {
2202 .label = "fan:red",
2203 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2204 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2205 },
2206 {
2207 .label = "psu1:green",
2208 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2209 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2210 },
2211 {
2212 .label = "psu1:red",
2213 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2214 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2215 },
2216 {
2217 .label = "psu2:green",
2218 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2219 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2220 },
2221 {
2222 .label = "psu2:red",
2223 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2224 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2225 },
2226 {
2227 .label = "uid:blue",
2228 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2229 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2230 },
2231};
2232
2233static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
2234 .data = mlxplat_mlxcpld_msn21xx_led_data,
2235 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
2236};
2237
2238/* Platform led for default data for 200GbE systems */
2239static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
2240 {
2241 .label = "status:green",
2242 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2243 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2244 },
2245 {
2246 .label = "status:orange",
2247 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2248 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2249 },
2250 {
2251 .label = "psu:green",
2252 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2253 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2254 },
2255 {
2256 .label = "psu:orange",
2257 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2258 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2259 },
2260 {
2261 .label = "fan1:green",
2262 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2263 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2264 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2265 .bit = BIT(0),
2266 },
2267 {
2268 .label = "fan1:orange",
2269 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2270 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2271 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2272 .bit = BIT(0),
2273 },
2274 {
2275 .label = "fan2:green",
2276 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2277 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2278 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2279 .bit = BIT(1),
2280 },
2281 {
2282 .label = "fan2:orange",
2283 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2284 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2285 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2286 .bit = BIT(1),
2287 },
2288 {
2289 .label = "fan3:green",
2290 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2291 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2292 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2293 .bit = BIT(2),
2294 },
2295 {
2296 .label = "fan3:orange",
2297 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2298 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2299 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2300 .bit = BIT(2),
2301 },
2302 {
2303 .label = "fan4:green",
2304 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2305 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2306 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2307 .bit = BIT(3),
2308 },
2309 {
2310 .label = "fan4:orange",
2311 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2312 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2313 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2314 .bit = BIT(3),
2315 },
2316 {
2317 .label = "fan5:green",
2318 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2319 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2320 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2321 .bit = BIT(4),
2322 },
2323 {
2324 .label = "fan5:orange",
2325 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2326 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2327 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2328 .bit = BIT(4),
2329 },
2330 {
2331 .label = "fan6:green",
2332 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2333 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2334 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2335 .bit = BIT(5),
2336 },
2337 {
2338 .label = "fan6:orange",
2339 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2340 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2341 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2342 .bit = BIT(5),
2343 },
2344 {
2345 .label = "fan7:green",
2346 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2347 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2348 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2349 .bit = BIT(6),
2350 },
2351 {
2352 .label = "fan7:orange",
2353 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2354 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2355 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2356 .bit = BIT(6),
2357 },
2358 {
2359 .label = "uid:blue",
2360 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2361 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2362 },
2363};
2364
2365static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
2366 .data = mlxplat_mlxcpld_default_ng_led_data,
2367 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
2368};
2369
2370/* Platform led for Comex based 100GbE systems */
2371static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
2372 {
2373 .label = "status:green",
2374 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2375 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2376 },
2377 {
2378 .label = "status:red",
2379 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2380 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2381 },
2382 {
2383 .label = "psu:green",
2384 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2385 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2386 },
2387 {
2388 .label = "psu:red",
2389 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2390 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2391 },
2392 {
2393 .label = "fan1:green",
2394 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2395 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2396 },
2397 {
2398 .label = "fan1:red",
2399 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2400 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2401 },
2402 {
2403 .label = "fan2:green",
2404 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2405 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2406 },
2407 {
2408 .label = "fan2:red",
2409 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2410 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2411 },
2412 {
2413 .label = "fan3:green",
2414 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2415 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2416 },
2417 {
2418 .label = "fan3:red",
2419 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2420 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2421 },
2422 {
2423 .label = "fan4:green",
2424 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2425 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2426 },
2427 {
2428 .label = "fan4:red",
2429 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2430 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2431 },
2432 {
2433 .label = "uid:blue",
2434 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2435 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2436 },
2437};
2438
2439static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
2440 .data = mlxplat_mlxcpld_comex_100G_led_data,
2441 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
2442};
2443
2444/* Platform led for data for modular systems */
2445static struct mlxreg_core_data mlxplat_mlxcpld_modular_led_data[] = {
2446 {
2447 .label = "status:green",
2448 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2449 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2450 },
2451 {
2452 .label = "status:orange",
2453 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2454 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
2455 },
2456 {
2457 .label = "psu:green",
2458 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2459 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2460 },
2461 {
2462 .label = "psu:orange",
2463 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
2464 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2465 },
2466 {
2467 .label = "fan1:green",
2468 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2469 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2470 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2471 .bit = BIT(0),
2472 },
2473 {
2474 .label = "fan1:orange",
2475 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2476 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2477 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2478 .bit = BIT(0),
2479 },
2480 {
2481 .label = "fan2:green",
2482 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2483 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2484 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2485 .bit = BIT(1),
2486 },
2487 {
2488 .label = "fan2:orange",
2489 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
2490 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2491 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2492 .bit = BIT(1),
2493 },
2494 {
2495 .label = "fan3:green",
2496 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2497 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2498 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2499 .bit = BIT(2),
2500 },
2501 {
2502 .label = "fan3:orange",
2503 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2504 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2505 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2506 .bit = BIT(2),
2507 },
2508 {
2509 .label = "fan4:green",
2510 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2511 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2512 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2513 .bit = BIT(3),
2514 },
2515 {
2516 .label = "fan4:orange",
2517 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
2518 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2519 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2520 .bit = BIT(3),
2521 },
2522 {
2523 .label = "fan5:green",
2524 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2525 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2526 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2527 .bit = BIT(4),
2528 },
2529 {
2530 .label = "fan5:orange",
2531 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2532 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2533 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2534 .bit = BIT(4),
2535 },
2536 {
2537 .label = "fan6:green",
2538 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2539 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2540 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2541 .bit = BIT(5),
2542 },
2543 {
2544 .label = "fan6:orange",
2545 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
2546 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
2547 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2548 .bit = BIT(5),
2549 },
2550 {
2551 .label = "fan7:green",
2552 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2553 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2554 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2555 .bit = BIT(6),
2556 },
2557 {
2558 .label = "fan7:orange",
2559 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2560 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2561 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
2562 .bit = BIT(6),
2563 },
2564 {
2565 .label = "uid:blue",
2566 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
2567 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2568 },
2569 {
2570 .label = "fan_front:green",
2571 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2572 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2573 },
2574 {
2575 .label = "fan_front:orange",
2576 .reg = MLXPLAT_CPLD_LPC_REG_LED6_OFFSET,
2577 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2578 },
2579 {
2580 .label = "mgmt:green",
2581 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
2582 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2583 },
2584 {
2585 .label = "mgmt:orange",
2586 .reg = MLXPLAT_CPLD_LPC_REG_LED7_OFFSET,
2587 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
2588 },
2589};
2590
2591static struct mlxreg_core_platform_data mlxplat_modular_led_data = {
2592 .data = mlxplat_mlxcpld_modular_led_data,
2593 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_led_data),
2594};
2595
2596/* Platform register access default */
2597static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
2598 {
2599 .label = "cpld1_version",
2600 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2601 .bit = GENMASK(7, 0),
2602 .mode = 0444,
2603 },
2604 {
2605 .label = "cpld2_version",
2606 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2607 .bit = GENMASK(7, 0),
2608 .mode = 0444,
2609 },
2610 {
2611 .label = "cpld1_pn",
2612 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2613 .bit = GENMASK(15, 0),
2614 .mode = 0444,
2615 .regnum = 2,
2616 },
2617 {
2618 .label = "cpld2_pn",
2619 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2620 .bit = GENMASK(15, 0),
2621 .mode = 0444,
2622 .regnum = 2,
2623 },
2624 {
2625 .label = "cpld1_version_min",
2626 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2627 .bit = GENMASK(7, 0),
2628 .mode = 0444,
2629 },
2630 {
2631 .label = "cpld2_version_min",
2632 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2633 .bit = GENMASK(7, 0),
2634 .mode = 0444,
2635 },
2636 {
2637 .label = "reset_long_pb",
2638 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2639 .mask = GENMASK(7, 0) & ~BIT(0),
2640 .mode = 0444,
2641 },
2642 {
2643 .label = "reset_short_pb",
2644 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2645 .mask = GENMASK(7, 0) & ~BIT(1),
2646 .mode = 0444,
2647 },
2648 {
2649 .label = "reset_aux_pwr_or_ref",
2650 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2651 .mask = GENMASK(7, 0) & ~BIT(2),
2652 .mode = 0444,
2653 },
2654 {
2655 .label = "reset_main_pwr_fail",
2656 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2657 .mask = GENMASK(7, 0) & ~BIT(3),
2658 .mode = 0444,
2659 },
2660 {
2661 .label = "reset_sw_reset",
2662 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2663 .mask = GENMASK(7, 0) & ~BIT(4),
2664 .mode = 0444,
2665 },
2666 {
2667 .label = "reset_fw_reset",
2668 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2669 .mask = GENMASK(7, 0) & ~BIT(5),
2670 .mode = 0444,
2671 },
2672 {
2673 .label = "reset_hotswap_or_wd",
2674 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2675 .mask = GENMASK(7, 0) & ~BIT(6),
2676 .mode = 0444,
2677 },
2678 {
2679 .label = "reset_asic_thermal",
2680 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2681 .mask = GENMASK(7, 0) & ~BIT(7),
2682 .mode = 0444,
2683 },
2684 {
2685 .label = "psu1_on",
2686 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2687 .mask = GENMASK(7, 0) & ~BIT(0),
2688 .mode = 0200,
2689 },
2690 {
2691 .label = "psu2_on",
2692 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2693 .mask = GENMASK(7, 0) & ~BIT(1),
2694 .mode = 0200,
2695 },
2696 {
2697 .label = "pwr_cycle",
2698 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2699 .mask = GENMASK(7, 0) & ~BIT(2),
2700 .mode = 0200,
2701 },
2702 {
2703 .label = "pwr_down",
2704 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2705 .mask = GENMASK(7, 0) & ~BIT(3),
2706 .mode = 0200,
2707 },
2708 {
2709 .label = "select_iio",
2710 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
2711 .mask = GENMASK(7, 0) & ~BIT(6),
2712 .mode = 0644,
2713 },
2714 {
2715 .label = "asic_health",
2716 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2717 .mask = MLXPLAT_CPLD_ASIC_MASK,
2718 .bit = 1,
2719 .mode = 0444,
2720 },
2721};
2722
2723static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
2724 .data = mlxplat_mlxcpld_default_regs_io_data,
2725 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
2726};
2727
2728/* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
2729static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
2730 {
2731 .label = "cpld1_version",
2732 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2733 .bit = GENMASK(7, 0),
2734 .mode = 0444,
2735 },
2736 {
2737 .label = "cpld2_version",
2738 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2739 .bit = GENMASK(7, 0),
2740 .mode = 0444,
2741 },
2742 {
2743 .label = "cpld1_pn",
2744 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2745 .bit = GENMASK(15, 0),
2746 .mode = 0444,
2747 .regnum = 2,
2748 },
2749 {
2750 .label = "cpld2_pn",
2751 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2752 .bit = GENMASK(15, 0),
2753 .mode = 0444,
2754 .regnum = 2,
2755 },
2756 {
2757 .label = "cpld1_version_min",
2758 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2759 .bit = GENMASK(7, 0),
2760 .mode = 0444,
2761 },
2762 {
2763 .label = "cpld2_version_min",
2764 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2765 .bit = GENMASK(7, 0),
2766 .mode = 0444,
2767 },
2768 {
2769 .label = "reset_long_pb",
2770 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2771 .mask = GENMASK(7, 0) & ~BIT(0),
2772 .mode = 0444,
2773 },
2774 {
2775 .label = "reset_short_pb",
2776 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2777 .mask = GENMASK(7, 0) & ~BIT(1),
2778 .mode = 0444,
2779 },
2780 {
2781 .label = "reset_aux_pwr_or_ref",
2782 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2783 .mask = GENMASK(7, 0) & ~BIT(2),
2784 .mode = 0444,
2785 },
2786 {
2787 .label = "reset_sw_reset",
2788 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2789 .mask = GENMASK(7, 0) & ~BIT(3),
2790 .mode = 0444,
2791 },
2792 {
2793 .label = "reset_main_pwr_fail",
2794 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2795 .mask = GENMASK(7, 0) & ~BIT(4),
2796 .mode = 0444,
2797 },
2798 {
2799 .label = "reset_asic_thermal",
2800 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2801 .mask = GENMASK(7, 0) & ~BIT(5),
2802 .mode = 0444,
2803 },
2804 {
2805 .label = "reset_hotswap_or_halt",
2806 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2807 .mask = GENMASK(7, 0) & ~BIT(6),
2808 .mode = 0444,
2809 },
2810 {
2811 .label = "reset_sff_wd",
2812 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
2813 .mask = GENMASK(7, 0) & ~BIT(6),
2814 .mode = 0444,
2815 },
2816 {
2817 .label = "psu1_on",
2818 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2819 .mask = GENMASK(7, 0) & ~BIT(0),
2820 .mode = 0200,
2821 },
2822 {
2823 .label = "psu2_on",
2824 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2825 .mask = GENMASK(7, 0) & ~BIT(1),
2826 .mode = 0200,
2827 },
2828 {
2829 .label = "pwr_cycle",
2830 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2831 .mask = GENMASK(7, 0) & ~BIT(2),
2832 .mode = 0200,
2833 },
2834 {
2835 .label = "pwr_down",
2836 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
2837 .mask = GENMASK(7, 0) & ~BIT(3),
2838 .mode = 0200,
2839 },
2840 {
2841 .label = "select_iio",
2842 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
2843 .mask = GENMASK(7, 0) & ~BIT(6),
2844 .mode = 0644,
2845 },
2846 {
2847 .label = "asic_health",
2848 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
2849 .mask = MLXPLAT_CPLD_ASIC_MASK,
2850 .bit = 1,
2851 .mode = 0444,
2852 },
2853};
2854
2855static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
2856 .data = mlxplat_mlxcpld_msn21xx_regs_io_data,
2857 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
2858};
2859
2860/* Platform register access for next generation systems families data */
2861static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
2862 {
2863 .label = "cpld1_version",
2864 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
2865 .bit = GENMASK(7, 0),
2866 .mode = 0444,
2867 },
2868 {
2869 .label = "cpld2_version",
2870 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
2871 .bit = GENMASK(7, 0),
2872 .mode = 0444,
2873 },
2874 {
2875 .label = "cpld3_version",
2876 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
2877 .bit = GENMASK(7, 0),
2878 .mode = 0444,
2879 },
2880 {
2881 .label = "cpld4_version",
2882 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
2883 .bit = GENMASK(7, 0),
2884 .mode = 0444,
2885 },
2886 {
2887 .label = "cpld1_pn",
2888 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
2889 .bit = GENMASK(15, 0),
2890 .mode = 0444,
2891 .regnum = 2,
2892 },
2893 {
2894 .label = "cpld2_pn",
2895 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
2896 .bit = GENMASK(15, 0),
2897 .mode = 0444,
2898 .regnum = 2,
2899 },
2900 {
2901 .label = "cpld3_pn",
2902 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
2903 .bit = GENMASK(15, 0),
2904 .mode = 0444,
2905 .regnum = 2,
2906 },
2907 {
2908 .label = "cpld4_pn",
2909 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
2910 .bit = GENMASK(15, 0),
2911 .mode = 0444,
2912 .regnum = 2,
2913 },
2914 {
2915 .label = "cpld1_version_min",
2916 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
2917 .bit = GENMASK(7, 0),
2918 .mode = 0444,
2919 },
2920 {
2921 .label = "cpld2_version_min",
2922 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
2923 .bit = GENMASK(7, 0),
2924 .mode = 0444,
2925 },
2926 {
2927 .label = "cpld3_version_min",
2928 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
2929 .bit = GENMASK(7, 0),
2930 .mode = 0444,
2931 },
2932 {
2933 .label = "cpld4_version_min",
2934 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
2935 .bit = GENMASK(7, 0),
2936 .mode = 0444,
2937 },
2938 {
2939 .label = "asic_reset",
2940 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
2941 .mask = GENMASK(7, 0) & ~BIT(3),
2942 .mode = 0200,
2943 },
2944 {
2945 .label = "asic2_reset",
2946 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP2_OFFSET,
2947 .mask = GENMASK(7, 0) & ~BIT(2),
2948 .mode = 0200,
2949 },
2950 {
2951 .label = "reset_long_pb",
2952 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2953 .mask = GENMASK(7, 0) & ~BIT(0),
2954 .mode = 0444,
2955 },
2956 {
2957 .label = "reset_short_pb",
2958 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2959 .mask = GENMASK(7, 0) & ~BIT(1),
2960 .mode = 0444,
2961 },
2962 {
2963 .label = "reset_aux_pwr_or_ref",
2964 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2965 .mask = GENMASK(7, 0) & ~BIT(2),
2966 .mode = 0444,
2967 },
2968 {
2969 .label = "reset_from_comex",
2970 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2971 .mask = GENMASK(7, 0) & ~BIT(4),
2972 .mode = 0444,
2973 },
2974 {
2975 .label = "reset_from_asic",
2976 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2977 .mask = GENMASK(7, 0) & ~BIT(5),
2978 .mode = 0444,
2979 },
2980 {
2981 .label = "reset_swb_wd",
2982 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2983 .mask = GENMASK(7, 0) & ~BIT(6),
2984 .mode = 0444,
2985 },
2986 {
2987 .label = "reset_asic_thermal",
2988 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2989 .mask = GENMASK(7, 0) & ~BIT(7),
2990 .mode = 0444,
2991 },
2992 {
2993 .label = "reset_comex_pwr_fail",
2994 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
2995 .mask = GENMASK(7, 0) & ~BIT(3),
2996 .mode = 0444,
2997 },
2998 {
2999 .label = "reset_platform",
3000 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3001 .mask = GENMASK(7, 0) & ~BIT(4),
3002 .mode = 0444,
3003 },
3004 {
3005 .label = "reset_soc",
3006 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3007 .mask = GENMASK(7, 0) & ~BIT(5),
3008 .mode = 0444,
3009 },
3010 {
3011 .label = "reset_comex_wd",
3012 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3013 .mask = GENMASK(7, 0) & ~BIT(6),
3014 .mode = 0444,
3015 },
3016 {
3017 .label = "reset_voltmon_upgrade_fail",
3018 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3019 .mask = GENMASK(7, 0) & ~BIT(0),
3020 .mode = 0444,
3021 },
3022 {
3023 .label = "reset_system",
3024 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3025 .mask = GENMASK(7, 0) & ~BIT(1),
3026 .mode = 0444,
3027 },
3028 {
3029 .label = "reset_sw_pwr_off",
3030 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3031 .mask = GENMASK(7, 0) & ~BIT(2),
3032 .mode = 0444,
3033 },
3034 {
3035 .label = "reset_comex_thermal",
3036 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3037 .mask = GENMASK(7, 0) & ~BIT(3),
3038 .mode = 0444,
3039 },
3040 {
3041 .label = "reset_reload_bios",
3042 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3043 .mask = GENMASK(7, 0) & ~BIT(5),
3044 .mode = 0444,
3045 },
3046 {
3047 .label = "reset_ac_pwr_fail",
3048 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3049 .mask = GENMASK(7, 0) & ~BIT(6),
3050 .mode = 0444,
3051 },
3052 {
3053 .label = "psu1_on",
3054 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3055 .mask = GENMASK(7, 0) & ~BIT(0),
3056 .mode = 0200,
3057 },
3058 {
3059 .label = "psu2_on",
3060 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3061 .mask = GENMASK(7, 0) & ~BIT(1),
3062 .mode = 0200,
3063 },
3064 {
3065 .label = "pwr_cycle",
3066 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3067 .mask = GENMASK(7, 0) & ~BIT(2),
3068 .mode = 0200,
3069 },
3070 {
3071 .label = "pwr_down",
3072 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3073 .mask = GENMASK(7, 0) & ~BIT(3),
3074 .mode = 0200,
3075 },
3076 {
3077 .label = "jtag_enable",
3078 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3079 .mask = GENMASK(7, 0) & ~BIT(4),
3080 .mode = 0644,
3081 },
3082 {
3083 .label = "asic_health",
3084 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3085 .mask = MLXPLAT_CPLD_ASIC_MASK,
3086 .bit = 1,
3087 .mode = 0444,
3088 },
3089 {
3090 .label = "asic2_health",
3091 .reg = MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET,
3092 .mask = MLXPLAT_CPLD_ASIC_MASK,
3093 .bit = 1,
3094 .mode = 0444,
3095 },
3096 {
3097 .label = "fan_dir",
3098 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
3099 .bit = GENMASK(7, 0),
3100 .mode = 0444,
3101 },
3102 {
3103 .label = "bios_safe_mode",
3104 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3105 .mask = GENMASK(7, 0) & ~BIT(4),
3106 .mode = 0444,
3107 },
3108 {
3109 .label = "bios_active_image",
3110 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3111 .mask = GENMASK(7, 0) & ~BIT(5),
3112 .mode = 0444,
3113 },
3114 {
3115 .label = "bios_auth_fail",
3116 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3117 .mask = GENMASK(7, 0) & ~BIT(6),
3118 .mode = 0444,
3119 },
3120 {
3121 .label = "bios_upgrade_fail",
3122 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3123 .mask = GENMASK(7, 0) & ~BIT(7),
3124 .mode = 0444,
3125 },
3126 {
3127 .label = "voltreg_update_status",
3128 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3129 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3130 .bit = 5,
3131 .mode = 0444,
3132 },
3133 {
3134 .label = "vpd_wp",
3135 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3136 .mask = GENMASK(7, 0) & ~BIT(3),
3137 .mode = 0644,
3138 },
3139 {
3140 .label = "pcie_asic_reset_dis",
3141 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3142 .mask = GENMASK(7, 0) & ~BIT(4),
3143 .mode = 0644,
3144 },
3145 {
3146 .label = "config1",
3147 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3148 .bit = GENMASK(7, 0),
3149 .mode = 0444,
3150 },
3151 {
3152 .label = "config2",
3153 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3154 .bit = GENMASK(7, 0),
3155 .mode = 0444,
3156 },
3157 {
3158 .label = "config3",
3159 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3160 .bit = GENMASK(7, 0),
3161 .mode = 0444,
3162 },
3163 {
3164 .label = "ufm_version",
3165 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3166 .bit = GENMASK(7, 0),
3167 .mode = 0444,
3168 },
3169};
3170
3171static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
3172 .data = mlxplat_mlxcpld_default_ng_regs_io_data,
3173 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
3174};
3175
3176/* Platform register access for modular systems families data */
3177static struct mlxreg_core_data mlxplat_mlxcpld_modular_regs_io_data[] = {
3178 {
3179 .label = "cpld1_version",
3180 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3181 .bit = GENMASK(7, 0),
3182 .mode = 0444,
3183 },
3184 {
3185 .label = "cpld2_version",
3186 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
3187 .bit = GENMASK(7, 0),
3188 .mode = 0444,
3189 },
3190 {
3191 .label = "cpld3_version",
3192 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
3193 .bit = GENMASK(7, 0),
3194 .mode = 0444,
3195 },
3196 {
3197 .label = "cpld4_version",
3198 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
3199 .bit = GENMASK(7, 0),
3200 .mode = 0444,
3201 },
3202 {
3203 .label = "cpld1_pn",
3204 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3205 .bit = GENMASK(15, 0),
3206 .mode = 0444,
3207 .regnum = 2,
3208 },
3209 {
3210 .label = "cpld2_pn",
3211 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
3212 .bit = GENMASK(15, 0),
3213 .mode = 0444,
3214 .regnum = 2,
3215 },
3216 {
3217 .label = "cpld3_pn",
3218 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
3219 .bit = GENMASK(15, 0),
3220 .mode = 0444,
3221 .regnum = 2,
3222 },
3223 {
3224 .label = "cpld4_pn",
3225 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
3226 .bit = GENMASK(15, 0),
3227 .mode = 0444,
3228 .regnum = 2,
3229 },
3230 {
3231 .label = "cpld1_version_min",
3232 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3233 .bit = GENMASK(7, 0),
3234 .mode = 0444,
3235 },
3236 {
3237 .label = "cpld2_version_min",
3238 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
3239 .bit = GENMASK(7, 0),
3240 .mode = 0444,
3241 },
3242 {
3243 .label = "cpld3_version_min",
3244 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
3245 .bit = GENMASK(7, 0),
3246 .mode = 0444,
3247 },
3248 {
3249 .label = "cpld4_version_min",
3250 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
3251 .bit = GENMASK(7, 0),
3252 .mode = 0444,
3253 },
3254 {
3255 .label = "lc1_enable",
3256 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3257 .mask = GENMASK(7, 0) & ~BIT(0),
3258 .mode = 0644,
3259 },
3260 {
3261 .label = "lc2_enable",
3262 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3263 .mask = GENMASK(7, 0) & ~BIT(1),
3264 .mode = 0644,
3265 },
3266 {
3267 .label = "lc3_enable",
3268 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3269 .mask = GENMASK(7, 0) & ~BIT(2),
3270 .mode = 0644,
3271 },
3272 {
3273 .label = "lc4_enable",
3274 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3275 .mask = GENMASK(7, 0) & ~BIT(3),
3276 .mode = 0644,
3277 },
3278 {
3279 .label = "lc5_enable",
3280 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3281 .mask = GENMASK(7, 0) & ~BIT(4),
3282 .mode = 0644,
3283 },
3284 {
3285 .label = "lc6_enable",
3286 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3287 .mask = GENMASK(7, 0) & ~BIT(5),
3288 .mode = 0644,
3289 },
3290 {
3291 .label = "lc7_enable",
3292 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3293 .mask = GENMASK(7, 0) & ~BIT(6),
3294 .mode = 0644,
3295 },
3296 {
3297 .label = "lc8_enable",
3298 .reg = MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET,
3299 .mask = GENMASK(7, 0) & ~BIT(7),
3300 .mode = 0644,
3301 },
3302 {
3303 .label = "reset_long_pb",
3304 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3305 .mask = GENMASK(7, 0) & ~BIT(0),
3306 .mode = 0444,
3307 },
3308 {
3309 .label = "reset_short_pb",
3310 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3311 .mask = GENMASK(7, 0) & ~BIT(1),
3312 .mode = 0444,
3313 },
3314 {
3315 .label = "reset_aux_pwr_or_fu",
3316 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3317 .mask = GENMASK(7, 0) & ~BIT(2),
3318 .mode = 0444,
3319 },
3320 {
3321 .label = "reset_mgmt_dc_dc_pwr_fail",
3322 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3323 .mask = GENMASK(7, 0) & ~BIT(3),
3324 .mode = 0444,
3325 },
3326 {
3327 .label = "reset_sys_comex_bios",
3328 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3329 .mask = GENMASK(7, 0) & ~BIT(5),
3330 .mode = 0444,
3331 },
3332 {
3333 .label = "reset_sw_reset",
3334 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3335 .mask = GENMASK(7, 0) & ~BIT(0),
3336 .mode = 0444,
3337 },
3338 {
3339 .label = "reset_aux_pwr_or_reload",
3340 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3341 .mask = GENMASK(7, 0) & ~BIT(2),
3342 .mode = 0444,
3343 },
3344 {
3345 .label = "reset_comex_pwr_fail",
3346 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3347 .mask = GENMASK(7, 0) & ~BIT(3),
3348 .mode = 0444,
3349 },
3350 {
3351 .label = "reset_platform",
3352 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3353 .mask = GENMASK(7, 0) & ~BIT(4),
3354 .mode = 0444,
3355 },
3356 {
3357 .label = "reset_soc",
3358 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3359 .mask = GENMASK(7, 0) & ~BIT(5),
3360 .mode = 0444,
3361 },
3362 {
3363 .label = "reset_pwr_off_from_carrier",
3364 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3365 .mask = GENMASK(7, 0) & ~BIT(7),
3366 .mode = 0444,
3367 },
3368 {
3369 .label = "reset_swb_wd",
3370 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3371 .mask = GENMASK(7, 0) & ~BIT(0),
3372 .mode = 0444,
3373 },
3374 {
3375 .label = "reset_swb_aux_pwr_or_fu",
3376 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3377 .mask = GENMASK(7, 0) & ~BIT(2),
3378 .mode = 0444,
3379 },
3380 {
3381 .label = "reset_swb_dc_dc_pwr_fail",
3382 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3383 .mask = GENMASK(7, 0) & ~BIT(3),
3384 .mode = 0444,
3385 },
3386 {
3387 .label = "reset_swb_12v_fail",
3388 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3389 .mask = GENMASK(7, 0) & ~BIT(4),
3390 .mode = 0444,
3391 },
3392 {
3393 .label = "reset_system",
3394 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3395 .mask = GENMASK(7, 0) & ~BIT(5),
3396 .mode = 0444,
3397 },
3398 {
3399 .label = "reset_thermal_spc_or_pciesw",
3400 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3401 .mask = GENMASK(7, 0) & ~BIT(7),
3402 .mode = 0444,
3403 },
3404 {
3405 .label = "bios_safe_mode",
3406 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3407 .mask = GENMASK(7, 0) & ~BIT(4),
3408 .mode = 0444,
3409 },
3410 {
3411 .label = "bios_active_image",
3412 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3413 .mask = GENMASK(7, 0) & ~BIT(5),
3414 .mode = 0444,
3415 },
3416 {
3417 .label = "bios_auth_fail",
3418 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3419 .mask = GENMASK(7, 0) & ~BIT(6),
3420 .mode = 0444,
3421 },
3422 {
3423 .label = "bios_upgrade_fail",
3424 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3425 .mask = GENMASK(7, 0) & ~BIT(7),
3426 .mode = 0444,
3427 },
3428 {
3429 .label = "voltreg_update_status",
3430 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3431 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3432 .bit = 5,
3433 .mode = 0444,
3434 },
3435 {
3436 .label = "vpd_wp",
3437 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3438 .mask = GENMASK(7, 0) & ~BIT(3),
3439 .mode = 0644,
3440 },
3441 {
3442 .label = "pcie_asic_reset_dis",
3443 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3444 .mask = GENMASK(7, 0) & ~BIT(4),
3445 .mode = 0644,
3446 },
3447 {
3448 .label = "shutdown_unlock",
3449 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3450 .mask = GENMASK(7, 0) & ~BIT(5),
3451 .mode = 0644,
3452 },
3453 {
3454 .label = "lc1_rst_mask",
3455 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3456 .mask = GENMASK(7, 0) & ~BIT(0),
3457 .mode = 0200,
3458 },
3459 {
3460 .label = "lc2_rst_mask",
3461 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3462 .mask = GENMASK(7, 0) & ~BIT(1),
3463 .mode = 0200,
3464 },
3465 {
3466 .label = "lc3_rst_mask",
3467 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3468 .mask = GENMASK(7, 0) & ~BIT(2),
3469 .mode = 0200,
3470 },
3471 {
3472 .label = "lc4_rst_mask",
3473 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3474 .mask = GENMASK(7, 0) & ~BIT(3),
3475 .mode = 0200,
3476 },
3477 {
3478 .label = "lc5_rst_mask",
3479 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3480 .mask = GENMASK(7, 0) & ~BIT(4),
3481 .mode = 0200,
3482 },
3483 {
3484 .label = "lc6_rst_mask",
3485 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3486 .mask = GENMASK(7, 0) & ~BIT(5),
3487 .mode = 0200,
3488 },
3489 {
3490 .label = "lc7_rst_mask",
3491 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3492 .mask = GENMASK(7, 0) & ~BIT(6),
3493 .mode = 0200,
3494 },
3495 {
3496 .label = "lc8_rst_mask",
3497 .reg = MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET,
3498 .mask = GENMASK(7, 0) & ~BIT(7),
3499 .mode = 0200,
3500 },
3501 {
3502 .label = "psu1_on",
3503 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3504 .mask = GENMASK(7, 0) & ~BIT(0),
3505 .mode = 0200,
3506 },
3507 {
3508 .label = "psu2_on",
3509 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3510 .mask = GENMASK(7, 0) & ~BIT(1),
3511 .mode = 0200,
3512 },
3513 {
3514 .label = "pwr_cycle",
3515 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3516 .mask = GENMASK(7, 0) & ~BIT(2),
3517 .mode = 0200,
3518 },
3519 {
3520 .label = "pwr_down",
3521 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3522 .mask = GENMASK(7, 0) & ~BIT(3),
3523 .mode = 0200,
3524 },
3525 {
3526 .label = "psu3_on",
3527 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3528 .mask = GENMASK(7, 0) & ~BIT(4),
3529 .mode = 0200,
3530 },
3531 {
3532 .label = "psu4_on",
3533 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3534 .mask = GENMASK(7, 0) & ~BIT(5),
3535 .mode = 0200,
3536 },
3537 {
3538 .label = "auto_power_mode",
3539 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3540 .mask = GENMASK(7, 0) & ~BIT(6),
3541 .mode = 0644,
3542 },
3543 {
3544 .label = "pm_mgmt_en",
3545 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3546 .mask = GENMASK(7, 0) & ~BIT(7),
3547 .mode = 0644,
3548 },
3549 {
3550 .label = "jtag_enable",
3551 .reg = MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE,
3552 .mask = GENMASK(3, 0),
3553 .bit = 1,
3554 .mode = 0644,
3555 },
3556 {
3557 .label = "safe_bios_dis",
3558 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET,
3559 .mask = GENMASK(7, 0) & ~BIT(5),
3560 .mode = 0644,
3561 },
3562 {
3563 .label = "safe_bios_dis_wp",
3564 .reg = MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET,
3565 .mask = GENMASK(7, 0) & ~BIT(5),
3566 .mode = 0644,
3567 },
3568 {
3569 .label = "asic_health",
3570 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
3571 .mask = MLXPLAT_CPLD_ASIC_MASK,
3572 .bit = 1,
3573 .mode = 0444,
3574 },
3575 {
3576 .label = "fan_dir",
3577 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
3578 .bit = GENMASK(7, 0),
3579 .mode = 0444,
3580 },
3581 {
3582 .label = "lc1_pwr",
3583 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3584 .mask = GENMASK(7, 0) & ~BIT(0),
3585 .mode = 0644,
3586 },
3587 {
3588 .label = "lc2_pwr",
3589 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3590 .mask = GENMASK(7, 0) & ~BIT(1),
3591 .mode = 0644,
3592 },
3593 {
3594 .label = "lc3_pwr",
3595 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3596 .mask = GENMASK(7, 0) & ~BIT(2),
3597 .mode = 0644,
3598 },
3599 {
3600 .label = "lc4_pwr",
3601 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3602 .mask = GENMASK(7, 0) & ~BIT(3),
3603 .mode = 0644,
3604 },
3605 {
3606 .label = "lc5_pwr",
3607 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3608 .mask = GENMASK(7, 0) & ~BIT(4),
3609 .mode = 0644,
3610 },
3611 {
3612 .label = "lc6_pwr",
3613 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3614 .mask = GENMASK(7, 0) & ~BIT(5),
3615 .mode = 0644,
3616 },
3617 {
3618 .label = "lc7_pwr",
3619 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3620 .mask = GENMASK(7, 0) & ~BIT(6),
3621 .mode = 0644,
3622 },
3623 {
3624 .label = "lc8_pwr",
3625 .reg = MLXPLAT_CPLD_LPC_REG_LC_PWR_ON,
3626 .mask = GENMASK(7, 0) & ~BIT(7),
3627 .mode = 0644,
3628 },
3629 {
3630 .label = "config1",
3631 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3632 .bit = GENMASK(7, 0),
3633 .mode = 0444,
3634 },
3635 {
3636 .label = "config2",
3637 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3638 .bit = GENMASK(7, 0),
3639 .mode = 0444,
3640 },
3641 {
3642 .label = "config3",
3643 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3644 .bit = GENMASK(7, 0),
3645 .mode = 0444,
3646 },
3647 {
3648 .label = "ufm_version",
3649 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3650 .bit = GENMASK(7, 0),
3651 .mode = 0444,
3652 },
3653};
3654
3655static struct mlxreg_core_platform_data mlxplat_modular_regs_io_data = {
3656 .data = mlxplat_mlxcpld_modular_regs_io_data,
3657 .counter = ARRAY_SIZE(mlxplat_mlxcpld_modular_regs_io_data),
3658};
3659
3660/* Platform register access for NVLink blade systems family data */
3661static struct mlxreg_core_data mlxplat_mlxcpld_nvlink_blade_regs_io_data[] = {
3662 {
3663 .label = "cpld1_version",
3664 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
3665 .bit = GENMASK(7, 0),
3666 .mode = 0444,
3667 },
3668 {
3669 .label = "cpld1_pn",
3670 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
3671 .bit = GENMASK(15, 0),
3672 .mode = 0444,
3673 .regnum = 2,
3674 },
3675 {
3676 .label = "cpld1_version_min",
3677 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
3678 .bit = GENMASK(7, 0),
3679 .mode = 0444,
3680 },
3681 {
3682 .label = "reset_aux_pwr_or_ref",
3683 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3684 .mask = GENMASK(7, 0) & ~BIT(2),
3685 .mode = 0444,
3686 },
3687 {
3688 .label = "reset_from_comex",
3689 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
3690 .mask = GENMASK(7, 0) & ~BIT(4),
3691 .mode = 0444,
3692 },
3693 {
3694 .label = "reset_comex_pwr_fail",
3695 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3696 .mask = GENMASK(7, 0) & ~BIT(3),
3697 .mode = 0444,
3698 },
3699 {
3700 .label = "reset_platform",
3701 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3702 .mask = GENMASK(7, 0) & ~BIT(4),
3703 .mode = 0444,
3704 },
3705 {
3706 .label = "reset_soc",
3707 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3708 .mask = GENMASK(7, 0) & ~BIT(5),
3709 .mode = 0444,
3710 },
3711 {
3712 .label = "reset_comex_wd",
3713 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
3714 .mask = GENMASK(7, 0) & ~BIT(6),
3715 .mode = 0444,
3716 },
3717 {
3718 .label = "reset_voltmon_upgrade_fail",
3719 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3720 .mask = GENMASK(7, 0) & ~BIT(0),
3721 .mode = 0444,
3722 },
3723 {
3724 .label = "reset_system",
3725 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3726 .mask = GENMASK(7, 0) & ~BIT(1),
3727 .mode = 0444,
3728 },
3729 {
3730 .label = "reset_sw_pwr_off",
3731 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3732 .mask = GENMASK(7, 0) & ~BIT(2),
3733 .mode = 0444,
3734 },
3735 {
3736 .label = "reset_comex_thermal",
3737 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3738 .mask = GENMASK(7, 0) & ~BIT(3),
3739 .mode = 0444,
3740 },
3741 {
3742 .label = "reset_reload_bios",
3743 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3744 .mask = GENMASK(7, 0) & ~BIT(5),
3745 .mode = 0444,
3746 },
3747 {
3748 .label = "reset_ac_pwr_fail",
3749 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
3750 .mask = GENMASK(7, 0) & ~BIT(6),
3751 .mode = 0444,
3752 },
3753 {
3754 .label = "pwr_cycle",
3755 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3756 .mask = GENMASK(7, 0) & ~BIT(2),
3757 .mode = 0200,
3758 },
3759 {
3760 .label = "pwr_down",
3761 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
3762 .mask = GENMASK(7, 0) & ~BIT(3),
3763 .mode = 0200,
3764 },
3765 {
3766 .label = "global_wp_request",
3767 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3768 .mask = GENMASK(7, 0) & ~BIT(0),
3769 .mode = 0644,
3770 },
3771 {
3772 .label = "jtag_enable",
3773 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3774 .mask = GENMASK(7, 0) & ~BIT(4),
3775 .mode = 0644,
3776 },
3777 {
3778 .label = "comm_chnl_ready",
3779 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
3780 .mask = GENMASK(7, 0) & ~BIT(6),
3781 .mode = 0200,
3782 },
3783 {
3784 .label = "bios_safe_mode",
3785 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3786 .mask = GENMASK(7, 0) & ~BIT(4),
3787 .mode = 0444,
3788 },
3789 {
3790 .label = "bios_active_image",
3791 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3792 .mask = GENMASK(7, 0) & ~BIT(5),
3793 .mode = 0444,
3794 },
3795 {
3796 .label = "bios_auth_fail",
3797 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3798 .mask = GENMASK(7, 0) & ~BIT(6),
3799 .mode = 0444,
3800 },
3801 {
3802 .label = "bios_upgrade_fail",
3803 .reg = MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET,
3804 .mask = GENMASK(7, 0) & ~BIT(7),
3805 .mode = 0444,
3806 },
3807 {
3808 .label = "voltreg_update_status",
3809 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
3810 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
3811 .bit = 5,
3812 .mode = 0444,
3813 },
3814 {
3815 .label = "vpd_wp",
3816 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3817 .mask = GENMASK(7, 0) & ~BIT(3),
3818 .mode = 0644,
3819 },
3820 {
3821 .label = "pcie_asic_reset_dis",
3822 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
3823 .mask = GENMASK(7, 0) & ~BIT(4),
3824 .mode = 0644,
3825 },
3826 {
3827 .label = "global_wp_response",
3828 .reg = MLXPLAT_CPLD_LPC_REG_GWP_OFFSET,
3829 .mask = GENMASK(7, 0) & ~BIT(0),
3830 .mode = 0444,
3831 },
3832 {
3833 .label = "config1",
3834 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
3835 .bit = GENMASK(7, 0),
3836 .mode = 0444,
3837 },
3838 {
3839 .label = "config2",
3840 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
3841 .bit = GENMASK(7, 0),
3842 .mode = 0444,
3843 },
3844 {
3845 .label = "config3",
3846 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET,
3847 .bit = GENMASK(7, 0),
3848 .mode = 0444,
3849 },
3850 {
3851 .label = "ufm_version",
3852 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
3853 .bit = GENMASK(7, 0),
3854 .mode = 0444,
3855 },
3856};
3857
3858static struct mlxreg_core_platform_data mlxplat_nvlink_blade_regs_io_data = {
3859 .data = mlxplat_mlxcpld_nvlink_blade_regs_io_data,
3860 .counter = ARRAY_SIZE(mlxplat_mlxcpld_nvlink_blade_regs_io_data),
3861};
3862
3863/* Platform FAN default */
3864static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
3865 {
3866 .label = "pwm1",
3867 .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
3868 },
3869 {
3870 .label = "pwm2",
3871 .reg = MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET,
3872 },
3873 {
3874 .label = "pwm3",
3875 .reg = MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET,
3876 },
3877 {
3878 .label = "pwm4",
3879 .reg = MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET,
3880 },
3881 {
3882 .label = "tacho1",
3883 .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
3884 .mask = GENMASK(7, 0),
3885 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3886 .bit = BIT(0),
3887 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3888
3889 },
3890 {
3891 .label = "tacho2",
3892 .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
3893 .mask = GENMASK(7, 0),
3894 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3895 .bit = BIT(1),
3896 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3897 },
3898 {
3899 .label = "tacho3",
3900 .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
3901 .mask = GENMASK(7, 0),
3902 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3903 .bit = BIT(2),
3904 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3905 },
3906 {
3907 .label = "tacho4",
3908 .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
3909 .mask = GENMASK(7, 0),
3910 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3911 .bit = BIT(3),
3912 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3913 },
3914 {
3915 .label = "tacho5",
3916 .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
3917 .mask = GENMASK(7, 0),
3918 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3919 .bit = BIT(4),
3920 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3921 },
3922 {
3923 .label = "tacho6",
3924 .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
3925 .mask = GENMASK(7, 0),
3926 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3927 .bit = BIT(5),
3928 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3929 },
3930 {
3931 .label = "tacho7",
3932 .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
3933 .mask = GENMASK(7, 0),
3934 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3935 .bit = BIT(6),
3936 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3937 },
3938 {
3939 .label = "tacho8",
3940 .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
3941 .mask = GENMASK(7, 0),
3942 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
3943 .bit = BIT(7),
3944 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3945 },
3946 {
3947 .label = "tacho9",
3948 .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
3949 .mask = GENMASK(7, 0),
3950 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3951 .bit = BIT(0),
3952 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3953 },
3954 {
3955 .label = "tacho10",
3956 .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
3957 .mask = GENMASK(7, 0),
3958 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3959 .bit = BIT(1),
3960 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3961 },
3962 {
3963 .label = "tacho11",
3964 .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
3965 .mask = GENMASK(7, 0),
3966 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3967 .bit = BIT(2),
3968 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3969 },
3970 {
3971 .label = "tacho12",
3972 .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
3973 .mask = GENMASK(7, 0),
3974 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3975 .bit = BIT(3),
3976 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
3977 },
3978 {
3979 .label = "tacho13",
3980 .reg = MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET,
3981 .mask = GENMASK(7, 0),
3982 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3983 .bit = BIT(4),
3984 },
3985 {
3986 .label = "tacho14",
3987 .reg = MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET,
3988 .mask = GENMASK(7, 0),
3989 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
3990 .bit = BIT(5),
3991 },
3992 {
3993 .label = "conf",
3994 .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
3995 },
3996};
3997
3998static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
3999 .data = mlxplat_mlxcpld_default_fan_data,
4000 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
4001 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
4002};
4003
4004/* Watchdog type1: hardware implementation version1
4005 * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
4006 */
4007static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
4008 {
4009 .label = "action",
4010 .reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
4011 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4012 .bit = 0,
4013 },
4014 {
4015 .label = "timeout",
4016 .reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
4017 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
4018 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4019 },
4020 {
4021 .label = "ping",
4022 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
4023 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
4024 .bit = 0,
4025 },
4026 {
4027 .label = "reset",
4028 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4029 .mask = GENMASK(7, 0) & ~BIT(6),
4030 .bit = 6,
4031 },
4032};
4033
4034static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
4035 {
4036 .label = "action",
4037 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4038 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4039 .bit = 4,
4040 },
4041 {
4042 .label = "timeout",
4043 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4044 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
4045 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4046 },
4047 {
4048 .label = "ping",
4049 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
4050 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
4051 .bit = 1,
4052 },
4053};
4054
4055static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
4056 {
4057 .data = mlxplat_mlxcpld_wd_main_regs_type1,
4058 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
4059 .version = MLX_WDT_TYPE1,
4060 .identity = "mlx-wdt-main",
4061 },
4062 {
4063 .data = mlxplat_mlxcpld_wd_aux_regs_type1,
4064 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
4065 .version = MLX_WDT_TYPE1,
4066 .identity = "mlx-wdt-aux",
4067 },
4068};
4069
4070/* Watchdog type2: hardware implementation version 2
4071 * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
4072 */
4073static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
4074 {
4075 .label = "action",
4076 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4077 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4078 .bit = 0,
4079 },
4080 {
4081 .label = "timeout",
4082 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4083 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4084 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4085 },
4086 {
4087 .label = "timeleft",
4088 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
4089 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4090 },
4091 {
4092 .label = "ping",
4093 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4094 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4095 .bit = 0,
4096 },
4097 {
4098 .label = "reset",
4099 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4100 .mask = GENMASK(7, 0) & ~BIT(6),
4101 .bit = 6,
4102 },
4103};
4104
4105static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
4106 {
4107 .label = "action",
4108 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4109 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4110 .bit = 4,
4111 },
4112 {
4113 .label = "timeout",
4114 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4115 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4116 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
4117 },
4118 {
4119 .label = "timeleft",
4120 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
4121 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4122 },
4123 {
4124 .label = "ping",
4125 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4126 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4127 .bit = 4,
4128 },
4129};
4130
4131static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
4132 {
4133 .data = mlxplat_mlxcpld_wd_main_regs_type2,
4134 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
4135 .version = MLX_WDT_TYPE2,
4136 .identity = "mlx-wdt-main",
4137 },
4138 {
4139 .data = mlxplat_mlxcpld_wd_aux_regs_type2,
4140 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
4141 .version = MLX_WDT_TYPE2,
4142 .identity = "mlx-wdt-aux",
4143 },
4144};
4145
4146/* Watchdog type3: hardware implementation version 3
4147 * Can be on all systems. It's differentiated by WD capability bit.
4148 * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
4149 * still have only one main watchdog.
4150 */
4151static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
4152 {
4153 .label = "action",
4154 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4155 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4156 .bit = 0,
4157 },
4158 {
4159 .label = "timeout",
4160 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4161 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4162 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
4163 },
4164 {
4165 .label = "timeleft",
4166 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
4167 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4168 },
4169 {
4170 .label = "ping",
4171 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
4172 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
4173 .bit = 0,
4174 },
4175 {
4176 .label = "reset",
4177 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
4178 .mask = GENMASK(7, 0) & ~BIT(6),
4179 .bit = 6,
4180 },
4181};
4182
4183static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
4184 {
4185 .label = "action",
4186 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4187 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4188 .bit = 4,
4189 },
4190 {
4191 .label = "timeout",
4192 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4193 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4194 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
4195 },
4196 {
4197 .label = "timeleft",
4198 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
4199 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
4200 },
4201 {
4202 .label = "ping",
4203 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
4204 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
4205 .bit = 4,
4206 },
4207};
4208
4209static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
4210 {
4211 .data = mlxplat_mlxcpld_wd_main_regs_type3,
4212 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
4213 .version = MLX_WDT_TYPE3,
4214 .identity = "mlx-wdt-main",
4215 },
4216 {
4217 .data = mlxplat_mlxcpld_wd_aux_regs_type3,
4218 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
4219 .version = MLX_WDT_TYPE3,
4220 .identity = "mlx-wdt-aux",
4221 },
4222};
4223
4224static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
4225{
4226 switch (reg) {
4227 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4228 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4229 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4230 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4231 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4232 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4233 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4234 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4235 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4236 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4237 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4238 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
4239 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4240 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
4241 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4242 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4243 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4244 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4245 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4246 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4247 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4248 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4249 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4250 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4251 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4252 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4253 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4254 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4255 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4256 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4257 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4258 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4259 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4260 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4261 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4262 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4263 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4264 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4265 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4266 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4267 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4268 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4269 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4270 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4271 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4272 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4273 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4274 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4275 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4276 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4277 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
4278 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
4279 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
4280 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
4281 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4282 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4283 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
4284 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4285 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4286 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
4287 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4288 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4289 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4290 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4291 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4292 return true;
4293 }
4294 return false;
4295}
4296
4297static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
4298{
4299 switch (reg) {
4300 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
4301 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
4302 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
4303 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
4304 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
4305 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
4306 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
4307 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
4308 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
4309 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
4310 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
4311 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
4312 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4313 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
4314 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
4315 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
4316 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4317 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4318 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4319 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4320 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4321 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4322 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4323 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
4324 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
4325 case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
4326 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4327 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4328 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4329 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
4330 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4331 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
4332 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4333 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4334 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4335 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
4336 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4337 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
4338 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4339 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
4340 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4341 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
4342 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4343 case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
4344 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4345 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4346 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
4347 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4348 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4349 case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
4350 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4351 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4352 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
4353 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4354 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4355 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
4356 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4357 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4358 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
4359 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4360 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4361 case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
4362 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4363 case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
4364 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4365 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4366 case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
4367 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4368 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4369 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4370 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4371 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4372 case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
4373 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4374 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4375 case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
4376 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4377 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4378 case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
4379 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4380 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4381 case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
4382 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4383 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4384 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4385 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
4386 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
4387 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
4388 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
4389 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4390 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4391 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
4392 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4393 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4394 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
4395 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
4396 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
4397 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
4398 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
4399 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4400 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4401 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4402 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4403 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
4404 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
4405 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
4406 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
4407 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
4408 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
4409 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
4410 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
4411 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
4412 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
4413 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
4414 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
4415 case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
4416 case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
4417 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4418 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
4419 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
4420 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
4421 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
4422 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
4423 case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
4424 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
4425 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
4426 case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
4427 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
4428 return true;
4429 }
4430 return false;
4431}
4432
4433static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
4434{
4435 switch (reg) {
4436 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
4437 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
4438 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
4439 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
4440 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
4441 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN1_OFFSET:
4442 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
4443 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN1_OFFSET:
4444 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
4445 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN1_OFFSET:
4446 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
4447 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN1_OFFSET:
4448 case MLXPLAT_CPLD_LPC_REG_RESET_GP4_OFFSET:
4449 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
4450 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
4451 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
4452 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
4453 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
4454 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
4455 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
4456 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
4457 case MLXPLAT_CPLD_LPC_REG_LED6_OFFSET:
4458 case MLXPLAT_CPLD_LPC_REG_LED7_OFFSET:
4459 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
4460 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
4461 case MLXPLAT_CPLD_LPC_REG_GPCOM0_OFFSET:
4462 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
4463 case MLXPLAT_CPLD_LPC_REG_GP_RST_OFFSET:
4464 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
4465 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
4466 case MLXPLAT_CPLD_LPC_REG_FIELD_UPGRADE:
4467 case MLXPLAT_CPLD_LPC_SAFE_BIOS_OFFSET:
4468 case MLXPLAT_CPLD_LPC_SAFE_BIOS_WP_OFFSET:
4469 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
4470 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
4471 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
4472 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
4473 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
4474 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
4475 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
4476 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
4477 case MLXPLAT_CPLD_LPC_REG_GWP_OFFSET:
4478 case MLXPLAT_CPLD_LPC_REG_GWP_EVENT_OFFSET:
4479 case MLXPLAT_CPLD_LPC_REG_GWP_MASK_OFFSET:
4480 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
4481 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
4482 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
4483 case MLXPLAT_CPLD_LPC_REG_ASIC2_HEALTH_OFFSET:
4484 case MLXPLAT_CPLD_LPC_REG_ASIC2_EVENT_OFFSET:
4485 case MLXPLAT_CPLD_LPC_REG_ASIC2_MASK_OFFSET:
4486 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
4487 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
4488 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
4489 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
4490 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
4491 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
4492 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
4493 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
4494 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
4495 case MLXPLAT_CPLD_LPC_REG_AGGRLC_OFFSET:
4496 case MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET:
4497 case MLXPLAT_CPLD_LPC_REG_LC_IN_OFFSET:
4498 case MLXPLAT_CPLD_LPC_REG_LC_IN_EVENT_OFFSET:
4499 case MLXPLAT_CPLD_LPC_REG_LC_IN_MASK_OFFSET:
4500 case MLXPLAT_CPLD_LPC_REG_LC_VR_OFFSET:
4501 case MLXPLAT_CPLD_LPC_REG_LC_VR_EVENT_OFFSET:
4502 case MLXPLAT_CPLD_LPC_REG_LC_VR_MASK_OFFSET:
4503 case MLXPLAT_CPLD_LPC_REG_LC_PG_OFFSET:
4504 case MLXPLAT_CPLD_LPC_REG_LC_PG_EVENT_OFFSET:
4505 case MLXPLAT_CPLD_LPC_REG_LC_PG_MASK_OFFSET:
4506 case MLXPLAT_CPLD_LPC_REG_LC_RD_OFFSET:
4507 case MLXPLAT_CPLD_LPC_REG_LC_RD_EVENT_OFFSET:
4508 case MLXPLAT_CPLD_LPC_REG_LC_RD_MASK_OFFSET:
4509 case MLXPLAT_CPLD_LPC_REG_LC_OK_OFFSET:
4510 case MLXPLAT_CPLD_LPC_REG_LC_OK_EVENT_OFFSET:
4511 case MLXPLAT_CPLD_LPC_REG_LC_OK_MASK_OFFSET:
4512 case MLXPLAT_CPLD_LPC_REG_LC_SN_OFFSET:
4513 case MLXPLAT_CPLD_LPC_REG_LC_SN_EVENT_OFFSET:
4514 case MLXPLAT_CPLD_LPC_REG_LC_SN_MASK_OFFSET:
4515 case MLXPLAT_CPLD_LPC_REG_LC_SD_OFFSET:
4516 case MLXPLAT_CPLD_LPC_REG_LC_SD_EVENT_OFFSET:
4517 case MLXPLAT_CPLD_LPC_REG_LC_SD_MASK_OFFSET:
4518 case MLXPLAT_CPLD_LPC_REG_LC_PWR_ON:
4519 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
4520 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
4521 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
4522 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
4523 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
4524 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
4525 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
4526 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
4527 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
4528 case MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET:
4529 case MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET:
4530 case MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET:
4531 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
4532 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
4533 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
4534 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
4535 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
4536 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
4537 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
4538 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
4539 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
4540 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
4541 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
4542 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
4543 case MLXPLAT_CPLD_LPC_REG_TACHO13_OFFSET:
4544 case MLXPLAT_CPLD_LPC_REG_TACHO14_OFFSET:
4545 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
4546 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
4547 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
4548 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
4549 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
4550 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
4551 case MLXPLAT_CPLD_LPC_REG_SLOT_QTY_OFFSET:
4552 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
4553 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
4554 case MLXPLAT_CPLD_LPC_REG_CONFIG3_OFFSET:
4555 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
4556 return true;
4557 }
4558 return false;
4559}
4560
4561static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
4562 { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
4563 { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
4564 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4565 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
4566};
4567
4568static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
4569 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4570 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
4571};
4572
4573static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
4574 { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
4575 MLXPLAT_CPLD_LOW_AGGRCX_MASK },
4576 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4577};
4578
4579static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
4580 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4581 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4582 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4583 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4584};
4585
4586static const struct reg_default mlxplat_mlxcpld_regmap_eth_modular[] = {
4587 { MLXPLAT_CPLD_LPC_REG_GP2_OFFSET, 0x61 },
4588 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
4589 { MLXPLAT_CPLD_LPC_REG_PWM2_OFFSET, 0x00 },
4590 { MLXPLAT_CPLD_LPC_REG_PWM3_OFFSET, 0x00 },
4591 { MLXPLAT_CPLD_LPC_REG_PWM4_OFFSET, 0x00 },
4592 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
4593 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
4594 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
4595 { MLXPLAT_CPLD_LPC_REG_AGGRLC_MASK_OFFSET,
4596 MLXPLAT_CPLD_AGGR_MASK_LC_LOW },
4597};
4598
4599struct mlxplat_mlxcpld_regmap_context {
4600 void __iomem *base;
4601};
4602
4603static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
4604
4605static int
4606mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
4607{
4608 struct mlxplat_mlxcpld_regmap_context *ctx = context;
4609
4610 *val = ioread8(ctx->base + reg);
4611 return 0;
4612}
4613
4614static int
4615mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
4616{
4617 struct mlxplat_mlxcpld_regmap_context *ctx = context;
4618
4619 iowrite8(val, ctx->base + reg);
4620 return 0;
4621}
4622
4623static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
4624 .reg_bits = 8,
4625 .val_bits = 8,
4626 .max_register = 255,
4627 .cache_type = REGCACHE_FLAT,
4628 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4629 .readable_reg = mlxplat_mlxcpld_readable_reg,
4630 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4631 .reg_defaults = mlxplat_mlxcpld_regmap_default,
4632 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
4633 .reg_read = mlxplat_mlxcpld_reg_read,
4634 .reg_write = mlxplat_mlxcpld_reg_write,
4635};
4636
4637static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
4638 .reg_bits = 8,
4639 .val_bits = 8,
4640 .max_register = 255,
4641 .cache_type = REGCACHE_FLAT,
4642 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4643 .readable_reg = mlxplat_mlxcpld_readable_reg,
4644 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4645 .reg_defaults = mlxplat_mlxcpld_regmap_ng,
4646 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
4647 .reg_read = mlxplat_mlxcpld_reg_read,
4648 .reg_write = mlxplat_mlxcpld_reg_write,
4649};
4650
4651static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
4652 .reg_bits = 8,
4653 .val_bits = 8,
4654 .max_register = 255,
4655 .cache_type = REGCACHE_FLAT,
4656 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4657 .readable_reg = mlxplat_mlxcpld_readable_reg,
4658 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4659 .reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
4660 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
4661 .reg_read = mlxplat_mlxcpld_reg_read,
4662 .reg_write = mlxplat_mlxcpld_reg_write,
4663};
4664
4665static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
4666 .reg_bits = 8,
4667 .val_bits = 8,
4668 .max_register = 255,
4669 .cache_type = REGCACHE_FLAT,
4670 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4671 .readable_reg = mlxplat_mlxcpld_readable_reg,
4672 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4673 .reg_defaults = mlxplat_mlxcpld_regmap_ng400,
4674 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
4675 .reg_read = mlxplat_mlxcpld_reg_read,
4676 .reg_write = mlxplat_mlxcpld_reg_write,
4677};
4678
4679static const struct regmap_config mlxplat_mlxcpld_regmap_config_eth_modular = {
4680 .reg_bits = 8,
4681 .val_bits = 8,
4682 .max_register = 255,
4683 .cache_type = REGCACHE_FLAT,
4684 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
4685 .readable_reg = mlxplat_mlxcpld_readable_reg,
4686 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
4687 .reg_defaults = mlxplat_mlxcpld_regmap_eth_modular,
4688 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_eth_modular),
4689 .reg_read = mlxplat_mlxcpld_reg_read,
4690 .reg_write = mlxplat_mlxcpld_reg_write,
4691};
4692
4693static struct resource mlxplat_mlxcpld_resources[] = {
4694 [0] = DEFINE_RES_IRQ_NAMED(MLXPLAT_CPLD_LPC_SYSIRQ, "mlxreg-hotplug"),
4695};
4696
4697static struct platform_device *mlxplat_dev;
4698static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
4699static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
4700static struct mlxreg_core_platform_data *mlxplat_led;
4701static struct mlxreg_core_platform_data *mlxplat_regs_io;
4702static struct mlxreg_core_platform_data *mlxplat_fan;
4703static struct mlxreg_core_platform_data
4704 *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
4705static const struct regmap_config *mlxplat_regmap_config;
4706
4707static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
4708{
4709 int i;
4710
4711 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4712 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4713 mlxplat_mux_data = mlxplat_default_mux_data;
4714 for (i = 0; i < mlxplat_mux_num; i++) {
4715 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
4716 mlxplat_mux_data[i].n_values =
4717 ARRAY_SIZE(mlxplat_default_channels[i]);
4718 }
4719 mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
4720 mlxplat_hotplug->deferred_nr =
4721 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4722 mlxplat_led = &mlxplat_default_led_data;
4723 mlxplat_regs_io = &mlxplat_default_regs_io_data;
4724 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4725
4726 return 1;
4727}
4728
4729static int __init mlxplat_dmi_default_wc_matched(const struct dmi_system_id *dmi)
4730{
4731 int i;
4732
4733 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4734 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4735 mlxplat_mux_data = mlxplat_default_mux_data;
4736 for (i = 0; i < mlxplat_mux_num; i++) {
4737 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
4738 mlxplat_mux_data[i].n_values =
4739 ARRAY_SIZE(mlxplat_default_channels[i]);
4740 }
4741 mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
4742 mlxplat_hotplug->deferred_nr =
4743 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4744 mlxplat_led = &mlxplat_default_led_wc_data;
4745 mlxplat_regs_io = &mlxplat_default_regs_io_data;
4746 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4747
4748 return 1;
4749}
4750
4751static int __init mlxplat_dmi_default_eth_wc_blade_matched(const struct dmi_system_id *dmi)
4752{
4753 int i;
4754
4755 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4756 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4757 mlxplat_mux_data = mlxplat_default_mux_data;
4758 for (i = 0; i < mlxplat_mux_num; i++) {
4759 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4760 mlxplat_mux_data[i].n_values =
4761 ARRAY_SIZE(mlxplat_msn21xx_channels);
4762 }
4763 mlxplat_hotplug = &mlxplat_mlxcpld_default_wc_data;
4764 mlxplat_hotplug->deferred_nr =
4765 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4766 mlxplat_led = &mlxplat_default_led_eth_wc_blade_data;
4767 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
4768 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4769 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4770 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4771 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
4772
4773 return 1;
4774}
4775
4776static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
4777{
4778 int i;
4779
4780 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4781 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4782 mlxplat_mux_data = mlxplat_default_mux_data;
4783 for (i = 0; i < mlxplat_mux_num; i++) {
4784 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4785 mlxplat_mux_data[i].n_values =
4786 ARRAY_SIZE(mlxplat_msn21xx_channels);
4787 }
4788 mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
4789 mlxplat_hotplug->deferred_nr =
4790 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4791 mlxplat_led = &mlxplat_msn21xx_led_data;
4792 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
4793 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4794
4795 return 1;
4796}
4797
4798static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
4799{
4800 int i;
4801
4802 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4803 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4804 mlxplat_mux_data = mlxplat_default_mux_data;
4805 for (i = 0; i < mlxplat_mux_num; i++) {
4806 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4807 mlxplat_mux_data[i].n_values =
4808 ARRAY_SIZE(mlxplat_msn21xx_channels);
4809 }
4810 mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
4811 mlxplat_hotplug->deferred_nr =
4812 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4813 mlxplat_led = &mlxplat_default_led_data;
4814 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
4815 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4816
4817 return 1;
4818}
4819
4820static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
4821{
4822 int i;
4823
4824 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4825 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4826 mlxplat_mux_data = mlxplat_default_mux_data;
4827 for (i = 0; i < mlxplat_mux_num; i++) {
4828 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4829 mlxplat_mux_data[i].n_values =
4830 ARRAY_SIZE(mlxplat_msn21xx_channels);
4831 }
4832 mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
4833 mlxplat_hotplug->deferred_nr =
4834 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4835 mlxplat_led = &mlxplat_msn21xx_led_data;
4836 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
4837 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
4838
4839 return 1;
4840}
4841
4842static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
4843{
4844 int i;
4845
4846 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4847 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4848 mlxplat_mux_data = mlxplat_default_mux_data;
4849 for (i = 0; i < mlxplat_mux_num; i++) {
4850 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4851 mlxplat_mux_data[i].n_values =
4852 ARRAY_SIZE(mlxplat_msn21xx_channels);
4853 }
4854 mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
4855 mlxplat_hotplug->deferred_nr =
4856 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4857 mlxplat_led = &mlxplat_default_ng_led_data;
4858 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
4859 mlxplat_fan = &mlxplat_default_fan_data;
4860 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4861 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4862 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4863 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
4864
4865 return 1;
4866}
4867
4868static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
4869{
4870 int i;
4871
4872 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
4873 mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
4874 mlxplat_mux_data = mlxplat_extended_mux_data;
4875 for (i = 0; i < mlxplat_mux_num; i++) {
4876 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4877 mlxplat_mux_data[i].n_values =
4878 ARRAY_SIZE(mlxplat_msn21xx_channels);
4879 }
4880 mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
4881 mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
4882 mlxplat_led = &mlxplat_comex_100G_led_data;
4883 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
4884 mlxplat_fan = &mlxplat_default_fan_data;
4885 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4886 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4887 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
4888
4889 return 1;
4890}
4891
4892static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
4893{
4894 int i;
4895
4896 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4897 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4898 mlxplat_mux_data = mlxplat_default_mux_data;
4899 for (i = 0; i < mlxplat_mux_num; i++) {
4900 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4901 mlxplat_mux_data[i].n_values =
4902 ARRAY_SIZE(mlxplat_msn21xx_channels);
4903 }
4904 mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
4905 mlxplat_hotplug->deferred_nr =
4906 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4907 mlxplat_led = &mlxplat_default_ng_led_data;
4908 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
4909 mlxplat_fan = &mlxplat_default_fan_data;
4910 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4911 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4912 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4913 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
4914
4915 return 1;
4916}
4917
4918static int __init mlxplat_dmi_modular_matched(const struct dmi_system_id *dmi)
4919{
4920 int i;
4921
4922 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4923 mlxplat_mux_num = ARRAY_SIZE(mlxplat_modular_mux_data);
4924 mlxplat_mux_data = mlxplat_modular_mux_data;
4925 mlxplat_hotplug = &mlxplat_mlxcpld_modular_data;
4926 mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_CH4_ETH_MODULAR;
4927 mlxplat_led = &mlxplat_modular_led_data;
4928 mlxplat_regs_io = &mlxplat_modular_regs_io_data;
4929 mlxplat_fan = &mlxplat_default_fan_data;
4930 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
4931 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
4932 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4933 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_eth_modular;
4934
4935 return 1;
4936}
4937
4938static int __init mlxplat_dmi_nvlink_blade_matched(const struct dmi_system_id *dmi)
4939{
4940 int i;
4941
4942 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
4943 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
4944 mlxplat_mux_data = mlxplat_default_mux_data;
4945 mlxplat_hotplug = &mlxplat_mlxcpld_nvlink_blade_data;
4946 mlxplat_hotplug->deferred_nr =
4947 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
4948 for (i = 0; i < mlxplat_mux_num; i++) {
4949 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
4950 mlxplat_mux_data[i].n_values =
4951 ARRAY_SIZE(mlxplat_msn21xx_channels);
4952 }
4953 mlxplat_regs_io = &mlxplat_nvlink_blade_regs_io_data;
4954 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
4955 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
4956
4957 return 1;
4958}
4959
4960static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
4961 {
4962 .callback = mlxplat_dmi_default_wc_matched,
4963 .matches = {
4964 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
4965 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI138"),
4966 },
4967 },
4968 {
4969 .callback = mlxplat_dmi_default_matched,
4970 .matches = {
4971 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
4972 },
4973 },
4974 {
4975 .callback = mlxplat_dmi_msn21xx_matched,
4976 .matches = {
4977 DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
4978 },
4979 },
4980 {
4981 .callback = mlxplat_dmi_msn274x_matched,
4982 .matches = {
4983 DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
4984 },
4985 },
4986 {
4987 .callback = mlxplat_dmi_msn201x_matched,
4988 .matches = {
4989 DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
4990 },
4991 },
4992 {
4993 .callback = mlxplat_dmi_default_eth_wc_blade_matched,
4994 .matches = {
4995 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
4996 DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "HI139"),
4997 },
4998 },
4999 {
5000 .callback = mlxplat_dmi_qmb7xx_matched,
5001 .matches = {
5002 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
5003 },
5004 },
5005 {
5006 .callback = mlxplat_dmi_qmb7xx_matched,
5007 .matches = {
5008 DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
5009 },
5010 },
5011 {
5012 .callback = mlxplat_dmi_comex_matched,
5013 .matches = {
5014 DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
5015 },
5016 },
5017 {
5018 .callback = mlxplat_dmi_ng400_matched,
5019 .matches = {
5020 DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
5021 },
5022 },
5023 {
5024 .callback = mlxplat_dmi_modular_matched,
5025 .matches = {
5026 DMI_MATCH(DMI_BOARD_NAME, "VMOD0011"),
5027 },
5028 },
5029 {
5030 .callback = mlxplat_dmi_nvlink_blade_matched,
5031 .matches = {
5032 DMI_MATCH(DMI_BOARD_NAME, "VMOD0015"),
5033 },
5034 },
5035 {
5036 .callback = mlxplat_dmi_msn274x_matched,
5037 .matches = {
5038 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5039 DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
5040 },
5041 },
5042 {
5043 .callback = mlxplat_dmi_default_matched,
5044 .matches = {
5045 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5046 DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
5047 },
5048 },
5049 {
5050 .callback = mlxplat_dmi_default_matched,
5051 .matches = {
5052 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5053 DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
5054 },
5055 },
5056 {
5057 .callback = mlxplat_dmi_default_matched,
5058 .matches = {
5059 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5060 DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
5061 },
5062 },
5063 {
5064 .callback = mlxplat_dmi_default_matched,
5065 .matches = {
5066 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5067 DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
5068 },
5069 },
5070 {
5071 .callback = mlxplat_dmi_msn21xx_matched,
5072 .matches = {
5073 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5074 DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
5075 },
5076 },
5077 {
5078 .callback = mlxplat_dmi_msn201x_matched,
5079 .matches = {
5080 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5081 DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
5082 },
5083 },
5084 {
5085 .callback = mlxplat_dmi_qmb7xx_matched,
5086 .matches = {
5087 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5088 DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
5089 },
5090 },
5091 {
5092 .callback = mlxplat_dmi_qmb7xx_matched,
5093 .matches = {
5094 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5095 DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
5096 },
5097 },
5098 {
5099 .callback = mlxplat_dmi_qmb7xx_matched,
5100 .matches = {
5101 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5102 DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
5103 },
5104 },
5105 {
5106 .callback = mlxplat_dmi_qmb7xx_matched,
5107 .matches = {
5108 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
5109 DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
5110 },
5111 },
5112 { }
5113};
5114
5115MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
5116
5117static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
5118{
5119 struct i2c_adapter *search_adap;
5120 int shift, i;
5121
5122 /* Scan adapters from expected id to verify it is free. */
5123 *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
5124 for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
5125 mlxplat_max_adap_num; i++) {
5126 search_adap = i2c_get_adapter(i);
5127 if (search_adap) {
5128 i2c_put_adapter(search_adap);
5129 continue;
5130 }
5131
5132 /* Return if expected parent adapter is free. */
5133 if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
5134 return 0;
5135 break;
5136 }
5137
5138 /* Return with error if free id for adapter is not found. */
5139 if (i == mlxplat_max_adap_num)
5140 return -ENODEV;
5141
5142 /* Shift adapter ids, since expected parent adapter is not free. */
5143 *nr = i;
5144 for (i = 0; i < mlxplat_mux_num; i++) {
5145 shift = *nr - mlxplat_mux_data[i].parent;
5146 mlxplat_mux_data[i].parent = *nr;
5147 mlxplat_mux_data[i].base_nr += shift;
5148 if (shift > 0)
5149 mlxplat_hotplug->shift_nr = shift;
5150 }
5151
5152 return 0;
5153}
5154
5155static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
5156{
5157 u32 regval;
5158 int i, rc;
5159
5160 rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
5161 ®val);
5162 if (rc)
5163 return rc;
5164
5165 if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
5166 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
5167 if (mlxplat_wd_data[i])
5168 mlxplat_wd_data[i] =
5169 &mlxplat_mlxcpld_wd_set_type3[i];
5170 }
5171 }
5172
5173 return 0;
5174}
5175
5176static int __init mlxplat_init(void)
5177{
5178 struct mlxplat_priv *priv;
5179 int i, j, nr, err;
5180
5181 if (!dmi_check_system(mlxplat_dmi_table))
5182 return -ENODEV;
5183
5184 mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, PLATFORM_DEVID_NONE,
5185 mlxplat_lpc_resources,
5186 ARRAY_SIZE(mlxplat_lpc_resources));
5187
5188 if (IS_ERR(mlxplat_dev))
5189 return PTR_ERR(mlxplat_dev);
5190
5191 priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
5192 GFP_KERNEL);
5193 if (!priv) {
5194 err = -ENOMEM;
5195 goto fail_alloc;
5196 }
5197 platform_set_drvdata(mlxplat_dev, priv);
5198
5199 mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
5200 mlxplat_lpc_resources[1].start, 1);
5201 if (!mlxplat_mlxcpld_regmap_ctx.base) {
5202 err = -ENOMEM;
5203 goto fail_alloc;
5204 }
5205
5206 if (!mlxplat_regmap_config)
5207 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
5208
5209 priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
5210 &mlxplat_mlxcpld_regmap_ctx,
5211 mlxplat_regmap_config);
5212 if (IS_ERR(priv->regmap)) {
5213 err = PTR_ERR(priv->regmap);
5214 goto fail_alloc;
5215 }
5216
5217 err = mlxplat_mlxcpld_verify_bus_topology(&nr);
5218 if (nr < 0)
5219 goto fail_alloc;
5220
5221 nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
5222 if (mlxplat_i2c)
5223 mlxplat_i2c->regmap = priv->regmap;
5224 priv->pdev_i2c = platform_device_register_resndata(&mlxplat_dev->dev, "i2c_mlxcpld",
5225 nr, mlxplat_mlxcpld_resources,
5226 ARRAY_SIZE(mlxplat_mlxcpld_resources),
5227 mlxplat_i2c, sizeof(*mlxplat_i2c));
5228 if (IS_ERR(priv->pdev_i2c)) {
5229 err = PTR_ERR(priv->pdev_i2c);
5230 goto fail_alloc;
5231 }
5232
5233 for (i = 0; i < mlxplat_mux_num; i++) {
5234 priv->pdev_mux[i] = platform_device_register_resndata(&priv->pdev_i2c->dev,
5235 "i2c-mux-reg", i, NULL, 0,
5236 &mlxplat_mux_data[i],
5237 sizeof(mlxplat_mux_data[i]));
5238 if (IS_ERR(priv->pdev_mux[i])) {
5239 err = PTR_ERR(priv->pdev_mux[i]);
5240 goto fail_platform_mux_register;
5241 }
5242 }
5243
5244 /* Add hotplug driver */
5245 if (mlxplat_hotplug) {
5246 mlxplat_hotplug->regmap = priv->regmap;
5247 priv->pdev_hotplug =
5248 platform_device_register_resndata(&mlxplat_dev->dev,
5249 "mlxreg-hotplug", PLATFORM_DEVID_NONE,
5250 mlxplat_mlxcpld_resources,
5251 ARRAY_SIZE(mlxplat_mlxcpld_resources),
5252 mlxplat_hotplug, sizeof(*mlxplat_hotplug));
5253 if (IS_ERR(priv->pdev_hotplug)) {
5254 err = PTR_ERR(priv->pdev_hotplug);
5255 goto fail_platform_mux_register;
5256 }
5257 }
5258
5259 /* Set default registers. */
5260 for (j = 0; j < mlxplat_regmap_config->num_reg_defaults; j++) {
5261 err = regmap_write(priv->regmap,
5262 mlxplat_regmap_config->reg_defaults[j].reg,
5263 mlxplat_regmap_config->reg_defaults[j].def);
5264 if (err)
5265 goto fail_platform_mux_register;
5266 }
5267
5268 /* Add LED driver. */
5269 if (mlxplat_led) {
5270 mlxplat_led->regmap = priv->regmap;
5271 priv->pdev_led =
5272 platform_device_register_resndata(&mlxplat_dev->dev, "leds-mlxreg",
5273 PLATFORM_DEVID_NONE, NULL, 0, mlxplat_led,
5274 sizeof(*mlxplat_led));
5275 if (IS_ERR(priv->pdev_led)) {
5276 err = PTR_ERR(priv->pdev_led);
5277 goto fail_platform_hotplug_register;
5278 }
5279 }
5280
5281 /* Add registers io access driver. */
5282 if (mlxplat_regs_io) {
5283 mlxplat_regs_io->regmap = priv->regmap;
5284 priv->pdev_io_regs = platform_device_register_resndata(&mlxplat_dev->dev,
5285 "mlxreg-io",
5286 PLATFORM_DEVID_NONE, NULL,
5287 0, mlxplat_regs_io,
5288 sizeof(*mlxplat_regs_io));
5289 if (IS_ERR(priv->pdev_io_regs)) {
5290 err = PTR_ERR(priv->pdev_io_regs);
5291 goto fail_platform_led_register;
5292 }
5293 }
5294
5295 /* Add FAN driver. */
5296 if (mlxplat_fan) {
5297 mlxplat_fan->regmap = priv->regmap;
5298 priv->pdev_fan = platform_device_register_resndata(&mlxplat_dev->dev, "mlxreg-fan",
5299 PLATFORM_DEVID_NONE, NULL, 0,
5300 mlxplat_fan,
5301 sizeof(*mlxplat_fan));
5302 if (IS_ERR(priv->pdev_fan)) {
5303 err = PTR_ERR(priv->pdev_fan);
5304 goto fail_platform_io_regs_register;
5305 }
5306 }
5307
5308 /* Add WD drivers. */
5309 err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
5310 if (err)
5311 goto fail_platform_wd_register;
5312 for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) {
5313 if (mlxplat_wd_data[j]) {
5314 mlxplat_wd_data[j]->regmap = priv->regmap;
5315 priv->pdev_wd[j] =
5316 platform_device_register_resndata(&mlxplat_dev->dev, "mlx-wdt", j,
5317 NULL, 0, mlxplat_wd_data[j],
5318 sizeof(*mlxplat_wd_data[j]));
5319 if (IS_ERR(priv->pdev_wd[j])) {
5320 err = PTR_ERR(priv->pdev_wd[j]);
5321 goto fail_platform_wd_register;
5322 }
5323 }
5324 }
5325
5326 /* Sync registers with hardware. */
5327 regcache_mark_dirty(priv->regmap);
5328 err = regcache_sync(priv->regmap);
5329 if (err)
5330 goto fail_platform_wd_register;
5331
5332 return 0;
5333
5334fail_platform_wd_register:
5335 while (--j >= 0)
5336 platform_device_unregister(priv->pdev_wd[j]);
5337 if (mlxplat_fan)
5338 platform_device_unregister(priv->pdev_fan);
5339fail_platform_io_regs_register:
5340 if (mlxplat_regs_io)
5341 platform_device_unregister(priv->pdev_io_regs);
5342fail_platform_led_register:
5343 if (mlxplat_led)
5344 platform_device_unregister(priv->pdev_led);
5345fail_platform_hotplug_register:
5346 if (mlxplat_hotplug)
5347 platform_device_unregister(priv->pdev_hotplug);
5348fail_platform_mux_register:
5349 while (--i >= 0)
5350 platform_device_unregister(priv->pdev_mux[i]);
5351 platform_device_unregister(priv->pdev_i2c);
5352fail_alloc:
5353 platform_device_unregister(mlxplat_dev);
5354
5355 return err;
5356}
5357module_init(mlxplat_init);
5358
5359static void __exit mlxplat_exit(void)
5360{
5361 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
5362 int i;
5363
5364 for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0 ; i--)
5365 platform_device_unregister(priv->pdev_wd[i]);
5366 if (priv->pdev_fan)
5367 platform_device_unregister(priv->pdev_fan);
5368 if (priv->pdev_io_regs)
5369 platform_device_unregister(priv->pdev_io_regs);
5370 if (priv->pdev_led)
5371 platform_device_unregister(priv->pdev_led);
5372 if (priv->pdev_hotplug)
5373 platform_device_unregister(priv->pdev_hotplug);
5374
5375 for (i = mlxplat_mux_num - 1; i >= 0 ; i--)
5376 platform_device_unregister(priv->pdev_mux[i]);
5377
5378 platform_device_unregister(priv->pdev_i2c);
5379 platform_device_unregister(mlxplat_dev);
5380}
5381module_exit(mlxplat_exit);
5382
5383MODULE_AUTHOR("Vadim Pasternak (vadimp@mellanox.com)");
5384MODULE_DESCRIPTION("Mellanox platform driver");
5385MODULE_LICENSE("Dual BSD/GPL");
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2/*
3 * Mellanox platform driver
4 *
5 * Copyright (C) 2016-2018 Mellanox Technologies
6 * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
7 */
8
9#include <linux/device.h>
10#include <linux/dmi.h>
11#include <linux/i2c.h>
12#include <linux/i2c-mux.h>
13#include <linux/io.h>
14#include <linux/module.h>
15#include <linux/platform_device.h>
16#include <linux/platform_data/i2c-mux-reg.h>
17#include <linux/platform_data/mlxreg.h>
18#include <linux/regmap.h>
19
20#define MLX_PLAT_DEVICE_NAME "mlxplat"
21
22/* LPC bus IO offsets */
23#define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000
24#define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500
25#define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00
26#define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01
27#define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02
28#define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET 0x03
29#define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET 0x04
30#define MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET 0x06
31#define MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET 0x08
32#define MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET 0x0a
33#define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
34#define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET 0x1e
35#define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET 0x1f
36#define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET 0x20
37#define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET 0x21
38#define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22
39#define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23
40#define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24
41#define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION 0x2a
42#define MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET 0x2b
43#define MLXPLAT_CPLD_LPC_REG_GP0_OFFSET 0x2e
44#define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET 0x30
45#define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET 0x31
46#define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET 0x32
47#define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET 0x33
48#define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET 0x37
49#define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a
50#define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b
51#define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40
52#define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET 0x41
53#define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET 0x42
54#define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET 0x43
55#define MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET 0x44
56#define MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET 0x45
57#define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
58#define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET 0x51
59#define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET 0x52
60#define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET 0x58
61#define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET 0x59
62#define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET 0x5a
63#define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET 0x64
64#define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET 0x65
65#define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET 0x66
66#define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET 0x88
67#define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET 0x89
68#define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET 0x8a
69#define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET 0xc7
70#define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET 0xc8
71#define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET 0xc9
72#define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET 0xcb
73#define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET 0xcd
74#define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET 0xce
75#define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET 0xcf
76#define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET 0xd1
77#define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET 0xd2
78#define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET 0xd3
79#define MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET 0xde
80#define MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET 0xdf
81#define MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET 0xe0
82#define MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET 0xe1
83#define MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET 0xe2
84#define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET 0xe3
85#define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET 0xe4
86#define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET 0xe5
87#define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET 0xe6
88#define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET 0xe7
89#define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET 0xe8
90#define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET 0xe9
91#define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET 0xeb
92#define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET 0xec
93#define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET 0xed
94#define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee
95#define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef
96#define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0
97#define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET 0xf5
98#define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET 0xf6
99#define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7
100#define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET 0xf8
101#define MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET 0xf9
102#define MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET 0xfb
103#define MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET 0xfc
104#define MLXPLAT_CPLD_LPC_IO_RANGE 0x100
105#define MLXPLAT_CPLD_LPC_I2C_CH1_OFF 0xdb
106#define MLXPLAT_CPLD_LPC_I2C_CH2_OFF 0xda
107#define MLXPLAT_CPLD_LPC_I2C_CH3_OFF 0xdc
108
109#define MLXPLAT_CPLD_LPC_PIO_OFFSET 0x10000UL
110#define MLXPLAT_CPLD_LPC_REG1 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
111 MLXPLAT_CPLD_LPC_I2C_CH1_OFF) | \
112 MLXPLAT_CPLD_LPC_PIO_OFFSET)
113#define MLXPLAT_CPLD_LPC_REG2 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
114 MLXPLAT_CPLD_LPC_I2C_CH2_OFF) | \
115 MLXPLAT_CPLD_LPC_PIO_OFFSET)
116#define MLXPLAT_CPLD_LPC_REG3 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
117 MLXPLAT_CPLD_LPC_I2C_CH3_OFF) | \
118 MLXPLAT_CPLD_LPC_PIO_OFFSET)
119
120/* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
121#define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF 0x04
122#define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF 0x08
123#define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF 0x08
124#define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF 0x40
125#define MLXPLAT_CPLD_AGGR_MASK_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
126 MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
127 MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
128#define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG 0x01
129#define MLXPLAT_CPLD_AGGR_MASK_NG_DEF 0x04
130#define MLXPLAT_CPLD_AGGR_MASK_COMEX BIT(0)
131#define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW 0xc1
132#define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C BIT(6)
133#define MLXPLAT_CPLD_PSU_MASK GENMASK(1, 0)
134#define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0)
135#define MLXPLAT_CPLD_PSU_EXT_MASK GENMASK(3, 0)
136#define MLXPLAT_CPLD_PWR_EXT_MASK GENMASK(3, 0)
137#define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0)
138#define MLXPLAT_CPLD_ASIC_MASK GENMASK(1, 0)
139#define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(5, 0)
140#define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
141#define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
142#define MLXPLAT_CPLD_VOLTREG_UPD_MASK GENMASK(5, 4)
143#define MLXPLAT_CPLD_I2C_CAP_BIT 0x04
144#define MLXPLAT_CPLD_I2C_CAP_MASK GENMASK(5, MLXPLAT_CPLD_I2C_CAP_BIT)
145
146/* Masks for aggregation for comex carriers */
147#define MLXPLAT_CPLD_AGGR_MASK_CARRIER BIT(1)
148#define MLXPLAT_CPLD_AGGR_MASK_CARR_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
149 MLXPLAT_CPLD_AGGR_MASK_CARRIER)
150#define MLXPLAT_CPLD_LOW_AGGRCX_MASK 0xc1
151
152/* Default I2C parent bus number */
153#define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
154
155/* Maximum number of possible physical buses equipped on system */
156#define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM 16
157#define MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM 24
158
159/* Number of channels in group */
160#define MLXPLAT_CPLD_GRP_CHNL_NUM 8
161
162/* Start channel numbers */
163#define MLXPLAT_CPLD_CH1 2
164#define MLXPLAT_CPLD_CH2 10
165#define MLXPLAT_CPLD_CH3 18
166
167/* Number of LPC attached MUX platform devices */
168#define MLXPLAT_CPLD_LPC_MUX_DEVS 3
169
170/* Hotplug devices adapter numbers */
171#define MLXPLAT_CPLD_NR_NONE -1
172#define MLXPLAT_CPLD_PSU_DEFAULT_NR 10
173#define MLXPLAT_CPLD_PSU_MSNXXXX_NR 4
174#define MLXPLAT_CPLD_FAN1_DEFAULT_NR 11
175#define MLXPLAT_CPLD_FAN2_DEFAULT_NR 12
176#define MLXPLAT_CPLD_FAN3_DEFAULT_NR 13
177#define MLXPLAT_CPLD_FAN4_DEFAULT_NR 14
178
179/* Masks and default values for watchdogs */
180#define MLXPLAT_CPLD_WD1_CLEAR_MASK GENMASK(7, 1)
181#define MLXPLAT_CPLD_WD2_CLEAR_MASK (GENMASK(7, 0) & ~BIT(1))
182
183#define MLXPLAT_CPLD_WD_TYPE1_TO_MASK GENMASK(7, 4)
184#define MLXPLAT_CPLD_WD_TYPE2_TO_MASK 0
185#define MLXPLAT_CPLD_WD_RESET_ACT_MASK GENMASK(7, 1)
186#define MLXPLAT_CPLD_WD_FAN_ACT_MASK (GENMASK(7, 0) & ~BIT(4))
187#define MLXPLAT_CPLD_WD_COUNT_ACT_MASK (GENMASK(7, 0) & ~BIT(7))
188#define MLXPLAT_CPLD_WD_CPBLTY_MASK (GENMASK(7, 0) & ~BIT(6))
189#define MLXPLAT_CPLD_WD_DFLT_TIMEOUT 30
190#define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT 600
191#define MLXPLAT_CPLD_WD_MAX_DEVS 2
192
193/* mlxplat_priv - platform private data
194 * @pdev_i2c - i2c controller platform device
195 * @pdev_mux - array of mux platform devices
196 * @pdev_hotplug - hotplug platform devices
197 * @pdev_led - led platform devices
198 * @pdev_io_regs - register access platform devices
199 * @pdev_fan - FAN platform devices
200 * @pdev_wd - array of watchdog platform devices
201 * @regmap: device register map
202 */
203struct mlxplat_priv {
204 struct platform_device *pdev_i2c;
205 struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
206 struct platform_device *pdev_hotplug;
207 struct platform_device *pdev_led;
208 struct platform_device *pdev_io_regs;
209 struct platform_device *pdev_fan;
210 struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
211 void *regmap;
212};
213
214/* Regions for LPC I2C controller and LPC base register space */
215static const struct resource mlxplat_lpc_resources[] = {
216 [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
217 MLXPLAT_CPLD_LPC_IO_RANGE,
218 "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
219 [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
220 MLXPLAT_CPLD_LPC_IO_RANGE,
221 "mlxplat_cpld_lpc_regs",
222 IORESOURCE_IO),
223};
224
225/* Platform i2c next generation systems data */
226static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
227 {
228 .reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
229 .mask = MLXPLAT_CPLD_I2C_CAP_MASK,
230 .bit = MLXPLAT_CPLD_I2C_CAP_BIT,
231 },
232};
233
234static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
235 {
236 .data = mlxplat_mlxcpld_i2c_ng_items_data,
237 },
238};
239
240/* Platform next generation systems i2c data */
241static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
242 .items = mlxplat_mlxcpld_i2c_ng_items,
243 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
244 .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
245 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
246 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
247};
248
249/* Platform default channels */
250static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
251 {
252 MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
253 MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
254 5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
255 },
256 {
257 MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
258 MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
259 5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
260 },
261};
262
263/* Platform channels for MSN21xx system family */
264static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
265
266/* Platform mux data */
267static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
268 {
269 .parent = 1,
270 .base_nr = MLXPLAT_CPLD_CH1,
271 .write_only = 1,
272 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
273 .reg_size = 1,
274 .idle_in_use = 1,
275 },
276 {
277 .parent = 1,
278 .base_nr = MLXPLAT_CPLD_CH2,
279 .write_only = 1,
280 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
281 .reg_size = 1,
282 .idle_in_use = 1,
283 },
284
285};
286
287/* Platform mux configuration variables */
288static int mlxplat_max_adap_num;
289static int mlxplat_mux_num;
290static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
291
292/* Platform extended mux data */
293static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
294 {
295 .parent = 1,
296 .base_nr = MLXPLAT_CPLD_CH1,
297 .write_only = 1,
298 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
299 .reg_size = 1,
300 .idle_in_use = 1,
301 },
302 {
303 .parent = 1,
304 .base_nr = MLXPLAT_CPLD_CH2,
305 .write_only = 1,
306 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
307 .reg_size = 1,
308 .idle_in_use = 1,
309 },
310 {
311 .parent = 1,
312 .base_nr = MLXPLAT_CPLD_CH3,
313 .write_only = 1,
314 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
315 .reg_size = 1,
316 .idle_in_use = 1,
317 },
318
319};
320
321/* Platform hotplug devices */
322static struct i2c_board_info mlxplat_mlxcpld_psu[] = {
323 {
324 I2C_BOARD_INFO("24c02", 0x51),
325 },
326 {
327 I2C_BOARD_INFO("24c02", 0x50),
328 },
329};
330
331static struct i2c_board_info mlxplat_mlxcpld_ng_psu[] = {
332 {
333 I2C_BOARD_INFO("24c32", 0x51),
334 },
335 {
336 I2C_BOARD_INFO("24c32", 0x50),
337 },
338};
339
340static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
341 {
342 I2C_BOARD_INFO("dps460", 0x59),
343 },
344 {
345 I2C_BOARD_INFO("dps460", 0x58),
346 },
347};
348
349static struct i2c_board_info mlxplat_mlxcpld_ext_pwr[] = {
350 {
351 I2C_BOARD_INFO("dps460", 0x5b),
352 },
353 {
354 I2C_BOARD_INFO("dps460", 0x5a),
355 },
356};
357
358static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
359 {
360 I2C_BOARD_INFO("24c32", 0x50),
361 },
362 {
363 I2C_BOARD_INFO("24c32", 0x50),
364 },
365 {
366 I2C_BOARD_INFO("24c32", 0x50),
367 },
368 {
369 I2C_BOARD_INFO("24c32", 0x50),
370 },
371};
372
373/* Platform hotplug comex carrier system family data */
374static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
375 {
376 .label = "psu1",
377 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
378 .mask = BIT(0),
379 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
380 },
381 {
382 .label = "psu2",
383 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
384 .mask = BIT(1),
385 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
386 },
387};
388
389/* Platform hotplug default data */
390static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
391 {
392 .label = "psu1",
393 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
394 .mask = BIT(0),
395 .hpdev.brdinfo = &mlxplat_mlxcpld_psu[0],
396 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
397 },
398 {
399 .label = "psu2",
400 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
401 .mask = BIT(1),
402 .hpdev.brdinfo = &mlxplat_mlxcpld_psu[1],
403 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
404 },
405};
406
407static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
408 {
409 .label = "pwr1",
410 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
411 .mask = BIT(0),
412 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
413 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
414 },
415 {
416 .label = "pwr2",
417 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
418 .mask = BIT(1),
419 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
420 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
421 },
422};
423
424static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
425 {
426 .label = "fan1",
427 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
428 .mask = BIT(0),
429 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
430 .hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
431 },
432 {
433 .label = "fan2",
434 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
435 .mask = BIT(1),
436 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
437 .hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
438 },
439 {
440 .label = "fan3",
441 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
442 .mask = BIT(2),
443 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
444 .hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
445 },
446 {
447 .label = "fan4",
448 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
449 .mask = BIT(3),
450 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
451 .hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
452 },
453};
454
455static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
456 {
457 .label = "asic1",
458 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
459 .mask = MLXPLAT_CPLD_ASIC_MASK,
460 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
461 },
462};
463
464static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
465 {
466 .data = mlxplat_mlxcpld_default_psu_items_data,
467 .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
468 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
469 .mask = MLXPLAT_CPLD_PSU_MASK,
470 .count = ARRAY_SIZE(mlxplat_mlxcpld_psu),
471 .inversed = 1,
472 .health = false,
473 },
474 {
475 .data = mlxplat_mlxcpld_default_pwr_items_data,
476 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
477 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
478 .mask = MLXPLAT_CPLD_PWR_MASK,
479 .count = ARRAY_SIZE(mlxplat_mlxcpld_pwr),
480 .inversed = 0,
481 .health = false,
482 },
483 {
484 .data = mlxplat_mlxcpld_default_fan_items_data,
485 .aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
486 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
487 .mask = MLXPLAT_CPLD_FAN_MASK,
488 .count = ARRAY_SIZE(mlxplat_mlxcpld_fan),
489 .inversed = 1,
490 .health = false,
491 },
492 {
493 .data = mlxplat_mlxcpld_default_asic_items_data,
494 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
495 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
496 .mask = MLXPLAT_CPLD_ASIC_MASK,
497 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
498 .inversed = 0,
499 .health = true,
500 },
501};
502
503static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
504 {
505 .data = mlxplat_mlxcpld_comex_psu_items_data,
506 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
507 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
508 .mask = MLXPLAT_CPLD_PSU_MASK,
509 .count = ARRAY_SIZE(mlxplat_mlxcpld_psu),
510 .inversed = 1,
511 .health = false,
512 },
513 {
514 .data = mlxplat_mlxcpld_default_pwr_items_data,
515 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
516 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
517 .mask = MLXPLAT_CPLD_PWR_MASK,
518 .count = ARRAY_SIZE(mlxplat_mlxcpld_pwr),
519 .inversed = 0,
520 .health = false,
521 },
522 {
523 .data = mlxplat_mlxcpld_default_fan_items_data,
524 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
525 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
526 .mask = MLXPLAT_CPLD_FAN_MASK,
527 .count = ARRAY_SIZE(mlxplat_mlxcpld_fan),
528 .inversed = 1,
529 .health = false,
530 },
531 {
532 .data = mlxplat_mlxcpld_default_asic_items_data,
533 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
534 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
535 .mask = MLXPLAT_CPLD_ASIC_MASK,
536 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
537 .inversed = 0,
538 .health = true,
539 },
540};
541
542static
543struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
544 .items = mlxplat_mlxcpld_default_items,
545 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
546 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
547 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
548 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
549 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
550};
551
552static
553struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
554 .items = mlxplat_mlxcpld_comex_items,
555 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
556 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
557 .mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
558 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
559 .mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
560};
561
562static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
563 {
564 .label = "pwr1",
565 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
566 .mask = BIT(0),
567 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
568 },
569 {
570 .label = "pwr2",
571 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
572 .mask = BIT(1),
573 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
574 },
575};
576
577/* Platform hotplug MSN21xx system family data */
578static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
579 {
580 .data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
581 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
582 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
583 .mask = MLXPLAT_CPLD_PWR_MASK,
584 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
585 .inversed = 0,
586 .health = false,
587 },
588 {
589 .data = mlxplat_mlxcpld_default_asic_items_data,
590 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
591 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
592 .mask = MLXPLAT_CPLD_ASIC_MASK,
593 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
594 .inversed = 0,
595 .health = true,
596 },
597};
598
599static
600struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
601 .items = mlxplat_mlxcpld_msn21xx_items,
602 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
603 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
604 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
605 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
606 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
607};
608
609/* Platform hotplug msn274x system family data */
610static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
611 {
612 .label = "psu1",
613 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
614 .mask = BIT(0),
615 .hpdev.brdinfo = &mlxplat_mlxcpld_psu[0],
616 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
617 },
618 {
619 .label = "psu2",
620 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
621 .mask = BIT(1),
622 .hpdev.brdinfo = &mlxplat_mlxcpld_psu[1],
623 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
624 },
625};
626
627static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
628 {
629 .label = "pwr1",
630 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
631 .mask = BIT(0),
632 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
633 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
634 },
635 {
636 .label = "pwr2",
637 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
638 .mask = BIT(1),
639 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
640 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
641 },
642};
643
644static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
645 {
646 .label = "fan1",
647 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
648 .mask = BIT(0),
649 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
650 },
651 {
652 .label = "fan2",
653 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
654 .mask = BIT(1),
655 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
656 },
657 {
658 .label = "fan3",
659 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
660 .mask = BIT(2),
661 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
662 },
663 {
664 .label = "fan4",
665 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
666 .mask = BIT(3),
667 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
668 },
669};
670
671static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
672 {
673 .data = mlxplat_mlxcpld_msn274x_psu_items_data,
674 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
675 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
676 .mask = MLXPLAT_CPLD_PSU_MASK,
677 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
678 .inversed = 1,
679 .health = false,
680 },
681 {
682 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
683 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
684 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
685 .mask = MLXPLAT_CPLD_PWR_MASK,
686 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
687 .inversed = 0,
688 .health = false,
689 },
690 {
691 .data = mlxplat_mlxcpld_msn274x_fan_items_data,
692 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
693 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
694 .mask = MLXPLAT_CPLD_FAN_MASK,
695 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
696 .inversed = 1,
697 .health = false,
698 },
699 {
700 .data = mlxplat_mlxcpld_default_asic_items_data,
701 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
702 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
703 .mask = MLXPLAT_CPLD_ASIC_MASK,
704 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
705 .inversed = 0,
706 .health = true,
707 },
708};
709
710static
711struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
712 .items = mlxplat_mlxcpld_msn274x_items,
713 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
714 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
715 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
716 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
717 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
718};
719
720/* Platform hotplug MSN201x system family data */
721static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
722 {
723 .label = "pwr1",
724 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
725 .mask = BIT(0),
726 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
727 },
728 {
729 .label = "pwr2",
730 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
731 .mask = BIT(1),
732 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
733 },
734};
735
736static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
737 {
738 .data = mlxplat_mlxcpld_msn201x_pwr_items_data,
739 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
740 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
741 .mask = MLXPLAT_CPLD_PWR_MASK,
742 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
743 .inversed = 0,
744 .health = false,
745 },
746 {
747 .data = mlxplat_mlxcpld_default_asic_items_data,
748 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
749 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
750 .mask = MLXPLAT_CPLD_ASIC_MASK,
751 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
752 .inversed = 0,
753 .health = true,
754 },
755};
756
757static
758struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
759 .items = mlxplat_mlxcpld_msn201x_items,
760 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
761 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
762 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
763 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
764 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
765};
766
767/* Platform hotplug next generation system family data */
768static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
769 {
770 .label = "psu1",
771 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
772 .mask = BIT(0),
773 .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[0],
774 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
775 },
776 {
777 .label = "psu2",
778 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
779 .mask = BIT(1),
780 .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[1],
781 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
782 },
783};
784
785static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
786 {
787 .label = "fan1",
788 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
789 .mask = BIT(0),
790 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
791 .bit = BIT(0),
792 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
793 },
794 {
795 .label = "fan2",
796 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
797 .mask = BIT(1),
798 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
799 .bit = BIT(1),
800 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
801 },
802 {
803 .label = "fan3",
804 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
805 .mask = BIT(2),
806 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
807 .bit = BIT(2),
808 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
809 },
810 {
811 .label = "fan4",
812 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
813 .mask = BIT(3),
814 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
815 .bit = BIT(3),
816 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
817 },
818 {
819 .label = "fan5",
820 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
821 .mask = BIT(4),
822 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
823 .bit = BIT(4),
824 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
825 },
826 {
827 .label = "fan6",
828 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
829 .mask = BIT(5),
830 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
831 .bit = BIT(5),
832 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
833 },
834};
835
836static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
837 {
838 .data = mlxplat_mlxcpld_default_ng_psu_items_data,
839 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
840 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
841 .mask = MLXPLAT_CPLD_PSU_MASK,
842 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
843 .inversed = 1,
844 .health = false,
845 },
846 {
847 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
848 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
849 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
850 .mask = MLXPLAT_CPLD_PWR_MASK,
851 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
852 .inversed = 0,
853 .health = false,
854 },
855 {
856 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
857 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
858 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
859 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
860 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
861 .inversed = 1,
862 .health = false,
863 },
864 {
865 .data = mlxplat_mlxcpld_default_asic_items_data,
866 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
867 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
868 .mask = MLXPLAT_CPLD_ASIC_MASK,
869 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
870 .inversed = 0,
871 .health = true,
872 },
873};
874
875static
876struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
877 .items = mlxplat_mlxcpld_default_ng_items,
878 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
879 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
880 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
881 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
882 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
883};
884
885/* Platform hotplug extended system family data */
886static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
887 {
888 .label = "psu1",
889 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
890 .mask = BIT(0),
891 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
892 },
893 {
894 .label = "psu2",
895 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
896 .mask = BIT(1),
897 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
898 },
899 {
900 .label = "psu3",
901 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
902 .mask = BIT(2),
903 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
904 },
905 {
906 .label = "psu4",
907 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
908 .mask = BIT(3),
909 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
910 },
911};
912
913static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
914 {
915 .label = "pwr1",
916 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
917 .mask = BIT(0),
918 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
919 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
920 },
921 {
922 .label = "pwr2",
923 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
924 .mask = BIT(1),
925 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
926 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
927 },
928 {
929 .label = "pwr3",
930 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
931 .mask = BIT(2),
932 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[0],
933 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
934 },
935 {
936 .label = "pwr4",
937 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
938 .mask = BIT(3),
939 .hpdev.brdinfo = &mlxplat_mlxcpld_ext_pwr[1],
940 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
941 },
942};
943
944static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
945 {
946 .data = mlxplat_mlxcpld_ext_psu_items_data,
947 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
948 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
949 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
950 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
951 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
952 .inversed = 1,
953 .health = false,
954 },
955 {
956 .data = mlxplat_mlxcpld_ext_pwr_items_data,
957 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
958 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
959 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
960 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
961 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
962 .inversed = 0,
963 .health = false,
964 },
965 {
966 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
967 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
968 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
969 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
970 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
971 .inversed = 1,
972 .health = false,
973 },
974 {
975 .data = mlxplat_mlxcpld_default_asic_items_data,
976 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
977 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
978 .mask = MLXPLAT_CPLD_ASIC_MASK,
979 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
980 .inversed = 0,
981 .health = true,
982 },
983};
984
985static
986struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
987 .items = mlxplat_mlxcpld_ext_items,
988 .counter = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
989 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
990 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
991 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
992 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
993};
994
995/* Platform led default data */
996static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
997 {
998 .label = "status:green",
999 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1000 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1001 },
1002 {
1003 .label = "status:red",
1004 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1005 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1006 },
1007 {
1008 .label = "psu:green",
1009 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1010 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1011 },
1012 {
1013 .label = "psu:red",
1014 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1015 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1016 },
1017 {
1018 .label = "fan1:green",
1019 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1020 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1021 },
1022 {
1023 .label = "fan1:red",
1024 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1025 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1026 },
1027 {
1028 .label = "fan2:green",
1029 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1030 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1031 },
1032 {
1033 .label = "fan2:red",
1034 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1035 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1036 },
1037 {
1038 .label = "fan3:green",
1039 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1040 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1041 },
1042 {
1043 .label = "fan3:red",
1044 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1045 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1046 },
1047 {
1048 .label = "fan4:green",
1049 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1050 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1051 },
1052 {
1053 .label = "fan4:red",
1054 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1055 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1056 },
1057};
1058
1059static struct mlxreg_core_platform_data mlxplat_default_led_data = {
1060 .data = mlxplat_mlxcpld_default_led_data,
1061 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
1062};
1063
1064/* Platform led MSN21xx system family data */
1065static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
1066 {
1067 .label = "status:green",
1068 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1069 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1070 },
1071 {
1072 .label = "status:red",
1073 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1074 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1075 },
1076 {
1077 .label = "fan:green",
1078 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1079 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1080 },
1081 {
1082 .label = "fan:red",
1083 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1084 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1085 },
1086 {
1087 .label = "psu1:green",
1088 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1089 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1090 },
1091 {
1092 .label = "psu1:red",
1093 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1094 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1095 },
1096 {
1097 .label = "psu2:green",
1098 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1099 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1100 },
1101 {
1102 .label = "psu2:red",
1103 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1104 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1105 },
1106 {
1107 .label = "uid:blue",
1108 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1109 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1110 },
1111};
1112
1113static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
1114 .data = mlxplat_mlxcpld_msn21xx_led_data,
1115 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
1116};
1117
1118/* Platform led for default data for 200GbE systems */
1119static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
1120 {
1121 .label = "status:green",
1122 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1123 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1124 },
1125 {
1126 .label = "status:orange",
1127 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1128 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1129 },
1130 {
1131 .label = "psu:green",
1132 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1133 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1134 },
1135 {
1136 .label = "psu:orange",
1137 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1138 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1139 },
1140 {
1141 .label = "fan1:green",
1142 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1143 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1144 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1145 .bit = BIT(0),
1146 },
1147 {
1148 .label = "fan1:orange",
1149 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1150 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1151 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1152 .bit = BIT(0),
1153 },
1154 {
1155 .label = "fan2:green",
1156 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1157 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1158 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1159 .bit = BIT(1),
1160 },
1161 {
1162 .label = "fan2:orange",
1163 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1164 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1165 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1166 .bit = BIT(1),
1167 },
1168 {
1169 .label = "fan3:green",
1170 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1171 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1172 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1173 .bit = BIT(2),
1174 },
1175 {
1176 .label = "fan3:orange",
1177 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1178 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1179 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1180 .bit = BIT(2),
1181 },
1182 {
1183 .label = "fan4:green",
1184 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1185 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1186 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1187 .bit = BIT(3),
1188 },
1189 {
1190 .label = "fan4:orange",
1191 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1192 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1193 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1194 .bit = BIT(3),
1195 },
1196 {
1197 .label = "fan5:green",
1198 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1199 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1200 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1201 .bit = BIT(4),
1202 },
1203 {
1204 .label = "fan5:orange",
1205 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1206 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1207 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1208 .bit = BIT(4),
1209 },
1210 {
1211 .label = "fan6:green",
1212 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1213 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1214 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1215 .bit = BIT(5),
1216 },
1217 {
1218 .label = "fan6:orange",
1219 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1220 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1221 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1222 .bit = BIT(5),
1223 },
1224 {
1225 .label = "uid:blue",
1226 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1227 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1228 },
1229};
1230
1231static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
1232 .data = mlxplat_mlxcpld_default_ng_led_data,
1233 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
1234};
1235
1236/* Platform led for Comex based 100GbE systems */
1237static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
1238 {
1239 .label = "status:green",
1240 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1241 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1242 },
1243 {
1244 .label = "status:red",
1245 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1246 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1247 },
1248 {
1249 .label = "psu:green",
1250 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1251 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1252 },
1253 {
1254 .label = "psu:red",
1255 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1256 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1257 },
1258 {
1259 .label = "fan1:green",
1260 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1261 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1262 },
1263 {
1264 .label = "fan1:red",
1265 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1266 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1267 },
1268 {
1269 .label = "fan2:green",
1270 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1271 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1272 },
1273 {
1274 .label = "fan2:red",
1275 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1276 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1277 },
1278 {
1279 .label = "fan3:green",
1280 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1281 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1282 },
1283 {
1284 .label = "fan3:red",
1285 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1286 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1287 },
1288 {
1289 .label = "fan4:green",
1290 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1291 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1292 },
1293 {
1294 .label = "fan4:red",
1295 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1296 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1297 },
1298 {
1299 .label = "uid:blue",
1300 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1301 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1302 },
1303};
1304
1305static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
1306 .data = mlxplat_mlxcpld_comex_100G_led_data,
1307 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
1308};
1309
1310/* Platform register access default */
1311static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
1312 {
1313 .label = "cpld1_version",
1314 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1315 .bit = GENMASK(7, 0),
1316 .mode = 0444,
1317 },
1318 {
1319 .label = "cpld2_version",
1320 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1321 .bit = GENMASK(7, 0),
1322 .mode = 0444,
1323 },
1324 {
1325 .label = "cpld1_pn",
1326 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1327 .bit = GENMASK(15, 0),
1328 .mode = 0444,
1329 .regnum = 2,
1330 },
1331 {
1332 .label = "cpld2_pn",
1333 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1334 .bit = GENMASK(15, 0),
1335 .mode = 0444,
1336 .regnum = 2,
1337 },
1338 {
1339 .label = "cpld1_version_min",
1340 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1341 .bit = GENMASK(7, 0),
1342 .mode = 0444,
1343 },
1344 {
1345 .label = "cpld2_version_min",
1346 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1347 .bit = GENMASK(7, 0),
1348 .mode = 0444,
1349 },
1350 {
1351 .label = "reset_long_pb",
1352 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1353 .mask = GENMASK(7, 0) & ~BIT(0),
1354 .mode = 0444,
1355 },
1356 {
1357 .label = "reset_short_pb",
1358 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1359 .mask = GENMASK(7, 0) & ~BIT(1),
1360 .mode = 0444,
1361 },
1362 {
1363 .label = "reset_aux_pwr_or_ref",
1364 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1365 .mask = GENMASK(7, 0) & ~BIT(2),
1366 .mode = 0444,
1367 },
1368 {
1369 .label = "reset_main_pwr_fail",
1370 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1371 .mask = GENMASK(7, 0) & ~BIT(3),
1372 .mode = 0444,
1373 },
1374 {
1375 .label = "reset_sw_reset",
1376 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1377 .mask = GENMASK(7, 0) & ~BIT(4),
1378 .mode = 0444,
1379 },
1380 {
1381 .label = "reset_fw_reset",
1382 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1383 .mask = GENMASK(7, 0) & ~BIT(5),
1384 .mode = 0444,
1385 },
1386 {
1387 .label = "reset_hotswap_or_wd",
1388 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1389 .mask = GENMASK(7, 0) & ~BIT(6),
1390 .mode = 0444,
1391 },
1392 {
1393 .label = "reset_asic_thermal",
1394 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1395 .mask = GENMASK(7, 0) & ~BIT(7),
1396 .mode = 0444,
1397 },
1398 {
1399 .label = "psu1_on",
1400 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1401 .mask = GENMASK(7, 0) & ~BIT(0),
1402 .mode = 0200,
1403 },
1404 {
1405 .label = "psu2_on",
1406 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1407 .mask = GENMASK(7, 0) & ~BIT(1),
1408 .mode = 0200,
1409 },
1410 {
1411 .label = "pwr_cycle",
1412 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1413 .mask = GENMASK(7, 0) & ~BIT(2),
1414 .mode = 0200,
1415 },
1416 {
1417 .label = "pwr_down",
1418 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1419 .mask = GENMASK(7, 0) & ~BIT(3),
1420 .mode = 0200,
1421 },
1422 {
1423 .label = "select_iio",
1424 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1425 .mask = GENMASK(7, 0) & ~BIT(6),
1426 .mode = 0644,
1427 },
1428 {
1429 .label = "asic_health",
1430 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1431 .mask = MLXPLAT_CPLD_ASIC_MASK,
1432 .bit = 1,
1433 .mode = 0444,
1434 },
1435};
1436
1437static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
1438 .data = mlxplat_mlxcpld_default_regs_io_data,
1439 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
1440};
1441
1442/* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
1443static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
1444 {
1445 .label = "cpld1_version",
1446 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1447 .bit = GENMASK(7, 0),
1448 .mode = 0444,
1449 },
1450 {
1451 .label = "cpld2_version",
1452 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1453 .bit = GENMASK(7, 0),
1454 .mode = 0444,
1455 },
1456 {
1457 .label = "cpld1_pn",
1458 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1459 .bit = GENMASK(15, 0),
1460 .mode = 0444,
1461 .regnum = 2,
1462 },
1463 {
1464 .label = "cpld2_pn",
1465 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1466 .bit = GENMASK(15, 0),
1467 .mode = 0444,
1468 .regnum = 2,
1469 },
1470 {
1471 .label = "cpld1_version_min",
1472 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1473 .bit = GENMASK(7, 0),
1474 .mode = 0444,
1475 },
1476 {
1477 .label = "cpld2_version_min",
1478 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1479 .bit = GENMASK(7, 0),
1480 .mode = 0444,
1481 },
1482 {
1483 .label = "reset_long_pb",
1484 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1485 .mask = GENMASK(7, 0) & ~BIT(0),
1486 .mode = 0444,
1487 },
1488 {
1489 .label = "reset_short_pb",
1490 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1491 .mask = GENMASK(7, 0) & ~BIT(1),
1492 .mode = 0444,
1493 },
1494 {
1495 .label = "reset_aux_pwr_or_ref",
1496 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1497 .mask = GENMASK(7, 0) & ~BIT(2),
1498 .mode = 0444,
1499 },
1500 {
1501 .label = "reset_sw_reset",
1502 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1503 .mask = GENMASK(7, 0) & ~BIT(3),
1504 .mode = 0444,
1505 },
1506 {
1507 .label = "reset_main_pwr_fail",
1508 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1509 .mask = GENMASK(7, 0) & ~BIT(4),
1510 .mode = 0444,
1511 },
1512 {
1513 .label = "reset_asic_thermal",
1514 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1515 .mask = GENMASK(7, 0) & ~BIT(5),
1516 .mode = 0444,
1517 },
1518 {
1519 .label = "reset_hotswap_or_halt",
1520 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1521 .mask = GENMASK(7, 0) & ~BIT(6),
1522 .mode = 0444,
1523 },
1524 {
1525 .label = "reset_sff_wd",
1526 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1527 .mask = GENMASK(7, 0) & ~BIT(6),
1528 .mode = 0444,
1529 },
1530 {
1531 .label = "psu1_on",
1532 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1533 .mask = GENMASK(7, 0) & ~BIT(0),
1534 .mode = 0200,
1535 },
1536 {
1537 .label = "psu2_on",
1538 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1539 .mask = GENMASK(7, 0) & ~BIT(1),
1540 .mode = 0200,
1541 },
1542 {
1543 .label = "pwr_cycle",
1544 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1545 .mask = GENMASK(7, 0) & ~BIT(2),
1546 .mode = 0200,
1547 },
1548 {
1549 .label = "pwr_down",
1550 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1551 .mask = GENMASK(7, 0) & ~BIT(3),
1552 .mode = 0200,
1553 },
1554 {
1555 .label = "select_iio",
1556 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1557 .mask = GENMASK(7, 0) & ~BIT(6),
1558 .mode = 0644,
1559 },
1560 {
1561 .label = "asic_health",
1562 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1563 .mask = MLXPLAT_CPLD_ASIC_MASK,
1564 .bit = 1,
1565 .mode = 0444,
1566 },
1567};
1568
1569static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
1570 .data = mlxplat_mlxcpld_msn21xx_regs_io_data,
1571 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
1572};
1573
1574/* Platform register access for next generation systems families data */
1575static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
1576 {
1577 .label = "cpld1_version",
1578 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1579 .bit = GENMASK(7, 0),
1580 .mode = 0444,
1581 },
1582 {
1583 .label = "cpld2_version",
1584 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1585 .bit = GENMASK(7, 0),
1586 .mode = 0444,
1587 },
1588 {
1589 .label = "cpld3_version",
1590 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
1591 .bit = GENMASK(7, 0),
1592 .mode = 0444,
1593 },
1594 {
1595 .label = "cpld4_version",
1596 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
1597 .bit = GENMASK(7, 0),
1598 .mode = 0444,
1599 },
1600 {
1601 .label = "cpld1_pn",
1602 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1603 .bit = GENMASK(15, 0),
1604 .mode = 0444,
1605 .regnum = 2,
1606 },
1607 {
1608 .label = "cpld2_pn",
1609 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1610 .bit = GENMASK(15, 0),
1611 .mode = 0444,
1612 .regnum = 2,
1613 },
1614 {
1615 .label = "cpld3_pn",
1616 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
1617 .bit = GENMASK(15, 0),
1618 .mode = 0444,
1619 .regnum = 2,
1620 },
1621 {
1622 .label = "cpld4_pn",
1623 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
1624 .bit = GENMASK(15, 0),
1625 .mode = 0444,
1626 .regnum = 2,
1627 },
1628 {
1629 .label = "cpld1_version_min",
1630 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1631 .bit = GENMASK(7, 0),
1632 .mode = 0444,
1633 },
1634 {
1635 .label = "cpld2_version_min",
1636 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1637 .bit = GENMASK(7, 0),
1638 .mode = 0444,
1639 },
1640 {
1641 .label = "cpld3_version_min",
1642 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
1643 .bit = GENMASK(7, 0),
1644 .mode = 0444,
1645 },
1646 {
1647 .label = "cpld4_version_min",
1648 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
1649 .bit = GENMASK(7, 0),
1650 .mode = 0444,
1651 },
1652 {
1653 .label = "reset_long_pb",
1654 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1655 .mask = GENMASK(7, 0) & ~BIT(0),
1656 .mode = 0444,
1657 },
1658 {
1659 .label = "reset_short_pb",
1660 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1661 .mask = GENMASK(7, 0) & ~BIT(1),
1662 .mode = 0444,
1663 },
1664 {
1665 .label = "reset_aux_pwr_or_ref",
1666 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1667 .mask = GENMASK(7, 0) & ~BIT(2),
1668 .mode = 0444,
1669 },
1670 {
1671 .label = "reset_from_comex",
1672 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1673 .mask = GENMASK(7, 0) & ~BIT(4),
1674 .mode = 0444,
1675 },
1676 {
1677 .label = "reset_from_asic",
1678 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1679 .mask = GENMASK(7, 0) & ~BIT(5),
1680 .mode = 0444,
1681 },
1682 {
1683 .label = "reset_swb_wd",
1684 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1685 .mask = GENMASK(7, 0) & ~BIT(6),
1686 .mode = 0444,
1687 },
1688 {
1689 .label = "reset_asic_thermal",
1690 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1691 .mask = GENMASK(7, 0) & ~BIT(7),
1692 .mode = 0444,
1693 },
1694 {
1695 .label = "reset_comex_pwr_fail",
1696 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1697 .mask = GENMASK(7, 0) & ~BIT(3),
1698 .mode = 0444,
1699 },
1700 {
1701 .label = "reset_platform",
1702 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1703 .mask = GENMASK(7, 0) & ~BIT(4),
1704 .mode = 0444,
1705 },
1706 {
1707 .label = "reset_soc",
1708 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1709 .mask = GENMASK(7, 0) & ~BIT(5),
1710 .mode = 0444,
1711 },
1712 {
1713 .label = "reset_comex_wd",
1714 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1715 .mask = GENMASK(7, 0) & ~BIT(6),
1716 .mode = 0444,
1717 },
1718 {
1719 .label = "reset_voltmon_upgrade_fail",
1720 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1721 .mask = GENMASK(7, 0) & ~BIT(0),
1722 .mode = 0444,
1723 },
1724 {
1725 .label = "reset_system",
1726 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1727 .mask = GENMASK(7, 0) & ~BIT(1),
1728 .mode = 0444,
1729 },
1730 {
1731 .label = "reset_sw_pwr_off",
1732 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1733 .mask = GENMASK(7, 0) & ~BIT(2),
1734 .mode = 0444,
1735 },
1736 {
1737 .label = "reset_comex_thermal",
1738 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1739 .mask = GENMASK(7, 0) & ~BIT(3),
1740 .mode = 0444,
1741 },
1742 {
1743 .label = "reset_reload_bios",
1744 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1745 .mask = GENMASK(7, 0) & ~BIT(5),
1746 .mode = 0444,
1747 },
1748 {
1749 .label = "reset_ac_pwr_fail",
1750 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1751 .mask = GENMASK(7, 0) & ~BIT(6),
1752 .mode = 0444,
1753 },
1754 {
1755 .label = "psu1_on",
1756 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1757 .mask = GENMASK(7, 0) & ~BIT(0),
1758 .mode = 0200,
1759 },
1760 {
1761 .label = "psu2_on",
1762 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1763 .mask = GENMASK(7, 0) & ~BIT(1),
1764 .mode = 0200,
1765 },
1766 {
1767 .label = "pwr_cycle",
1768 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1769 .mask = GENMASK(7, 0) & ~BIT(2),
1770 .mode = 0200,
1771 },
1772 {
1773 .label = "pwr_down",
1774 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1775 .mask = GENMASK(7, 0) & ~BIT(3),
1776 .mode = 0200,
1777 },
1778 {
1779 .label = "jtag_enable",
1780 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1781 .mask = GENMASK(7, 0) & ~BIT(4),
1782 .mode = 0644,
1783 },
1784 {
1785 .label = "asic_health",
1786 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1787 .mask = MLXPLAT_CPLD_ASIC_MASK,
1788 .bit = 1,
1789 .mode = 0444,
1790 },
1791 {
1792 .label = "fan_dir",
1793 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
1794 .bit = GENMASK(7, 0),
1795 .mode = 0444,
1796 },
1797 {
1798 .label = "voltreg_update_status",
1799 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
1800 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
1801 .bit = 5,
1802 .mode = 0444,
1803 },
1804 {
1805 .label = "vpd_wp",
1806 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
1807 .mask = GENMASK(7, 0) & ~BIT(3),
1808 .mode = 0644,
1809 },
1810 {
1811 .label = "pcie_asic_reset_dis",
1812 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
1813 .mask = GENMASK(7, 0) & ~BIT(4),
1814 .mode = 0644,
1815 },
1816 {
1817 .label = "config1",
1818 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
1819 .bit = GENMASK(7, 0),
1820 .mode = 0444,
1821 },
1822 {
1823 .label = "config2",
1824 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
1825 .bit = GENMASK(7, 0),
1826 .mode = 0444,
1827 },
1828 {
1829 .label = "ufm_version",
1830 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
1831 .bit = GENMASK(7, 0),
1832 .mode = 0444,
1833 },
1834};
1835
1836static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
1837 .data = mlxplat_mlxcpld_default_ng_regs_io_data,
1838 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
1839};
1840
1841/* Platform FAN default */
1842static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
1843 {
1844 .label = "pwm1",
1845 .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
1846 },
1847 {
1848 .label = "tacho1",
1849 .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
1850 .mask = GENMASK(7, 0),
1851 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1852 .bit = BIT(0),
1853 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1854
1855 },
1856 {
1857 .label = "tacho2",
1858 .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
1859 .mask = GENMASK(7, 0),
1860 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1861 .bit = BIT(1),
1862 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1863 },
1864 {
1865 .label = "tacho3",
1866 .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
1867 .mask = GENMASK(7, 0),
1868 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1869 .bit = BIT(2),
1870 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1871 },
1872 {
1873 .label = "tacho4",
1874 .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
1875 .mask = GENMASK(7, 0),
1876 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1877 .bit = BIT(3),
1878 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1879 },
1880 {
1881 .label = "tacho5",
1882 .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
1883 .mask = GENMASK(7, 0),
1884 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1885 .bit = BIT(4),
1886 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1887 },
1888 {
1889 .label = "tacho6",
1890 .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
1891 .mask = GENMASK(7, 0),
1892 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1893 .bit = BIT(5),
1894 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1895 },
1896 {
1897 .label = "tacho7",
1898 .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
1899 .mask = GENMASK(7, 0),
1900 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1901 .bit = BIT(6),
1902 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1903 },
1904 {
1905 .label = "tacho8",
1906 .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
1907 .mask = GENMASK(7, 0),
1908 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1909 .bit = BIT(7),
1910 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1911 },
1912 {
1913 .label = "tacho9",
1914 .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
1915 .mask = GENMASK(7, 0),
1916 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1917 .bit = BIT(0),
1918 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1919 },
1920 {
1921 .label = "tacho10",
1922 .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
1923 .mask = GENMASK(7, 0),
1924 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1925 .bit = BIT(1),
1926 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1927 },
1928 {
1929 .label = "tacho11",
1930 .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
1931 .mask = GENMASK(7, 0),
1932 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1933 .bit = BIT(2),
1934 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1935 },
1936 {
1937 .label = "tacho12",
1938 .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
1939 .mask = GENMASK(7, 0),
1940 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1941 .bit = BIT(3),
1942 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1943 },
1944 {
1945 .label = "conf",
1946 .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
1947 },
1948};
1949
1950static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
1951 .data = mlxplat_mlxcpld_default_fan_data,
1952 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
1953};
1954
1955/* Watchdog type1: hardware implementation version1
1956 * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
1957 */
1958static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
1959 {
1960 .label = "action",
1961 .reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
1962 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
1963 .bit = 0,
1964 },
1965 {
1966 .label = "timeout",
1967 .reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
1968 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
1969 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
1970 },
1971 {
1972 .label = "ping",
1973 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
1974 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
1975 .bit = 0,
1976 },
1977 {
1978 .label = "reset",
1979 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1980 .mask = GENMASK(7, 0) & ~BIT(6),
1981 .bit = 6,
1982 },
1983};
1984
1985static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
1986 {
1987 .label = "action",
1988 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
1989 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
1990 .bit = 4,
1991 },
1992 {
1993 .label = "timeout",
1994 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
1995 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
1996 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
1997 },
1998 {
1999 .label = "ping",
2000 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
2001 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
2002 .bit = 1,
2003 },
2004};
2005
2006static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
2007 {
2008 .data = mlxplat_mlxcpld_wd_main_regs_type1,
2009 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
2010 .version = MLX_WDT_TYPE1,
2011 .identity = "mlx-wdt-main",
2012 },
2013 {
2014 .data = mlxplat_mlxcpld_wd_aux_regs_type1,
2015 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
2016 .version = MLX_WDT_TYPE1,
2017 .identity = "mlx-wdt-aux",
2018 },
2019};
2020
2021/* Watchdog type2: hardware implementation version 2
2022 * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
2023 */
2024static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
2025 {
2026 .label = "action",
2027 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2028 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2029 .bit = 0,
2030 },
2031 {
2032 .label = "timeout",
2033 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2034 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2035 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
2036 },
2037 {
2038 .label = "timeleft",
2039 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
2040 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2041 },
2042 {
2043 .label = "ping",
2044 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2045 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2046 .bit = 0,
2047 },
2048 {
2049 .label = "reset",
2050 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2051 .mask = GENMASK(7, 0) & ~BIT(6),
2052 .bit = 6,
2053 },
2054};
2055
2056static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
2057 {
2058 .label = "action",
2059 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2060 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2061 .bit = 4,
2062 },
2063 {
2064 .label = "timeout",
2065 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2066 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2067 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
2068 },
2069 {
2070 .label = "timeleft",
2071 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
2072 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2073 },
2074 {
2075 .label = "ping",
2076 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2077 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2078 .bit = 4,
2079 },
2080};
2081
2082static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
2083 {
2084 .data = mlxplat_mlxcpld_wd_main_regs_type2,
2085 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
2086 .version = MLX_WDT_TYPE2,
2087 .identity = "mlx-wdt-main",
2088 },
2089 {
2090 .data = mlxplat_mlxcpld_wd_aux_regs_type2,
2091 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
2092 .version = MLX_WDT_TYPE2,
2093 .identity = "mlx-wdt-aux",
2094 },
2095};
2096
2097/* Watchdog type3: hardware implementation version 3
2098 * Can be on all systems. It's differentiated by WD capability bit.
2099 * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
2100 * still have only one main watchdog.
2101 */
2102static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
2103 {
2104 .label = "action",
2105 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2106 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2107 .bit = 0,
2108 },
2109 {
2110 .label = "timeout",
2111 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2112 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2113 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
2114 },
2115 {
2116 .label = "timeleft",
2117 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2118 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2119 },
2120 {
2121 .label = "ping",
2122 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2123 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2124 .bit = 0,
2125 },
2126 {
2127 .label = "reset",
2128 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2129 .mask = GENMASK(7, 0) & ~BIT(6),
2130 .bit = 6,
2131 },
2132};
2133
2134static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
2135 {
2136 .label = "action",
2137 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2138 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2139 .bit = 4,
2140 },
2141 {
2142 .label = "timeout",
2143 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2144 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2145 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
2146 },
2147 {
2148 .label = "timeleft",
2149 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2150 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2151 },
2152 {
2153 .label = "ping",
2154 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2155 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2156 .bit = 4,
2157 },
2158};
2159
2160static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
2161 {
2162 .data = mlxplat_mlxcpld_wd_main_regs_type3,
2163 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
2164 .version = MLX_WDT_TYPE3,
2165 .identity = "mlx-wdt-main",
2166 },
2167 {
2168 .data = mlxplat_mlxcpld_wd_aux_regs_type3,
2169 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
2170 .version = MLX_WDT_TYPE3,
2171 .identity = "mlx-wdt-aux",
2172 },
2173};
2174
2175static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
2176{
2177 switch (reg) {
2178 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2179 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2180 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2181 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2182 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2183 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2184 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2185 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
2186 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2187 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
2188 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2189 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2190 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2191 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2192 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2193 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2194 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2195 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2196 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2197 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2198 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2199 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2200 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
2201 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
2202 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
2203 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
2204 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2205 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2206 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
2207 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2208 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2209 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
2210 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2211 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2212 return true;
2213 }
2214 return false;
2215}
2216
2217static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
2218{
2219 switch (reg) {
2220 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
2221 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
2222 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
2223 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
2224 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
2225 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
2226 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
2227 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
2228 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
2229 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
2230 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
2231 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2232 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2233 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2234 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2235 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2236 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
2237 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
2238 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2239 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2240 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
2241 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2242 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
2243 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
2244 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2245 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
2246 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2247 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
2248 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2249 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
2250 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2251 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
2252 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2253 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2254 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
2255 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2256 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2257 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
2258 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2259 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2260 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
2261 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2262 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2263 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
2264 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
2265 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
2266 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
2267 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2268 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2269 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
2270 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2271 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2272 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
2273 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
2274 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
2275 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
2276 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
2277 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2278 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
2279 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
2280 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
2281 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
2282 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
2283 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
2284 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
2285 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
2286 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
2287 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
2288 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
2289 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
2290 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2291 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
2292 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
2293 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
2294 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
2295 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
2296 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
2297 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
2298 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
2299 return true;
2300 }
2301 return false;
2302}
2303
2304static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
2305{
2306 switch (reg) {
2307 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
2308 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
2309 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
2310 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
2311 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
2312 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
2313 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
2314 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
2315 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
2316 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
2317 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
2318 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2319 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2320 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2321 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2322 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2323 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
2324 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
2325 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2326 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2327 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2328 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
2329 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2330 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
2331 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2332 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
2333 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2334 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
2335 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2336 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
2337 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2338 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2339 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
2340 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2341 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2342 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
2343 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2344 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2345 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
2346 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2347 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2348 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2349 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2350 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2351 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2352 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
2353 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
2354 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
2355 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
2356 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2357 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
2358 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
2359 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
2360 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
2361 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
2362 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
2363 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
2364 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
2365 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
2366 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
2367 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
2368 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
2369 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2370 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
2371 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
2372 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
2373 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
2374 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
2375 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
2376 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
2377 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
2378 return true;
2379 }
2380 return false;
2381}
2382
2383static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
2384 { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
2385 { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
2386 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2387 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
2388};
2389
2390static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
2391 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2392 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
2393};
2394
2395static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
2396 { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
2397 MLXPLAT_CPLD_LOW_AGGRCX_MASK },
2398 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2399};
2400
2401static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
2402 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2403 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
2404 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
2405 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
2406};
2407
2408struct mlxplat_mlxcpld_regmap_context {
2409 void __iomem *base;
2410};
2411
2412static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
2413
2414static int
2415mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
2416{
2417 struct mlxplat_mlxcpld_regmap_context *ctx = context;
2418
2419 *val = ioread8(ctx->base + reg);
2420 return 0;
2421}
2422
2423static int
2424mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
2425{
2426 struct mlxplat_mlxcpld_regmap_context *ctx = context;
2427
2428 iowrite8(val, ctx->base + reg);
2429 return 0;
2430}
2431
2432static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
2433 .reg_bits = 8,
2434 .val_bits = 8,
2435 .max_register = 255,
2436 .cache_type = REGCACHE_FLAT,
2437 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
2438 .readable_reg = mlxplat_mlxcpld_readable_reg,
2439 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
2440 .reg_defaults = mlxplat_mlxcpld_regmap_default,
2441 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
2442 .reg_read = mlxplat_mlxcpld_reg_read,
2443 .reg_write = mlxplat_mlxcpld_reg_write,
2444};
2445
2446static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
2447 .reg_bits = 8,
2448 .val_bits = 8,
2449 .max_register = 255,
2450 .cache_type = REGCACHE_FLAT,
2451 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
2452 .readable_reg = mlxplat_mlxcpld_readable_reg,
2453 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
2454 .reg_defaults = mlxplat_mlxcpld_regmap_ng,
2455 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
2456 .reg_read = mlxplat_mlxcpld_reg_read,
2457 .reg_write = mlxplat_mlxcpld_reg_write,
2458};
2459
2460static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
2461 .reg_bits = 8,
2462 .val_bits = 8,
2463 .max_register = 255,
2464 .cache_type = REGCACHE_FLAT,
2465 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
2466 .readable_reg = mlxplat_mlxcpld_readable_reg,
2467 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
2468 .reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
2469 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
2470 .reg_read = mlxplat_mlxcpld_reg_read,
2471 .reg_write = mlxplat_mlxcpld_reg_write,
2472};
2473
2474static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
2475 .reg_bits = 8,
2476 .val_bits = 8,
2477 .max_register = 255,
2478 .cache_type = REGCACHE_FLAT,
2479 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
2480 .readable_reg = mlxplat_mlxcpld_readable_reg,
2481 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
2482 .reg_defaults = mlxplat_mlxcpld_regmap_ng400,
2483 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
2484 .reg_read = mlxplat_mlxcpld_reg_read,
2485 .reg_write = mlxplat_mlxcpld_reg_write,
2486};
2487
2488static struct resource mlxplat_mlxcpld_resources[] = {
2489 [0] = DEFINE_RES_IRQ_NAMED(17, "mlxreg-hotplug"),
2490};
2491
2492static struct platform_device *mlxplat_dev;
2493static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
2494static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
2495static struct mlxreg_core_platform_data *mlxplat_led;
2496static struct mlxreg_core_platform_data *mlxplat_regs_io;
2497static struct mlxreg_core_platform_data *mlxplat_fan;
2498static struct mlxreg_core_platform_data
2499 *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
2500static const struct regmap_config *mlxplat_regmap_config;
2501
2502static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
2503{
2504 int i;
2505
2506 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2507 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2508 mlxplat_mux_data = mlxplat_default_mux_data;
2509 for (i = 0; i < mlxplat_mux_num; i++) {
2510 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
2511 mlxplat_mux_data[i].n_values =
2512 ARRAY_SIZE(mlxplat_default_channels[i]);
2513 }
2514 mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
2515 mlxplat_hotplug->deferred_nr =
2516 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2517 mlxplat_led = &mlxplat_default_led_data;
2518 mlxplat_regs_io = &mlxplat_default_regs_io_data;
2519 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2520
2521 return 1;
2522}
2523
2524static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
2525{
2526 int i;
2527
2528 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2529 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2530 mlxplat_mux_data = mlxplat_default_mux_data;
2531 for (i = 0; i < mlxplat_mux_num; i++) {
2532 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2533 mlxplat_mux_data[i].n_values =
2534 ARRAY_SIZE(mlxplat_msn21xx_channels);
2535 }
2536 mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
2537 mlxplat_hotplug->deferred_nr =
2538 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2539 mlxplat_led = &mlxplat_msn21xx_led_data;
2540 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2541 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2542
2543 return 1;
2544}
2545
2546static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
2547{
2548 int i;
2549
2550 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2551 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2552 mlxplat_mux_data = mlxplat_default_mux_data;
2553 for (i = 0; i < mlxplat_mux_num; i++) {
2554 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2555 mlxplat_mux_data[i].n_values =
2556 ARRAY_SIZE(mlxplat_msn21xx_channels);
2557 }
2558 mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
2559 mlxplat_hotplug->deferred_nr =
2560 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2561 mlxplat_led = &mlxplat_default_led_data;
2562 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2563 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2564
2565 return 1;
2566}
2567
2568static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
2569{
2570 int i;
2571
2572 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2573 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2574 mlxplat_mux_data = mlxplat_default_mux_data;
2575 for (i = 0; i < mlxplat_mux_num; i++) {
2576 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2577 mlxplat_mux_data[i].n_values =
2578 ARRAY_SIZE(mlxplat_msn21xx_channels);
2579 }
2580 mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
2581 mlxplat_hotplug->deferred_nr =
2582 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2583 mlxplat_led = &mlxplat_msn21xx_led_data;
2584 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2585 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2586
2587 return 1;
2588}
2589
2590static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
2591{
2592 int i;
2593
2594 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2595 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2596 mlxplat_mux_data = mlxplat_default_mux_data;
2597 for (i = 0; i < mlxplat_mux_num; i++) {
2598 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2599 mlxplat_mux_data[i].n_values =
2600 ARRAY_SIZE(mlxplat_msn21xx_channels);
2601 }
2602 mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
2603 mlxplat_hotplug->deferred_nr =
2604 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2605 mlxplat_led = &mlxplat_default_ng_led_data;
2606 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2607 mlxplat_fan = &mlxplat_default_fan_data;
2608 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2609 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2610 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
2611 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
2612
2613 return 1;
2614}
2615
2616static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
2617{
2618 int i;
2619
2620 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
2621 mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
2622 mlxplat_mux_data = mlxplat_extended_mux_data;
2623 for (i = 0; i < mlxplat_mux_num; i++) {
2624 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2625 mlxplat_mux_data[i].n_values =
2626 ARRAY_SIZE(mlxplat_msn21xx_channels);
2627 }
2628 mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
2629 mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
2630 mlxplat_led = &mlxplat_comex_100G_led_data;
2631 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2632 mlxplat_fan = &mlxplat_default_fan_data;
2633 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2634 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2635 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
2636
2637 return 1;
2638}
2639
2640static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
2641{
2642 int i;
2643
2644 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2645 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2646 mlxplat_mux_data = mlxplat_default_mux_data;
2647 for (i = 0; i < mlxplat_mux_num; i++) {
2648 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2649 mlxplat_mux_data[i].n_values =
2650 ARRAY_SIZE(mlxplat_msn21xx_channels);
2651 }
2652 mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
2653 mlxplat_hotplug->deferred_nr =
2654 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2655 mlxplat_led = &mlxplat_default_ng_led_data;
2656 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2657 mlxplat_fan = &mlxplat_default_fan_data;
2658 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2659 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2660 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
2661 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
2662
2663 return 1;
2664}
2665
2666static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
2667 {
2668 .callback = mlxplat_dmi_default_matched,
2669 .matches = {
2670 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
2671 },
2672 },
2673 {
2674 .callback = mlxplat_dmi_msn21xx_matched,
2675 .matches = {
2676 DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
2677 },
2678 },
2679 {
2680 .callback = mlxplat_dmi_msn274x_matched,
2681 .matches = {
2682 DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
2683 },
2684 },
2685 {
2686 .callback = mlxplat_dmi_msn201x_matched,
2687 .matches = {
2688 DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
2689 },
2690 },
2691 {
2692 .callback = mlxplat_dmi_qmb7xx_matched,
2693 .matches = {
2694 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
2695 },
2696 },
2697 {
2698 .callback = mlxplat_dmi_qmb7xx_matched,
2699 .matches = {
2700 DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
2701 },
2702 },
2703 {
2704 .callback = mlxplat_dmi_comex_matched,
2705 .matches = {
2706 DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
2707 },
2708 },
2709 {
2710 .callback = mlxplat_dmi_ng400_matched,
2711 .matches = {
2712 DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
2713 },
2714 },
2715 {
2716 .callback = mlxplat_dmi_msn274x_matched,
2717 .matches = {
2718 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2719 DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
2720 },
2721 },
2722 {
2723 .callback = mlxplat_dmi_default_matched,
2724 .matches = {
2725 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2726 DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
2727 },
2728 },
2729 {
2730 .callback = mlxplat_dmi_default_matched,
2731 .matches = {
2732 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2733 DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
2734 },
2735 },
2736 {
2737 .callback = mlxplat_dmi_default_matched,
2738 .matches = {
2739 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2740 DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
2741 },
2742 },
2743 {
2744 .callback = mlxplat_dmi_default_matched,
2745 .matches = {
2746 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2747 DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
2748 },
2749 },
2750 {
2751 .callback = mlxplat_dmi_msn21xx_matched,
2752 .matches = {
2753 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2754 DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
2755 },
2756 },
2757 {
2758 .callback = mlxplat_dmi_msn201x_matched,
2759 .matches = {
2760 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2761 DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
2762 },
2763 },
2764 {
2765 .callback = mlxplat_dmi_qmb7xx_matched,
2766 .matches = {
2767 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2768 DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
2769 },
2770 },
2771 {
2772 .callback = mlxplat_dmi_qmb7xx_matched,
2773 .matches = {
2774 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2775 DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
2776 },
2777 },
2778 {
2779 .callback = mlxplat_dmi_qmb7xx_matched,
2780 .matches = {
2781 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2782 DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
2783 },
2784 },
2785 {
2786 .callback = mlxplat_dmi_qmb7xx_matched,
2787 .matches = {
2788 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2789 DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
2790 },
2791 },
2792 { }
2793};
2794
2795MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
2796
2797static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
2798{
2799 struct i2c_adapter *search_adap;
2800 int shift, i;
2801
2802 /* Scan adapters from expected id to verify it is free. */
2803 *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
2804 for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
2805 mlxplat_max_adap_num; i++) {
2806 search_adap = i2c_get_adapter(i);
2807 if (search_adap) {
2808 i2c_put_adapter(search_adap);
2809 continue;
2810 }
2811
2812 /* Return if expected parent adapter is free. */
2813 if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
2814 return 0;
2815 break;
2816 }
2817
2818 /* Return with error if free id for adapter is not found. */
2819 if (i == mlxplat_max_adap_num)
2820 return -ENODEV;
2821
2822 /* Shift adapter ids, since expected parent adapter is not free. */
2823 *nr = i;
2824 for (i = 0; i < mlxplat_mux_num; i++) {
2825 shift = *nr - mlxplat_mux_data[i].parent;
2826 mlxplat_mux_data[i].parent = *nr;
2827 mlxplat_mux_data[i].base_nr += shift;
2828 if (shift > 0)
2829 mlxplat_hotplug->shift_nr = shift;
2830 }
2831
2832 return 0;
2833}
2834
2835static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
2836{
2837 u32 regval;
2838 int i, rc;
2839
2840 rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2841 ®val);
2842 if (rc)
2843 return rc;
2844
2845 if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
2846 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
2847 if (mlxplat_wd_data[i])
2848 mlxplat_wd_data[i] =
2849 &mlxplat_mlxcpld_wd_set_type3[i];
2850 }
2851 }
2852
2853 return 0;
2854}
2855
2856static int __init mlxplat_init(void)
2857{
2858 struct mlxplat_priv *priv;
2859 int i, j, nr, err;
2860
2861 if (!dmi_check_system(mlxplat_dmi_table))
2862 return -ENODEV;
2863
2864 mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, -1,
2865 mlxplat_lpc_resources,
2866 ARRAY_SIZE(mlxplat_lpc_resources));
2867
2868 if (IS_ERR(mlxplat_dev))
2869 return PTR_ERR(mlxplat_dev);
2870
2871 priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
2872 GFP_KERNEL);
2873 if (!priv) {
2874 err = -ENOMEM;
2875 goto fail_alloc;
2876 }
2877 platform_set_drvdata(mlxplat_dev, priv);
2878
2879 mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
2880 mlxplat_lpc_resources[1].start, 1);
2881 if (!mlxplat_mlxcpld_regmap_ctx.base) {
2882 err = -ENOMEM;
2883 goto fail_alloc;
2884 }
2885
2886 if (!mlxplat_regmap_config)
2887 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
2888
2889 priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
2890 &mlxplat_mlxcpld_regmap_ctx,
2891 mlxplat_regmap_config);
2892 if (IS_ERR(priv->regmap)) {
2893 err = PTR_ERR(priv->regmap);
2894 goto fail_alloc;
2895 }
2896
2897 err = mlxplat_mlxcpld_verify_bus_topology(&nr);
2898 if (nr < 0)
2899 goto fail_alloc;
2900
2901 nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
2902 if (mlxplat_i2c)
2903 mlxplat_i2c->regmap = priv->regmap;
2904 priv->pdev_i2c = platform_device_register_resndata(
2905 &mlxplat_dev->dev, "i2c_mlxcpld",
2906 nr, mlxplat_mlxcpld_resources,
2907 ARRAY_SIZE(mlxplat_mlxcpld_resources),
2908 mlxplat_i2c, sizeof(*mlxplat_i2c));
2909 if (IS_ERR(priv->pdev_i2c)) {
2910 err = PTR_ERR(priv->pdev_i2c);
2911 goto fail_alloc;
2912 }
2913
2914 for (i = 0; i < mlxplat_mux_num; i++) {
2915 priv->pdev_mux[i] = platform_device_register_resndata(
2916 &priv->pdev_i2c->dev,
2917 "i2c-mux-reg", i, NULL,
2918 0, &mlxplat_mux_data[i],
2919 sizeof(mlxplat_mux_data[i]));
2920 if (IS_ERR(priv->pdev_mux[i])) {
2921 err = PTR_ERR(priv->pdev_mux[i]);
2922 goto fail_platform_mux_register;
2923 }
2924 }
2925
2926 /* Add hotplug driver */
2927 mlxplat_hotplug->regmap = priv->regmap;
2928 priv->pdev_hotplug = platform_device_register_resndata(
2929 &mlxplat_dev->dev, "mlxreg-hotplug",
2930 PLATFORM_DEVID_NONE,
2931 mlxplat_mlxcpld_resources,
2932 ARRAY_SIZE(mlxplat_mlxcpld_resources),
2933 mlxplat_hotplug, sizeof(*mlxplat_hotplug));
2934 if (IS_ERR(priv->pdev_hotplug)) {
2935 err = PTR_ERR(priv->pdev_hotplug);
2936 goto fail_platform_mux_register;
2937 }
2938
2939 /* Set default registers. */
2940 for (j = 0; j < mlxplat_regmap_config->num_reg_defaults; j++) {
2941 err = regmap_write(priv->regmap,
2942 mlxplat_regmap_config->reg_defaults[j].reg,
2943 mlxplat_regmap_config->reg_defaults[j].def);
2944 if (err)
2945 goto fail_platform_mux_register;
2946 }
2947
2948 /* Add LED driver. */
2949 mlxplat_led->regmap = priv->regmap;
2950 priv->pdev_led = platform_device_register_resndata(
2951 &mlxplat_dev->dev, "leds-mlxreg",
2952 PLATFORM_DEVID_NONE, NULL, 0,
2953 mlxplat_led, sizeof(*mlxplat_led));
2954 if (IS_ERR(priv->pdev_led)) {
2955 err = PTR_ERR(priv->pdev_led);
2956 goto fail_platform_hotplug_register;
2957 }
2958
2959 /* Add registers io access driver. */
2960 if (mlxplat_regs_io) {
2961 mlxplat_regs_io->regmap = priv->regmap;
2962 priv->pdev_io_regs = platform_device_register_resndata(
2963 &mlxplat_dev->dev, "mlxreg-io",
2964 PLATFORM_DEVID_NONE, NULL, 0,
2965 mlxplat_regs_io,
2966 sizeof(*mlxplat_regs_io));
2967 if (IS_ERR(priv->pdev_io_regs)) {
2968 err = PTR_ERR(priv->pdev_io_regs);
2969 goto fail_platform_led_register;
2970 }
2971 }
2972
2973 /* Add FAN driver. */
2974 if (mlxplat_fan) {
2975 mlxplat_fan->regmap = priv->regmap;
2976 priv->pdev_fan = platform_device_register_resndata(
2977 &mlxplat_dev->dev, "mlxreg-fan",
2978 PLATFORM_DEVID_NONE, NULL, 0,
2979 mlxplat_fan,
2980 sizeof(*mlxplat_fan));
2981 if (IS_ERR(priv->pdev_fan)) {
2982 err = PTR_ERR(priv->pdev_fan);
2983 goto fail_platform_io_regs_register;
2984 }
2985 }
2986
2987 /* Add WD drivers. */
2988 err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
2989 if (err)
2990 goto fail_platform_wd_register;
2991 for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) {
2992 if (mlxplat_wd_data[j]) {
2993 mlxplat_wd_data[j]->regmap = priv->regmap;
2994 priv->pdev_wd[j] = platform_device_register_resndata(
2995 &mlxplat_dev->dev, "mlx-wdt",
2996 j, NULL, 0,
2997 mlxplat_wd_data[j],
2998 sizeof(*mlxplat_wd_data[j]));
2999 if (IS_ERR(priv->pdev_wd[j])) {
3000 err = PTR_ERR(priv->pdev_wd[j]);
3001 goto fail_platform_wd_register;
3002 }
3003 }
3004 }
3005
3006 /* Sync registers with hardware. */
3007 regcache_mark_dirty(priv->regmap);
3008 err = regcache_sync(priv->regmap);
3009 if (err)
3010 goto fail_platform_wd_register;
3011
3012 return 0;
3013
3014fail_platform_wd_register:
3015 while (--j >= 0)
3016 platform_device_unregister(priv->pdev_wd[j]);
3017 if (mlxplat_fan)
3018 platform_device_unregister(priv->pdev_fan);
3019fail_platform_io_regs_register:
3020 if (mlxplat_regs_io)
3021 platform_device_unregister(priv->pdev_io_regs);
3022fail_platform_led_register:
3023 platform_device_unregister(priv->pdev_led);
3024fail_platform_hotplug_register:
3025 platform_device_unregister(priv->pdev_hotplug);
3026fail_platform_mux_register:
3027 while (--i >= 0)
3028 platform_device_unregister(priv->pdev_mux[i]);
3029 platform_device_unregister(priv->pdev_i2c);
3030fail_alloc:
3031 platform_device_unregister(mlxplat_dev);
3032
3033 return err;
3034}
3035module_init(mlxplat_init);
3036
3037static void __exit mlxplat_exit(void)
3038{
3039 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
3040 int i;
3041
3042 for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0 ; i--)
3043 platform_device_unregister(priv->pdev_wd[i]);
3044 if (priv->pdev_fan)
3045 platform_device_unregister(priv->pdev_fan);
3046 if (priv->pdev_io_regs)
3047 platform_device_unregister(priv->pdev_io_regs);
3048 platform_device_unregister(priv->pdev_led);
3049 platform_device_unregister(priv->pdev_hotplug);
3050
3051 for (i = mlxplat_mux_num - 1; i >= 0 ; i--)
3052 platform_device_unregister(priv->pdev_mux[i]);
3053
3054 platform_device_unregister(priv->pdev_i2c);
3055 platform_device_unregister(mlxplat_dev);
3056}
3057module_exit(mlxplat_exit);
3058
3059MODULE_AUTHOR("Vadim Pasternak (vadimp@mellanox.com)");
3060MODULE_DESCRIPTION("Mellanox platform driver");
3061MODULE_LICENSE("Dual BSD/GPL");