Lines Matching +full:- +full:uses +full:- +full:gpio +full:- +full:dvs
1 // SPDX-License-Identifier: GPL-2.0
9 #include <linux/gpio/consumer.h>
30 const struct pf9453_dvs_config dvs; member
216 .max_register = PF9453_MAX_REG - 1,
222 * BUCK2RAM[1:0] BUCK2 DVS ramp rate setting
253 int ret = -EINVAL; in pf9453_pmic_write()
257 /* If not updating entire register, perform a read-mod-write */ in pf9453_pmic_write()
263 ret = regmap_read(pf9453->regmap, reg, &rxBuf); in pf9453_pmic_write()
265 dev_err(pf9453->dev, "Read reg=%0x error!\n", reg); in pf9453_pmic_write()
273 ret = regmap_raw_write(pf9453->regmap, PF9453_REG_LOCK, &key, 1U); in pf9453_pmic_write()
275 dev_err(pf9453->dev, "Write reg=%0x error!\n", reg); in pf9453_pmic_write()
279 ret = regmap_raw_write(pf9453->regmap, reg, &data, 1U); in pf9453_pmic_write()
281 dev_err(pf9453->dev, "Write reg=%0x error!\n", reg); in pf9453_pmic_write()
286 ret = regmap_raw_write(pf9453->regmap, PF9453_REG_LOCK, &key, 1U); in pf9453_pmic_write()
288 dev_err(pf9453->dev, "Write reg=%0x error!\n", reg); in pf9453_pmic_write()
292 ret = regmap_raw_write(pf9453->regmap, reg, &data, 1U); in pf9453_pmic_write()
294 dev_err(pf9453->dev, "Write reg=%0x error!\n", reg); in pf9453_pmic_write()
314 struct pf9453 *pf9453 = dev_get_drvdata(rdev->dev.parent); in pf9453_regulator_enable_regmap()
317 if (rdev->desc->enable_is_inverted) { in pf9453_regulator_enable_regmap()
318 val = rdev->desc->disable_val; in pf9453_regulator_enable_regmap()
320 val = rdev->desc->enable_val; in pf9453_regulator_enable_regmap()
322 val = rdev->desc->enable_mask; in pf9453_regulator_enable_regmap()
325 return pf9453_pmic_write(pf9453, rdev->desc->enable_reg, rdev->desc->enable_mask, val); in pf9453_regulator_enable_regmap()
339 struct pf9453 *pf9453 = dev_get_drvdata(rdev->dev.parent); in pf9453_regulator_disable_regmap()
342 if (rdev->desc->enable_is_inverted) { in pf9453_regulator_disable_regmap()
343 val = rdev->desc->enable_val; in pf9453_regulator_disable_regmap()
345 val = rdev->desc->enable_mask; in pf9453_regulator_disable_regmap()
347 val = rdev->desc->disable_val; in pf9453_regulator_disable_regmap()
350 return pf9453_pmic_write(pf9453, rdev->desc->enable_reg, rdev->desc->enable_mask, val); in pf9453_regulator_disable_regmap()
365 struct pf9453 *pf9453 = dev_get_drvdata(rdev->dev.parent); in pf9453_regulator_set_voltage_sel_regmap()
368 sel <<= ffs(rdev->desc->vsel_mask) - 1; in pf9453_regulator_set_voltage_sel_regmap()
369 ret = pf9453_pmic_write(pf9453, rdev->desc->vsel_reg, rdev->desc->vsel_mask, sel); in pf9453_regulator_set_voltage_sel_regmap()
373 if (rdev->desc->apply_bit) in pf9453_regulator_set_voltage_sel_regmap()
374 ret = pf9453_pmic_write(pf9453, rdev->desc->apply_reg, in pf9453_regulator_set_voltage_sel_regmap()
375 rdev->desc->apply_bit, rdev->desc->apply_bit); in pf9453_regulator_set_voltage_sel_regmap()
393 if (!found || table[s] - target < tmp - target) { in find_closest_bigger()
405 return -EINVAL; in find_closest_bigger()
423 struct pf9453 *pf9453 = dev_get_drvdata(rdev->dev.parent); in pf9453_regulator_set_ramp_delay_regmap()
427 if (WARN_ON(!rdev->desc->n_ramp_values || !rdev->desc->ramp_delay_table)) in pf9453_regulator_set_ramp_delay_regmap()
428 return -EINVAL; in pf9453_regulator_set_ramp_delay_regmap()
430 ret = find_closest_bigger(ramp_delay, rdev->desc->ramp_delay_table, in pf9453_regulator_set_ramp_delay_regmap()
431 rdev->desc->n_ramp_values, &sel); in pf9453_regulator_set_ramp_delay_regmap()
435 "Can't set ramp-delay %u, setting %u\n", ramp_delay, in pf9453_regulator_set_ramp_delay_regmap()
436 rdev->desc->ramp_delay_table[sel]); in pf9453_regulator_set_ramp_delay_regmap()
439 sel <<= ffs(rdev->desc->ramp_mask) - 1; in pf9453_regulator_set_ramp_delay_regmap()
441 return pf9453_pmic_write(pf9453, rdev->desc->ramp_reg, in pf9453_regulator_set_ramp_delay_regmap()
442 rdev->desc->ramp_mask, sel); in pf9453_regulator_set_ramp_delay_regmap()
523 if (ret == -EINVAL) in buck_set_dvs()
528 for (i = 0; i < desc->n_voltages; i++) { in buck_set_dvs()
533 i <<= ffs(desc->vsel_mask) - 1; in buck_set_dvs()
543 /* Enable DVS control through PMIC_STBY_REQ for this BUCK */ in buck_set_dvs()
544 ret = pf9453_pmic_write(pf9453, regulator->desc.enable_reg, in buck_set_dvs()
554 struct pf9453 *pf9453 = dev_get_drvdata(cfg->dev); in pf9453_set_dvs_levels()
555 const struct pf9453_dvs_config *dvs = &data->dvs; in pf9453_set_dvs_levels() local
563 prop = "nxp,dvs-run-voltage"; in pf9453_set_dvs_levels()
564 reg = dvs->run_reg; in pf9453_set_dvs_levels()
565 mask = dvs->run_mask; in pf9453_set_dvs_levels()
569 prop = "nxp,dvs-standby-voltage"; in pf9453_set_dvs_levels()
570 reg = dvs->standby_reg; in pf9453_set_dvs_levels()
571 mask = dvs->standby_mask; in pf9453_set_dvs_levels()
574 return -EINVAL; in pf9453_set_dvs_levels()
628 .dvs = {
714 .of_match = of_match_ptr("LDO-SNVS"),
735 struct regmap *regmap = pf9453->regmap; in pf9453_irq_handler()
741 dev_err(pf9453->dev, "Failed to read INT1(%d)\n", ret); in pf9453_irq_handler()
746 dev_warn(pf9453->dev, "IRQ_RSTB interrupt.\n"); in pf9453_irq_handler()
749 dev_warn(pf9453->dev, "IRQ_ONKEY interrupt.\n"); in pf9453_irq_handler()
752 dev_warn(pf9453->dev, "VRFLT1 interrupt.\n"); in pf9453_irq_handler()
755 dev_warn(pf9453->dev, "IRQ_RESETKEY interrupt.\n"); in pf9453_irq_handler()
758 dev_warn(pf9453->dev, "LOWVSYS interrupt.\n"); in pf9453_irq_handler()
761 dev_warn(pf9453->dev, "IRQ_THERM_100 interrupt.\n"); in pf9453_irq_handler()
764 dev_warn(pf9453->dev, "IRQ_THERM_80 interrupt.\n"); in pf9453_irq_handler()
771 const struct pf9453_regulator_desc *regulator_desc = of_device_get_match_data(&i2c->dev); in pf9453_i2c_probe()
778 if (!i2c->irq) in pf9453_i2c_probe()
779 return dev_err_probe(&i2c->dev, -EINVAL, "No IRQ configured?\n"); in pf9453_i2c_probe()
781 pf9453 = devm_kzalloc(&i2c->dev, sizeof(struct pf9453), GFP_KERNEL); in pf9453_i2c_probe()
783 return -ENOMEM; in pf9453_i2c_probe()
785 pf9453->regmap = devm_regmap_init_i2c(i2c, &pf9453_regmap_config); in pf9453_i2c_probe()
786 if (IS_ERR(pf9453->regmap)) in pf9453_i2c_probe()
787 return dev_err_probe(&i2c->dev, PTR_ERR(pf9453->regmap), in pf9453_i2c_probe()
790 pf9453->irq = i2c->irq; in pf9453_i2c_probe()
791 pf9453->dev = &i2c->dev; in pf9453_i2c_probe()
793 dev_set_drvdata(&i2c->dev, pf9453); in pf9453_i2c_probe()
795 ret = regmap_read(pf9453->regmap, PF9453_REG_DEV_ID, &device_id); in pf9453_i2c_probe()
797 return dev_err_probe(&i2c->dev, ret, "Read device id error\n"); in pf9453_i2c_probe()
801 return dev_err_probe(&i2c->dev, -EINVAL, "Device id(%x) mismatched\n", in pf9453_i2c_probe()
804 while (regulator_desc->desc.name) { in pf9453_i2c_probe()
808 desc = ®ulator_desc->desc; in pf9453_i2c_probe()
810 config.regmap = pf9453->regmap; in pf9453_i2c_probe()
811 config.dev = pf9453->dev; in pf9453_i2c_probe()
813 rdev = devm_regulator_register(pf9453->dev, desc, &config); in pf9453_i2c_probe()
815 return dev_err_probe(pf9453->dev, PTR_ERR(rdev), in pf9453_i2c_probe()
816 "Failed to register regulator(%s)\n", desc->name); in pf9453_i2c_probe()
821 ret = devm_request_threaded_irq(pf9453->dev, pf9453->irq, NULL, pf9453_irq_handler, in pf9453_i2c_probe()
823 "pf9453-irq", pf9453); in pf9453_i2c_probe()
825 return dev_err_probe(pf9453->dev, ret, "Failed to request IRQ: %d\n", pf9453->irq); in pf9453_i2c_probe()
832 return dev_err_probe(&i2c->dev, ret, "Unmask irq error\n"); in pf9453_i2c_probe()
834 if (of_property_read_bool(i2c->dev.of_node, "nxp,wdog_b-warm-reset")) in pf9453_i2c_probe()
842 return dev_err_probe(&i2c->dev, ret, "Failed to set WDOG_B reset behavior\n"); in pf9453_i2c_probe()
845 * The driver uses the LDO1OUT_H register to control the LDO1 regulator. in pf9453_i2c_probe()
847 * check if the pin is available as GPIO and set it to high. in pf9453_i2c_probe()
849 pf9453->sd_vsel_gpio = gpiod_get_optional(pf9453->dev, "sd-vsel", GPIOD_OUT_HIGH); in pf9453_i2c_probe()
851 if (IS_ERR(pf9453->sd_vsel_gpio)) in pf9453_i2c_probe()
852 return dev_err_probe(&i2c->dev, PTR_ERR(pf9453->sd_vsel_gpio), in pf9453_i2c_probe()
853 "Failed to get SD_VSEL GPIO\n"); in pf9453_i2c_probe()
869 .name = "nxp-pf9453",