Lines Matching refs:mlxreg_lc
56 /* mlxreg_lc - device private data
74 struct mlxreg_lc {
412 mlxreg_lc_create_static_devices(struct mlxreg_lc *mlxreg_lc, struct mlxreg_hotplug_device *devs,
422 dev_err(mlxreg_lc->dev, "Failed to create client %s at bus %d at addr 0x%02x\n",
443 mlxreg_lc_destroy_static_devices(struct mlxreg_lc *mlxreg_lc, struct mlxreg_hotplug_device *devs,
458 static int mlxreg_lc_power_on_off(struct mlxreg_lc *mlxreg_lc, u8 action)
463 err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_pwr, ®val);
468 regval |= BIT(mlxreg_lc->data->slot - 1);
470 regval &= ~BIT(mlxreg_lc->data->slot - 1);
472 err = regmap_write(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_pwr, regval);
478 static int mlxreg_lc_enable_disable(struct mlxreg_lc *mlxreg_lc, bool action)
491 err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_ena, ®val);
496 regval |= BIT(mlxreg_lc->data->slot - 1);
498 regval &= ~BIT(mlxreg_lc->data->slot - 1);
500 err = regmap_write(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_ena, regval);
507 mlxreg_lc_sn4800_c16_config_init(struct mlxreg_lc *mlxreg_lc, void *regmap,
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;
518 mlxreg_lc->aux_devs = devm_kmemdup(dev, mlxreg_lc_aux_pwr_brdinfo,
520 if (!mlxreg_lc->aux_devs)
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,
525 if (!mlxreg_lc->main_devs)
527 mlxreg_lc->main_devs_num = ARRAY_SIZE(mlxreg_lc_main_pwr_brdinfo);
533 mlxreg_lc_state_update(struct mlxreg_lc *mlxreg_lc, enum mlxreg_lc_state state, u8 action)
536 mlxreg_lc->state |= state;
538 mlxreg_lc->state &= ~state;
542 mlxreg_lc_state_update_locked(struct mlxreg_lc *mlxreg_lc, enum mlxreg_lc_state state, u8 action)
544 mutex_lock(&mlxreg_lc->lock);
547 mlxreg_lc->state |= state;
549 mlxreg_lc->state &= ~state;
551 mutex_unlock(&mlxreg_lc->lock);
560 struct mlxreg_lc *mlxreg_lc = handle;
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);
566 mutex_lock(&mlxreg_lc->lock);
567 if (!(mlxreg_lc->state & MLXREG_LC_INITIALIZED))
576 mlxreg_lc_state_update(mlxreg_lc, MLXREG_LC_SYNCED, action);
578 if (!(mlxreg_lc->state & MLXREG_LC_POWERED) && action) {
579 err = mlxreg_lc_power_on_off(mlxreg_lc, 1);
584 if (mlxreg_lc->state & MLXREG_LC_CONFIGURED && action)
585 err = mlxreg_lc_enable_disable(mlxreg_lc, 1);
591 if (mlxreg_lc->state & MLXREG_LC_POWERED) {
593 if (mlxreg_lc->state & MLXREG_LC_CONFIGURED)
594 err = mlxreg_lc_enable_disable(mlxreg_lc, 1);
598 err = mlxreg_lc_create_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
599 mlxreg_lc->main_devs_num);
604 if (mlxreg_lc->state & MLXREG_LC_CONFIGURED)
605 err = mlxreg_lc_enable_disable(mlxreg_lc, 1);
607 mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
608 mlxreg_lc->main_devs_num);
610 mlxreg_lc_state_update(mlxreg_lc, MLXREG_LC_POWERED, action);
617 err = mlxreg_lc_enable_disable(mlxreg_lc, !!action);
622 err = mlxreg_lc_power_on_off(mlxreg_lc, 0);
632 mutex_unlock(&mlxreg_lc->lock);
645 struct mlxreg_lc *mlxreg_lc = handle;
650 aux_dev = mlxreg_lc->aux_devs;
651 for (i = 0; i < mlxreg_lc->aux_devs_num; i++, aux_dev++) {
656 err = mlxreg_lc_create_static_devices(mlxreg_lc, mlxreg_lc->aux_devs,
657 mlxreg_lc->aux_devs_num);
662 main_dev = mlxreg_lc->main_devs;
663 for (i = 0; i < mlxreg_lc->main_devs_num; i++, main_dev++) {
669 err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_pwr, ®val);
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);
679 mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_POWERED, 1);
683 err = regmap_read(mlxreg_lc->par_regmap, mlxreg_lc->data->reg_sync, ®val);
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);
698 mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_INITIALIZED, 1);
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);
708 mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->aux_devs, mlxreg_lc->aux_devs_num);
714 mlxreg_lc_config_init(struct mlxreg_lc *mlxreg_lc, void *regmap,
729 err = mlxreg_lc_sn4800_c16_config_init(mlxreg_lc, regmap, data);
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)) {
751 return PTR_ERR(mlxreg_lc->mux);
755 if (mlxreg_lc->io_data) {
756 mlxreg_lc->io_data->regmap = regmap;
757 mlxreg_lc->io_regs =
759 mlxreg_lc->io_data, sizeof(*mlxreg_lc->io_data));
760 if (IS_ERR(mlxreg_lc->io_regs)) {
764 err = PTR_ERR(mlxreg_lc->io_regs);
770 if (mlxreg_lc->led_data) {
771 mlxreg_lc->led_data->regmap = regmap;
772 mlxreg_lc->led =
774 mlxreg_lc->led_data,
775 sizeof(*mlxreg_lc->led_data));
776 if (IS_ERR(mlxreg_lc->led)) {
780 err = PTR_ERR(mlxreg_lc->led);
788 if (mlxreg_lc->io_regs)
789 platform_device_unregister(mlxreg_lc->io_regs);
791 if (mlxreg_lc->mux)
792 platform_device_unregister(mlxreg_lc->mux);
797 static void mlxreg_lc_config_exit(struct mlxreg_lc *mlxreg_lc)
800 if (mlxreg_lc->led)
801 platform_device_unregister(mlxreg_lc->led);
803 if (mlxreg_lc->io_regs)
804 platform_device_unregister(mlxreg_lc->io_regs);
806 if (mlxreg_lc->mux)
807 platform_device_unregister(mlxreg_lc->mux);
814 struct mlxreg_lc *mlxreg_lc;
822 mlxreg_lc = devm_kzalloc(&pdev->dev, sizeof(*mlxreg_lc), GFP_KERNEL);
823 if (!mlxreg_lc)
826 mutex_init(&mlxreg_lc->lock);
829 data->notifier->handle = mlxreg_lc;
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);
886 err = mlxreg_lc_config_init(mlxreg_lc, regmap, data);
913 struct mlxreg_lc *mlxreg_lc = platform_get_drvdata(pdev);
915 mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_INITIALIZED, 0);
931 mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->main_devs,
932 mlxreg_lc->main_devs_num);
934 mlxreg_lc_destroy_static_devices(mlxreg_lc, mlxreg_lc->aux_devs, mlxreg_lc->aux_devs_num);
936 mlxreg_lc_config_exit(mlxreg_lc);