GNU Linux-libre 6.7.9-gnu
[releases.git] / drivers / platform / mellanox / mlxreg-lc.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Nvidia line card driver
4  *
5  * Copyright (C) 2020 Nvidia Technologies Ltd.
6  */
7
8 #include <linux/device.h>
9 #include <linux/i2c.h>
10 #include <linux/module.h>
11 #include <linux/platform_data/mlxcpld.h>
12 #include <linux/platform_data/mlxreg.h>
13 #include <linux/platform_device.h>
14 #include <linux/regmap.h>
15
16 /* I2C bus IO offsets */
17 #define MLXREG_LC_REG_CPLD1_VER_OFFSET          0x2500
18 #define MLXREG_LC_REG_FPGA1_VER_OFFSET          0x2501
19 #define MLXREG_LC_REG_CPLD1_PN_OFFSET           0x2504
20 #define MLXREG_LC_REG_FPGA1_PN_OFFSET           0x2506
21 #define MLXREG_LC_REG_RESET_CAUSE_OFFSET        0x251d
22 #define MLXREG_LC_REG_LED1_OFFSET               0x2520
23 #define MLXREG_LC_REG_GP0_OFFSET                0x252e
24 #define MLXREG_LC_REG_FIELD_UPGRADE             0x2534
25 #define MLXREG_LC_CHANNEL_I2C_REG               0x25dc
26 #define MLXREG_LC_REG_CPLD1_MVER_OFFSET         0x25de
27 #define MLXREG_LC_REG_FPGA1_MVER_OFFSET         0x25df
28 #define MLXREG_LC_REG_MAX_POWER_OFFSET          0x25f1
29 #define MLXREG_LC_REG_CONFIG_OFFSET             0x25fb
30 #define MLXREG_LC_REG_MAX                       0x3fff
31
32 /**
33  * enum mlxreg_lc_type - line cards types
34  *
35  * @MLXREG_LC_SN4800_C16: 100GbE line card with 16 QSFP28 ports;
36  */
37 enum mlxreg_lc_type {
38         MLXREG_LC_SN4800_C16 = 0x0000,
39 };
40
41 /**
42  * enum mlxreg_lc_state - line cards state
43  *
44  * @MLXREG_LC_INITIALIZED: line card is initialized;
45  * @MLXREG_LC_POWERED: line card is powered;
46  * @MLXREG_LC_SYNCED: line card is synchronized between hardware and firmware;
47  */
48 enum mlxreg_lc_state {
49         MLXREG_LC_INITIALIZED = BIT(0),
50         MLXREG_LC_POWERED = BIT(1),
51         MLXREG_LC_SYNCED = BIT(2),
52 };
53
54 #define MLXREG_LC_CONFIGURED    (MLXREG_LC_INITIALIZED | MLXREG_LC_POWERED | MLXREG_LC_SYNCED)
55
56 /* mlxreg_lc - device private data
57  * @dev: platform device;
58  * @lock: line card lock;
59  * @par_regmap: parent device regmap handle;
60  * @data: pltaform core data;
61  * @io_data: register access platform data;
62  * @led_data: LED platform data ;
63  * @mux_data: MUX platform data;
64  * @led: LED device;
65  * @io_regs: register access device;
66  * @mux_brdinfo: mux configuration;
67  * @mux: mux devices;
68  * @aux_devs: I2C devices feeding by auxiliary power;
69  * @aux_devs_num: number of I2C devices feeding by auxiliary power;
70  * @main_devs: I2C devices feeding by main power;
71  * @main_devs_num: number of I2C devices feeding by main power;
72  * @state: line card state;
73  */
74 struct mlxreg_lc {
75         struct device *dev;
76         struct mutex lock; /* line card access lock */
77         void *par_regmap;
78         struct mlxreg_core_data *data;
79         struct mlxreg_core_platform_data *io_data;
80         struct mlxreg_core_platform_data *led_data;
81         struct mlxcpld_mux_plat_data *mux_data;
82         struct platform_device *led;
83         struct platform_device *io_regs;
84         struct i2c_board_info *mux_brdinfo;
85         struct platform_device *mux;
86         struct mlxreg_hotplug_device *aux_devs;
87         int aux_devs_num;
88         struct mlxreg_hotplug_device *main_devs;
89         int main_devs_num;
90         enum mlxreg_lc_state state;
91 };
92
93 static bool mlxreg_lc_writeable_reg(struct device *dev, unsigned int reg)
94 {
95         switch (reg) {
96         case MLXREG_LC_REG_LED1_OFFSET:
97         case MLXREG_LC_REG_GP0_OFFSET:
98         case MLXREG_LC_REG_FIELD_UPGRADE:
99         case MLXREG_LC_CHANNEL_I2C_REG:
100                 return true;
101         }
102         return false;
103 }
104
105 static bool mlxreg_lc_readable_reg(struct device *dev, unsigned int reg)
106 {
107         switch (reg) {
108         case MLXREG_LC_REG_CPLD1_VER_OFFSET:
109         case MLXREG_LC_REG_FPGA1_VER_OFFSET:
110         case MLXREG_LC_REG_CPLD1_PN_OFFSET:
111         case MLXREG_LC_REG_FPGA1_PN_OFFSET:
112         case MLXREG_LC_REG_RESET_CAUSE_OFFSET:
113         case MLXREG_LC_REG_LED1_OFFSET:
114         case MLXREG_LC_REG_GP0_OFFSET:
115         case MLXREG_LC_REG_FIELD_UPGRADE:
116         case MLXREG_LC_CHANNEL_I2C_REG:
117         case MLXREG_LC_REG_CPLD1_MVER_OFFSET:
118         case MLXREG_LC_REG_FPGA1_MVER_OFFSET:
119         case MLXREG_LC_REG_MAX_POWER_OFFSET:
120         case MLXREG_LC_REG_CONFIG_OFFSET:
121                 return true;
122         }
123         return false;
124 }
125
126 static bool mlxreg_lc_volatile_reg(struct device *dev, unsigned int reg)
127 {
128         switch (reg) {
129         case MLXREG_LC_REG_CPLD1_VER_OFFSET:
130         case MLXREG_LC_REG_FPGA1_VER_OFFSET:
131         case MLXREG_LC_REG_CPLD1_PN_OFFSET:
132         case MLXREG_LC_REG_FPGA1_PN_OFFSET:
133         case MLXREG_LC_REG_RESET_CAUSE_OFFSET:
134         case MLXREG_LC_REG_LED1_OFFSET:
135         case MLXREG_LC_REG_GP0_OFFSET:
136         case MLXREG_LC_REG_FIELD_UPGRADE:
137         case MLXREG_LC_CHANNEL_I2C_REG:
138         case MLXREG_LC_REG_CPLD1_MVER_OFFSET:
139         case MLXREG_LC_REG_FPGA1_MVER_OFFSET:
140         case MLXREG_LC_REG_MAX_POWER_OFFSET:
141         case MLXREG_LC_REG_CONFIG_OFFSET:
142                 return true;
143         }
144         return false;
145 }
146
147 static const struct reg_default mlxreg_lc_regmap_default[] = {
148         { MLXREG_LC_CHANNEL_I2C_REG, 0x00 },
149 };
150
151 /* Configuration for the register map of a device with 2 bytes address space. */
152 static const struct regmap_config mlxreg_lc_regmap_conf = {
153         .reg_bits = 16,
154         .val_bits = 8,
155         .max_register = MLXREG_LC_REG_MAX,
156         .cache_type = REGCACHE_FLAT,
157         .writeable_reg = mlxreg_lc_writeable_reg,
158         .readable_reg = mlxreg_lc_readable_reg,
159         .volatile_reg = mlxreg_lc_volatile_reg,
160         .reg_defaults = mlxreg_lc_regmap_default,
161         .num_reg_defaults = ARRAY_SIZE(mlxreg_lc_regmap_default),
162 };
163
164 /* Default channels vector.
165  * It contains only the channels, which physically connected to the devices,
166  * empty channels are skipped.
167  */
168 static int mlxreg_lc_chan[] = {
169         0x04, 0x05, 0x06, 0x07, 0x08, 0x10, 0x20, 0x21, 0x22, 0x23, 0x40, 0x41,
170         0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d,
171         0x4e, 0x4f
172 };
173
174 /* Defaul mux configuration. */
175 static struct mlxcpld_mux_plat_data mlxreg_lc_mux_data[] = {
176         {
177                 .chan_ids = mlxreg_lc_chan,
178                 .num_adaps = ARRAY_SIZE(mlxreg_lc_chan),
179                 .sel_reg_addr = MLXREG_LC_CHANNEL_I2C_REG,
180                 .reg_size = 2,
181         },
182 };
183
184 /* Defaul mux board info. */
185 static struct i2c_board_info mlxreg_lc_mux_brdinfo = {
186         I2C_BOARD_INFO("i2c-mux-mlxcpld", 0x32),
187 };
188
189 /* Line card default auxiliary power static devices. */
190 static struct i2c_board_info mlxreg_lc_aux_pwr_devices[] = {
191         {
192                 I2C_BOARD_INFO("24c32", 0x51),
193         },
194         {
195                 I2C_BOARD_INFO("24c32", 0x51),
196         },
197 };
198
199 /* Line card default auxiliary power board info. */
200 static struct mlxreg_hotplug_device mlxreg_lc_aux_pwr_brdinfo[] = {
201         {
202                 .brdinfo = &mlxreg_lc_aux_pwr_devices[0],
203                 .nr = 3,
204         },
205         {
206                 .brdinfo = &mlxreg_lc_aux_pwr_devices[1],
207                 .nr = 4,
208         },
209 };
210
211 /* Line card default main power static devices. */
212 static struct i2c_board_info mlxreg_lc_main_pwr_devices[] = {
213         {
214                 I2C_BOARD_INFO("mp2975", 0x62),
215         },
216         {
217                 I2C_BOARD_INFO("mp2975", 0x64),
218         },
219         {
220                 I2C_BOARD_INFO("max11603", 0x6d),
221         },
222         {
223                 I2C_BOARD_INFO("lm25066", 0x15),
224         },
225 };
226
227 /* Line card default main power board info. */
228 static struct mlxreg_hotplug_device mlxreg_lc_main_pwr_brdinfo[] = {
229         {
230                 .brdinfo = &mlxreg_lc_main_pwr_devices[0],
231                 .nr = 0,
232         },
233         {
234                 .brdinfo = &mlxreg_lc_main_pwr_devices[1],
235                 .nr = 0,
236         },
237         {
238                 .brdinfo = &mlxreg_lc_main_pwr_devices[2],
239                 .nr = 1,
240         },
241         {
242                 .brdinfo = &mlxreg_lc_main_pwr_devices[3],
243                 .nr = 2,
244         },
245 };
246
247 /* LED default data. */
248 static struct mlxreg_core_data mlxreg_lc_led_data[] = {
249         {
250                 .label = "status:green",
251                 .reg = MLXREG_LC_REG_LED1_OFFSET,
252                 .mask = GENMASK(7, 4),
253         },
254         {
255                 .label = "status:orange",
256                 .reg = MLXREG_LC_REG_LED1_OFFSET,
257                 .mask = GENMASK(7, 4),
258         },
259 };
260
261 static struct mlxreg_core_platform_data mlxreg_lc_led = {
262         .identity = "pci",
263         .data = mlxreg_lc_led_data,
264         .counter = ARRAY_SIZE(mlxreg_lc_led_data),
265 };
266
267 /* Default register access data. */
268 static struct mlxreg_core_data mlxreg_lc_io_data[] = {
269         {
270                 .label = "cpld1_version",
271                 .reg = MLXREG_LC_REG_CPLD1_VER_OFFSET,
272                 .bit = GENMASK(7, 0),
273                 .mode = 0444,
274         },
275         {
276                 .label = "fpga1_version",
277                 .reg = MLXREG_LC_REG_FPGA1_VER_OFFSET,
278                 .bit = GENMASK(7, 0),
279                 .mode = 0444,
280         },
281         {
282                 .label = "cpld1_pn",
283                 .reg = MLXREG_LC_REG_CPLD1_PN_OFFSET,
284                 .bit = GENMASK(15, 0),
285                 .mode = 0444,
286                 .regnum = 2,
287         },
288         {
289                 .label = "fpga1_pn",
290                 .reg = MLXREG_LC_REG_FPGA1_PN_OFFSET,
291                 .bit = GENMASK(15, 0),
292                 .mode = 0444,
293                 .regnum = 2,
294         },
295         {
296                 .label = "cpld1_version_min",
297                 .reg = MLXREG_LC_REG_CPLD1_MVER_OFFSET,
298                 .bit = GENMASK(7, 0),
299                 .mode = 0444,
300         },
301         {
302                 .label = "fpga1_version_min",
303                 .reg = MLXREG_LC_REG_FPGA1_MVER_OFFSET,
304                 .bit = GENMASK(7, 0),
305                 .mode = 0444,
306         },
307         {
308                 .label = "reset_fpga_not_done",
309                 .reg = MLXREG_LC_REG_RESET_CAUSE_OFFSET,
310                 .mask = GENMASK(7, 0) & ~BIT(1),
311                 .mode = 0444,
312         },
313         {
314                 .label = "reset_aux_pwr_or_ref",
315                 .reg = MLXREG_LC_REG_RESET_CAUSE_OFFSET,
316                 .mask = GENMASK(7, 0) & ~BIT(2),
317                 .mode = 0444,
318         },
319         {
320                 .label = "reset_dc_dc_pwr_fail",
321                 .reg = MLXREG_LC_REG_RESET_CAUSE_OFFSET,
322                 .mask = GENMASK(7, 0) & ~BIT(3),
323                 .mode = 0444,
324         },
325         {
326                 .label = "reset_from_chassis",
327                 .reg = MLXREG_LC_REG_RESET_CAUSE_OFFSET,
328                 .mask = GENMASK(7, 0) & ~BIT(4),
329                 .mode = 0444,
330         },
331         {
332                 .label = "reset_pwr_off_from_chassis",
333                 .reg = MLXREG_LC_REG_RESET_CAUSE_OFFSET,
334                 .mask = GENMASK(7, 0) & ~BIT(5),
335                 .mode = 0444,
336         },
337         {
338                 .label = "reset_line_card",
339                 .reg = MLXREG_LC_REG_RESET_CAUSE_OFFSET,
340                 .mask = GENMASK(7, 0) & ~BIT(6),
341                 .mode = 0444,
342         },
343         {
344                 .label = "reset_line_card_pwr_en",
345                 .reg = MLXREG_LC_REG_RESET_CAUSE_OFFSET,
346                 .mask = GENMASK(7, 0) & ~BIT(7),
347                 .mode = 0444,
348         },
349         {
350                 .label = "cpld_upgrade_en",
351                 .reg = MLXREG_LC_REG_FIELD_UPGRADE,
352                 .mask = GENMASK(7, 0) & ~BIT(0),
353                 .mode = 0644,
354                 .secured = 1,
355         },
356         {
357                 .label = "fpga_upgrade_en",
358                 .reg = MLXREG_LC_REG_FIELD_UPGRADE,
359                 .mask = GENMASK(7, 0) & ~BIT(1),
360                 .mode = 0644,
361                 .secured = 1,
362         },
363         {
364                 .label = "qsfp_pwr_en",
365                 .reg = MLXREG_LC_REG_GP0_OFFSET,
366                 .mask = GENMASK(7, 0) & ~BIT(0),
367                 .mode = 0644,
368         },
369         {
370                 .label = "vpd_wp",
371                 .reg = MLXREG_LC_REG_GP0_OFFSET,
372                 .mask = GENMASK(7, 0) & ~BIT(3),
373                 .mode = 0644,
374                 .secured = 1,
375         },
376         {
377                 .label = "agb_spi_burn_en",
378                 .reg = MLXREG_LC_REG_GP0_OFFSET,
379                 .mask = GENMASK(7, 0) & ~BIT(5),
380                 .mode = 0644,
381                 .secured = 1,
382         },
383         {
384                 .label = "fpga_spi_burn_en",
385                 .reg = MLXREG_LC_REG_GP0_OFFSET,
386                 .mask = GENMASK(7, 0) & ~BIT(6),
387                 .mode = 0644,
388                 .secured = 1,
389         },
390         {
391                 .label = "max_power",
392                 .reg = MLXREG_LC_REG_MAX_POWER_OFFSET,
393                 .bit = GENMASK(15, 0),
394                 .mode = 0444,
395                 .regnum = 2,
396         },
397         {
398                 .label = "config",
399                 .reg = MLXREG_LC_REG_CONFIG_OFFSET,
400                 .bit = GENMASK(15, 0),
401                 .mode = 0444,
402                 .regnum = 2,
403         },
404 };
405
406 static struct mlxreg_core_platform_data mlxreg_lc_regs_io = {
407         .data = mlxreg_lc_io_data,
408         .counter = ARRAY_SIZE(mlxreg_lc_io_data),
409 };
410
411 static int
412 mlxreg_lc_create_static_devices(struct mlxreg_lc *mlxreg_lc, struct mlxreg_hotplug_device *devs,
413                                 int size)
414 {
415         struct mlxreg_hotplug_device *dev = devs;
416         int i, ret;
417
418         /* Create static I2C device feeding by auxiliary or main power. */
419         for (i = 0; i < size; i++, dev++) {
420                 dev->client = i2c_new_client_device(dev->adapter, dev->brdinfo);
421                 if (IS_ERR(dev->client)) {
422                         dev_err(mlxreg_lc->dev, "Failed to create client %s at bus %d at addr 0x%02x\n",
423                                 dev->brdinfo->type, dev->nr, dev->brdinfo->addr);
424
425                         dev->adapter = NULL;
426                         ret = PTR_ERR(dev->client);
427                         goto fail_create_static_devices;
428                 }
429         }
430
431         return 0;
432
433 fail_create_static_devices:
434         while (--i >= 0) {
435                 dev = devs + i;
436                 i2c_unregister_device(dev->client);
437                 dev->client = NULL;
438         }
439         return ret;
440 }
441
442 static void
443 mlxreg_lc_destroy_static_devices(struct mlxreg_lc *mlxreg_lc, struct mlxreg_hotplug_device *devs,
444                                  int size)
445 {
446         struct mlxreg_hotplug_device *dev = devs;
447         int i;
448
449         /* Destroy static I2C device feeding by auxiliary or main power. */
450         for (i = 0; i < size; i++, dev++) {
451                 if (dev->client) {
452                         i2c_unregister_device(dev->client);
453                         dev->client = NULL;
454                 }
455         }
456 }
457
458 static int mlxreg_lc_power_on_off(struct mlxreg_lc *mlxreg_lc, u8 action)
459 {
460         u32 regval;
461         int err;
462
463         err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_pwr, &regval);
464         if (err)
465                 goto regmap_read_fail;
466
467         if (action)
468                 regval |= BIT(mlxreg_lc->data->slot - 1);
469         else
470                 regval &= ~BIT(mlxreg_lc->data->slot - 1);
471
472         err = regmap_write(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_pwr, regval);
473
474 regmap_read_fail:
475         return err;
476 }
477
478 static int mlxreg_lc_enable_disable(struct mlxreg_lc *mlxreg_lc, bool action)
479 {
480         u32 regval;
481         int err;
482
483         /*
484          * Hardware holds the line card after powering on in the disabled state. Holding line card
485          * in disabled state protects access to the line components, like FPGA and gearboxes.
486          * Line card should be enabled in order to get it in operational state. Line card could be
487          * disabled for moving it to non-operational state. Enabling line card does not affect the
488          * line card which is already has been enabled. Disabling does not affect the disabled line
489          * card.
490          */
491         err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_ena, &regval);
492         if (err)
493                 goto regmap_read_fail;
494
495         if (action)
496                 regval |= BIT(mlxreg_lc->data->slot - 1);
497         else
498                 regval &= ~BIT(mlxreg_lc->data->slot - 1);
499
500         err = regmap_write(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_ena, regval);
501
502 regmap_read_fail:
503         return err;
504 }
505
506 static int
507 mlxreg_lc_sn4800_c16_config_init(struct mlxreg_lc *mlxreg_lc, void *regmap,
508                                  struct mlxreg_core_data *data)
509 {
510         struct device *dev = &data->hpdev.client->dev;
511
512         /* Set line card configuration according to the type. */
513         mlxreg_lc->mux_data = mlxreg_lc_mux_data;
514         mlxreg_lc->io_data = &mlxreg_lc_regs_io;
515         mlxreg_lc->led_data = &mlxreg_lc_led;
516         mlxreg_lc->mux_brdinfo = &mlxreg_lc_mux_brdinfo;
517
518         mlxreg_lc->aux_devs = devm_kmemdup(dev, mlxreg_lc_aux_pwr_brdinfo,
519                                            sizeof(mlxreg_lc_aux_pwr_brdinfo), GFP_KERNEL);
520         if (!mlxreg_lc->aux_devs)
521                 return -ENOMEM;
522         mlxreg_lc->aux_devs_num = ARRAY_SIZE(mlxreg_lc_aux_pwr_brdinfo);
523         mlxreg_lc->main_devs = devm_kmemdup(dev, mlxreg_lc_main_pwr_brdinfo,
524                                             sizeof(mlxreg_lc_main_pwr_brdinfo), GFP_KERNEL);
525         if (!mlxreg_lc->main_devs)
526                 return -ENOMEM;
527         mlxreg_lc->main_devs_num = ARRAY_SIZE(mlxreg_lc_main_pwr_brdinfo);
528
529         return 0;
530 }
531
532 static void
533 mlxreg_lc_state_update(struct mlxreg_lc *mlxreg_lc, enum mlxreg_lc_state state, u8 action)
534 {
535         if (action)
536                 mlxreg_lc->state |= state;
537         else
538                 mlxreg_lc->state &= ~state;
539 }
540
541 static void
542 mlxreg_lc_state_update_locked(struct mlxreg_lc *mlxreg_lc, enum mlxreg_lc_state state, u8 action)
543 {
544         mutex_lock(&mlxreg_lc->lock);
545
546         if (action)
547                 mlxreg_lc->state |= state;
548         else
549                 mlxreg_lc->state &= ~state;
550
551         mutex_unlock(&mlxreg_lc->lock);
552 }
553
554 /*
555  * Callback is to be called from mlxreg-hotplug driver to notify about line card about received
556  * event.
557  */
558 static int mlxreg_lc_event_handler(void *handle, enum mlxreg_hotplug_kind kind, u8 action)
559 {
560         struct mlxreg_lc *mlxreg_lc = handle;
561         int err = 0;
562
563         dev_info(mlxreg_lc->dev, "linecard#%d state %d event kind %d action %d\n",
564                  mlxreg_lc->data->slot, mlxreg_lc->state, kind, action);
565
566         mutex_lock(&mlxreg_lc->lock);
567         if (!(mlxreg_lc->state & MLXREG_LC_INITIALIZED))
568                 goto mlxreg_lc_non_initialzed_exit;
569
570         switch (kind) {
571         case MLXREG_HOTPLUG_LC_SYNCED:
572                 /*
573                  * Synchronization event - hardware and firmware are synchronized. Power on/off
574                  * line card - to allow/disallow main power source.
575                  */
576                 mlxreg_lc_state_update(mlxreg_lc, MLXREG_LC_SYNCED, action);
577                 /* Power line card if it is not powered yet. */
578                 if (!(mlxreg_lc->state & MLXREG_LC_POWERED) && action) {
579                         err = mlxreg_lc_power_on_off(mlxreg_lc, 1);
580                         if (err)
581                                 goto mlxreg_lc_power_on_off_fail;
582                 }
583                 /* In case line card is configured - enable it. */
584                 if (mlxreg_lc->state & MLXREG_LC_CONFIGURED && action)
585                         err = mlxreg_lc_enable_disable(mlxreg_lc, 1);
586                 break;
587         case MLXREG_HOTPLUG_LC_POWERED:
588                 /* Power event - attach or de-attach line card device feeding by the main power. */
589                 if (action) {
590                         /* Do not create devices, if line card is already powered. */
591                         if (mlxreg_lc->state & MLXREG_LC_POWERED) {
592                                 /* In case line card is configured - enable it. */
593                                 if (mlxreg_lc->state & MLXREG_LC_CONFIGURED)
594                                         err = mlxreg_lc_enable_disable(mlxreg_lc, 1);
595
596                                 goto mlxreg_lc_enable_disable_exit;
597                         }
598                         err = mlxreg_lc_create_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
599                                                               mlxreg_lc->main_devs_num);
600                         if (err)
601                                 goto mlxreg_lc_create_static_devices_fail;
602
603                         /* In case line card is already in ready state - enable it. */
604                         if (mlxreg_lc->state & MLXREG_LC_CONFIGURED)
605                                 err = mlxreg_lc_enable_disable(mlxreg_lc, 1);
606                 } else {
607                         mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
608                                                          mlxreg_lc->main_devs_num);
609                 }
610                 mlxreg_lc_state_update(mlxreg_lc, MLXREG_LC_POWERED, action);
611                 break;
612         case MLXREG_HOTPLUG_LC_READY:
613                 /*
614                  * Ready event â€“ enable line card by releasing it from reset or disable it by put
615                  * to reset state.
616                  */
617                 err = mlxreg_lc_enable_disable(mlxreg_lc, !!action);
618                 break;
619         case MLXREG_HOTPLUG_LC_THERMAL:
620                 /* Thermal shutdown event â€“ power off line card. */
621                 if (action)
622                         err = mlxreg_lc_power_on_off(mlxreg_lc, 0);
623                 break;
624         default:
625                 break;
626         }
627
628 mlxreg_lc_enable_disable_exit:
629 mlxreg_lc_power_on_off_fail:
630 mlxreg_lc_create_static_devices_fail:
631 mlxreg_lc_non_initialzed_exit:
632         mutex_unlock(&mlxreg_lc->lock);
633
634         return err;
635 }
636
637 /*
638  * Callback is to be called from i2c-mux-mlxcpld driver to indicate that all adapter devices has
639  * been created.
640  */
641 static int mlxreg_lc_completion_notify(void *handle, struct i2c_adapter *parent,
642                                        struct i2c_adapter *adapters[])
643 {
644         struct mlxreg_hotplug_device *main_dev, *aux_dev;
645         struct mlxreg_lc *mlxreg_lc = handle;
646         u32 regval;
647         int i, err;
648
649         /* Update I2C devices feeding by auxiliary power. */
650         aux_dev = mlxreg_lc->aux_devs;
651         for (i = 0; i < mlxreg_lc->aux_devs_num; i++, aux_dev++) {
652                 aux_dev->adapter = adapters[aux_dev->nr];
653                 aux_dev->nr = adapters[aux_dev->nr]->nr;
654         }
655
656         err = mlxreg_lc_create_static_devices(mlxreg_lc, mlxreg_lc->aux_devs,
657                                               mlxreg_lc->aux_devs_num);
658         if (err)
659                 return err;
660
661         /* Update I2C devices feeding by main power. */
662         main_dev = mlxreg_lc->main_devs;
663         for (i = 0; i < mlxreg_lc->main_devs_num; i++, main_dev++) {
664                 main_dev->adapter = adapters[main_dev->nr];
665                 main_dev->nr = adapters[main_dev->nr]->nr;
666         }
667
668         /* Verify if line card is powered. */
669         err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_pwr, &regval);
670         if (err)
671                 goto mlxreg_lc_regmap_read_power_fail;
672
673         if (regval & mlxreg_lc->data->mask) {
674                 err = mlxreg_lc_create_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
675                                                       mlxreg_lc->main_devs_num);
676                 if (err)
677                         goto mlxreg_lc_create_static_devices_failed;
678
679                 mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_POWERED, 1);
680         }
681
682         /* Verify if line card is synchronized. */
683         err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_sync, &regval);
684         if (err)
685                 goto mlxreg_lc_regmap_read_sync_fail;
686
687         /* Power on line card if necessary. */
688         if (regval & mlxreg_lc->data->mask) {
689                 mlxreg_lc->state |= MLXREG_LC_SYNCED;
690                 mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_SYNCED, 1);
691                 if (mlxreg_lc->state & ~MLXREG_LC_POWERED) {
692                         err = mlxreg_lc_power_on_off(mlxreg_lc, 1);
693                         if (err)
694                                 goto mlxreg_lc_regmap_power_on_off_fail;
695                 }
696         }
697
698         mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_INITIALIZED, 1);
699
700         return 0;
701
702 mlxreg_lc_regmap_power_on_off_fail:
703 mlxreg_lc_regmap_read_sync_fail:
704         if (mlxreg_lc->state & MLXREG_LC_POWERED)
705                 mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
706                                                  mlxreg_lc->main_devs_num);
707 mlxreg_lc_create_static_devices_failed:
708         mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->aux_devs, mlxreg_lc->aux_devs_num);
709 mlxreg_lc_regmap_read_power_fail:
710         return err;
711 }
712
713 static int
714 mlxreg_lc_config_init(struct mlxreg_lc *mlxreg_lc, void *regmap,
715                       struct mlxreg_core_data *data)
716 {
717         struct device *dev = &data->hpdev.client->dev;
718         int lsb, err;
719         u32 regval;
720
721         /* Validate line card type. */
722         err = regmap_read(regmap, MLXREG_LC_REG_CONFIG_OFFSET, &lsb);
723         err = (!err) ? regmap_read(regmap, MLXREG_LC_REG_CONFIG_OFFSET, &regval) : err;
724         if (err)
725                 return err;
726         regval = (regval & GENMASK(7, 0)) << 8 | (lsb & GENMASK(7, 0));
727         switch (regval) {
728         case MLXREG_LC_SN4800_C16:
729                 err = mlxreg_lc_sn4800_c16_config_init(mlxreg_lc, regmap, data);
730                 if (err) {
731                         dev_err(dev, "Failed to config client %s at bus %d at addr 0x%02x\n",
732                                 data->hpdev.brdinfo->type, data->hpdev.nr,
733                                 data->hpdev.brdinfo->addr);
734                         return err;
735                 }
736                 break;
737         default:
738                 return -ENODEV;
739         }
740
741         /* Create mux infrastructure. */
742         mlxreg_lc->mux_data->handle = mlxreg_lc;
743         mlxreg_lc->mux_data->completion_notify = mlxreg_lc_completion_notify;
744         mlxreg_lc->mux_brdinfo->platform_data = mlxreg_lc->mux_data;
745         mlxreg_lc->mux = platform_device_register_resndata(dev, "i2c-mux-mlxcpld", data->hpdev.nr,
746                                                            NULL, 0, mlxreg_lc->mux_data,
747                                                            sizeof(*mlxreg_lc->mux_data));
748         if (IS_ERR(mlxreg_lc->mux)) {
749                 dev_err(dev, "Failed to create mux infra for client %s at bus %d at addr 0x%02x\n",
750                         data->hpdev.brdinfo->type, data->hpdev.nr, data->hpdev.brdinfo->addr);
751                 return PTR_ERR(mlxreg_lc->mux);
752         }
753
754         /* Register IO access driver. */
755         if (mlxreg_lc->io_data) {
756                 mlxreg_lc->io_data->regmap = regmap;
757                 mlxreg_lc->io_regs =
758                 platform_device_register_resndata(dev, "mlxreg-io", data->hpdev.nr, NULL, 0,
759                                                   mlxreg_lc->io_data, sizeof(*mlxreg_lc->io_data));
760                 if (IS_ERR(mlxreg_lc->io_regs)) {
761                         dev_err(dev, "Failed to create regio for client %s at bus %d at addr 0x%02x\n",
762                                 data->hpdev.brdinfo->type, data->hpdev.nr,
763                                 data->hpdev.brdinfo->addr);
764                         err = PTR_ERR(mlxreg_lc->io_regs);
765                         goto fail_register_io;
766                 }
767         }
768
769         /* Register LED driver. */
770         if (mlxreg_lc->led_data) {
771                 mlxreg_lc->led_data->regmap = regmap;
772                 mlxreg_lc->led =
773                 platform_device_register_resndata(dev, "leds-mlxreg", data->hpdev.nr, NULL, 0,
774                                                   mlxreg_lc->led_data,
775                                                   sizeof(*mlxreg_lc->led_data));
776                 if (IS_ERR(mlxreg_lc->led)) {
777                         dev_err(dev, "Failed to create LED objects for client %s at bus %d at addr 0x%02x\n",
778                                 data->hpdev.brdinfo->type, data->hpdev.nr,
779                                 data->hpdev.brdinfo->addr);
780                         err = PTR_ERR(mlxreg_lc->led);
781                         goto fail_register_led;
782                 }
783         }
784
785         return 0;
786
787 fail_register_led:
788         if (mlxreg_lc->io_regs)
789                 platform_device_unregister(mlxreg_lc->io_regs);
790 fail_register_io:
791         if (mlxreg_lc->mux)
792                 platform_device_unregister(mlxreg_lc->mux);
793
794         return err;
795 }
796
797 static void mlxreg_lc_config_exit(struct mlxreg_lc *mlxreg_lc)
798 {
799         /* Unregister LED driver. */
800         if (mlxreg_lc->led)
801                 platform_device_unregister(mlxreg_lc->led);
802         /* Unregister IO access driver. */
803         if (mlxreg_lc->io_regs)
804                 platform_device_unregister(mlxreg_lc->io_regs);
805         /* Remove mux infrastructure. */
806         if (mlxreg_lc->mux)
807                 platform_device_unregister(mlxreg_lc->mux);
808 }
809
810 static int mlxreg_lc_probe(struct platform_device *pdev)
811 {
812         struct mlxreg_core_hotplug_platform_data *par_pdata;
813         struct mlxreg_core_data *data;
814         struct mlxreg_lc *mlxreg_lc;
815         void *regmap;
816         int i, err;
817
818         data = dev_get_platdata(&pdev->dev);
819         if (!data)
820                 return -EINVAL;
821
822         mlxreg_lc = devm_kzalloc(&pdev->dev, sizeof(*mlxreg_lc), GFP_KERNEL);
823         if (!mlxreg_lc)
824                 return -ENOMEM;
825
826         mutex_init(&mlxreg_lc->lock);
827         /* Set event notification callback. */
828         data->notifier->user_handler = mlxreg_lc_event_handler;
829         data->notifier->handle = mlxreg_lc;
830
831         data->hpdev.adapter = i2c_get_adapter(data->hpdev.nr);
832         if (!data->hpdev.adapter) {
833                 dev_err(&pdev->dev, "Failed to get adapter for bus %d\n",
834                         data->hpdev.nr);
835                 err = -EFAULT;
836                 goto i2c_get_adapter_fail;
837         }
838
839         /* Create device at the top of line card I2C tree.*/
840         data->hpdev.client = i2c_new_client_device(data->hpdev.adapter,
841                                                    data->hpdev.brdinfo);
842         if (IS_ERR(data->hpdev.client)) {
843                 dev_err(&pdev->dev, "Failed to create client %s at bus %d at addr 0x%02x\n",
844                         data->hpdev.brdinfo->type, data->hpdev.nr, data->hpdev.brdinfo->addr);
845                 err = PTR_ERR(data->hpdev.client);
846                 goto i2c_new_device_fail;
847         }
848
849         regmap = devm_regmap_init_i2c(data->hpdev.client,
850                                       &mlxreg_lc_regmap_conf);
851         if (IS_ERR(regmap)) {
852                 dev_err(&pdev->dev, "Failed to create regmap for client %s at bus %d at addr 0x%02x\n",
853                         data->hpdev.brdinfo->type, data->hpdev.nr, data->hpdev.brdinfo->addr);
854                 err = PTR_ERR(regmap);
855                 goto devm_regmap_init_i2c_fail;
856         }
857
858         /* Set default registers. */
859         for (i = 0; i < mlxreg_lc_regmap_conf.num_reg_defaults; i++) {
860                 err = regmap_write(regmap, mlxreg_lc_regmap_default[i].reg,
861                                    mlxreg_lc_regmap_default[i].def);
862                 if (err) {
863                         dev_err(&pdev->dev, "Failed to set default regmap %d for client %s at bus %d at addr 0x%02x\n",
864                                 i, data->hpdev.brdinfo->type, data->hpdev.nr,
865                                 data->hpdev.brdinfo->addr);
866                         goto regmap_write_fail;
867                 }
868         }
869
870         /* Sync registers with hardware. */
871         regcache_mark_dirty(regmap);
872         err = regcache_sync(regmap);
873         if (err) {
874                 dev_err(&pdev->dev, "Failed to sync regmap for client %s at bus %d at addr 0x%02x\n",
875                         data->hpdev.brdinfo->type, data->hpdev.nr, data->hpdev.brdinfo->addr);
876                 goto regcache_sync_fail;
877         }
878
879         par_pdata = data->hpdev.brdinfo->platform_data;
880         mlxreg_lc->par_regmap = par_pdata->regmap;
881         mlxreg_lc->data = data;
882         mlxreg_lc->dev = &pdev->dev;
883         platform_set_drvdata(pdev, mlxreg_lc);
884
885         /* Configure line card. */
886         err = mlxreg_lc_config_init(mlxreg_lc, regmap, data);
887         if (err)
888                 goto mlxreg_lc_config_init_fail;
889
890         return 0;
891
892 mlxreg_lc_config_init_fail:
893 regcache_sync_fail:
894 regmap_write_fail:
895 devm_regmap_init_i2c_fail:
896         i2c_unregister_device(data->hpdev.client);
897         data->hpdev.client = NULL;
898 i2c_new_device_fail:
899         i2c_put_adapter(data->hpdev.adapter);
900         data->hpdev.adapter = NULL;
901 i2c_get_adapter_fail:
902         /* Clear event notification callback and handle. */
903         if (data->notifier) {
904                 data->notifier->user_handler = NULL;
905                 data->notifier->handle = NULL;
906         }
907         return err;
908 }
909
910 static void mlxreg_lc_remove(struct platform_device *pdev)
911 {
912         struct mlxreg_core_data *data = dev_get_platdata(&pdev->dev);
913         struct mlxreg_lc *mlxreg_lc = platform_get_drvdata(pdev);
914
915         mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_INITIALIZED, 0);
916
917         /*
918          * Probing and removing are invoked by hotplug events raised upon line card insertion and
919          * removing. If probing procedure fails all data is cleared. However, hotplug event still
920          * will be raised on line card removing and activate removing procedure. In this case there
921          * is nothing to remove.
922          */
923         if (!data->notifier || !data->notifier->handle)
924                 return;
925
926         /* Clear event notification callback and handle. */
927         data->notifier->user_handler = NULL;
928         data->notifier->handle = NULL;
929
930         /* Destroy static I2C device feeding by main power. */
931         mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
932                                          mlxreg_lc->main_devs_num);
933         /* Destroy static I2C device feeding by auxiliary power. */
934         mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->aux_devs, mlxreg_lc->aux_devs_num);
935         /* Unregister underlying drivers. */
936         mlxreg_lc_config_exit(mlxreg_lc);
937         if (data->hpdev.client) {
938                 i2c_unregister_device(data->hpdev.client);
939                 data->hpdev.client = NULL;
940                 i2c_put_adapter(data->hpdev.adapter);
941                 data->hpdev.adapter = NULL;
942         }
943 }
944
945 static struct platform_driver mlxreg_lc_driver = {
946         .probe = mlxreg_lc_probe,
947         .remove_new = mlxreg_lc_remove,
948         .driver = {
949                 .name = "mlxreg-lc",
950         },
951 };
952
953 module_platform_driver(mlxreg_lc_driver);
954
955 MODULE_AUTHOR("Vadim Pasternak <vadimp@nvidia.com>");
956 MODULE_DESCRIPTION("Nvidia line card platform driver");
957 MODULE_LICENSE("Dual BSD/GPL");
958 MODULE_ALIAS("platform:mlxreg-lc");