diff options
-rw-r--r-- | drivers/platform/x86/mlx-platform.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c index e4251cfa7b5d..454e14f02285 100644 --- a/drivers/platform/x86/mlx-platform.c +++ b/drivers/platform/x86/mlx-platform.c | |||
@@ -83,6 +83,7 @@ | |||
83 | #define MLXPLAT_CPLD_PSU_MASK GENMASK(1, 0) | 83 | #define MLXPLAT_CPLD_PSU_MASK GENMASK(1, 0) |
84 | #define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0) | 84 | #define MLXPLAT_CPLD_PWR_MASK GENMASK(1, 0) |
85 | #define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0) | 85 | #define MLXPLAT_CPLD_FAN_MASK GENMASK(3, 0) |
86 | #define MLXPLAT_CPLD_FAN_NG_MASK GENMASK(5, 0) | ||
86 | 87 | ||
87 | /* Start channel numbers */ | 88 | /* Start channel numbers */ |
88 | #define MLXPLAT_CPLD_CH1 2 | 89 | #define MLXPLAT_CPLD_CH1 2 |
@@ -170,6 +171,15 @@ static struct i2c_board_info mlxplat_mlxcpld_psu[] = { | |||
170 | }, | 171 | }, |
171 | }; | 172 | }; |
172 | 173 | ||
174 | static struct i2c_board_info mlxplat_mlxcpld_ng_psu[] = { | ||
175 | { | ||
176 | I2C_BOARD_INFO("24c32", 0x51), | ||
177 | }, | ||
178 | { | ||
179 | I2C_BOARD_INFO("24c32", 0x50), | ||
180 | }, | ||
181 | }; | ||
182 | |||
173 | static struct i2c_board_info mlxplat_mlxcpld_pwr[] = { | 183 | static struct i2c_board_info mlxplat_mlxcpld_pwr[] = { |
174 | { | 184 | { |
175 | I2C_BOARD_INFO("dps460", 0x59), | 185 | I2C_BOARD_INFO("dps460", 0x59), |
@@ -476,6 +486,103 @@ struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_msn201x_data = { | |||
476 | .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW, | 486 | .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW, |
477 | }; | 487 | }; |
478 | 488 | ||
489 | /* Platform hotplug next generation system family data */ | ||
490 | static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = { | ||
491 | { | ||
492 | .label = "psu1", | ||
493 | .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET, | ||
494 | .mask = BIT(0), | ||
495 | .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[0], | ||
496 | .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR, | ||
497 | }, | ||
498 | { | ||
499 | .label = "psu2", | ||
500 | .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET, | ||
501 | .mask = BIT(1), | ||
502 | .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[1], | ||
503 | .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR, | ||
504 | }, | ||
505 | }; | ||
506 | |||
507 | static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_fan_items_data[] = { | ||
508 | { | ||
509 | .label = "fan1", | ||
510 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | ||
511 | .mask = BIT(0), | ||
512 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | ||
513 | }, | ||
514 | { | ||
515 | .label = "fan2", | ||
516 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | ||
517 | .mask = BIT(1), | ||
518 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | ||
519 | }, | ||
520 | { | ||
521 | .label = "fan3", | ||
522 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | ||
523 | .mask = BIT(2), | ||
524 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | ||
525 | }, | ||
526 | { | ||
527 | .label = "fan4", | ||
528 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | ||
529 | .mask = BIT(3), | ||
530 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | ||
531 | }, | ||
532 | { | ||
533 | .label = "fan5", | ||
534 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | ||
535 | .mask = BIT(4), | ||
536 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | ||
537 | }, | ||
538 | { | ||
539 | .label = "fan6", | ||
540 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | ||
541 | .mask = BIT(5), | ||
542 | .hpdev.nr = MLXPLAT_CPLD_NR_NONE, | ||
543 | }, | ||
544 | }; | ||
545 | |||
546 | static struct mlxreg_core_item mlxplat_mlxcpld_default_ng_items[] = { | ||
547 | { | ||
548 | .data = mlxplat_mlxcpld_default_ng_psu_items_data, | ||
549 | .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF, | ||
550 | .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET, | ||
551 | .mask = MLXPLAT_CPLD_PSU_MASK, | ||
552 | .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_psu_items_data), | ||
553 | .inversed = 1, | ||
554 | .health = false, | ||
555 | }, | ||
556 | { | ||
557 | .data = mlxplat_mlxcpld_default_ng_pwr_items_data, | ||
558 | .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF, | ||
559 | .reg = MLXPLAT_CPLD_LPC_REG_PWR_OFFSET, | ||
560 | .mask = MLXPLAT_CPLD_PWR_MASK, | ||
561 | .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_pwr_items_data), | ||
562 | .inversed = 0, | ||
563 | .health = false, | ||
564 | }, | ||
565 | { | ||
566 | .data = mlxplat_mlxcpld_default_ng_fan_items_data, | ||
567 | .aggr_mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF, | ||
568 | .reg = MLXPLAT_CPLD_LPC_REG_FAN_OFFSET, | ||
569 | .mask = MLXPLAT_CPLD_FAN_NG_MASK, | ||
570 | .count = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_fan_items_data), | ||
571 | .inversed = 1, | ||
572 | .health = false, | ||
573 | }, | ||
574 | }; | ||
575 | |||
576 | static | ||
577 | struct mlxreg_core_hotplug_platform_data mlxplat_mlxcpld_default_ng_data = { | ||
578 | .items = mlxplat_mlxcpld_default_ng_items, | ||
579 | .counter = ARRAY_SIZE(mlxplat_mlxcpld_default_ng_items), | ||
580 | .cell = MLXPLAT_CPLD_LPC_REG_AGGR_OFFSET, | ||
581 | .mask = MLXPLAT_CPLD_AGGR_MASK_NG_DEF, | ||
582 | .cell_low = MLXPLAT_CPLD_LPC_REG_AGGRLO_OFFSET, | ||
583 | .mask_low = MLXPLAT_CPLD_LOW_AGGR_MASK_LOW, | ||
584 | }; | ||
585 | |||
479 | static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg) | 586 | static bool mlxplat_mlxcpld_writeable_reg(struct device *dev, unsigned int reg) |
480 | { | 587 | { |
481 | switch (reg) { | 588 | switch (reg) { |
@@ -633,6 +740,20 @@ static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi) | |||
633 | return 1; | 740 | return 1; |
634 | }; | 741 | }; |
635 | 742 | ||
743 | static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi) | ||
744 | { | ||
745 | int i; | ||
746 | |||
747 | for (i = 0; i < ARRAY_SIZE(mlxplat_mux_data); i++) { | ||
748 | mlxplat_mux_data[i].values = mlxplat_msn21xx_channels; | ||
749 | mlxplat_mux_data[i].n_values = | ||
750 | ARRAY_SIZE(mlxplat_msn21xx_channels); | ||
751 | } | ||
752 | mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data; | ||
753 | |||
754 | return 1; | ||
755 | }; | ||
756 | |||
636 | static const struct dmi_system_id mlxplat_dmi_table[] __initconst = { | 757 | static const struct dmi_system_id mlxplat_dmi_table[] __initconst = { |
637 | { | 758 | { |
638 | .callback = mlxplat_dmi_msn274x_matched, | 759 | .callback = mlxplat_dmi_msn274x_matched, |
@@ -683,6 +804,27 @@ static const struct dmi_system_id mlxplat_dmi_table[] __initconst = { | |||
683 | DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"), | 804 | DMI_MATCH(DMI_PRODUCT_NAME, "MSN201"), |
684 | }, | 805 | }, |
685 | }, | 806 | }, |
807 | { | ||
808 | .callback = mlxplat_dmi_qmb7xx_matched, | ||
809 | .matches = { | ||
810 | DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"), | ||
811 | DMI_MATCH(DMI_PRODUCT_NAME, "QMB7"), | ||
812 | }, | ||
813 | }, | ||
814 | { | ||
815 | .callback = mlxplat_dmi_qmb7xx_matched, | ||
816 | .matches = { | ||
817 | DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"), | ||
818 | DMI_MATCH(DMI_PRODUCT_NAME, "SN37"), | ||
819 | }, | ||
820 | }, | ||
821 | { | ||
822 | .callback = mlxplat_dmi_qmb7xx_matched, | ||
823 | .matches = { | ||
824 | DMI_MATCH(DMI_BOARD_VENDOR, "Mellanox Technologies"), | ||
825 | DMI_MATCH(DMI_PRODUCT_NAME, "SN34"), | ||
826 | }, | ||
827 | }, | ||
686 | { } | 828 | { } |
687 | }; | 829 | }; |
688 | 830 | ||