1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
3 * Mellanox platform driver
5 * Copyright (C) 2016-2018 Mellanox Technologies
6 * Copyright (C) 2016-2018 Vadim Pasternak <vadimp@mellanox.com>
9 #include <linux/device.h>
10 #include <linux/dmi.h>
11 #include <linux/i2c.h>
12 #include <linux/i2c-mux.h>
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/platform_data/i2c-mux-reg.h>
17 #include <linux/platform_data/mlxreg.h>
18 #include <linux/regmap.h>
20 #define MLX_PLAT_DEVICE_NAME "mlxplat"
22 /* LPC bus IO offsets */
23 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADRR 0x2000
24 #define MLXPLAT_CPLD_LPC_REG_BASE_ADRR 0x2500
25 #define MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET 0x00
26 #define MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET 0x01
27 #define MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET 0x02
28 #define MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET 0x03
29 #define MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET 0x1d
30 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET 0x1e
31 #define MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET 0x1f
32 #define MLXPLAT_CPLD_LPC_REG_LED1_OFFSET 0x20
33 #define MLXPLAT_CPLD_LPC_REG_LED2_OFFSET 0x21
34 #define MLXPLAT_CPLD_LPC_REG_LED3_OFFSET 0x22
35 #define MLXPLAT_CPLD_LPC_REG_LED4_OFFSET 0x23
36 #define MLXPLAT_CPLD_LPC_REG_LED5_OFFSET 0x24
37 #define MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION 0x2a
38 #define MLXPLAT_CPLD_LPC_REG_GP1_OFFSET 0x30
39 #define MLXPLAT_CPLD_LPC_REG_WP1_OFFSET 0x31
40 #define MLXPLAT_CPLD_LPC_REG_GP2_OFFSET 0x32
41 #define MLXPLAT_CPLD_LPC_REG_WP2_OFFSET 0x33
42 #define MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET 0x37
43 #define MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET 0x3a
44 #define MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET 0x3b
45 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET 0x40
46 #define MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET 0x41
47 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET 0x42
48 #define MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET 0x43
49 #define MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET 0x50
50 #define MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET 0x51
51 #define MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET 0x52
52 #define MLXPLAT_CPLD_LPC_REG_PSU_OFFSET 0x58
53 #define MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET 0x59
54 #define MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET 0x5a
55 #define MLXPLAT_CPLD_LPC_REG_PWR_OFFSET 0x64
56 #define MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET 0x65
57 #define MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET 0x66
58 #define MLXPLAT_CPLD_LPC_REG_FAN_OFFSET 0x88
59 #define MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET 0x89
60 #define MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET 0x8a
61 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET 0xc7
62 #define MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET 0xc8
63 #define MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET 0xc9
64 #define MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET 0xcb
65 #define MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET 0xcd
66 #define MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET 0xce
67 #define MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET 0xcf
68 #define MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET 0xd1
69 #define MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET 0xd2
70 #define MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET 0xd3
71 #define MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET 0xe3
72 #define MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET 0xe4
73 #define MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET 0xe5
74 #define MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET 0xe6
75 #define MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET 0xe7
76 #define MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET 0xe8
77 #define MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET 0xe9
78 #define MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET 0xeb
79 #define MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET 0xec
80 #define MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET 0xed
81 #define MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET 0xee
82 #define MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET 0xef
83 #define MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET 0xf0
84 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET 0xf5
85 #define MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET 0xf6
86 #define MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET 0xf7
87 #define MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET 0xf8
88 #define MLXPLAT_CPLD_LPC_IO_RANGE 0x100
89 #define MLXPLAT_CPLD_LPC_I2C_CH1_OFF 0xdb
90 #define MLXPLAT_CPLD_LPC_I2C_CH2_OFF 0xda
92 #define MLXPLAT_CPLD_LPC_PIO_OFFSET 0x10000UL
93 #define MLXPLAT_CPLD_LPC_REG1 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
94 MLXPLAT_CPLD_LPC_I2C_CH1_OFF) | \
95 MLXPLAT_CPLD_LPC_PIO_OFFSET)
96 #define MLXPLAT_CPLD_LPC_REG2 ((MLXPLAT_CPLD_LPC_REG_BASE_ADRR + \
97 MLXPLAT_CPLD_LPC_I2C_CH2_OFF) | \
98 MLXPLAT_CPLD_LPC_PIO_OFFSET)
100 /* Masks for aggregation, psu, pwr and fan event in CPLD related registers. */
101 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF 0x04
102 #define MLXPLAT_CPLD_AGGR_PSU_MASK_DEF 0x08
103 #define MLXPLAT_CPLD_AGGR_PWR_MASK_DEF 0x08
104 #define MLXPLAT_CPLD_AGGR_FAN_MASK_DEF 0x40
105 #define MLXPLAT_CPLD_AGGR_MASK_DEF (MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF | \
106 MLXPLAT_CPLD_AGGR_PSU_MASK_DEF | \
107 MLXPLAT_CPLD_AGGR_FAN_MASK_DEF)
108 #define MLXPLAT_CPLD_AGGR_ASIC_MASK_NG 0x01
109 #define MLXPLAT_CPLD_AGGR_MASK_NG_DEF 0x04
110 #define MLXPLAT_CPLD_AGGR_MASK_COMEX BIT(0)
111 #define MLXPLAT_CPLD_LOW_AGGR_MASK_LOW 0xc1
112 #define MLXPLAT_CPLD_LOW_AGGR_MASK_I2C BIT(6)
113 #define MLXPLAT_CPLD_PSU_MASK GENMASK(1, 0)
114 #define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0)
115 #define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0)
116 #define MLXPLAT_CPLD_ASIC_MASK GENMASK(1, 0)
117 #define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(5, 0)
118 #define MLXPLAT_CPLD_LED_LO_NIBBLE_MASK GENMASK(7, 4)
119 #define MLXPLAT_CPLD_LED_HI_NIBBLE_MASK GENMASK(3, 0)
121 /* Default I2C parent bus number */
122 #define MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR 1
124 /* Maximum number of possible physical buses equipped on system */
125 #define MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM 16
127 /* Number of channels in group */
128 #define MLXPLAT_CPLD_GRP_CHNL_NUM 8
130 /* Start channel numbers */
131 #define MLXPLAT_CPLD_CH1 2
132 #define MLXPLAT_CPLD_CH2 10
134 /* Number of LPC attached MUX platform devices */
135 #define MLXPLAT_CPLD_LPC_MUX_DEVS 2
137 /* Hotplug devices adapter numbers */
138 #define MLXPLAT_CPLD_NR_NONE -1
139 #define MLXPLAT_CPLD_PSU_DEFAULT_NR 10
140 #define MLXPLAT_CPLD_PSU_MSNXXXX_NR 4
141 #define MLXPLAT_CPLD_FAN1_DEFAULT_NR 11
142 #define MLXPLAT_CPLD_FAN2_DEFAULT_NR 12
143 #define MLXPLAT_CPLD_FAN3_DEFAULT_NR 13
144 #define MLXPLAT_CPLD_FAN4_DEFAULT_NR 14
146 /* Masks and default values for watchdogs */
147 #define MLXPLAT_CPLD_WD1_CLEAR_MASK GENMASK(7, 1)
148 #define MLXPLAT_CPLD_WD2_CLEAR_MASK (GENMASK(7, 0) & ~BIT(1))
150 #define MLXPLAT_CPLD_WD_TYPE1_TO_MASK GENMASK(7, 4)
151 #define MLXPLAT_CPLD_WD_TYPE2_TO_MASK 0
152 #define MLXPLAT_CPLD_WD_RESET_ACT_MASK GENMASK(7, 1)
153 #define MLXPLAT_CPLD_WD_FAN_ACT_MASK (GENMASK(7, 0) & ~BIT(4))
154 #define MLXPLAT_CPLD_WD_COUNT_ACT_MASK (GENMASK(7, 0) & ~BIT(7))
155 #define MLXPLAT_CPLD_WD_DFLT_TIMEOUT 30
156 #define MLXPLAT_CPLD_WD_MAX_DEVS 2
158 /* mlxplat_priv - platform private data
159 * @pdev_i2c - i2c controller platform device
160 * @pdev_mux - array of mux platform devices
161 * @pdev_hotplug - hotplug platform devices
162 * @pdev_led - led platform devices
163 * @pdev_io_regs - register access platform devices
164 * @pdev_fan - FAN platform devices
165 * @pdev_wd - array of watchdog platform devices
166 * @regmap: device register map
168 struct mlxplat_priv
{
169 struct platform_device
*pdev_i2c
;
170 struct platform_device
*pdev_mux
[MLXPLAT_CPLD_LPC_MUX_DEVS
];
171 struct platform_device
*pdev_hotplug
;
172 struct platform_device
*pdev_led
;
173 struct platform_device
*pdev_io_regs
;
174 struct platform_device
*pdev_fan
;
175 struct platform_device
*pdev_wd
[MLXPLAT_CPLD_WD_MAX_DEVS
];
179 /* Regions for LPC I2C controller and LPC base register space */
180 static const struct resource mlxplat_lpc_resources
[] = {
181 [0] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_I2C_BASE_ADRR
,
182 MLXPLAT_CPLD_LPC_IO_RANGE
,
183 "mlxplat_cpld_lpc_i2c_ctrl", IORESOURCE_IO
),
184 [1] = DEFINE_RES_NAMED(MLXPLAT_CPLD_LPC_REG_BASE_ADRR
,
185 MLXPLAT_CPLD_LPC_IO_RANGE
,
186 "mlxplat_cpld_lpc_regs",
190 /* Platform next generation systems i2c data */
191 static struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_i2c_ng_data
= {
192 .cell
= MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET
,
193 .mask
= MLXPLAT_CPLD_AGGR_MASK_COMEX
,
194 .cell_low
= MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET
,
195 .mask_low
= MLXPLAT_CPLD_LOW_AGGR_MASK_I2C
,
198 /* Platform default channels */
199 static const int mlxplat_default_channels
[][MLXPLAT_CPLD_GRP_CHNL_NUM
] = {
201 MLXPLAT_CPLD_CH1
, MLXPLAT_CPLD_CH1
+ 1, MLXPLAT_CPLD_CH1
+ 2,
202 MLXPLAT_CPLD_CH1
+ 3, MLXPLAT_CPLD_CH1
+ 4, MLXPLAT_CPLD_CH1
+
203 5, MLXPLAT_CPLD_CH1
+ 6, MLXPLAT_CPLD_CH1
+ 7
206 MLXPLAT_CPLD_CH2
, MLXPLAT_CPLD_CH2
+ 1, MLXPLAT_CPLD_CH2
+ 2,
207 MLXPLAT_CPLD_CH2
+ 3, MLXPLAT_CPLD_CH2
+ 4, MLXPLAT_CPLD_CH2
+
208 5, MLXPLAT_CPLD_CH2
+ 6, MLXPLAT_CPLD_CH2
+ 7
212 /* Platform channels for MSN21xx system family */
213 static const int mlxplat_msn21xx_channels
[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
215 /* Platform mux data */
216 static struct i2c_mux_reg_platform_data mlxplat_mux_data
[] = {
219 .base_nr
= MLXPLAT_CPLD_CH1
,
221 .reg
= (void __iomem
*)MLXPLAT_CPLD_LPC_REG1
,
227 .base_nr
= MLXPLAT_CPLD_CH2
,
229 .reg
= (void __iomem
*)MLXPLAT_CPLD_LPC_REG2
,
236 /* Platform hotplug devices */
237 static struct i2c_board_info mlxplat_mlxcpld_psu
[] = {
239 I2C_BOARD_INFO("24c02", 0x51),
242 I2C_BOARD_INFO("24c02", 0x50),
246 static struct i2c_board_info mlxplat_mlxcpld_ng_psu
[] = {
248 I2C_BOARD_INFO("24c32", 0x51),
251 I2C_BOARD_INFO("24c32", 0x50),
255 static struct i2c_board_info mlxplat_mlxcpld_pwr
[] = {
257 I2C_BOARD_INFO("dps460", 0x59),
260 I2C_BOARD_INFO("dps460", 0x58),
264 static struct i2c_board_info mlxplat_mlxcpld_fan
[] = {
266 I2C_BOARD_INFO("24c32", 0x50),
269 I2C_BOARD_INFO("24c32", 0x50),
272 I2C_BOARD_INFO("24c32", 0x50),
275 I2C_BOARD_INFO("24c32", 0x50),
279 /* Platform hotplug default data */
280 static struct mlxreg_core_data mlxplat_mlxcpld_default_psu_items_data
[] = {
283 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
285 .hpdev
.brdinfo
= &mlxplat_mlxcpld_psu
[0],
286 .hpdev
.nr
= MLXPLAT_CPLD_PSU_DEFAULT_NR
,
290 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
292 .hpdev
.brdinfo
= &mlxplat_mlxcpld_psu
[1],
293 .hpdev
.nr
= MLXPLAT_CPLD_PSU_DEFAULT_NR
,
297 static struct mlxreg_core_data mlxplat_mlxcpld_default_pwr_items_data
[] = {
300 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
302 .hpdev
.brdinfo
= &mlxplat_mlxcpld_pwr
[0],
303 .hpdev
.nr
= MLXPLAT_CPLD_PSU_DEFAULT_NR
,
307 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
309 .hpdev
.brdinfo
= &mlxplat_mlxcpld_pwr
[1],
310 .hpdev
.nr
= MLXPLAT_CPLD_PSU_DEFAULT_NR
,
314 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_items_data
[] = {
317 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
319 .hpdev
.brdinfo
= &mlxplat_mlxcpld_fan
[0],
320 .hpdev
.nr
= MLXPLAT_CPLD_FAN1_DEFAULT_NR
,
324 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
326 .hpdev
.brdinfo
= &mlxplat_mlxcpld_fan
[1],
327 .hpdev
.nr
= MLXPLAT_CPLD_FAN2_DEFAULT_NR
,
331 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
333 .hpdev
.brdinfo
= &mlxplat_mlxcpld_fan
[2],
334 .hpdev
.nr
= MLXPLAT_CPLD_FAN3_DEFAULT_NR
,
338 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
340 .hpdev
.brdinfo
= &mlxplat_mlxcpld_fan
[3],
341 .hpdev
.nr
= MLXPLAT_CPLD_FAN4_DEFAULT_NR
,
345 static struct mlxreg_core_data mlxplat_mlxcpld_default_asic_items_data
[] = {
348 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
349 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
350 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
354 static struct mlxreg_core_item mlxplat_mlxcpld_default_items
[] = {
356 .data
= mlxplat_mlxcpld_default_psu_items_data
,
357 .aggr_mask
= MLXPLAT_CPLD_AGGR_PSU_MASK_DEF
,
358 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
359 .mask
= MLXPLAT_CPLD_PSU_MASK
,
360 .count
= ARRAY_SIZE(mlxplat_mlxcpld_psu
),
365 .data
= mlxplat_mlxcpld_default_pwr_items_data
,
366 .aggr_mask
= MLXPLAT_CPLD_AGGR_PWR_MASK_DEF
,
367 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
368 .mask
= MLXPLAT_CPLD_PWR_MASK
,
369 .count
= ARRAY_SIZE(mlxplat_mlxcpld_pwr
),
374 .data
= mlxplat_mlxcpld_default_fan_items_data
,
375 .aggr_mask
= MLXPLAT_CPLD_AGGR_FAN_MASK_DEF
,
376 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
377 .mask
= MLXPLAT_CPLD_FAN_MASK
,
378 .count
= ARRAY_SIZE(mlxplat_mlxcpld_fan
),
383 .data
= mlxplat_mlxcpld_default_asic_items_data
,
384 .aggr_mask
= MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF
,
385 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
386 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
387 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data
),
394 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_data
= {
395 .items
= mlxplat_mlxcpld_default_items
,
396 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_default_items
),
397 .cell
= MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET
,
398 .mask
= MLXPLAT_CPLD_AGGR_MASK_DEF
,
399 .cell_low
= MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET
,
400 .mask_low
= MLXPLAT_CPLD_LOW_AGGR_MASK_LOW
,
403 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_pwr_items_data
[] = {
406 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
408 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
412 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
414 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
418 /* Platform hotplug MSN21xx system family data */
419 static struct mlxreg_core_item mlxplat_mlxcpld_msn21xx_items
[] = {
421 .data
= mlxplat_mlxcpld_msn21xx_pwr_items_data
,
422 .aggr_mask
= MLXPLAT_CPLD_AGGR_PWR_MASK_DEF
,
423 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
424 .mask
= MLXPLAT_CPLD_PWR_MASK
,
425 .count
= ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_pwr_items_data
),
430 .data
= mlxplat_mlxcpld_default_asic_items_data
,
431 .aggr_mask
= MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF
,
432 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
433 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
434 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data
),
441 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn21xx_data
= {
442 .items
= mlxplat_mlxcpld_msn21xx_items
,
443 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_items
),
444 .cell
= MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET
,
445 .mask
= MLXPLAT_CPLD_AGGR_MASK_DEF
,
446 .cell_low
= MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET
,
447 .mask_low
= MLXPLAT_CPLD_LOW_AGGR_MASK_LOW
,
450 /* Platform hotplug msn274x system family data */
451 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_psu_items_data
[] = {
454 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
456 .hpdev
.brdinfo
= &mlxplat_mlxcpld_psu
[0],
457 .hpdev
.nr
= MLXPLAT_CPLD_PSU_MSNXXXX_NR
,
461 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
463 .hpdev
.brdinfo
= &mlxplat_mlxcpld_psu
[1],
464 .hpdev
.nr
= MLXPLAT_CPLD_PSU_MSNXXXX_NR
,
468 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_pwr_items_data
[] = {
471 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
473 .hpdev
.brdinfo
= &mlxplat_mlxcpld_pwr
[0],
474 .hpdev
.nr
= MLXPLAT_CPLD_PSU_MSNXXXX_NR
,
478 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
480 .hpdev
.brdinfo
= &mlxplat_mlxcpld_pwr
[1],
481 .hpdev
.nr
= MLXPLAT_CPLD_PSU_MSNXXXX_NR
,
485 static struct mlxreg_core_data mlxplat_mlxcpld_msn274x_fan_items_data
[] = {
488 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
490 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
494 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
496 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
500 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
502 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
506 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
508 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
512 static struct mlxreg_core_item mlxplat_mlxcpld_msn274x_items
[] = {
514 .data
= mlxplat_mlxcpld_msn274x_psu_items_data
,
515 .aggr_mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
516 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
517 .mask
= MLXPLAT_CPLD_PSU_MASK
,
518 .count
= ARRAY_SIZE(mlxplat_mlxcpld_msn274x_psu_items_data
),
523 .data
= mlxplat_mlxcpld_default_ng_pwr_items_data
,
524 .aggr_mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
525 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
526 .mask
= MLXPLAT_CPLD_PWR_MASK
,
527 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data
),
532 .data
= mlxplat_mlxcpld_msn274x_fan_items_data
,
533 .aggr_mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
534 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
535 .mask
= MLXPLAT_CPLD_FAN_MASK
,
536 .count
= ARRAY_SIZE(mlxplat_mlxcpld_msn274x_fan_items_data
),
541 .data
= mlxplat_mlxcpld_default_asic_items_data
,
542 .aggr_mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
543 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
544 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
545 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data
),
552 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn274x_data
= {
553 .items
= mlxplat_mlxcpld_msn274x_items
,
554 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_msn274x_items
),
555 .cell
= MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET
,
556 .mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
557 .cell_low
= MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET
,
558 .mask_low
= MLXPLAT_CPLD_LOW_AGGR_MASK_LOW
,
561 /* Platform hotplug MSN201x system family data */
562 static struct mlxreg_core_data mlxplat_mlxcpld_msn201x_pwr_items_data
[] = {
565 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
567 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
571 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
573 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
577 static struct mlxreg_core_item mlxplat_mlxcpld_msn201x_items
[] = {
579 .data
= mlxplat_mlxcpld_msn201x_pwr_items_data
,
580 .aggr_mask
= MLXPLAT_CPLD_AGGR_PWR_MASK_DEF
,
581 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
582 .mask
= MLXPLAT_CPLD_PWR_MASK
,
583 .count
= ARRAY_SIZE(mlxplat_mlxcpld_msn201x_pwr_items_data
),
588 .data
= mlxplat_mlxcpld_default_asic_items_data
,
589 .aggr_mask
= MLXPLAT_CPLD_AGGR_ASIC_MASK_DEF
,
590 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
591 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
592 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data
),
599 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data
= {
600 .items
= mlxplat_mlxcpld_msn201x_items
,
601 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_msn201x_items
),
602 .cell
= MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET
,
603 .mask
= MLXPLAT_CPLD_AGGR_MASK_DEF
,
604 .cell_low
= MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET
,
605 .mask_low
= MLXPLAT_CPLD_LOW_AGGR_MASK_LOW
,
608 /* Platform hotplug next generation system family data */
609 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data
[] = {
612 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
614 .hpdev
.brdinfo
= &mlxplat_mlxcpld_ng_psu
[0],
615 .hpdev
.nr
= MLXPLAT_CPLD_PSU_MSNXXXX_NR
,
619 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
621 .hpdev
.brdinfo
= &mlxplat_mlxcpld_ng_psu
[1],
622 .hpdev
.nr
= MLXPLAT_CPLD_PSU_MSNXXXX_NR
,
626 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data
[] = {
629 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
631 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
633 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
637 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
639 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
641 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
645 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
647 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
649 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
653 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
655 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
657 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
661 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
663 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
665 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
669 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
671 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
673 .hpdev
.nr
= MLXPLAT_CPLD_NR_NONE
,
677 static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items
[] = {
679 .data
= mlxplat_mlxcpld_default_ng_psu_items_data
,
680 .aggr_mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
681 .reg
= MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
,
682 .mask
= MLXPLAT_CPLD_PSU_MASK
,
683 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data
),
688 .data
= mlxplat_mlxcpld_default_ng_pwr_items_data
,
689 .aggr_mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
690 .reg
= MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
,
691 .mask
= MLXPLAT_CPLD_PWR_MASK
,
692 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data
),
697 .data
= mlxplat_mlxcpld_default_ng_fan_items_data
,
698 .aggr_mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
699 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
,
700 .mask
= MLXPLAT_CPLD_FAN_NG_MASK
,
701 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data
),
706 .data
= mlxplat_mlxcpld_default_asic_items_data
,
707 .aggr_mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
,
708 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
709 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
710 .count
= ARRAY_SIZE(mlxplat_mlxcpld_default_asic_items_data
),
717 struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data
= {
718 .items
= mlxplat_mlxcpld_default_ng_items
,
719 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items
),
720 .cell
= MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET
,
721 .mask
= MLXPLAT_CPLD_AGGR_MASK_NG_DEF
| MLXPLAT_CPLD_AGGR_MASK_COMEX
,
722 .cell_low
= MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET
,
723 .mask_low
= MLXPLAT_CPLD_LOW_AGGR_MASK_LOW
,
726 /* Platform led default data */
727 static struct mlxreg_core_data mlxplat_mlxcpld_default_led_data
[] = {
729 .label
= "status:green",
730 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
731 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
734 .label
= "status:red",
735 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
736 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
739 .label
= "psu:green",
740 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
741 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
745 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
746 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
749 .label
= "fan1:green",
750 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
751 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
755 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
756 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
759 .label
= "fan2:green",
760 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
761 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
765 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
766 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
769 .label
= "fan3:green",
770 .reg
= MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
,
771 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
775 .reg
= MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
,
776 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
779 .label
= "fan4:green",
780 .reg
= MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
,
781 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
785 .reg
= MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
,
786 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
790 static struct mlxreg_core_platform_data mlxplat_default_led_data
= {
791 .data
= mlxplat_mlxcpld_default_led_data
,
792 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_default_led_data
),
795 /* Platform led MSN21xx system family data */
796 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_led_data
[] = {
798 .label
= "status:green",
799 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
800 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
803 .label
= "status:red",
804 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
805 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
808 .label
= "fan:green",
809 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
810 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
814 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
815 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
818 .label
= "psu1:green",
819 .reg
= MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
,
820 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
824 .reg
= MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
,
825 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
828 .label
= "psu2:green",
829 .reg
= MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
,
830 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
834 .reg
= MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
,
835 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
839 .reg
= MLXPLAT_CPLD_LPC_REG_LED5_OFFSET
,
840 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
844 static struct mlxreg_core_platform_data mlxplat_msn21xx_led_data
= {
845 .data
= mlxplat_mlxcpld_msn21xx_led_data
,
846 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_led_data
),
849 /* Platform led for default data for 200GbE systems */
850 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_led_data
[] = {
852 .label
= "status:green",
853 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
854 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
857 .label
= "status:orange",
858 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
859 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
862 .label
= "psu:green",
863 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
864 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
867 .label
= "psu:orange",
868 .reg
= MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
,
869 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
872 .label
= "fan1:green",
873 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
874 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
875 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
879 .label
= "fan1:orange",
880 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
881 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
882 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
886 .label
= "fan2:green",
887 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
888 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
889 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
893 .label
= "fan2:orange",
894 .reg
= MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
,
895 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
896 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
900 .label
= "fan3:green",
901 .reg
= MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
,
902 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
903 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
907 .label
= "fan3:orange",
908 .reg
= MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
,
909 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
910 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
914 .label
= "fan4:green",
915 .reg
= MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
,
916 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
917 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
921 .label
= "fan4:orange",
922 .reg
= MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
,
923 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
924 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
928 .label
= "fan5:green",
929 .reg
= MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
,
930 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
931 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
935 .label
= "fan5:orange",
936 .reg
= MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
,
937 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
938 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
942 .label
= "fan6:green",
943 .reg
= MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
,
944 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
945 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
949 .label
= "fan6:orange",
950 .reg
= MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
,
951 .mask
= MLXPLAT_CPLD_LED_HI_NIBBLE_MASK
,
952 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
,
957 .reg
= MLXPLAT_CPLD_LPC_REG_LED5_OFFSET
,
958 .mask
= MLXPLAT_CPLD_LED_LO_NIBBLE_MASK
,
962 static struct mlxreg_core_platform_data mlxplat_default_ng_led_data
= {
963 .data
= mlxplat_mlxcpld_default_ng_led_data
,
964 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_default_ng_led_data
),
967 /* Platform register access default */
968 static struct mlxreg_core_data mlxplat_mlxcpld_default_regs_io_data
[] = {
970 .label
= "cpld1_version",
971 .reg
= MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET
,
972 .bit
= GENMASK(7, 0),
976 .label
= "cpld2_version",
977 .reg
= MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET
,
978 .bit
= GENMASK(7, 0),
982 .label
= "reset_long_pb",
983 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
984 .mask
= GENMASK(7, 0) & ~BIT(0),
988 .label
= "reset_short_pb",
989 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
990 .mask
= GENMASK(7, 0) & ~BIT(1),
994 .label
= "reset_aux_pwr_or_ref",
995 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
996 .mask
= GENMASK(7, 0) & ~BIT(2),
1000 .label
= "reset_main_pwr_fail",
1001 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1002 .mask
= GENMASK(7, 0) & ~BIT(3),
1006 .label
= "reset_sw_reset",
1007 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1008 .mask
= GENMASK(7, 0) & ~BIT(4),
1012 .label
= "reset_fw_reset",
1013 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1014 .mask
= GENMASK(7, 0) & ~BIT(5),
1018 .label
= "reset_hotswap_or_wd",
1019 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1020 .mask
= GENMASK(7, 0) & ~BIT(6),
1024 .label
= "reset_asic_thermal",
1025 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1026 .mask
= GENMASK(7, 0) & ~BIT(7),
1031 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1032 .mask
= GENMASK(7, 0) & ~BIT(0),
1037 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1038 .mask
= GENMASK(7, 0) & ~BIT(1),
1042 .label
= "pwr_cycle",
1043 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1044 .mask
= GENMASK(7, 0) & ~BIT(2),
1048 .label
= "pwr_down",
1049 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1050 .mask
= GENMASK(7, 0) & ~BIT(3),
1054 .label
= "select_iio",
1055 .reg
= MLXPLAT_CPLD_LPC_REG_GP2_OFFSET
,
1056 .mask
= GENMASK(7, 0) & ~BIT(6),
1060 .label
= "asic_health",
1061 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
1062 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
1068 static struct mlxreg_core_platform_data mlxplat_default_regs_io_data
= {
1069 .data
= mlxplat_mlxcpld_default_regs_io_data
,
1070 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_default_regs_io_data
),
1073 /* Platform register access MSN21xx, MSN201x, MSN274x systems families data */
1074 static struct mlxreg_core_data mlxplat_mlxcpld_msn21xx_regs_io_data
[] = {
1076 .label
= "cpld1_version",
1077 .reg
= MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET
,
1078 .bit
= GENMASK(7, 0),
1082 .label
= "cpld2_version",
1083 .reg
= MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET
,
1084 .bit
= GENMASK(7, 0),
1088 .label
= "reset_long_pb",
1089 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1090 .mask
= GENMASK(7, 0) & ~BIT(0),
1094 .label
= "reset_short_pb",
1095 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1096 .mask
= GENMASK(7, 0) & ~BIT(1),
1100 .label
= "reset_aux_pwr_or_ref",
1101 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1102 .mask
= GENMASK(7, 0) & ~BIT(2),
1106 .label
= "reset_sw_reset",
1107 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1108 .mask
= GENMASK(7, 0) & ~BIT(3),
1112 .label
= "reset_main_pwr_fail",
1113 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1114 .mask
= GENMASK(7, 0) & ~BIT(4),
1118 .label
= "reset_asic_thermal",
1119 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1120 .mask
= GENMASK(7, 0) & ~BIT(5),
1124 .label
= "reset_hotswap_or_halt",
1125 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1126 .mask
= GENMASK(7, 0) & ~BIT(6),
1130 .label
= "reset_sff_wd",
1131 .reg
= MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET
,
1132 .mask
= GENMASK(7, 0) & ~BIT(6),
1137 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1138 .mask
= GENMASK(7, 0) & ~BIT(0),
1143 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1144 .mask
= GENMASK(7, 0) & ~BIT(1),
1148 .label
= "pwr_cycle",
1149 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1150 .mask
= GENMASK(7, 0) & ~BIT(2),
1154 .label
= "pwr_down",
1155 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1156 .mask
= GENMASK(7, 0) & ~BIT(3),
1160 .label
= "asic_health",
1161 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
1162 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
1168 static struct mlxreg_core_platform_data mlxplat_msn21xx_regs_io_data
= {
1169 .data
= mlxplat_mlxcpld_msn21xx_regs_io_data
,
1170 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_msn21xx_regs_io_data
),
1173 /* Platform register access for next generation systems families data */
1174 static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_regs_io_data
[] = {
1176 .label
= "cpld1_version",
1177 .reg
= MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET
,
1178 .bit
= GENMASK(7, 0),
1182 .label
= "cpld2_version",
1183 .reg
= MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET
,
1184 .bit
= GENMASK(7, 0),
1188 .label
= "cpld3_version",
1189 .reg
= MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET
,
1190 .bit
= GENMASK(7, 0),
1194 .label
= "cpld4_version",
1195 .reg
= MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET
,
1196 .bit
= GENMASK(7, 0),
1200 .label
= "reset_long_pb",
1201 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1202 .mask
= GENMASK(7, 0) & ~BIT(0),
1206 .label
= "reset_short_pb",
1207 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1208 .mask
= GENMASK(7, 0) & ~BIT(1),
1212 .label
= "reset_aux_pwr_or_ref",
1213 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1214 .mask
= GENMASK(7, 0) & ~BIT(2),
1218 .label
= "reset_from_comex",
1219 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1220 .mask
= GENMASK(7, 0) & ~BIT(4),
1224 .label
= "reset_from_asic",
1225 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1226 .mask
= GENMASK(7, 0) & ~BIT(5),
1230 .label
= "reset_swb_wd",
1231 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1232 .mask
= GENMASK(7, 0) & ~BIT(6),
1236 .label
= "reset_asic_thermal",
1237 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1238 .mask
= GENMASK(7, 0) & ~BIT(7),
1242 .label
= "reset_comex_pwr_fail",
1243 .reg
= MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET
,
1244 .mask
= GENMASK(7, 0) & ~BIT(3),
1248 .label
= "reset_comex_wd",
1249 .reg
= MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET
,
1250 .mask
= GENMASK(7, 0) & ~BIT(6),
1254 .label
= "reset_voltmon_upgrade_fail",
1255 .reg
= MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET
,
1256 .mask
= GENMASK(7, 0) & ~BIT(0),
1260 .label
= "reset_system",
1261 .reg
= MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET
,
1262 .mask
= GENMASK(7, 0) & ~BIT(1),
1266 .label
= "reset_comex_thermal",
1267 .reg
= MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET
,
1268 .mask
= GENMASK(7, 0) & ~BIT(3),
1272 .label
= "reset_reload_bios",
1273 .reg
= MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET
,
1274 .mask
= GENMASK(7, 0) & ~BIT(5),
1279 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1280 .mask
= GENMASK(7, 0) & ~BIT(0),
1285 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1286 .mask
= GENMASK(7, 0) & ~BIT(1),
1290 .label
= "pwr_cycle",
1291 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1292 .mask
= GENMASK(7, 0) & ~BIT(2),
1296 .label
= "pwr_down",
1297 .reg
= MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
,
1298 .mask
= GENMASK(7, 0) & ~BIT(3),
1302 .label
= "jtag_enable",
1303 .reg
= MLXPLAT_CPLD_LPC_REG_GP2_OFFSET
,
1304 .mask
= GENMASK(7, 0) & ~BIT(4),
1308 .label
= "asic_health",
1309 .reg
= MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
,
1310 .mask
= MLXPLAT_CPLD_ASIC_MASK
,
1316 .reg
= MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION
,
1317 .bit
= GENMASK(7, 0),
1322 static struct mlxreg_core_platform_data mlxplat_default_ng_regs_io_data
= {
1323 .data
= mlxplat_mlxcpld_default_ng_regs_io_data
,
1324 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_default_ng_regs_io_data
),
1327 /* Platform FAN default */
1328 static struct mlxreg_core_data mlxplat_mlxcpld_default_fan_data
[] = {
1331 .reg
= MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET
,
1335 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET
,
1336 .mask
= GENMASK(7, 0),
1337 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
,
1342 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET
,
1343 .mask
= GENMASK(7, 0),
1344 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
,
1349 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET
,
1350 .mask
= GENMASK(7, 0),
1351 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
,
1356 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET
,
1357 .mask
= GENMASK(7, 0),
1358 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
,
1363 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET
,
1364 .mask
= GENMASK(7, 0),
1365 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
,
1370 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET
,
1371 .mask
= GENMASK(7, 0),
1372 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
,
1377 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET
,
1378 .mask
= GENMASK(7, 0),
1379 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
,
1384 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET
,
1385 .mask
= GENMASK(7, 0),
1386 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
,
1391 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET
,
1392 .mask
= GENMASK(7, 0),
1393 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET
,
1398 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET
,
1399 .mask
= GENMASK(7, 0),
1400 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET
,
1405 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET
,
1406 .mask
= GENMASK(7, 0),
1407 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET
,
1412 .reg
= MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET
,
1413 .mask
= GENMASK(7, 0),
1414 .capability
= MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET
,
1419 .capability
= MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET
,
1423 static struct mlxreg_core_platform_data mlxplat_default_fan_data
= {
1424 .data
= mlxplat_mlxcpld_default_fan_data
,
1425 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_default_fan_data
),
1428 /* Watchdog type1: hardware implementation version1
1429 * (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140 systems).
1431 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type1
[] = {
1434 .reg
= MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET
,
1435 .mask
= MLXPLAT_CPLD_WD_RESET_ACT_MASK
,
1440 .reg
= MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET
,
1441 .mask
= MLXPLAT_CPLD_WD_TYPE1_TO_MASK
,
1442 .health_cntr
= MLXPLAT_CPLD_WD_DFLT_TIMEOUT
,
1446 .reg
= MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET
,
1447 .mask
= MLXPLAT_CPLD_WD1_CLEAR_MASK
,
1452 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1453 .mask
= GENMASK(7, 0) & ~BIT(6),
1458 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type1
[] = {
1461 .reg
= MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET
,
1462 .mask
= MLXPLAT_CPLD_WD_FAN_ACT_MASK
,
1467 .reg
= MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET
,
1468 .mask
= MLXPLAT_CPLD_WD_TYPE1_TO_MASK
,
1469 .health_cntr
= MLXPLAT_CPLD_WD_DFLT_TIMEOUT
,
1473 .reg
= MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET
,
1474 .mask
= MLXPLAT_CPLD_WD1_CLEAR_MASK
,
1479 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type1
[] = {
1481 .data
= mlxplat_mlxcpld_wd_main_regs_type1
,
1482 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type1
),
1483 .version
= MLX_WDT_TYPE1
,
1484 .identity
= "mlx-wdt-main",
1487 .data
= mlxplat_mlxcpld_wd_aux_regs_type1
,
1488 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type1
),
1489 .version
= MLX_WDT_TYPE1
,
1490 .identity
= "mlx-wdt-aux",
1494 /* Watchdog type2: hardware implementation version 2
1495 * (all systems except (MSN2700, MSN2410, MSN2740, MSN2100 and MSN2140).
1497 static struct mlxreg_core_data mlxplat_mlxcpld_wd_main_regs_type2
[] = {
1500 .reg
= MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET
,
1501 .mask
= MLXPLAT_CPLD_WD_RESET_ACT_MASK
,
1506 .reg
= MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET
,
1507 .mask
= MLXPLAT_CPLD_WD_TYPE2_TO_MASK
,
1508 .health_cntr
= MLXPLAT_CPLD_WD_DFLT_TIMEOUT
,
1511 .label
= "timeleft",
1512 .reg
= MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET
,
1513 .mask
= MLXPLAT_CPLD_WD_TYPE2_TO_MASK
,
1517 .reg
= MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET
,
1518 .mask
= MLXPLAT_CPLD_WD_RESET_ACT_MASK
,
1523 .reg
= MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
,
1524 .mask
= GENMASK(7, 0) & ~BIT(6),
1529 static struct mlxreg_core_data mlxplat_mlxcpld_wd_aux_regs_type2
[] = {
1532 .reg
= MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET
,
1533 .mask
= MLXPLAT_CPLD_WD_FAN_ACT_MASK
,
1538 .reg
= MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET
,
1539 .mask
= MLXPLAT_CPLD_WD_TYPE2_TO_MASK
,
1540 .health_cntr
= MLXPLAT_CPLD_WD_DFLT_TIMEOUT
,
1543 .label
= "timeleft",
1544 .reg
= MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET
,
1545 .mask
= MLXPLAT_CPLD_WD_TYPE2_TO_MASK
,
1549 .reg
= MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET
,
1550 .mask
= MLXPLAT_CPLD_WD_FAN_ACT_MASK
,
1555 static struct mlxreg_core_platform_data mlxplat_mlxcpld_wd_set_type2
[] = {
1557 .data
= mlxplat_mlxcpld_wd_main_regs_type2
,
1558 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_wd_main_regs_type2
),
1559 .version
= MLX_WDT_TYPE2
,
1560 .identity
= "mlx-wdt-main",
1563 .data
= mlxplat_mlxcpld_wd_aux_regs_type2
,
1564 .counter
= ARRAY_SIZE(mlxplat_mlxcpld_wd_aux_regs_type2
),
1565 .version
= MLX_WDT_TYPE2
,
1566 .identity
= "mlx-wdt-aux",
1570 static bool mlxplat_mlxcpld_writeable_reg(struct device
*dev
, unsigned int reg
)
1573 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
:
1574 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
:
1575 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
:
1576 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
:
1577 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET
:
1578 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
:
1579 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET
:
1580 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET
:
1581 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET
:
1582 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET
:
1583 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET
:
1584 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET
:
1585 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET
:
1586 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET
:
1587 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET
:
1588 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET
:
1589 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET
:
1590 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET
:
1591 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET
:
1592 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET
:
1593 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET
:
1594 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET
:
1595 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET
:
1596 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET
:
1597 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET
:
1598 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET
:
1599 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET
:
1600 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET
:
1601 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET
:
1602 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET
:
1608 static bool mlxplat_mlxcpld_readable_reg(struct device
*dev
, unsigned int reg
)
1611 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET
:
1612 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET
:
1613 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET
:
1614 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET
:
1615 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
:
1616 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET
:
1617 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET
:
1618 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
:
1619 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
:
1620 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
:
1621 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
:
1622 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET
:
1623 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION
:
1624 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
:
1625 case MLXPLAT_CPLD_LPC_REG_WP1_OFFSET
:
1626 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET
:
1627 case MLXPLAT_CPLD_LPC_REG_WP2_OFFSET
:
1628 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET
:
1629 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET
:
1630 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET
:
1631 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET
:
1632 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET
:
1633 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET
:
1634 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
:
1635 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET
:
1636 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET
:
1637 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
:
1638 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET
:
1639 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET
:
1640 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
:
1641 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET
:
1642 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET
:
1643 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
:
1644 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET
:
1645 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET
:
1646 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_OFFSET
:
1647 case MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET
:
1648 case MLXPLAT_CPLD_LPC_REG_WD1_TMR_OFFSET
:
1649 case MLXPLAT_CPLD_LPC_REG_WD1_ACT_OFFSET
:
1650 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET
:
1651 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET
:
1652 case MLXPLAT_CPLD_LPC_REG_WD2_ACT_OFFSET
:
1653 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET
:
1654 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET
:
1655 case MLXPLAT_CPLD_LPC_REG_WD3_ACT_OFFSET
:
1656 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET
:
1657 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET
:
1658 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET
:
1659 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET
:
1660 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET
:
1661 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET
:
1662 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET
:
1663 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET
:
1664 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET
:
1665 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET
:
1666 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET
:
1667 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET
:
1668 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET
:
1669 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET
:
1670 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
:
1671 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET
:
1672 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
:
1673 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET
:
1679 static bool mlxplat_mlxcpld_volatile_reg(struct device
*dev
, unsigned int reg
)
1682 case MLXPLAT_CPLD_LPC_REG_CPLD1_VER_OFFSET
:
1683 case MLXPLAT_CPLD_LPC_REG_CPLD2_VER_OFFSET
:
1684 case MLXPLAT_CPLD_LPC_REG_CPLD3_VER_OFFSET
:
1685 case MLXPLAT_CPLD_LPC_REG_CPLD4_VER_OFFSET
:
1686 case MLXPLAT_CPLD_LPC_REG_RESET_CAUSE_OFFSET
:
1687 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE1_OFFSET
:
1688 case MLXPLAT_CPLD_LPC_REG_RST_CAUSE2_OFFSET
:
1689 case MLXPLAT_CPLD_LPC_REG_LED1_OFFSET
:
1690 case MLXPLAT_CPLD_LPC_REG_LED2_OFFSET
:
1691 case MLXPLAT_CPLD_LPC_REG_LED3_OFFSET
:
1692 case MLXPLAT_CPLD_LPC_REG_LED4_OFFSET
:
1693 case MLXPLAT_CPLD_LPC_REG_LED5_OFFSET
:
1694 case MLXPLAT_CPLD_LPC_REG_FAN_DIRECTION
:
1695 case MLXPLAT_CPLD_LPC_REG_GP1_OFFSET
:
1696 case MLXPLAT_CPLD_LPC_REG_GP2_OFFSET
:
1697 case MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET
:
1698 case MLXPLAT_CPLD_LPC_REG_AGGR_MASK_OFFSET
:
1699 case MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET
:
1700 case MLXPLAT_CPLD_LPC_REG_AGGRLO_MASK_OFFSET
:
1701 case MLXPLAT_CPLD_LPC_REG_AGGRCO_OFFSET
:
1702 case MLXPLAT_CPLD_LPC_REG_AGGRCO_MASK_OFFSET
:
1703 case MLXPLAT_CPLD_LPC_REG_ASIC_HEALTH_OFFSET
:
1704 case MLXPLAT_CPLD_LPC_REG_ASIC_EVENT_OFFSET
:
1705 case MLXPLAT_CPLD_LPC_REG_ASIC_MASK_OFFSET
:
1706 case MLXPLAT_CPLD_LPC_REG_PSU_OFFSET
:
1707 case MLXPLAT_CPLD_LPC_REG_PSU_EVENT_OFFSET
:
1708 case MLXPLAT_CPLD_LPC_REG_PSU_MASK_OFFSET
:
1709 case MLXPLAT_CPLD_LPC_REG_PWR_OFFSET
:
1710 case MLXPLAT_CPLD_LPC_REG_PWR_EVENT_OFFSET
:
1711 case MLXPLAT_CPLD_LPC_REG_PWR_MASK_OFFSET
:
1712 case MLXPLAT_CPLD_LPC_REG_FAN_OFFSET
:
1713 case MLXPLAT_CPLD_LPC_REG_FAN_EVENT_OFFSET
:
1714 case MLXPLAT_CPLD_LPC_REG_FAN_MASK_OFFSET
:
1715 case MLXPLAT_CPLD_LPC_REG_WD2_TMR_OFFSET
:
1716 case MLXPLAT_CPLD_LPC_REG_WD2_TLEFT_OFFSET
:
1717 case MLXPLAT_CPLD_LPC_REG_WD3_TMR_OFFSET
:
1718 case MLXPLAT_CPLD_LPC_REG_WD3_TLEFT_OFFSET
:
1719 case MLXPLAT_CPLD_LPC_REG_PWM1_OFFSET
:
1720 case MLXPLAT_CPLD_LPC_REG_TACHO1_OFFSET
:
1721 case MLXPLAT_CPLD_LPC_REG_TACHO2_OFFSET
:
1722 case MLXPLAT_CPLD_LPC_REG_TACHO3_OFFSET
:
1723 case MLXPLAT_CPLD_LPC_REG_TACHO4_OFFSET
:
1724 case MLXPLAT_CPLD_LPC_REG_TACHO5_OFFSET
:
1725 case MLXPLAT_CPLD_LPC_REG_TACHO6_OFFSET
:
1726 case MLXPLAT_CPLD_LPC_REG_TACHO7_OFFSET
:
1727 case MLXPLAT_CPLD_LPC_REG_TACHO8_OFFSET
:
1728 case MLXPLAT_CPLD_LPC_REG_TACHO9_OFFSET
:
1729 case MLXPLAT_CPLD_LPC_REG_TACHO10_OFFSET
:
1730 case MLXPLAT_CPLD_LPC_REG_TACHO11_OFFSET
:
1731 case MLXPLAT_CPLD_LPC_REG_TACHO12_OFFSET
:
1732 case MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET
:
1733 case MLXPLAT_CPLD_LPC_REG_FAN_CAP1_OFFSET
:
1734 case MLXPLAT_CPLD_LPC_REG_FAN_CAP2_OFFSET
:
1735 case MLXPLAT_CPLD_LPC_REG_FAN_DRW_CAP_OFFSET
:
1736 case MLXPLAT_CPLD_LPC_REG_TACHO_SPEED_OFFSET
:
1742 static const struct reg_default mlxplat_mlxcpld_regmap_default
[] = {
1743 { MLXPLAT_CPLD_LPC_REG_WP1_OFFSET
, 0x00 },
1744 { MLXPLAT_CPLD_LPC_REG_WP2_OFFSET
, 0x00 },
1745 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET
, 0x00 },
1746 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET
, 0x00 },
1749 static const struct reg_default mlxplat_mlxcpld_regmap_ng
[] = {
1750 { MLXPLAT_CPLD_LPC_REG_PWM_CONTROL_OFFSET
, 0x00 },
1751 { MLXPLAT_CPLD_LPC_REG_WD_CLEAR_WP_OFFSET
, 0x00 },
1754 struct mlxplat_mlxcpld_regmap_context
{
1758 static struct mlxplat_mlxcpld_regmap_context mlxplat_mlxcpld_regmap_ctx
;
1761 mlxplat_mlxcpld_reg_read(void *context
, unsigned int reg
, unsigned int *val
)
1763 struct mlxplat_mlxcpld_regmap_context
*ctx
= context
;
1765 *val
= ioread8(ctx
->base
+ reg
);
1770 mlxplat_mlxcpld_reg_write(void *context
, unsigned int reg
, unsigned int val
)
1772 struct mlxplat_mlxcpld_regmap_context
*ctx
= context
;
1774 iowrite8(val
, ctx
->base
+ reg
);
1778 static const struct regmap_config mlxplat_mlxcpld_regmap_config
= {
1781 .max_register
= 255,
1782 .cache_type
= REGCACHE_FLAT
,
1783 .writeable_reg
= mlxplat_mlxcpld_writeable_reg
,
1784 .readable_reg
= mlxplat_mlxcpld_readable_reg
,
1785 .volatile_reg
= mlxplat_mlxcpld_volatile_reg
,
1786 .reg_defaults
= mlxplat_mlxcpld_regmap_default
,
1787 .num_reg_defaults
= ARRAY_SIZE(mlxplat_mlxcpld_regmap_default
),
1788 .reg_read
= mlxplat_mlxcpld_reg_read
,
1789 .reg_write
= mlxplat_mlxcpld_reg_write
,
1792 static const struct regmap_config mlxplat_mlxcpld_regmap_config_ng
= {
1795 .max_register
= 255,
1796 .cache_type
= REGCACHE_FLAT
,
1797 .writeable_reg
= mlxplat_mlxcpld_writeable_reg
,
1798 .readable_reg
= mlxplat_mlxcpld_readable_reg
,
1799 .volatile_reg
= mlxplat_mlxcpld_volatile_reg
,
1800 .reg_defaults
= mlxplat_mlxcpld_regmap_ng
,
1801 .num_reg_defaults
= ARRAY_SIZE(mlxplat_mlxcpld_regmap_ng
),
1802 .reg_read
= mlxplat_mlxcpld_reg_read
,
1803 .reg_write
= mlxplat_mlxcpld_reg_write
,
1806 static struct resource mlxplat_mlxcpld_resources
[] = {
1807 [0] = DEFINE_RES_IRQ_NAMED(17, "mlxreg-hotplug"),
1810 static struct platform_device
*mlxplat_dev
;
1811 static struct mlxreg_core_hotplug_platform_data
*mlxplat_i2c
;
1812 static struct mlxreg_core_hotplug_platform_data
*mlxplat_hotplug
;
1813 static struct mlxreg_core_platform_data
*mlxplat_led
;
1814 static struct mlxreg_core_platform_data
*mlxplat_regs_io
;
1815 static struct mlxreg_core_platform_data
*mlxplat_fan
;
1816 static struct mlxreg_core_platform_data
1817 *mlxplat_wd_data
[MLXPLAT_CPLD_WD_MAX_DEVS
];
1818 static const struct regmap_config
*mlxplat_regmap_config
;
1820 static int __init
mlxplat_dmi_default_matched(const struct dmi_system_id
*dmi
)
1824 for (i
= 0; i
< ARRAY_SIZE(mlxplat_mux_data
); i
++) {
1825 mlxplat_mux_data
[i
].values
= mlxplat_default_channels
[i
];
1826 mlxplat_mux_data
[i
].n_values
=
1827 ARRAY_SIZE(mlxplat_default_channels
[i
]);
1829 mlxplat_hotplug
= &mlxplat_mlxcpld_default_data
;
1830 mlxplat_hotplug
->deferred_nr
=
1831 mlxplat_default_channels
[i
- 1][MLXPLAT_CPLD_GRP_CHNL_NUM
- 1];
1832 mlxplat_led
= &mlxplat_default_led_data
;
1833 mlxplat_regs_io
= &mlxplat_default_regs_io_data
;
1834 mlxplat_wd_data
[0] = &mlxplat_mlxcpld_wd_set_type1
[0];
1839 static int __init
mlxplat_dmi_msn21xx_matched(const struct dmi_system_id
*dmi
)
1843 for (i
= 0; i
< ARRAY_SIZE(mlxplat_mux_data
); i
++) {
1844 mlxplat_mux_data
[i
].values
= mlxplat_msn21xx_channels
;
1845 mlxplat_mux_data
[i
].n_values
=
1846 ARRAY_SIZE(mlxplat_msn21xx_channels
);
1848 mlxplat_hotplug
= &mlxplat_mlxcpld_msn21xx_data
;
1849 mlxplat_hotplug
->deferred_nr
=
1850 mlxplat_msn21xx_channels
[MLXPLAT_CPLD_GRP_CHNL_NUM
- 1];
1851 mlxplat_led
= &mlxplat_msn21xx_led_data
;
1852 mlxplat_regs_io
= &mlxplat_msn21xx_regs_io_data
;
1853 mlxplat_wd_data
[0] = &mlxplat_mlxcpld_wd_set_type1
[0];
1858 static int __init
mlxplat_dmi_msn274x_matched(const struct dmi_system_id
*dmi
)
1862 for (i
= 0; i
< ARRAY_SIZE(mlxplat_mux_data
); i
++) {
1863 mlxplat_mux_data
[i
].values
= mlxplat_msn21xx_channels
;
1864 mlxplat_mux_data
[i
].n_values
=
1865 ARRAY_SIZE(mlxplat_msn21xx_channels
);
1867 mlxplat_hotplug
= &mlxplat_mlxcpld_msn274x_data
;
1868 mlxplat_hotplug
->deferred_nr
=
1869 mlxplat_msn21xx_channels
[MLXPLAT_CPLD_GRP_CHNL_NUM
- 1];
1870 mlxplat_led
= &mlxplat_default_led_data
;
1871 mlxplat_regs_io
= &mlxplat_msn21xx_regs_io_data
;
1872 mlxplat_wd_data
[0] = &mlxplat_mlxcpld_wd_set_type1
[0];
1877 static int __init
mlxplat_dmi_msn201x_matched(const struct dmi_system_id
*dmi
)
1881 for (i
= 0; i
< ARRAY_SIZE(mlxplat_mux_data
); i
++) {
1882 mlxplat_mux_data
[i
].values
= mlxplat_msn21xx_channels
;
1883 mlxplat_mux_data
[i
].n_values
=
1884 ARRAY_SIZE(mlxplat_msn21xx_channels
);
1886 mlxplat_hotplug
= &mlxplat_mlxcpld_msn201x_data
;
1887 mlxplat_hotplug
->deferred_nr
=
1888 mlxplat_default_channels
[i
- 1][MLXPLAT_CPLD_GRP_CHNL_NUM
- 1];
1889 mlxplat_led
= &mlxplat_msn21xx_led_data
;
1890 mlxplat_regs_io
= &mlxplat_msn21xx_regs_io_data
;
1891 mlxplat_wd_data
[0] = &mlxplat_mlxcpld_wd_set_type1
[0];
1896 static int __init
mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id
*dmi
)
1900 for (i
= 0; i
< ARRAY_SIZE(mlxplat_mux_data
); i
++) {
1901 mlxplat_mux_data
[i
].values
= mlxplat_msn21xx_channels
;
1902 mlxplat_mux_data
[i
].n_values
=
1903 ARRAY_SIZE(mlxplat_msn21xx_channels
);
1905 mlxplat_hotplug
= &mlxplat_mlxcpld_default_ng_data
;
1906 mlxplat_hotplug
->deferred_nr
=
1907 mlxplat_msn21xx_channels
[MLXPLAT_CPLD_GRP_CHNL_NUM
- 1];
1908 mlxplat_led
= &mlxplat_default_ng_led_data
;
1909 mlxplat_regs_io
= &mlxplat_default_ng_regs_io_data
;
1910 mlxplat_fan
= &mlxplat_default_fan_data
;
1911 for (i
= 0; i
< ARRAY_SIZE(mlxplat_mlxcpld_wd_set_type2
); i
++)
1912 mlxplat_wd_data
[i
] = &mlxplat_mlxcpld_wd_set_type2
[i
];
1913 mlxplat_i2c
= &mlxplat_mlxcpld_i2c_ng_data
;
1914 mlxplat_regmap_config
= &mlxplat_mlxcpld_regmap_config_ng
;
1919 static const struct dmi_system_id mlxplat_dmi_table
[] __initconst
= {
1921 .callback
= mlxplat_dmi_default_matched
,
1923 DMI_MATCH(DMI_BOARD_NAME
, "VMOD0001"),
1927 .callback
= mlxplat_dmi_msn21xx_matched
,
1929 DMI_MATCH(DMI_BOARD_NAME
, "VMOD0002"),
1933 .callback
= mlxplat_dmi_msn274x_matched
,
1935 DMI_MATCH(DMI_BOARD_NAME
, "VMOD0003"),
1939 .callback
= mlxplat_dmi_msn201x_matched
,
1941 DMI_MATCH(DMI_BOARD_NAME
, "VMOD0004"),
1945 .callback
= mlxplat_dmi_qmb7xx_matched
,
1947 DMI_MATCH(DMI_BOARD_NAME
, "VMOD0005"),
1951 .callback
= mlxplat_dmi_qmb7xx_matched
,
1953 DMI_MATCH(DMI_BOARD_NAME
, "VMOD0007"),
1957 .callback
= mlxplat_dmi_msn274x_matched
,
1959 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
1960 DMI_MATCH(DMI_PRODUCT_NAME
, "MSN274"),
1964 .callback
= mlxplat_dmi_default_matched
,
1966 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
1967 DMI_MATCH(DMI_PRODUCT_NAME
, "MSN24"),
1971 .callback
= mlxplat_dmi_default_matched
,
1973 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
1974 DMI_MATCH(DMI_PRODUCT_NAME
, "MSN27"),
1978 .callback
= mlxplat_dmi_default_matched
,
1980 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
1981 DMI_MATCH(DMI_PRODUCT_NAME
, "MSB"),
1985 .callback
= mlxplat_dmi_default_matched
,
1987 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
1988 DMI_MATCH(DMI_PRODUCT_NAME
, "MSX"),
1992 .callback
= mlxplat_dmi_msn21xx_matched
,
1994 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
1995 DMI_MATCH(DMI_PRODUCT_NAME
, "MSN21"),
1999 .callback
= mlxplat_dmi_msn201x_matched
,
2001 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
2002 DMI_MATCH(DMI_PRODUCT_NAME
, "MSN201"),
2006 .callback
= mlxplat_dmi_qmb7xx_matched
,
2008 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
2009 DMI_MATCH(DMI_PRODUCT_NAME
, "MQM87"),
2013 .callback
= mlxplat_dmi_qmb7xx_matched
,
2015 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
2016 DMI_MATCH(DMI_PRODUCT_NAME
, "MSN37"),
2020 .callback
= mlxplat_dmi_qmb7xx_matched
,
2022 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
2023 DMI_MATCH(DMI_PRODUCT_NAME
, "MSN34"),
2027 .callback
= mlxplat_dmi_qmb7xx_matched
,
2029 DMI_MATCH(DMI_BOARD_VENDOR
, "Mellanox Technologies"),
2030 DMI_MATCH(DMI_PRODUCT_NAME
, "MSN38"),
2036 MODULE_DEVICE_TABLE(dmi
, mlxplat_dmi_table
);
2038 static int mlxplat_mlxcpld_verify_bus_topology(int *nr
)
2040 struct i2c_adapter
*search_adap
;
2043 /* Scan adapters from expected id to verify it is free. */
2044 *nr
= MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR
;
2045 for (i
= MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR
; i
<
2046 MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM
; i
++) {
2047 search_adap
= i2c_get_adapter(i
);
2049 i2c_put_adapter(search_adap
);
2053 /* Return if expected parent adapter is free. */
2054 if (i
== MLXPLAT_CPLD_PHYS_ADAPTER_DEF_NR
)
2059 /* Return with error if free id for adapter is not found. */
2060 if (i
== MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM
)
2063 /* Shift adapter ids, since expected parent adapter is not free. */
2065 for (i
= 0; i
< ARRAY_SIZE(mlxplat_mux_data
); i
++) {
2066 shift
= *nr
- mlxplat_mux_data
[i
].parent
;
2067 mlxplat_mux_data
[i
].parent
= *nr
;
2068 mlxplat_mux_data
[i
].base_nr
+= shift
;
2070 mlxplat_hotplug
->shift_nr
= shift
;
2076 static int __init
mlxplat_init(void)
2078 struct mlxplat_priv
*priv
;
2081 if (!dmi_check_system(mlxplat_dmi_table
))
2084 mlxplat_dev
= platform_device_register_simple(MLX_PLAT_DEVICE_NAME
, -1,
2085 mlxplat_lpc_resources
,
2086 ARRAY_SIZE(mlxplat_lpc_resources
));
2088 if (IS_ERR(mlxplat_dev
))
2089 return PTR_ERR(mlxplat_dev
);
2091 priv
= devm_kzalloc(&mlxplat_dev
->dev
, sizeof(struct mlxplat_priv
),
2097 platform_set_drvdata(mlxplat_dev
, priv
);
2099 mlxplat_mlxcpld_regmap_ctx
.base
= devm_ioport_map(&mlxplat_dev
->dev
,
2100 mlxplat_lpc_resources
[1].start
, 1);
2101 if (!mlxplat_mlxcpld_regmap_ctx
.base
) {
2106 if (!mlxplat_regmap_config
)
2107 mlxplat_regmap_config
= &mlxplat_mlxcpld_regmap_config
;
2109 priv
->regmap
= devm_regmap_init(&mlxplat_dev
->dev
, NULL
,
2110 &mlxplat_mlxcpld_regmap_ctx
,
2111 mlxplat_regmap_config
);
2112 if (IS_ERR(priv
->regmap
)) {
2113 err
= PTR_ERR(priv
->regmap
);
2117 err
= mlxplat_mlxcpld_verify_bus_topology(&nr
);
2121 nr
= (nr
== MLXPLAT_CPLD_MAX_PHYS_ADAPTER_NUM
) ? -1 : nr
;
2123 mlxplat_i2c
->regmap
= priv
->regmap
;
2124 priv
->pdev_i2c
= platform_device_register_resndata(
2125 &mlxplat_dev
->dev
, "i2c_mlxcpld",
2126 nr
, mlxplat_mlxcpld_resources
,
2127 ARRAY_SIZE(mlxplat_mlxcpld_resources
),
2128 mlxplat_i2c
, sizeof(*mlxplat_i2c
));
2129 if (IS_ERR(priv
->pdev_i2c
)) {
2130 err
= PTR_ERR(priv
->pdev_i2c
);
2134 for (i
= 0; i
< ARRAY_SIZE(mlxplat_mux_data
); i
++) {
2135 priv
->pdev_mux
[i
] = platform_device_register_resndata(
2136 &priv
->pdev_i2c
->dev
,
2137 "i2c-mux-reg", i
, NULL
,
2138 0, &mlxplat_mux_data
[i
],
2139 sizeof(mlxplat_mux_data
[i
]));
2140 if (IS_ERR(priv
->pdev_mux
[i
])) {
2141 err
= PTR_ERR(priv
->pdev_mux
[i
]);
2142 goto fail_platform_mux_register
;
2146 /* Add hotplug driver */
2147 mlxplat_hotplug
->regmap
= priv
->regmap
;
2148 priv
->pdev_hotplug
= platform_device_register_resndata(
2149 &mlxplat_dev
->dev
, "mlxreg-hotplug",
2150 PLATFORM_DEVID_NONE
,
2151 mlxplat_mlxcpld_resources
,
2152 ARRAY_SIZE(mlxplat_mlxcpld_resources
),
2153 mlxplat_hotplug
, sizeof(*mlxplat_hotplug
));
2154 if (IS_ERR(priv
->pdev_hotplug
)) {
2155 err
= PTR_ERR(priv
->pdev_hotplug
);
2156 goto fail_platform_mux_register
;
2159 /* Set default registers. */
2160 for (j
= 0; j
< mlxplat_regmap_config
->num_reg_defaults
; j
++) {
2161 err
= regmap_write(priv
->regmap
,
2162 mlxplat_regmap_config
->reg_defaults
[j
].reg
,
2163 mlxplat_regmap_config
->reg_defaults
[j
].def
);
2165 goto fail_platform_mux_register
;
2168 /* Add LED driver. */
2169 mlxplat_led
->regmap
= priv
->regmap
;
2170 priv
->pdev_led
= platform_device_register_resndata(
2171 &mlxplat_dev
->dev
, "leds-mlxreg",
2172 PLATFORM_DEVID_NONE
, NULL
, 0,
2173 mlxplat_led
, sizeof(*mlxplat_led
));
2174 if (IS_ERR(priv
->pdev_led
)) {
2175 err
= PTR_ERR(priv
->pdev_led
);
2176 goto fail_platform_hotplug_register
;
2179 /* Add registers io access driver. */
2180 if (mlxplat_regs_io
) {
2181 mlxplat_regs_io
->regmap
= priv
->regmap
;
2182 priv
->pdev_io_regs
= platform_device_register_resndata(
2183 &mlxplat_dev
->dev
, "mlxreg-io",
2184 PLATFORM_DEVID_NONE
, NULL
, 0,
2186 sizeof(*mlxplat_regs_io
));
2187 if (IS_ERR(priv
->pdev_io_regs
)) {
2188 err
= PTR_ERR(priv
->pdev_io_regs
);
2189 goto fail_platform_led_register
;
2193 /* Add FAN driver. */
2195 mlxplat_fan
->regmap
= priv
->regmap
;
2196 priv
->pdev_fan
= platform_device_register_resndata(
2197 &mlxplat_dev
->dev
, "mlxreg-fan",
2198 PLATFORM_DEVID_NONE
, NULL
, 0,
2200 sizeof(*mlxplat_fan
));
2201 if (IS_ERR(priv
->pdev_fan
)) {
2202 err
= PTR_ERR(priv
->pdev_fan
);
2203 goto fail_platform_io_regs_register
;
2207 /* Add WD drivers. */
2208 for (j
= 0; j
< MLXPLAT_CPLD_WD_MAX_DEVS
; j
++) {
2209 if (mlxplat_wd_data
[j
]) {
2210 mlxplat_wd_data
[j
]->regmap
= priv
->regmap
;
2211 priv
->pdev_wd
[j
] = platform_device_register_resndata(
2212 &mlxplat_dev
->dev
, "mlx-wdt",
2215 sizeof(*mlxplat_wd_data
[j
]));
2216 if (IS_ERR(priv
->pdev_wd
[j
])) {
2217 err
= PTR_ERR(priv
->pdev_wd
[j
]);
2218 goto fail_platform_wd_register
;
2223 /* Sync registers with hardware. */
2224 regcache_mark_dirty(priv
->regmap
);
2225 err
= regcache_sync(priv
->regmap
);
2227 goto fail_platform_wd_register
;
2231 fail_platform_wd_register
:
2233 platform_device_unregister(priv
->pdev_wd
[j
]);
2235 platform_device_unregister(priv
->pdev_fan
);
2236 fail_platform_io_regs_register
:
2237 if (mlxplat_regs_io
)
2238 platform_device_unregister(priv
->pdev_io_regs
);
2239 fail_platform_led_register
:
2240 platform_device_unregister(priv
->pdev_led
);
2241 fail_platform_hotplug_register
:
2242 platform_device_unregister(priv
->pdev_hotplug
);
2243 fail_platform_mux_register
:
2245 platform_device_unregister(priv
->pdev_mux
[i
]);
2246 platform_device_unregister(priv
->pdev_i2c
);
2248 platform_device_unregister(mlxplat_dev
);
2252 module_init(mlxplat_init
);
2254 static void __exit
mlxplat_exit(void)
2256 struct mlxplat_priv
*priv
= platform_get_drvdata(mlxplat_dev
);
2259 for (i
= MLXPLAT_CPLD_WD_MAX_DEVS
- 1; i
>= 0 ; i
--)
2260 platform_device_unregister(priv
->pdev_wd
[i
]);
2262 platform_device_unregister(priv
->pdev_fan
);
2263 if (priv
->pdev_io_regs
)
2264 platform_device_unregister(priv
->pdev_io_regs
);
2265 platform_device_unregister(priv
->pdev_led
);
2266 platform_device_unregister(priv
->pdev_hotplug
);
2268 for (i
= ARRAY_SIZE(mlxplat_mux_data
) - 1; i
>= 0 ; i
--)
2269 platform_device_unregister(priv
->pdev_mux
[i
]);
2271 platform_device_unregister(priv
->pdev_i2c
);
2272 platform_device_unregister(mlxplat_dev
);
2274 module_exit(mlxplat_exit
);
2276 MODULE_AUTHOR("Vadim Pasternak (vadimp@mellanox.com)");
2277 MODULE_DESCRIPTION("Mellanox platform driver");
2278 MODULE_LICENSE("Dual BSD/GPL");