Lines Matching +full:nxp +full:- +full:i
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright 2020 NXP.
4 * NXP PCA9450 pmic driver
56 .max_register = PCA9450_MAX_REGISTER - 1,
157 int ret, i; in buck_set_dvs() local
161 if (ret == -EINVAL) in buck_set_dvs()
166 for (i = 0; i < desc->n_voltages; i++) { in buck_set_dvs()
167 ret = regulator_desc_list_voltage_linear_range(desc, i); in buck_set_dvs()
171 i <<= ffs(desc->vsel_mask) - 1; in buck_set_dvs()
172 ret = regmap_update_bits(regmap, reg, mask, i); in buck_set_dvs()
182 ret = regmap_update_bits(regmap, regulator->desc.enable_reg, in buck_set_dvs()
194 const struct pc9450_dvs_config *dvs = &data->dvs; in pca9450_set_dvs_levels()
197 int i, ret = 0; in pca9450_set_dvs_levels() local
199 for (i = 0; i < PCA9450_DVS_LEVEL_MAX; i++) { in pca9450_set_dvs_levels()
200 switch (i) { in pca9450_set_dvs_levels()
202 prop = "nxp,dvs-run-voltage"; in pca9450_set_dvs_levels()
203 reg = dvs->run_reg; in pca9450_set_dvs_levels()
204 mask = dvs->run_mask; in pca9450_set_dvs_levels()
207 prop = "nxp,dvs-standby-voltage"; in pca9450_set_dvs_levels()
208 reg = dvs->standby_reg; in pca9450_set_dvs_levels()
209 mask = dvs->standby_mask; in pca9450_set_dvs_levels()
212 return -EINVAL; in pca9450_set_dvs_levels()
215 ret = buck_set_dvs(desc, np, cfg->regmap, prop, reg, mask); in pca9450_set_dvs_levels()
669 struct regmap *regmap = pca9450->regmap; in pca9450_irq_handler()
675 dev_err(pca9450->dev, in pca9450_irq_handler()
681 dev_warn(pca9450->dev, "PWRON interrupt.\n"); in pca9450_irq_handler()
684 dev_warn(pca9450->dev, "WDOGB interrupt.\n"); in pca9450_irq_handler()
687 dev_warn(pca9450->dev, "VRFLT1 interrupt.\n"); in pca9450_irq_handler()
690 dev_warn(pca9450->dev, "VRFLT2 interrupt.\n"); in pca9450_irq_handler()
693 dev_warn(pca9450->dev, "LOWVSYS interrupt.\n"); in pca9450_irq_handler()
696 dev_warn(pca9450->dev, "IRQ_THERM_105 interrupt.\n"); in pca9450_irq_handler()
699 dev_warn(pca9450->dev, "IRQ_THERM_125 interrupt.\n"); in pca9450_irq_handler()
708 of_device_get_match_data(&i2c->dev); in pca9450_i2c_probe()
712 unsigned int device_id, i; in pca9450_i2c_probe() local
716 if (!i2c->irq) { in pca9450_i2c_probe()
717 dev_err(&i2c->dev, "No IRQ configured?\n"); in pca9450_i2c_probe()
718 return -EINVAL; in pca9450_i2c_probe()
721 pca9450 = devm_kzalloc(&i2c->dev, sizeof(struct pca9450), GFP_KERNEL); in pca9450_i2c_probe()
723 return -ENOMEM; in pca9450_i2c_probe()
728 pca9450->rcnt = ARRAY_SIZE(pca9450a_regulators); in pca9450_i2c_probe()
732 pca9450->rcnt = ARRAY_SIZE(pca9450bc_regulators); in pca9450_i2c_probe()
735 dev_err(&i2c->dev, "Unknown device type"); in pca9450_i2c_probe()
736 return -EINVAL; in pca9450_i2c_probe()
739 pca9450->irq = i2c->irq; in pca9450_i2c_probe()
740 pca9450->type = type; in pca9450_i2c_probe()
741 pca9450->dev = &i2c->dev; in pca9450_i2c_probe()
743 dev_set_drvdata(&i2c->dev, pca9450); in pca9450_i2c_probe()
745 pca9450->regmap = devm_regmap_init_i2c(i2c, in pca9450_i2c_probe()
747 if (IS_ERR(pca9450->regmap)) { in pca9450_i2c_probe()
748 dev_err(&i2c->dev, "regmap initialization failed\n"); in pca9450_i2c_probe()
749 return PTR_ERR(pca9450->regmap); in pca9450_i2c_probe()
752 ret = regmap_read(pca9450->regmap, PCA9450_REG_DEV_ID, &device_id); in pca9450_i2c_probe()
754 dev_err(&i2c->dev, "Read device id error\n"); in pca9450_i2c_probe()
761 dev_err(&i2c->dev, "Device id(%x) mismatched\n", in pca9450_i2c_probe()
763 return -EINVAL; in pca9450_i2c_probe()
766 for (i = 0; i < pca9450->rcnt; i++) { in pca9450_i2c_probe()
771 r = ®ulator_desc[i]; in pca9450_i2c_probe()
772 desc = &r->desc; in pca9450_i2c_probe()
774 config.regmap = pca9450->regmap; in pca9450_i2c_probe()
775 config.dev = pca9450->dev; in pca9450_i2c_probe()
777 rdev = devm_regulator_register(pca9450->dev, desc, &config); in pca9450_i2c_probe()
780 dev_err(pca9450->dev, in pca9450_i2c_probe()
782 desc->name, ret); in pca9450_i2c_probe()
787 ret = devm_request_threaded_irq(pca9450->dev, pca9450->irq, NULL, in pca9450_i2c_probe()
790 "pca9450-irq", pca9450); in pca9450_i2c_probe()
792 dev_err(pca9450->dev, "Failed to request IRQ: %d\n", in pca9450_i2c_probe()
793 pca9450->irq); in pca9450_i2c_probe()
797 ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_INT1_MSK, in pca9450_i2c_probe()
802 dev_err(&i2c->dev, "Unmask irq error\n"); in pca9450_i2c_probe()
807 ret = regmap_clear_bits(pca9450->regmap, PCA9450_REG_BUCK123_DVS, in pca9450_i2c_probe()
810 dev_err(&i2c->dev, "Failed to clear PRESET_EN bit: %d\n", ret); in pca9450_i2c_probe()
814 if (of_property_read_bool(i2c->dev.of_node, "nxp,wdog_b-warm-reset")) in pca9450_i2c_probe()
820 ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_RESET_CTRL, in pca9450_i2c_probe()
823 dev_err(&i2c->dev, "Failed to set WDOG_B reset behavior\n"); in pca9450_i2c_probe()
827 if (of_property_read_bool(i2c->dev.of_node, "nxp,i2c-lt-enable")) { in pca9450_i2c_probe()
829 ret = regmap_update_bits(pca9450->regmap, PCA9450_REG_CONFIG2, in pca9450_i2c_probe()
832 dev_err(&i2c->dev, in pca9450_i2c_probe()
843 pca9450->sd_vsel_gpio = gpiod_get_optional(pca9450->dev, "sd-vsel", GPIOD_OUT_HIGH); in pca9450_i2c_probe()
845 if (IS_ERR(pca9450->sd_vsel_gpio)) { in pca9450_i2c_probe()
846 dev_err(&i2c->dev, "Failed to get SD_VSEL GPIO\n"); in pca9450_i2c_probe()
847 return PTR_ERR(pca9450->sd_vsel_gpio); in pca9450_i2c_probe()
850 dev_info(&i2c->dev, "%s probed.\n", in pca9450_i2c_probe()
858 .compatible = "nxp,pca9450a",
862 .compatible = "nxp,pca9450b",
866 .compatible = "nxp,pca9450c",
875 .name = "nxp-pca9450",
883 MODULE_AUTHOR("Robin Gong <yibin.gong@nxp.com>");
884 MODULE_DESCRIPTION("NXP PCA9450 Power Management IC driver");