Lines Matching refs:power

3  * AXP20x PMIC USB power supply status driver
26 #define DRVNAME "axp20x-usb-power-supply"
79 static bool axp20x_usb_vbus_needs_polling(struct axp20x_usb_power *power)
86 if (power->axp_data->vbus_needs_polling && !power->online)
94 struct axp20x_usb_power *power = devid;
96 power_supply_changed(power->supply);
98 mod_delayed_work(system_power_efficient_wq, &power->vbus_detect, DEBOUNCE_TIME);
105 struct axp20x_usb_power *power =
110 ret = regmap_read(power->regmap, AXP20X_PWR_INPUT_STATUS, &val);
115 if (val != power->old_status)
116 power_supply_changed(power->supply);
118 power->old_status = val;
119 power->online = val & AXP20X_PWR_STATUS_VBUS_USED;
122 if (axp20x_usb_vbus_needs_polling(power))
123 mod_delayed_work(system_power_efficient_wq, &power->vbus_detect, DEBOUNCE_TIME);
129 struct axp20x_usb_power *power = power_supply_get_drvdata(psy);
135 ret = regmap_read(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, &v);
143 ret = iio_read_channel_processed(power->vbus_v,
156 ret = axp20x_read_variable_width(power->regmap,
164 ret = regmap_field_read(power->curr_lim_fld, &v);
168 val->intval = power->axp_data->curr_lim_table[v];
172 ret = iio_read_channel_processed(power->vbus_i,
185 ret = axp20x_read_variable_width(power->regmap,
197 ret = regmap_read(power->regmap, AXP20X_PWR_INPUT_STATUS, &input);
210 if (power->vbus_valid_bit) {
211 ret = regmap_field_read(power->vbus_valid_bit, &v);
233 static int axp20x_usb_power_set_voltage_min(struct axp20x_usb_power *power,
248 return regmap_update_bits(power->regmap,
259 static int axp20x_usb_power_set_current_max(struct axp20x_usb_power *power, int intval)
261 const unsigned int max = GENMASK(power->axp_data->curr_lim_fld.msb,
262 power->axp_data->curr_lim_fld.lsb);
268 if (power->axp_data->curr_lim_table[i] == intval)
269 return regmap_field_write(power->curr_lim_fld, i);
278 struct axp20x_usb_power *power = power_supply_get_drvdata(psy);
282 if (!power->vbus_disable_bit)
285 return regmap_field_write(power->vbus_disable_bit, !val->intval);
288 return axp20x_usb_power_set_voltage_min(power, val->intval);
291 return axp20x_usb_power_set_current_max(power, val->intval);
303 struct axp20x_usb_power *power = power_supply_get_drvdata(psy);
313 return power->vbus_disable_bit != NULL;
449 struct axp20x_usb_power *power = dev_get_drvdata(dev);
458 if (device_may_wakeup(&power->supply->dev))
459 enable_irq_wake(power->irqs[i++]);
460 while (i < power->num_irqs)
461 disable_irq(power->irqs[i++]);
468 struct axp20x_usb_power *power = dev_get_drvdata(dev);
471 if (device_may_wakeup(&power->supply->dev))
472 disable_irq_wake(power->irqs[i++]);
473 while (i < power->num_irqs)
474 enable_irq(power->irqs[i++]);
476 mod_delayed_work(system_power_efficient_wq, &power->vbus_detect, DEBOUNCE_TIME);
486 struct axp20x_usb_power *power)
488 power->vbus_v = devm_iio_channel_get(&pdev->dev, "vbus_v");
489 if (IS_ERR(power->vbus_v)) {
490 if (PTR_ERR(power->vbus_v) == -ENODEV)
492 return PTR_ERR(power->vbus_v);
495 power->vbus_i = devm_iio_channel_get(&pdev->dev, "vbus_i");
496 if (IS_ERR(power->vbus_i)) {
497 if (PTR_ERR(power->vbus_i) == -ENODEV)
499 return PTR_ERR(power->vbus_i);
505 static int configure_adc_registers(struct axp20x_usb_power *power)
508 return regmap_update_bits(power->regmap, AXP20X_ADC_EN1,
539 struct axp20x_usb_power *power;
553 power = devm_kzalloc(&pdev->dev,
554 struct_size(power, irqs, axp_data->num_irq_names),
556 if (!power)
559 platform_set_drvdata(pdev, power);
561 power->axp_data = axp_data;
562 power->regmap = axp20x->regmap;
563 power->num_irqs = axp_data->num_irq_names;
565 power->curr_lim_fld = devm_regmap_field_alloc(&pdev->dev, power->regmap,
567 if (IS_ERR(power->curr_lim_fld))
568 return PTR_ERR(power->curr_lim_fld);
570 ret = axp20x_regmap_field_alloc_optional(&pdev->dev, power->regmap,
572 &power->vbus_valid_bit);
576 ret = axp20x_regmap_field_alloc_optional(&pdev->dev, power->regmap,
578 &power->vbus_mon_bit);
582 ret = axp20x_regmap_field_alloc_optional(&pdev->dev, power->regmap,
584 &power->usb_bc_en_bit);
588 ret = axp20x_regmap_field_alloc_optional(&pdev->dev, power->regmap,
590 &power->vbus_disable_bit);
594 ret = devm_delayed_work_autocancel(&pdev->dev, &power->vbus_detect,
599 if (power->vbus_mon_bit) {
601 ret = regmap_field_write(power->vbus_mon_bit, 1);
606 ret = configure_iio_channels(pdev, power);
608 ret = configure_adc_registers(power);
614 if (power->usb_bc_en_bit) {
616 ret = regmap_field_write(power->usb_bc_en_bit, 1);
622 psy_cfg.drv_data = power;
624 power->supply = devm_power_supply_register(&pdev->dev,
627 if (IS_ERR(power->supply))
628 return PTR_ERR(power->supply);
636 power->irqs[i] = regmap_irq_get_virq(axp20x->regmap_irqc, irq);
637 ret = devm_request_any_context_irq(&pdev->dev, power->irqs[i],
639 DRVNAME, power);
647 if (axp20x_usb_vbus_needs_polling(power))
648 queue_delayed_work(system_power_efficient_wq, &power->vbus_detect, 0);
655 .compatible = "x-powers,axp192-usb-power-supply",
658 .compatible = "x-powers,axp202-usb-power-supply",
661 .compatible = "x-powers,axp221-usb-power-supply",
664 .compatible = "x-powers,axp223-usb-power-supply",
667 .compatible = "x-powers,axp813-usb-power-supply",
685 MODULE_DESCRIPTION("AXP20x PMIC USB power supply status driver");