1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
3 * Mellanox platform driver
5 * Copyright (C) 2016-2018 Mellanox Technologies
9 #include <linux/device.h>
10 #include <linux/dmi.h>
11 #include <linux/i2c.h>
12 #include <linux/i2c-mux.h>
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/platform_data/i2c-mux-reg.h>
17 #include <linux/platform_data/mlxreg.h>
18 #include <linux/regmap.h>
20 #define MLX_PLAT_DEVICE_NAME "mlxplat"
22 /* LPC bus IO offsets */
23 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000
24 #define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500
25 #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00
26 #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01
27 #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02
28 #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET 0x03
29 #define MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET 0x04
30 #define MLXPLAT_CPLD_LPC_REG_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
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)
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)
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
152 /* Default I2C parent bus number */
153 #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
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
159 /* Number of channels in group */
160 #define MLXPLAT_CPLD_GRP_CHNL_NUM 8
162 /* Start channel numbers */
163 #define MLXPLAT_CPLD_CH1 2
164 #define MLXPLAT_CPLD_CH2 10
165 #define MLXPLAT_CPLD_CH3 18
167 /* Number of LPC attached MUX platform devices */
168 #define MLXPLAT_CPLD_LPC_MUX_DEVS 3
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_PSU_MSNXXXX_NR2 3
175 #define MLXPLAT_CPLD_FAN1_DEFAULT_NR 11
176 #define MLXPLAT_CPLD_FAN2_DEFAULT_NR 12
177 #define MLXPLAT_CPLD_FAN3_DEFAULT_NR 13
178 #define MLXPLAT_CPLD_FAN4_DEFAULT_NR 14
180 /* Masks and default values for watchdogs */
181 #define MLXPLAT_CPLD_WD1_CLEAR_MASK GENMASK(7, 1)
182 #define MLXPLAT_CPLD_WD2_CLEAR_MASK (GENMASK(7, 0) & ~BIT(1))
184 #define MLXPLAT_CPLD_WD_TYPE1_TO_MASK GENMASK(7, 4)
185 #define MLXPLAT_CPLD_WD_TYPE2_TO_MASK 0
186 #define MLXPLAT_CPLD_WD_RESET_ACT_MASK GENMASK(7, 1)
187 #define MLXPLAT_CPLD_WD_FAN_ACT_MASK (GENMASK(7, 0) & ~BIT(4))
188 #define MLXPLAT_CPLD_WD_COUNT_ACT_MASK (GENMASK(7, 0) & ~BIT(7))
189 #define MLXPLAT_CPLD_WD_CPBLTY_MASK (GENMASK(7, 0) & ~BIT(6))
190 #define MLXPLAT_CPLD_WD_DFLT_TIMEOUT 30
191 #define MLXPLAT_CPLD_WD3_DFLT_TIMEOUT 600
192 #define MLXPLAT_CPLD_WD_MAX_DEVS 2
194 /* mlxplat_priv - platform private data
195 * @pdev_i2c - i2c controller platform device
196 * @pdev_mux - array of mux platform devices
197 * @pdev_hotplug - hotplug platform devices
198 * @pdev_led - led platform devices
199 * @pdev_io_regs - register access platform devices
200 * @pdev_fan - FAN platform devices
201 * @pdev_wd - array of watchdog platform devices
202 * @regmap: device register map
204 struct mlxplat_priv {
205 struct platform_device *pdev_i2c;
206 struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
207 struct platform_device *pdev_hotplug;
208 struct platform_device *pdev_led;
209 struct platform_device *pdev_io_regs;
210 struct platform_device *pdev_fan;
211 struct platform_device *pdev_wd[MLXPLAT_CPLD_WD_MAX_DEVS];
215 /* Regions for LPC I2C controller and LPC base register space */
216 static const struct resource mlxplat_lpc_resources[] = {
217 [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR,
218 MLXPLAT_CPLD_LPC_IO_RANGE,
219 "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO),
220 [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR,
221 MLXPLAT_CPLD_LPC_IO_RANGE,
222 "mlxplat_cpld_lpc_regs",
226 /* Platform i2c next generation systems data */
227 static struct mlxreg_core_data mlxplat_mlxcpld_i2c_ng_items_data[] = {
229 .reg = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
230 .mask = MLXPLAT_CPLD_I2C_CAP_MASK,
231 .bit = MLXPLAT_CPLD_I2C_CAP_BIT,
235 static struct mlxreg_core_item mlxplat_mlxcpld_i2c_ng_items[] = {
237 .data = mlxplat_mlxcpld_i2c_ng_items_data,
241 /* Platform next generation systems i2c data */
242 static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data = {
243 .items = mlxplat_mlxcpld_i2c_ng_items,
244 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
245 .mask = MLXPLAT_CPLD_AGGR_MASK_COMEX,
246 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET,
247 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_I2C,
250 /* Platform default channels */
251 static const int mlxplat_default_channels[][MLXPLAT_CPLD_GRP_CHNL_NUM] = {
253 MLXPLAT_CPLD_CH1, MLXPLAT_CPLD_CH1 + 1, MLXPLAT_CPLD_CH1 + 2,
254 MLXPLAT_CPLD_CH1 + 3, MLXPLAT_CPLD_CH1 + 4, MLXPLAT_CPLD_CH1 +
255 5, MLXPLAT_CPLD_CH1 + 6, MLXPLAT_CPLD_CH1 + 7
258 MLXPLAT_CPLD_CH2, MLXPLAT_CPLD_CH2 + 1, MLXPLAT_CPLD_CH2 + 2,
259 MLXPLAT_CPLD_CH2 + 3, MLXPLAT_CPLD_CH2 + 4, MLXPLAT_CPLD_CH2 +
260 5, MLXPLAT_CPLD_CH2 + 6, MLXPLAT_CPLD_CH2 + 7
264 /* Platform channels for MSN21xx system family */
265 static const int mlxplat_msn21xx_channels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
267 /* Platform mux data */
268 static struct i2c_mux_reg_platform_data mlxplat_default_mux_data[] = {
271 .base_nr = MLXPLAT_CPLD_CH1,
273 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
279 .base_nr = MLXPLAT_CPLD_CH2,
281 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
288 /* Platform mux configuration variables */
289 static int mlxplat_max_adap_num;
290 static int mlxplat_mux_num;
291 static struct i2c_mux_reg_platform_data *mlxplat_mux_data;
293 /* Platform extended mux data */
294 static struct i2c_mux_reg_platform_data mlxplat_extended_mux_data[] = {
297 .base_nr = MLXPLAT_CPLD_CH1,
299 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG1,
305 .base_nr = MLXPLAT_CPLD_CH2,
307 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG3,
313 .base_nr = MLXPLAT_CPLD_CH3,
315 .reg = (void __iomem *)MLXPLAT_CPLD_LPC_REG2,
322 /* Platform hotplug devices */
323 static struct i2c_board_info mlxplat_mlxcpld_psu[] = {
325 I2C_BOARD_INFO("24c02", 0x51),
328 I2C_BOARD_INFO("24c02", 0x50),
332 static struct i2c_board_info mlxplat_mlxcpld_ng_psu[] = {
334 I2C_BOARD_INFO("24c32", 0x51),
337 I2C_BOARD_INFO("24c32", 0x50),
341 static struct i2c_board_info mlxplat_mlxcpld_pwr[] = {
343 I2C_BOARD_INFO("dps460", 0x59),
346 I2C_BOARD_INFO("dps460", 0x58),
350 static struct i2c_board_info mlxplat_mlxcpld_fan[] = {
352 I2C_BOARD_INFO("24c32", 0x50),
355 I2C_BOARD_INFO("24c32", 0x50),
358 I2C_BOARD_INFO("24c32", 0x50),
361 I2C_BOARD_INFO("24c32", 0x50),
365 /* Platform hotplug comex carrier system family data */
366 static struct mlxreg_core_data mlxplat_mlxcpld_comex_psu_items_data[] = {
369 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
371 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
375 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
377 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
381 /* Platform hotplug default data */
382 static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data[] = {
385 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
387 .hpdev.brdinfo = &mlxplat_mlxcpld_psu[0],
388 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
392 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
394 .hpdev.brdinfo = &mlxplat_mlxcpld_psu[1],
395 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
399 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data[] = {
402 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
404 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
405 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
409 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
411 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
412 .hpdev.nr = MLXPLAT_CPLD_PSU_DEFAULT_NR,
416 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data[] = {
419 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
421 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[0],
422 .hpdev.nr = MLXPLAT_CPLD_FAN1_DEFAULT_NR,
426 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
428 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[1],
429 .hpdev.nr = MLXPLAT_CPLD_FAN2_DEFAULT_NR,
433 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
435 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[2],
436 .hpdev.nr = MLXPLAT_CPLD_FAN3_DEFAULT_NR,
440 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
442 .hpdev.brdinfo = &mlxplat_mlxcpld_fan[3],
443 .hpdev.nr = MLXPLAT_CPLD_FAN4_DEFAULT_NR,
447 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data[] = {
450 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
451 .mask = MLXPLAT_CPLD_ASIC_MASK,
452 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
456 static struct mlxreg_core_item mlxplat_mlxcpld_default_items[] = {
458 .data = mlxplat_mlxcpld_default_psu_items_data,
459 .aggr_mask = MLXPLAT_CPLD_AGGR_PSU_MASK_DEF,
460 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
461 .mask = MLXPLAT_CPLD_PSU_MASK,
462 .count = ARRAY_SIZE(mlxplat_mlxcpld_psu),
467 .data = mlxplat_mlxcpld_default_pwr_items_data,
468 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
469 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
470 .mask = MLXPLAT_CPLD_PWR_MASK,
471 .count = ARRAY_SIZE(mlxplat_mlxcpld_pwr),
476 .data = mlxplat_mlxcpld_default_fan_items_data,
477 .aggr_mask = MLXPLAT_CPLD_AGGR_FAN_MASK_DEF,
478 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
479 .mask = MLXPLAT_CPLD_FAN_MASK,
480 .count = ARRAY_SIZE(mlxplat_mlxcpld_fan),
485 .data = mlxplat_mlxcpld_default_asic_items_data,
486 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
487 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
488 .mask = MLXPLAT_CPLD_ASIC_MASK,
489 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
495 static struct mlxreg_core_item mlxplat_mlxcpld_comex_items[] = {
497 .data = mlxplat_mlxcpld_comex_psu_items_data,
498 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
499 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
500 .mask = MLXPLAT_CPLD_PSU_MASK,
501 .count = ARRAY_SIZE(mlxplat_mlxcpld_psu),
506 .data = mlxplat_mlxcpld_default_pwr_items_data,
507 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
508 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
509 .mask = MLXPLAT_CPLD_PWR_MASK,
510 .count = ARRAY_SIZE(mlxplat_mlxcpld_pwr),
515 .data = mlxplat_mlxcpld_default_fan_items_data,
516 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_CARRIER,
517 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
518 .mask = MLXPLAT_CPLD_FAN_MASK,
519 .count = ARRAY_SIZE(mlxplat_mlxcpld_fan),
524 .data = mlxplat_mlxcpld_default_asic_items_data,
525 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
526 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
527 .mask = MLXPLAT_CPLD_ASIC_MASK,
528 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
535 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data = {
536 .items = mlxplat_mlxcpld_default_items,
537 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_items),
538 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
539 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
540 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
541 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
545 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_comex_data = {
546 .items = mlxplat_mlxcpld_comex_items,
547 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_items),
548 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
549 .mask = MLXPLAT_CPLD_AGGR_MASK_CARR_DEF,
550 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET,
551 .mask_low = MLXPLAT_CPLD_LOW_AGGRCX_MASK,
554 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data[] = {
557 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
559 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
563 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
565 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
569 /* Platform hotplug MSN21xx system family data */
570 static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items[] = {
572 .data = mlxplat_mlxcpld_msn21xx_pwr_items_data,
573 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
574 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
575 .mask = MLXPLAT_CPLD_PWR_MASK,
576 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data),
581 .data = mlxplat_mlxcpld_default_asic_items_data,
582 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
583 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
584 .mask = MLXPLAT_CPLD_ASIC_MASK,
585 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
592 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data = {
593 .items = mlxplat_mlxcpld_msn21xx_items,
594 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items),
595 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
596 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
597 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
598 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
601 /* Platform hotplug msn274x system family data */
602 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data[] = {
605 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
607 .hpdev.brdinfo = &mlxplat_mlxcpld_psu[0],
608 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
612 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
614 .hpdev.brdinfo = &mlxplat_mlxcpld_psu[1],
615 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
619 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data[] = {
622 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
624 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
625 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
629 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
631 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
632 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
636 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data[] = {
639 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
641 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
645 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
647 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
651 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
653 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
657 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
659 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
663 static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items[] = {
665 .data = mlxplat_mlxcpld_msn274x_psu_items_data,
666 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
667 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
668 .mask = MLXPLAT_CPLD_PSU_MASK,
669 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data),
674 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
675 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
676 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
677 .mask = MLXPLAT_CPLD_PWR_MASK,
678 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
683 .data = mlxplat_mlxcpld_msn274x_fan_items_data,
684 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
685 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
686 .mask = MLXPLAT_CPLD_FAN_MASK,
687 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data),
692 .data = mlxplat_mlxcpld_default_asic_items_data,
693 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
694 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
695 .mask = MLXPLAT_CPLD_ASIC_MASK,
696 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
703 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data = {
704 .items = mlxplat_mlxcpld_msn274x_items,
705 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items),
706 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
707 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
708 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
709 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
712 /* Platform hotplug MSN201x system family data */
713 static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data[] = {
716 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
718 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
722 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
724 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
728 static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items[] = {
730 .data = mlxplat_mlxcpld_msn201x_pwr_items_data,
731 .aggr_mask = MLXPLAT_CPLD_AGGR_PWR_MASK_DEF,
732 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
733 .mask = MLXPLAT_CPLD_PWR_MASK,
734 .count = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data),
739 .data = mlxplat_mlxcpld_default_asic_items_data,
740 .aggr_mask = MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF,
741 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
742 .mask = MLXPLAT_CPLD_ASIC_MASK,
743 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
750 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = {
751 .items = mlxplat_mlxcpld_msn201x_items,
752 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items),
753 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
754 .mask = MLXPLAT_CPLD_AGGR_MASK_DEF,
755 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
756 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
759 /* Platform hotplug next generation system family data */
760 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = {
763 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
765 .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[0],
766 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
770 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
772 .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[1],
773 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
777 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = {
780 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
782 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
784 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
788 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
790 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
792 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
796 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
798 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
800 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
804 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
806 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
808 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
812 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
814 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
816 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
820 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
822 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
824 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
828 static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = {
830 .data = mlxplat_mlxcpld_default_ng_psu_items_data,
831 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
832 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
833 .mask = MLXPLAT_CPLD_PSU_MASK,
834 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data),
839 .data = mlxplat_mlxcpld_default_ng_pwr_items_data,
840 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
841 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
842 .mask = MLXPLAT_CPLD_PWR_MASK,
843 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data),
848 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
849 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
850 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
851 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
852 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
857 .data = mlxplat_mlxcpld_default_asic_items_data,
858 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
859 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
860 .mask = MLXPLAT_CPLD_ASIC_MASK,
861 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
868 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = {
869 .items = mlxplat_mlxcpld_default_ng_items,
870 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items),
871 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
872 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
873 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
874 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
877 /* Platform hotplug extended system family data */
878 static struct mlxreg_core_data mlxplat_mlxcpld_ext_psu_items_data[] = {
881 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
883 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
887 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
889 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
893 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
895 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
899 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
901 .hpdev.nr = MLXPLAT_CPLD_NR_NONE,
905 static struct mlxreg_core_data mlxplat_mlxcpld_ext_pwr_items_data[] = {
908 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
910 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
911 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
915 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
917 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
918 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR,
922 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
924 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[0],
925 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR2,
929 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
931 .hpdev.brdinfo = &mlxplat_mlxcpld_pwr[1],
932 .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR2,
936 static struct mlxreg_core_item mlxplat_mlxcpld_ext_items[] = {
938 .data = mlxplat_mlxcpld_ext_psu_items_data,
939 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
940 .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET,
941 .mask = MLXPLAT_CPLD_PSU_EXT_MASK,
942 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
943 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_psu_items_data),
948 .data = mlxplat_mlxcpld_ext_pwr_items_data,
949 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
950 .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET,
951 .mask = MLXPLAT_CPLD_PWR_EXT_MASK,
952 .capability = MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
953 .count = ARRAY_SIZE(mlxplat_mlxcpld_ext_pwr_items_data),
958 .data = mlxplat_mlxcpld_default_ng_fan_items_data,
959 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
960 .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
961 .mask = MLXPLAT_CPLD_FAN_NG_MASK,
962 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data),
967 .data = mlxplat_mlxcpld_default_asic_items_data,
968 .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF,
969 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
970 .mask = MLXPLAT_CPLD_ASIC_MASK,
971 .count = ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data),
978 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_ext_data = {
979 .items = mlxplat_mlxcpld_ext_items,
980 .counter = ARRAY_SIZE(mlxplat_mlxcpld_ext_items),
981 .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET,
982 .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF | MLXPLAT_CPLD_AGGR_MASK_COMEX,
983 .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET,
984 .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW,
987 /* Platform led default data */
988 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data[] = {
990 .label = "status:green",
991 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
992 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
995 .label = "status:red",
996 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
997 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1000 .label = "psu:green",
1001 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1002 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1006 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1007 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1010 .label = "fan1:green",
1011 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1012 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1015 .label = "fan1:red",
1016 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1017 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1020 .label = "fan2:green",
1021 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1022 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1025 .label = "fan2:red",
1026 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1027 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1030 .label = "fan3:green",
1031 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1032 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1035 .label = "fan3:red",
1036 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1037 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1040 .label = "fan4:green",
1041 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1042 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1045 .label = "fan4:red",
1046 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1047 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1051 static struct mlxreg_core_platform_data mlxplat_default_led_data = {
1052 .data = mlxplat_mlxcpld_default_led_data,
1053 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_led_data),
1056 /* Platform led MSN21xx system family data */
1057 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data[] = {
1059 .label = "status:green",
1060 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1061 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1064 .label = "status:red",
1065 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1066 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1069 .label = "fan:green",
1070 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1071 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1075 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1076 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1079 .label = "psu1:green",
1080 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1081 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1084 .label = "psu1:red",
1085 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1086 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1089 .label = "psu2:green",
1090 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1091 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1094 .label = "psu2:red",
1095 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1096 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1099 .label = "uid:blue",
1100 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1101 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1105 static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data = {
1106 .data = mlxplat_mlxcpld_msn21xx_led_data,
1107 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data),
1110 /* Platform led for default data for 200GbE systems */
1111 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data[] = {
1113 .label = "status:green",
1114 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1115 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1118 .label = "status:orange",
1119 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1120 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1123 .label = "psu:green",
1124 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1125 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1128 .label = "psu:orange",
1129 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1130 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1133 .label = "fan1:green",
1134 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1135 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1136 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1140 .label = "fan1:orange",
1141 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1142 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1143 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1147 .label = "fan2:green",
1148 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1149 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1150 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1154 .label = "fan2:orange",
1155 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1156 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1157 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1161 .label = "fan3:green",
1162 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1163 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1164 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1168 .label = "fan3:orange",
1169 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1170 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1171 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1175 .label = "fan4:green",
1176 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1177 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1178 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1182 .label = "fan4:orange",
1183 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1184 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1185 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1189 .label = "fan5:green",
1190 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1191 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1192 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1196 .label = "fan5:orange",
1197 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1198 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1199 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1203 .label = "fan6:green",
1204 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1205 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1206 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1210 .label = "fan6:orange",
1211 .reg = MLXPLAT_CPLD_LPC_REG_LED4_OFFSET,
1212 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1213 .capability = MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET,
1217 .label = "uid:blue",
1218 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1219 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1223 static struct mlxreg_core_platform_data mlxplat_default_ng_led_data = {
1224 .data = mlxplat_mlxcpld_default_ng_led_data,
1225 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data),
1228 /* Platform led for Comex based 100GbE systems */
1229 static struct mlxreg_core_data mlxplat_mlxcpld_comex_100G_led_data[] = {
1231 .label = "status:green",
1232 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1233 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1236 .label = "status:red",
1237 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1238 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
1241 .label = "psu:green",
1242 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1243 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1247 .reg = MLXPLAT_CPLD_LPC_REG_LED1_OFFSET,
1248 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1251 .label = "fan1:green",
1252 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1253 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1256 .label = "fan1:red",
1257 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1258 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1261 .label = "fan2:green",
1262 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1263 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1266 .label = "fan2:red",
1267 .reg = MLXPLAT_CPLD_LPC_REG_LED2_OFFSET,
1268 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1271 .label = "fan3:green",
1272 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1273 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1276 .label = "fan3:red",
1277 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1278 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1281 .label = "fan4:green",
1282 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1283 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1286 .label = "fan4:red",
1287 .reg = MLXPLAT_CPLD_LPC_REG_LED3_OFFSET,
1288 .mask = MLXPLAT_CPLD_LED_HI_NIBBLE_MASK,
1291 .label = "uid:blue",
1292 .reg = MLXPLAT_CPLD_LPC_REG_LED5_OFFSET,
1293 .mask = MLXPLAT_CPLD_LED_LO_NIBBLE_MASK,
1297 static struct mlxreg_core_platform_data mlxplat_comex_100G_led_data = {
1298 .data = mlxplat_mlxcpld_comex_100G_led_data,
1299 .counter = ARRAY_SIZE(mlxplat_mlxcpld_comex_100G_led_data),
1302 /* Platform register access default */
1303 static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data[] = {
1305 .label = "cpld1_version",
1306 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1307 .bit = GENMASK(7, 0),
1311 .label = "cpld2_version",
1312 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1313 .bit = GENMASK(7, 0),
1317 .label = "cpld1_pn",
1318 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1319 .bit = GENMASK(15, 0),
1324 .label = "cpld2_pn",
1325 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1326 .bit = GENMASK(15, 0),
1331 .label = "cpld1_version_min",
1332 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1333 .bit = GENMASK(7, 0),
1337 .label = "cpld2_version_min",
1338 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1339 .bit = GENMASK(7, 0),
1343 .label = "reset_long_pb",
1344 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1345 .mask = GENMASK(7, 0) & ~BIT(0),
1349 .label = "reset_short_pb",
1350 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1351 .mask = GENMASK(7, 0) & ~BIT(1),
1355 .label = "reset_aux_pwr_or_ref",
1356 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1357 .mask = GENMASK(7, 0) & ~BIT(2),
1361 .label = "reset_main_pwr_fail",
1362 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1363 .mask = GENMASK(7, 0) & ~BIT(3),
1367 .label = "reset_sw_reset",
1368 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1369 .mask = GENMASK(7, 0) & ~BIT(4),
1373 .label = "reset_fw_reset",
1374 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1375 .mask = GENMASK(7, 0) & ~BIT(5),
1379 .label = "reset_hotswap_or_wd",
1380 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1381 .mask = GENMASK(7, 0) & ~BIT(6),
1385 .label = "reset_asic_thermal",
1386 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1387 .mask = GENMASK(7, 0) & ~BIT(7),
1392 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1393 .mask = GENMASK(7, 0) & ~BIT(0),
1398 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1399 .mask = GENMASK(7, 0) & ~BIT(1),
1403 .label = "pwr_cycle",
1404 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1405 .mask = GENMASK(7, 0) & ~BIT(2),
1409 .label = "pwr_down",
1410 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1411 .mask = GENMASK(7, 0) & ~BIT(3),
1415 .label = "select_iio",
1416 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1417 .mask = GENMASK(7, 0) & ~BIT(6),
1421 .label = "asic_health",
1422 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1423 .mask = MLXPLAT_CPLD_ASIC_MASK,
1429 static struct mlxreg_core_platform_data mlxplat_default_regs_io_data = {
1430 .data = mlxplat_mlxcpld_default_regs_io_data,
1431 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data),
1434 /* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
1435 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data[] = {
1437 .label = "cpld1_version",
1438 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1439 .bit = GENMASK(7, 0),
1443 .label = "cpld2_version",
1444 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1445 .bit = GENMASK(7, 0),
1449 .label = "cpld1_pn",
1450 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1451 .bit = GENMASK(15, 0),
1456 .label = "cpld2_pn",
1457 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1458 .bit = GENMASK(15, 0),
1463 .label = "cpld1_version_min",
1464 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1465 .bit = GENMASK(7, 0),
1469 .label = "cpld2_version_min",
1470 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1471 .bit = GENMASK(7, 0),
1475 .label = "reset_long_pb",
1476 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1477 .mask = GENMASK(7, 0) & ~BIT(0),
1481 .label = "reset_short_pb",
1482 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1483 .mask = GENMASK(7, 0) & ~BIT(1),
1487 .label = "reset_aux_pwr_or_ref",
1488 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1489 .mask = GENMASK(7, 0) & ~BIT(2),
1493 .label = "reset_sw_reset",
1494 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1495 .mask = GENMASK(7, 0) & ~BIT(3),
1499 .label = "reset_main_pwr_fail",
1500 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1501 .mask = GENMASK(7, 0) & ~BIT(4),
1505 .label = "reset_asic_thermal",
1506 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1507 .mask = GENMASK(7, 0) & ~BIT(5),
1511 .label = "reset_hotswap_or_halt",
1512 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1513 .mask = GENMASK(7, 0) & ~BIT(6),
1517 .label = "reset_sff_wd",
1518 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1519 .mask = GENMASK(7, 0) & ~BIT(6),
1524 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1525 .mask = GENMASK(7, 0) & ~BIT(0),
1530 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1531 .mask = GENMASK(7, 0) & ~BIT(1),
1535 .label = "pwr_cycle",
1536 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1537 .mask = GENMASK(7, 0) & ~BIT(2),
1541 .label = "pwr_down",
1542 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1543 .mask = GENMASK(7, 0) & ~BIT(3),
1547 .label = "select_iio",
1548 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1549 .mask = GENMASK(7, 0) & ~BIT(6),
1553 .label = "asic_health",
1554 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1555 .mask = MLXPLAT_CPLD_ASIC_MASK,
1561 static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data = {
1562 .data = mlxplat_mlxcpld_msn21xx_regs_io_data,
1563 .counter = ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data),
1566 /* Platform register access for next generation systems families data */
1567 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data[] = {
1569 .label = "cpld1_version",
1570 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET,
1571 .bit = GENMASK(7, 0),
1575 .label = "cpld2_version",
1576 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET,
1577 .bit = GENMASK(7, 0),
1581 .label = "cpld3_version",
1582 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET,
1583 .bit = GENMASK(7, 0),
1587 .label = "cpld4_version",
1588 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET,
1589 .bit = GENMASK(7, 0),
1593 .label = "cpld1_pn",
1594 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET,
1595 .bit = GENMASK(15, 0),
1600 .label = "cpld2_pn",
1601 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET,
1602 .bit = GENMASK(15, 0),
1607 .label = "cpld3_pn",
1608 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET,
1609 .bit = GENMASK(15, 0),
1614 .label = "cpld4_pn",
1615 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET,
1616 .bit = GENMASK(15, 0),
1621 .label = "cpld1_version_min",
1622 .reg = MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET,
1623 .bit = GENMASK(7, 0),
1627 .label = "cpld2_version_min",
1628 .reg = MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET,
1629 .bit = GENMASK(7, 0),
1633 .label = "cpld3_version_min",
1634 .reg = MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET,
1635 .bit = GENMASK(7, 0),
1639 .label = "cpld4_version_min",
1640 .reg = MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET,
1641 .bit = GENMASK(7, 0),
1645 .label = "reset_long_pb",
1646 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1647 .mask = GENMASK(7, 0) & ~BIT(0),
1651 .label = "reset_short_pb",
1652 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1653 .mask = GENMASK(7, 0) & ~BIT(1),
1657 .label = "reset_aux_pwr_or_ref",
1658 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1659 .mask = GENMASK(7, 0) & ~BIT(2),
1663 .label = "reset_from_comex",
1664 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1665 .mask = GENMASK(7, 0) & ~BIT(4),
1669 .label = "reset_from_asic",
1670 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1671 .mask = GENMASK(7, 0) & ~BIT(5),
1675 .label = "reset_swb_wd",
1676 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1677 .mask = GENMASK(7, 0) & ~BIT(6),
1681 .label = "reset_asic_thermal",
1682 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1683 .mask = GENMASK(7, 0) & ~BIT(7),
1687 .label = "reset_comex_pwr_fail",
1688 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1689 .mask = GENMASK(7, 0) & ~BIT(3),
1693 .label = "reset_platform",
1694 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1695 .mask = GENMASK(7, 0) & ~BIT(4),
1699 .label = "reset_soc",
1700 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1701 .mask = GENMASK(7, 0) & ~BIT(5),
1705 .label = "reset_comex_wd",
1706 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET,
1707 .mask = GENMASK(7, 0) & ~BIT(6),
1711 .label = "reset_voltmon_upgrade_fail",
1712 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1713 .mask = GENMASK(7, 0) & ~BIT(0),
1717 .label = "reset_system",
1718 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1719 .mask = GENMASK(7, 0) & ~BIT(1),
1723 .label = "reset_sw_pwr_off",
1724 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1725 .mask = GENMASK(7, 0) & ~BIT(2),
1729 .label = "reset_comex_thermal",
1730 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1731 .mask = GENMASK(7, 0) & ~BIT(3),
1735 .label = "reset_reload_bios",
1736 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1737 .mask = GENMASK(7, 0) & ~BIT(5),
1741 .label = "reset_ac_pwr_fail",
1742 .reg = MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET,
1743 .mask = GENMASK(7, 0) & ~BIT(6),
1748 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1749 .mask = GENMASK(7, 0) & ~BIT(0),
1754 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1755 .mask = GENMASK(7, 0) & ~BIT(1),
1759 .label = "pwr_cycle",
1760 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1761 .mask = GENMASK(7, 0) & ~BIT(2),
1765 .label = "pwr_down",
1766 .reg = MLXPLAT_CPLD_LPC_REG_GP1_OFFSET,
1767 .mask = GENMASK(7, 0) & ~BIT(3),
1771 .label = "jtag_enable",
1772 .reg = MLXPLAT_CPLD_LPC_REG_GP2_OFFSET,
1773 .mask = GENMASK(7, 0) & ~BIT(4),
1777 .label = "asic_health",
1778 .reg = MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET,
1779 .mask = MLXPLAT_CPLD_ASIC_MASK,
1785 .reg = MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION,
1786 .bit = GENMASK(7, 0),
1790 .label = "voltreg_update_status",
1791 .reg = MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET,
1792 .mask = MLXPLAT_CPLD_VOLTREG_UPD_MASK,
1798 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
1799 .mask = GENMASK(7, 0) & ~BIT(3),
1803 .label = "pcie_asic_reset_dis",
1804 .reg = MLXPLAT_CPLD_LPC_REG_GP0_OFFSET,
1805 .mask = GENMASK(7, 0) & ~BIT(4),
1810 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET,
1811 .bit = GENMASK(7, 0),
1816 .reg = MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET,
1817 .bit = GENMASK(7, 0),
1821 .label = "ufm_version",
1822 .reg = MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET,
1823 .bit = GENMASK(7, 0),
1828 static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data = {
1829 .data = mlxplat_mlxcpld_default_ng_regs_io_data,
1830 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data),
1833 /* Platform FAN default */
1834 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data[] = {
1837 .reg = MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET,
1841 .reg = MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET,
1842 .mask = GENMASK(7, 0),
1843 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1845 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1850 .reg = MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET,
1851 .mask = GENMASK(7, 0),
1852 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1854 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1858 .reg = MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET,
1859 .mask = GENMASK(7, 0),
1860 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1862 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1866 .reg = MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET,
1867 .mask = GENMASK(7, 0),
1868 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1870 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1874 .reg = MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET,
1875 .mask = GENMASK(7, 0),
1876 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1878 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1882 .reg = MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET,
1883 .mask = GENMASK(7, 0),
1884 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1886 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1890 .reg = MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET,
1891 .mask = GENMASK(7, 0),
1892 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1894 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1898 .reg = MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET,
1899 .mask = GENMASK(7, 0),
1900 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET,
1902 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1906 .reg = MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET,
1907 .mask = GENMASK(7, 0),
1908 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1910 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1914 .reg = MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET,
1915 .mask = GENMASK(7, 0),
1916 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1918 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1922 .reg = MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET,
1923 .mask = GENMASK(7, 0),
1924 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1926 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1930 .reg = MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET,
1931 .mask = GENMASK(7, 0),
1932 .capability = MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET,
1934 .reg_prsnt = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET,
1938 .capability = MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET,
1942 static struct mlxreg_core_platform_data mlxplat_default_fan_data = {
1943 .data = mlxplat_mlxcpld_default_fan_data,
1944 .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data),
1947 /* Watchdog type1: hardware implementation version1
1948 * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
1950 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1[] = {
1953 .reg = MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET,
1954 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
1959 .reg = MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET,
1960 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
1961 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
1965 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
1966 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
1971 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
1972 .mask = GENMASK(7, 0) & ~BIT(6),
1977 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1[] = {
1980 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
1981 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
1986 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
1987 .mask = MLXPLAT_CPLD_WD_TYPE1_TO_MASK,
1988 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
1992 .reg = MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET,
1993 .mask = MLXPLAT_CPLD_WD1_CLEAR_MASK,
1998 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1[] = {
2000 .data = mlxplat_mlxcpld_wd_main_regs_type1,
2001 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1),
2002 .version = MLX_WDT_TYPE1,
2003 .identity = "mlx-wdt-main",
2006 .data = mlxplat_mlxcpld_wd_aux_regs_type1,
2007 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1),
2008 .version = MLX_WDT_TYPE1,
2009 .identity = "mlx-wdt-aux",
2013 /* Watchdog type2: hardware implementation version 2
2014 * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
2016 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2[] = {
2019 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2020 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2025 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2026 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2027 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
2030 .label = "timeleft",
2031 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET,
2032 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2036 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2037 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2042 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2043 .mask = GENMASK(7, 0) & ~BIT(6),
2048 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2[] = {
2051 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2052 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2057 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2058 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2059 .health_cntr = MLXPLAT_CPLD_WD_DFLT_TIMEOUT,
2062 .label = "timeleft",
2063 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET,
2064 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2068 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2069 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2074 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2[] = {
2076 .data = mlxplat_mlxcpld_wd_main_regs_type2,
2077 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2),
2078 .version = MLX_WDT_TYPE2,
2079 .identity = "mlx-wdt-main",
2082 .data = mlxplat_mlxcpld_wd_aux_regs_type2,
2083 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2),
2084 .version = MLX_WDT_TYPE2,
2085 .identity = "mlx-wdt-aux",
2089 /* Watchdog type3: hardware implementation version 3
2090 * Can be on all systems. It's differentiated by WD capability bit.
2091 * Old systems (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140)
2092 * still have only one main watchdog.
2094 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type3[] = {
2097 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2098 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2103 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2104 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2105 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
2108 .label = "timeleft",
2109 .reg = MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET,
2110 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2114 .reg = MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET,
2115 .mask = MLXPLAT_CPLD_WD_RESET_ACT_MASK,
2120 .reg = MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET,
2121 .mask = GENMASK(7, 0) & ~BIT(6),
2126 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type3[] = {
2129 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2130 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2135 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2136 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2137 .health_cntr = MLXPLAT_CPLD_WD3_DFLT_TIMEOUT,
2140 .label = "timeleft",
2141 .reg = MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET,
2142 .mask = MLXPLAT_CPLD_WD_TYPE2_TO_MASK,
2146 .reg = MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET,
2147 .mask = MLXPLAT_CPLD_WD_FAN_ACT_MASK,
2152 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type3[] = {
2154 .data = mlxplat_mlxcpld_wd_main_regs_type3,
2155 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type3),
2156 .version = MLX_WDT_TYPE3,
2157 .identity = "mlx-wdt-main",
2160 .data = mlxplat_mlxcpld_wd_aux_regs_type3,
2161 .counter = ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type3),
2162 .version = MLX_WDT_TYPE3,
2163 .identity = "mlx-wdt-aux",
2167 static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg)
2170 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2171 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2172 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2173 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2174 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2175 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2176 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2177 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
2178 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2179 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
2180 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2181 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2182 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2183 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2184 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2185 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2186 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2187 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2188 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2189 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2190 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2191 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2192 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
2193 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
2194 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
2195 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
2196 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2197 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2198 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
2199 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2200 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2201 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
2202 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2203 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2209 static bool mlxplat_mlxcpld_readable_reg(struct device *dev, unsigned int reg)
2212 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
2213 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
2214 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
2215 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
2216 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
2217 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
2218 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
2219 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
2220 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
2221 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
2222 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
2223 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2224 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2225 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2226 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2227 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2228 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
2229 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
2230 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2231 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2232 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET:
2233 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2234 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET:
2235 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
2236 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2237 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
2238 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2239 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
2240 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2241 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
2242 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2243 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
2244 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2245 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2246 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
2247 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2248 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2249 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
2250 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2251 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2252 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
2253 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2254 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2255 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET:
2256 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET:
2257 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET:
2258 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET:
2259 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2260 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2261 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET:
2262 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2263 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2264 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET:
2265 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
2266 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
2267 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
2268 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
2269 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2270 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
2271 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
2272 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
2273 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
2274 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
2275 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
2276 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
2277 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
2278 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
2279 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
2280 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
2281 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
2282 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2283 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
2284 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
2285 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
2286 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
2287 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
2288 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
2289 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
2290 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
2296 static bool mlxplat_mlxcpld_volatile_reg(struct device *dev, unsigned int reg)
2299 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET:
2300 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET:
2301 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET:
2302 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET:
2303 case MLXPLAT_CPLD_LPC_REG_CPLD1_PN_OFFSET:
2304 case MLXPLAT_CPLD_LPC_REG_CPLD2_PN_OFFSET:
2305 case MLXPLAT_CPLD_LPC_REG_CPLD3_PN_OFFSET:
2306 case MLXPLAT_CPLD_LPC_REG_CPLD4_PN_OFFSET:
2307 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET:
2308 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET:
2309 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET:
2310 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET:
2311 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET:
2312 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET:
2313 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET:
2314 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET:
2315 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION:
2316 case MLXPLAT_CPLD_LPC_REG_GP0_RO_OFFSET:
2317 case MLXPLAT_CPLD_LPC_REG_GP0_OFFSET:
2318 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET:
2319 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET:
2320 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET:
2321 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET:
2322 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET:
2323 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET:
2324 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET:
2325 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET:
2326 case MLXPLAT_CPLD_LPC_REG_AGGRCX_OFFSET:
2327 case MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET:
2328 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET:
2329 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET:
2330 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET:
2331 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET:
2332 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET:
2333 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET:
2334 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET:
2335 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET:
2336 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET:
2337 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET:
2338 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET:
2339 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET:
2340 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET:
2341 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET:
2342 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET:
2343 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET:
2344 case MLXPLAT_CPLD_LPC_REG_CPLD1_MVER_OFFSET:
2345 case MLXPLAT_CPLD_LPC_REG_CPLD2_MVER_OFFSET:
2346 case MLXPLAT_CPLD_LPC_REG_CPLD3_MVER_OFFSET:
2347 case MLXPLAT_CPLD_LPC_REG_CPLD4_MVER_OFFSET:
2348 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET:
2349 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET:
2350 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET:
2351 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET:
2352 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET:
2353 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET:
2354 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET:
2355 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET:
2356 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET:
2357 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET:
2358 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET:
2359 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET:
2360 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET:
2361 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET:
2362 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET:
2363 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET:
2364 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET:
2365 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET:
2366 case MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET:
2367 case MLXPLAT_CPLD_LPC_REG_CONFIG1_OFFSET:
2368 case MLXPLAT_CPLD_LPC_REG_CONFIG2_OFFSET:
2369 case MLXPLAT_CPLD_LPC_REG_UFM_VERSION_OFFSET:
2375 static const struct reg_default mlxplat_mlxcpld_regmap_default[] = {
2376 { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET, 0x00 },
2377 { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET, 0x00 },
2378 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2379 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
2382 static const struct reg_default mlxplat_mlxcpld_regmap_ng[] = {
2383 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2384 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET, 0x00 },
2387 static const struct reg_default mlxplat_mlxcpld_regmap_comex_default[] = {
2388 { MLXPLAT_CPLD_LPC_REG_AGGRCX_MASK_OFFSET,
2389 MLXPLAT_CPLD_LOW_AGGRCX_MASK },
2390 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2393 static const struct reg_default mlxplat_mlxcpld_regmap_ng400[] = {
2394 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET, 0x00 },
2395 { MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET, 0x00 },
2396 { MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET, 0x00 },
2397 { MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET, 0x00 },
2400 struct mlxplat_mlxcpld_regmap_context {
2404 static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx;
2407 mlxplat_mlxcpld_reg_read(void *context, unsigned int reg, unsigned int *val)
2409 struct mlxplat_mlxcpld_regmap_context *ctx = context;
2411 *val = ioread8(ctx->base + reg);
2416 mlxplat_mlxcpld_reg_write(void *context, unsigned int reg, unsigned int val)
2418 struct mlxplat_mlxcpld_regmap_context *ctx = context;
2420 iowrite8(val, ctx->base + reg);
2424 static const struct regmap_config mlxplat_mlxcpld_regmap_config = {
2427 .max_register = 255,
2428 .cache_type = REGCACHE_FLAT,
2429 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
2430 .readable_reg = mlxplat_mlxcpld_readable_reg,
2431 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
2432 .reg_defaults = mlxplat_mlxcpld_regmap_default,
2433 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_default),
2434 .reg_read = mlxplat_mlxcpld_reg_read,
2435 .reg_write = mlxplat_mlxcpld_reg_write,
2438 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng = {
2441 .max_register = 255,
2442 .cache_type = REGCACHE_FLAT,
2443 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
2444 .readable_reg = mlxplat_mlxcpld_readable_reg,
2445 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
2446 .reg_defaults = mlxplat_mlxcpld_regmap_ng,
2447 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng),
2448 .reg_read = mlxplat_mlxcpld_reg_read,
2449 .reg_write = mlxplat_mlxcpld_reg_write,
2452 static const struct regmap_config mlxplat_mlxcpld_regmap_config_comex = {
2455 .max_register = 255,
2456 .cache_type = REGCACHE_FLAT,
2457 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
2458 .readable_reg = mlxplat_mlxcpld_readable_reg,
2459 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
2460 .reg_defaults = mlxplat_mlxcpld_regmap_comex_default,
2461 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_comex_default),
2462 .reg_read = mlxplat_mlxcpld_reg_read,
2463 .reg_write = mlxplat_mlxcpld_reg_write,
2466 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng400 = {
2469 .max_register = 255,
2470 .cache_type = REGCACHE_FLAT,
2471 .writeable_reg = mlxplat_mlxcpld_writeable_reg,
2472 .readable_reg = mlxplat_mlxcpld_readable_reg,
2473 .volatile_reg = mlxplat_mlxcpld_volatile_reg,
2474 .reg_defaults = mlxplat_mlxcpld_regmap_ng400,
2475 .num_reg_defaults = ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng400),
2476 .reg_read = mlxplat_mlxcpld_reg_read,
2477 .reg_write = mlxplat_mlxcpld_reg_write,
2480 static struct resource mlxplat_mlxcpld_resources[] = {
2481 [0] = DEFINE_RES_IRQ_NAMED(17, "mlxreg-hotplug"),
2484 static struct platform_device *mlxplat_dev;
2485 static struct mlxreg_core_hotplug_platform_data *mlxplat_i2c;
2486 static struct mlxreg_core_hotplug_platform_data *mlxplat_hotplug;
2487 static struct mlxreg_core_platform_data *mlxplat_led;
2488 static struct mlxreg_core_platform_data *mlxplat_regs_io;
2489 static struct mlxreg_core_platform_data *mlxplat_fan;
2490 static struct mlxreg_core_platform_data
2491 *mlxplat_wd_data[MLXPLAT_CPLD_WD_MAX_DEVS];
2492 static const struct regmap_config *mlxplat_regmap_config;
2494 static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
2498 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2499 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2500 mlxplat_mux_data = mlxplat_default_mux_data;
2501 for (i = 0; i < mlxplat_mux_num; i++) {
2502 mlxplat_mux_data[i].values = mlxplat_default_channels[i];
2503 mlxplat_mux_data[i].n_values =
2504 ARRAY_SIZE(mlxplat_default_channels[i]);
2506 mlxplat_hotplug = &mlxplat_mlxcpld_default_data;
2507 mlxplat_hotplug->deferred_nr =
2508 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2509 mlxplat_led = &mlxplat_default_led_data;
2510 mlxplat_regs_io = &mlxplat_default_regs_io_data;
2511 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2516 static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
2520 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2521 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2522 mlxplat_mux_data = mlxplat_default_mux_data;
2523 for (i = 0; i < mlxplat_mux_num; i++) {
2524 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2525 mlxplat_mux_data[i].n_values =
2526 ARRAY_SIZE(mlxplat_msn21xx_channels);
2528 mlxplat_hotplug = &mlxplat_mlxcpld_msn21xx_data;
2529 mlxplat_hotplug->deferred_nr =
2530 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2531 mlxplat_led = &mlxplat_msn21xx_led_data;
2532 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2533 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2538 static int __init mlxplat_dmi_msn274x_matched(const struct dmi_system_id *dmi)
2542 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2543 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2544 mlxplat_mux_data = mlxplat_default_mux_data;
2545 for (i = 0; i < mlxplat_mux_num; i++) {
2546 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2547 mlxplat_mux_data[i].n_values =
2548 ARRAY_SIZE(mlxplat_msn21xx_channels);
2550 mlxplat_hotplug = &mlxplat_mlxcpld_msn274x_data;
2551 mlxplat_hotplug->deferred_nr =
2552 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2553 mlxplat_led = &mlxplat_default_led_data;
2554 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2555 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2560 static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi)
2564 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2565 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2566 mlxplat_mux_data = mlxplat_default_mux_data;
2567 for (i = 0; i < mlxplat_mux_num; i++) {
2568 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2569 mlxplat_mux_data[i].n_values =
2570 ARRAY_SIZE(mlxplat_msn21xx_channels);
2572 mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data;
2573 mlxplat_hotplug->deferred_nr =
2574 mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2575 mlxplat_led = &mlxplat_msn21xx_led_data;
2576 mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data;
2577 mlxplat_wd_data[0] = &mlxplat_mlxcpld_wd_set_type1[0];
2582 static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi)
2586 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2587 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2588 mlxplat_mux_data = mlxplat_default_mux_data;
2589 for (i = 0; i < mlxplat_mux_num; i++) {
2590 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2591 mlxplat_mux_data[i].n_values =
2592 ARRAY_SIZE(mlxplat_msn21xx_channels);
2594 mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data;
2595 mlxplat_hotplug->deferred_nr =
2596 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2597 mlxplat_led = &mlxplat_default_ng_led_data;
2598 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2599 mlxplat_fan = &mlxplat_default_fan_data;
2600 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2601 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2602 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
2603 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng;
2608 static int __init mlxplat_dmi_comex_matched(const struct dmi_system_id *dmi)
2612 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
2613 mlxplat_mux_num = ARRAY_SIZE(mlxplat_extended_mux_data);
2614 mlxplat_mux_data = mlxplat_extended_mux_data;
2615 for (i = 0; i < mlxplat_mux_num; i++) {
2616 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2617 mlxplat_mux_data[i].n_values =
2618 ARRAY_SIZE(mlxplat_msn21xx_channels);
2620 mlxplat_hotplug = &mlxplat_mlxcpld_comex_data;
2621 mlxplat_hotplug->deferred_nr = MLXPLAT_CPLD_MAX_PHYS_EXT_ADAPTER_NUM;
2622 mlxplat_led = &mlxplat_comex_100G_led_data;
2623 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2624 mlxplat_fan = &mlxplat_default_fan_data;
2625 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2626 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2627 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_comex;
2632 static int __init mlxplat_dmi_ng400_matched(const struct dmi_system_id *dmi)
2636 mlxplat_max_adap_num = MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM;
2637 mlxplat_mux_num = ARRAY_SIZE(mlxplat_default_mux_data);
2638 mlxplat_mux_data = mlxplat_default_mux_data;
2639 for (i = 0; i < mlxplat_mux_num; i++) {
2640 mlxplat_mux_data[i].values = mlxplat_msn21xx_channels;
2641 mlxplat_mux_data[i].n_values =
2642 ARRAY_SIZE(mlxplat_msn21xx_channels);
2644 mlxplat_hotplug = &mlxplat_mlxcpld_ext_data;
2645 mlxplat_hotplug->deferred_nr =
2646 mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1];
2647 mlxplat_led = &mlxplat_default_ng_led_data;
2648 mlxplat_regs_io = &mlxplat_default_ng_regs_io_data;
2649 mlxplat_fan = &mlxplat_default_fan_data;
2650 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2); i++)
2651 mlxplat_wd_data[i] = &mlxplat_mlxcpld_wd_set_type2[i];
2652 mlxplat_i2c = &mlxplat_mlxcpld_i2c_ng_data;
2653 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config_ng400;
2658 static const struct dmi_system_id mlxplat_dmi_table[] __initconst = {
2660 .callback = mlxplat_dmi_default_matched,
2662 DMI_MATCH(DMI_BOARD_NAME, "VMOD0001"),
2666 .callback = mlxplat_dmi_msn21xx_matched,
2668 DMI_MATCH(DMI_BOARD_NAME, "VMOD0002"),
2672 .callback = mlxplat_dmi_msn274x_matched,
2674 DMI_MATCH(DMI_BOARD_NAME, "VMOD0003"),
2678 .callback = mlxplat_dmi_msn201x_matched,
2680 DMI_MATCH(DMI_BOARD_NAME, "VMOD0004"),
2684 .callback = mlxplat_dmi_qmb7xx_matched,
2686 DMI_MATCH(DMI_BOARD_NAME, "VMOD0005"),
2690 .callback = mlxplat_dmi_qmb7xx_matched,
2692 DMI_MATCH(DMI_BOARD_NAME, "VMOD0007"),
2696 .callback = mlxplat_dmi_comex_matched,
2698 DMI_MATCH(DMI_BOARD_NAME, "VMOD0009"),
2702 .callback = mlxplat_dmi_ng400_matched,
2704 DMI_MATCH(DMI_BOARD_NAME, "VMOD0010"),
2708 .callback = mlxplat_dmi_msn274x_matched,
2710 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2711 DMI_MATCH(DMI_PRODUCT_NAME, "MSN274"),
2715 .callback = mlxplat_dmi_default_matched,
2717 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2718 DMI_MATCH(DMI_PRODUCT_NAME, "MSN24"),
2722 .callback = mlxplat_dmi_default_matched,
2724 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2725 DMI_MATCH(DMI_PRODUCT_NAME, "MSN27"),
2729 .callback = mlxplat_dmi_default_matched,
2731 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2732 DMI_MATCH(DMI_PRODUCT_NAME, "MSB"),
2736 .callback = mlxplat_dmi_default_matched,
2738 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2739 DMI_MATCH(DMI_PRODUCT_NAME, "MSX"),
2743 .callback = mlxplat_dmi_msn21xx_matched,
2745 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2746 DMI_MATCH(DMI_PRODUCT_NAME, "MSN21"),
2750 .callback = mlxplat_dmi_msn201x_matched,
2752 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2753 DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"),
2757 .callback = mlxplat_dmi_qmb7xx_matched,
2759 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2760 DMI_MATCH(DMI_PRODUCT_NAME, "MQM87"),
2764 .callback = mlxplat_dmi_qmb7xx_matched,
2766 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2767 DMI_MATCH(DMI_PRODUCT_NAME, "MSN37"),
2771 .callback = mlxplat_dmi_qmb7xx_matched,
2773 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2774 DMI_MATCH(DMI_PRODUCT_NAME, "MSN34"),
2778 .callback = mlxplat_dmi_qmb7xx_matched,
2780 DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"),
2781 DMI_MATCH(DMI_PRODUCT_NAME, "MSN38"),
2787 MODULE_DEVICE_TABLE(dmi, mlxplat_dmi_table);
2789 static int mlxplat_mlxcpld_verify_bus_topology(int *nr)
2791 struct i2c_adapter *search_adap;
2794 /* Scan adapters from expected id to verify it is free. */
2795 *nr = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR;
2796 for (i = MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR; i <
2797 mlxplat_max_adap_num; i++) {
2798 search_adap = i2c_get_adapter(i);
2800 i2c_put_adapter(search_adap);
2804 /* Return if expected parent adapter is free. */
2805 if (i == MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR)
2810 /* Return with error if free id for adapter is not found. */
2811 if (i == mlxplat_max_adap_num)
2814 /* Shift adapter ids, since expected parent adapter is not free. */
2816 for (i = 0; i < mlxplat_mux_num; i++) {
2817 shift = *nr - mlxplat_mux_data[i].parent;
2818 mlxplat_mux_data[i].parent = *nr;
2819 mlxplat_mux_data[i].base_nr += shift;
2821 mlxplat_hotplug->shift_nr = shift;
2827 static int mlxplat_mlxcpld_check_wd_capability(void *regmap)
2832 rc = regmap_read(regmap, MLXPLAT_CPLD_LPC_REG_PSU_I2C_CAP_OFFSET,
2837 if (!(regval & ~MLXPLAT_CPLD_WD_CPBLTY_MASK)) {
2838 for (i = 0; i < ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type3); i++) {
2839 if (mlxplat_wd_data[i])
2840 mlxplat_wd_data[i] =
2841 &mlxplat_mlxcpld_wd_set_type3[i];
2848 static int __init mlxplat_init(void)
2850 struct mlxplat_priv *priv;
2853 if (!dmi_check_system(mlxplat_dmi_table))
2856 mlxplat_dev = platform_device_register_simple(MLX_PLAT_DEVICE_NAME, -1,
2857 mlxplat_lpc_resources,
2858 ARRAY_SIZE(mlxplat_lpc_resources));
2860 if (IS_ERR(mlxplat_dev))
2861 return PTR_ERR(mlxplat_dev);
2863 priv = devm_kzalloc(&mlxplat_dev->dev, sizeof(struct mlxplat_priv),
2869 platform_set_drvdata(mlxplat_dev, priv);
2871 mlxplat_mlxcpld_regmap_ctx.base = devm_ioport_map(&mlxplat_dev->dev,
2872 mlxplat_lpc_resources[1].start, 1);
2873 if (!mlxplat_mlxcpld_regmap_ctx.base) {
2878 if (!mlxplat_regmap_config)
2879 mlxplat_regmap_config = &mlxplat_mlxcpld_regmap_config;
2881 priv->regmap = devm_regmap_init(&mlxplat_dev->dev, NULL,
2882 &mlxplat_mlxcpld_regmap_ctx,
2883 mlxplat_regmap_config);
2884 if (IS_ERR(priv->regmap)) {
2885 err = PTR_ERR(priv->regmap);
2889 err = mlxplat_mlxcpld_verify_bus_topology(&nr);
2893 nr = (nr == mlxplat_max_adap_num) ? -1 : nr;
2895 mlxplat_i2c->regmap = priv->regmap;
2896 priv->pdev_i2c = platform_device_register_resndata(
2897 &mlxplat_dev->dev, "i2c_mlxcpld",
2898 nr, mlxplat_mlxcpld_resources,
2899 ARRAY_SIZE(mlxplat_mlxcpld_resources),
2900 mlxplat_i2c, sizeof(*mlxplat_i2c));
2901 if (IS_ERR(priv->pdev_i2c)) {
2902 err = PTR_ERR(priv->pdev_i2c);
2906 for (i = 0; i < mlxplat_mux_num; i++) {
2907 priv->pdev_mux[i] = platform_device_register_resndata(
2908 &priv->pdev_i2c->dev,
2909 "i2c-mux-reg", i, NULL,
2910 0, &mlxplat_mux_data[i],
2911 sizeof(mlxplat_mux_data[i]));
2912 if (IS_ERR(priv->pdev_mux[i])) {
2913 err = PTR_ERR(priv->pdev_mux[i]);
2914 goto fail_platform_mux_register;
2918 /* Add hotplug driver */
2919 mlxplat_hotplug->regmap = priv->regmap;
2920 priv->pdev_hotplug = platform_device_register_resndata(
2921 &mlxplat_dev->dev, "mlxreg-hotplug",
2922 PLATFORM_DEVID_NONE,
2923 mlxplat_mlxcpld_resources,
2924 ARRAY_SIZE(mlxplat_mlxcpld_resources),
2925 mlxplat_hotplug, sizeof(*mlxplat_hotplug));
2926 if (IS_ERR(priv->pdev_hotplug)) {
2927 err = PTR_ERR(priv->pdev_hotplug);
2928 goto fail_platform_mux_register;
2931 /* Set default registers. */
2932 for (j = 0; j < mlxplat_regmap_config->num_reg_defaults; j++) {
2933 err = regmap_write(priv->regmap,
2934 mlxplat_regmap_config->reg_defaults[j].reg,
2935 mlxplat_regmap_config->reg_defaults[j].def);
2937 goto fail_platform_mux_register;
2940 /* Add LED driver. */
2941 mlxplat_led->regmap = priv->regmap;
2942 priv->pdev_led = platform_device_register_resndata(
2943 &mlxplat_dev->dev, "leds-mlxreg",
2944 PLATFORM_DEVID_NONE, NULL, 0,
2945 mlxplat_led, sizeof(*mlxplat_led));
2946 if (IS_ERR(priv->pdev_led)) {
2947 err = PTR_ERR(priv->pdev_led);
2948 goto fail_platform_hotplug_register;
2951 /* Add registers io access driver. */
2952 if (mlxplat_regs_io) {
2953 mlxplat_regs_io->regmap = priv->regmap;
2954 priv->pdev_io_regs = platform_device_register_resndata(
2955 &mlxplat_dev->dev, "mlxreg-io",
2956 PLATFORM_DEVID_NONE, NULL, 0,
2958 sizeof(*mlxplat_regs_io));
2959 if (IS_ERR(priv->pdev_io_regs)) {
2960 err = PTR_ERR(priv->pdev_io_regs);
2961 goto fail_platform_led_register;
2965 /* Add FAN driver. */
2967 mlxplat_fan->regmap = priv->regmap;
2968 priv->pdev_fan = platform_device_register_resndata(
2969 &mlxplat_dev->dev, "mlxreg-fan",
2970 PLATFORM_DEVID_NONE, NULL, 0,
2972 sizeof(*mlxplat_fan));
2973 if (IS_ERR(priv->pdev_fan)) {
2974 err = PTR_ERR(priv->pdev_fan);
2975 goto fail_platform_io_regs_register;
2979 /* Add WD drivers. */
2980 err = mlxplat_mlxcpld_check_wd_capability(priv->regmap);
2982 goto fail_platform_wd_register;
2983 for (j = 0; j < MLXPLAT_CPLD_WD_MAX_DEVS; j++) {
2984 if (mlxplat_wd_data[j]) {
2985 mlxplat_wd_data[j]->regmap = priv->regmap;
2986 priv->pdev_wd[j] = platform_device_register_resndata(
2987 &mlxplat_dev->dev, "mlx-wdt",
2990 sizeof(*mlxplat_wd_data[j]));
2991 if (IS_ERR(priv->pdev_wd[j])) {
2992 err = PTR_ERR(priv->pdev_wd[j]);
2993 goto fail_platform_wd_register;
2998 /* Sync registers with hardware. */
2999 regcache_mark_dirty(priv->regmap);
3000 err = regcache_sync(priv->regmap);
3002 goto fail_platform_wd_register;
3006 fail_platform_wd_register:
3008 platform_device_unregister(priv->pdev_wd[j]);
3010 platform_device_unregister(priv->pdev_fan);
3011 fail_platform_io_regs_register:
3012 if (mlxplat_regs_io)
3013 platform_device_unregister(priv->pdev_io_regs);
3014 fail_platform_led_register:
3015 platform_device_unregister(priv->pdev_led);
3016 fail_platform_hotplug_register:
3017 platform_device_unregister(priv->pdev_hotplug);
3018 fail_platform_mux_register:
3020 platform_device_unregister(priv->pdev_mux[i]);
3021 platform_device_unregister(priv->pdev_i2c);
3023 platform_device_unregister(mlxplat_dev);
3027 module_init(mlxplat_init);
3029 static void __exit mlxplat_exit(void)
3031 struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
3034 for (i = MLXPLAT_CPLD_WD_MAX_DEVS - 1; i >= 0 ; i--)
3035 platform_device_unregister(priv->pdev_wd[i]);
3037 platform_device_unregister(priv->pdev_fan);
3038 if (priv->pdev_io_regs)
3039 platform_device_unregister(priv->pdev_io_regs);
3040 platform_device_unregister(priv->pdev_led);
3041 platform_device_unregister(priv->pdev_hotplug);
3043 for (i = mlxplat_mux_num - 1; i >= 0 ; i--)
3044 platform_device_unregister(priv->pdev_mux[i]);
3046 platform_device_unregister(priv->pdev_i2c);
3047 platform_device_unregister(mlxplat_dev);
3049 module_exit(mlxplat_exit);
3052 MODULE_DESCRIPTION("Mellanox platform driver");
3053 MODULE_LICENSE("Dual BSD/GPL");