Lines Matching refs:power
3 * AXP20x PMIC USB power supply status driver
26 #define DRVNAME "axp20x-usb-power-supply"
76 static bool axp20x_usb_vbus_needs_polling(struct axp20x_usb_power *power)
83 if (power->axp20x_id >= AXP221_ID && !power->online)
91 struct axp20x_usb_power *power = devid;
93 power_supply_changed(power->supply);
95 mod_delayed_work(system_wq, &power->vbus_detect, DEBOUNCE_TIME);
102 struct axp20x_usb_power *power =
107 ret = regmap_read(power->regmap, AXP20X_PWR_INPUT_STATUS, &val);
112 if (val != power->old_status)
113 power_supply_changed(power->supply);
115 power->old_status = val;
116 power->online = val & AXP20X_PWR_STATUS_VBUS_USED;
119 if (axp20x_usb_vbus_needs_polling(power))
120 mod_delayed_work(system_wq, &power->vbus_detect, DEBOUNCE_TIME);
123 static int axp20x_get_current_max(struct axp20x_usb_power *power, int *val)
126 int ret = regmap_read(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, &v);
133 if (power->axp20x_id == AXP221_ID)
152 static int axp813_get_current_max(struct axp20x_usb_power *power, int *val)
155 int ret = regmap_read(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, &v);
180 struct axp20x_usb_power *power = power_supply_get_drvdata(psy);
186 ret = regmap_read(power->regmap, AXP20X_VBUS_IPSOUT_MGMT, &v);
194 ret = iio_read_channel_processed(power->vbus_v,
207 ret = axp20x_read_variable_width(power->regmap,
215 if (power->axp20x_id == AXP813_ID)
216 return axp813_get_current_max(power, &val->intval);
217 return axp20x_get_current_max(power, &val->intval);
220 ret = iio_read_channel_processed(power->vbus_i,
233 ret = axp20x_read_variable_width(power->regmap,
245 ret = regmap_read(power->regmap, AXP20X_PWR_INPUT_STATUS, &input);
258 if (power->axp20x_id == AXP202_ID) {
259 ret = regmap_read(power->regmap,
282 static int axp813_usb_power_set_online(struct axp20x_usb_power *power,
287 return regmap_update_bits(power->regmap,
292 static int axp20x_usb_power_set_voltage_min(struct axp20x_usb_power *power,
307 return regmap_update_bits(power->regmap,
318 static int axp813_usb_power_set_current_max(struct axp20x_usb_power *power,
325 return regmap_update_bits(power->regmap,
333 return regmap_update_bits(power->regmap,
343 static int axp20x_usb_power_set_current_max(struct axp20x_usb_power *power,
350 if (power->axp20x_id == AXP221_ID)
356 return regmap_update_bits(power->regmap,
370 struct axp20x_usb_power *power = power_supply_get_drvdata(psy);
374 if (power->axp20x_id != AXP813_ID)
376 return axp813_usb_power_set_online(power, val->intval);
379 return axp20x_usb_power_set_voltage_min(power, val->intval);
382 if (power->axp20x_id == AXP813_ID)
383 return axp813_usb_power_set_current_max(power,
385 return axp20x_usb_power_set_current_max(power, val->intval);
397 struct axp20x_usb_power *power = power_supply_get_drvdata(psy);
407 return power->axp20x_id == AXP813_ID;
501 struct axp20x_usb_power *power = dev_get_drvdata(dev);
510 if (device_may_wakeup(&power->supply->dev))
511 enable_irq_wake(power->irqs[i++]);
512 while (i < power->num_irqs)
513 disable_irq(power->irqs[i++]);
520 struct axp20x_usb_power *power = dev_get_drvdata(dev);
523 if (device_may_wakeup(&power->supply->dev))
524 disable_irq_wake(power->irqs[i++]);
525 while (i < power->num_irqs)
526 enable_irq(power->irqs[i++]);
528 mod_delayed_work(system_wq, &power->vbus_detect, DEBOUNCE_TIME);
538 struct axp20x_usb_power *power)
540 power->vbus_v = devm_iio_channel_get(&pdev->dev, "vbus_v");
541 if (IS_ERR(power->vbus_v)) {
542 if (PTR_ERR(power->vbus_v) == -ENODEV)
544 return PTR_ERR(power->vbus_v);
547 power->vbus_i = devm_iio_channel_get(&pdev->dev, "vbus_i");
548 if (IS_ERR(power->vbus_i)) {
549 if (PTR_ERR(power->vbus_i) == -ENODEV)
551 return PTR_ERR(power->vbus_i);
557 static int configure_adc_registers(struct axp20x_usb_power *power)
560 return regmap_update_bits(power->regmap, AXP20X_ADC_EN1,
571 struct axp20x_usb_power *power;
585 power = devm_kzalloc(&pdev->dev,
586 struct_size(power, irqs, axp_data->num_irq_names),
588 if (!power)
591 platform_set_drvdata(pdev, power);
593 power->axp20x_id = axp_data->axp20x_id;
594 power->regmap = axp20x->regmap;
595 power->num_irqs = axp_data->num_irq_names;
596 INIT_DELAYED_WORK(&power->vbus_detect, axp20x_usb_power_poll_vbus);
598 if (power->axp20x_id == AXP202_ID) {
600 ret = regmap_update_bits(power->regmap, AXP20X_VBUS_MON,
607 ret = configure_iio_channels(pdev, power);
609 ret = configure_adc_registers(power);
615 if (power->axp20x_id == AXP813_ID) {
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);
638 power->irqs[i] = regmap_irq_get_virq(axp20x->regmap_irqc, irq);
639 ret = devm_request_any_context_irq(&pdev->dev, power->irqs[i],
641 DRVNAME, power);
649 if (axp20x_usb_vbus_needs_polling(power))
650 queue_delayed_work(system_wq, &power->vbus_detect, 0);
657 struct axp20x_usb_power *power = platform_get_drvdata(pdev);
659 cancel_delayed_work_sync(&power->vbus_detect);
666 .compatible = "x-powers,axp202-usb-power-supply",
669 .compatible = "x-powers,axp221-usb-power-supply",
672 .compatible = "x-powers,axp223-usb-power-supply",
675 .compatible = "x-powers,axp813-usb-power-supply",
694 MODULE_DESCRIPTION("AXP20x PMIC USB power supply status driver");