Lines Matching +full:mt6370 +full:- +full:adc
1 // SPDX-License-Identifier: GPL-2.0-only
10 #include <linux/devm-helpers.h>
184 ret = regmap_field_read(priv->rmap_fields[fd], ®_val);
210 val = r->max_sel;
216 return regmap_field_write(priv->rmap_fields[fd], val);
238 struct mt6370_priv *priv = rcfg->driver_data;
240 rcfg->ena_gpiod = fwnode_gpiod_get_index(of_fwnode_handle(of),
243 rdesc->name);
244 if (IS_ERR(rcfg->ena_gpiod)) {
245 rcfg->ena_gpiod = NULL;
249 return regmap_update_bits(priv->regmap, MT6370_REG_CHG_CTRL1,
262 mutex_lock(&priv->attach_lock);
263 attach = priv->attach;
272 dev_err(priv->dev, "Failed to enable USB CHG EN\n");
277 dev_err(priv->dev, "Failed to get USB status\n");
282 dev_err(priv->dev, "Invalid attach state\n");
291 priv->psy_usb_type = POWER_SUPPLY_USB_TYPE_SDP;
294 priv->psy_usb_type = POWER_SUPPLY_USB_TYPE_DCP;
297 priv->psy_usb_type = POWER_SUPPLY_USB_TYPE_CDP;
302 priv->psy_usb_type = POWER_SUPPLY_USB_TYPE_UNKNOWN;
307 mutex_unlock(&priv->attach_lock);
310 power_supply_changed(priv->psy);
321 dev_err(priv->dev, "Failed to get FL_STROBE_EN\n");
326 dev_err(priv->dev, "Flash led is still in strobe mode\n");
327 return -EINVAL;
333 dev_err(priv->dev, "Failed to disable CFO_EN\n");
340 dev_err(priv->dev, "Failed to enable CFO_EN\n");
351 return -EINVAL;
353 ret = iio_read_channel_processed(&priv->iio_adcs[chan], val);
355 dev_err(priv->dev, "Failed to read ADC\n");
369 dev_err(priv->dev, "Failed to get mivr state\n");
378 dev_err(priv->dev, "Failed to get ibus\n");
385 dev_err(priv->dev, "Failed to toggle cfo\n");
389 enable_irq(priv->irq_nums[MT6370_IRQ_MIVR]);
390 pm_relax(priv->dev);
402 dev_err(priv->dev, "Failed to get OTG state\n");
411 dev_err(priv->dev, "Failed to get opposite power ready state\n");
419 ret = power_supply_set_property(priv->psy, POWER_SUPPLY_PROP_ONLINE,
422 dev_err(priv->dev, "Failed to start attach/detach flow\n");
428 mutex_lock(&priv->attach_lock);
429 val->intval = !!priv->attach;
430 mutex_unlock(&priv->attach_lock);
442 ret = power_supply_get_property(priv->psy, POWER_SUPPLY_PROP_ONLINE,
445 dev_err(priv->dev, "Failed to get online status\n");
450 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
461 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
464 val->intval = POWER_SUPPLY_STATUS_CHARGING;
467 val->intval = POWER_SUPPLY_STATUS_FULL;
470 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
504 val->intval = type;
512 bool pwr_rdy = !!val->intval;
514 mutex_lock(&priv->attach_lock);
515 if (pwr_rdy == !!priv->attach) {
516 dev_err(priv->dev, "pwr_rdy is same(%d)\n", pwr_rdy);
517 mutex_unlock(&priv->attach_lock);
521 priv->attach = pwr_rdy;
522 mutex_unlock(&priv->attach_lock);
524 if (!queue_work(priv->wq, &priv->bc12_work))
525 dev_err(priv->dev, "bc12 work has already queued\n");
544 return mt6370_chg_field_get(priv, F_ICHG, &val->intval);
546 val->intval = linear_range_get_max_value(&mt6370_chg_ranges[MT6370_RANGE_F_ICHG]);
549 return mt6370_chg_field_get(priv, F_VOREG, &val->intval);
551 val->intval = linear_range_get_max_value(&mt6370_chg_ranges[MT6370_RANGE_F_VOREG]);
554 return mt6370_chg_field_get(priv, F_IAICR, &val->intval);
556 return mt6370_chg_field_get(priv, F_VMIVR, &val->intval);
558 return mt6370_chg_field_get(priv, F_IPREC, &val->intval);
560 return mt6370_chg_field_get(priv, F_IEOC, &val->intval);
562 val->intval = priv->psy_usb_type;
565 return -EINVAL;
579 return mt6370_chg_field_set(priv, F_ICHG, val->intval);
581 return mt6370_chg_field_set(priv, F_VOREG, val->intval);
583 return mt6370_chg_field_set(priv, F_IAICR, val->intval);
585 return mt6370_chg_field_set(priv, F_VMIVR, val->intval);
587 return mt6370_chg_field_set(priv, F_IPREC, val->intval);
589 return mt6370_chg_field_set(priv, F_IEOC, val->intval);
591 return -EINVAL;
628 .name = "mt6370-charger",
657 .of_match = "usb-otg-vbus-regulator",
659 .name = "mt6370-usb-otg-vbus",
682 priv->rmap_fields[i] = devm_regmap_field_alloc(priv->dev,
683 priv->regmap,
685 if (IS_ERR(priv->rmap_fields[i]))
686 return dev_err_probe(priv->dev,
687 PTR_ERR(priv->rmap_fields[i]),
702 dev_err(priv->dev, "Failed to disable usb_chg_en\n");
709 dev_err(priv->dev, "Failed to disable input current limit\n");
716 dev_err(priv->dev, "Failed to set ICHG to 900mA");
723 dev_err(priv->dev, "Failed to set IINLMTSEL\n");
732 .name = "mediatek,chg-" #_name, \
740 .dev = priv->dev,
741 .regmap = priv->regmap,
745 priv->rdev = devm_regulator_register(priv->dev, &mt6370_chg_otg_rdesc,
748 return PTR_ERR_OR_ZERO(priv->rdev);
755 .fwnode = dev_fwnode(priv->dev),
758 priv->psy = devm_power_supply_register(priv->dev, &mt6370_chg_psy_desc,
761 return PTR_ERR_OR_ZERO(priv->psy);
787 dev_err(priv->dev, "Failed to get OTG state\n");
794 mutex_lock(&priv->attach_lock);
795 priv->attach = MT6370_ATTACH_STAT_ATTACH_BC12_DONE;
796 mutex_unlock(&priv->attach_lock);
798 if (!queue_work(priv->wq, &priv->bc12_work))
799 dev_err(priv->dev, "bc12 work has already queued\n");
817 pm_stay_awake(priv->dev);
818 disable_irq_nosync(priv->irq_nums[MT6370_IRQ_MIVR]);
819 schedule_delayed_work(&priv->mivr_dwork, msecs_to_jiffies(200));
843 ret = platform_get_irq_byname(to_platform_device(priv->dev),
848 priv->irq_nums[i] = ret;
849 ret = devm_request_threaded_irq(priv->dev, ret, NULL,
852 dev_name(priv->dev), priv);
854 return dev_err_probe(priv->dev, ret,
864 struct device *dev = &pdev->dev;
870 return -ENOMEM;
872 priv->dev = &pdev->dev;
874 priv->regmap = dev_get_regmap(pdev->dev.parent, NULL);
875 if (!priv->regmap)
876 return dev_err_probe(dev, -ENODEV, "Failed to get regmap\n");
884 priv->iio_adcs = devm_iio_channel_get_all(priv->dev);
885 if (IS_ERR(priv->iio_adcs))
886 return dev_err_probe(dev, PTR_ERR(priv->iio_adcs),
887 "Failed to get iio adc\n");
897 mutex_init(&priv->attach_lock);
899 &priv->attach_lock);
903 priv->attach = MT6370_ATTACH_STAT_DETACH;
905 priv->wq = create_singlethread_workqueue(dev_name(priv->dev));
906 if (!priv->wq)
907 return dev_err_probe(dev, -ENOMEM,
910 ret = devm_add_action_or_reset(dev, mt6370_chg_destroy_wq, priv->wq);
914 ret = devm_work_autocancel(dev, &priv->bc12_work, mt6370_chg_bc12_work_func);
918 ret = devm_delayed_work_autocancel(dev, &priv->mivr_dwork, mt6370_chg_mivr_dwork_func);
925 "Failed to init mt6370 charger setting\n");
937 { .compatible = "mediatek,mt6370-charger", },
945 .name = "mt6370-charger",
952 MODULE_DESCRIPTION("MediaTek MT6370 Charger Driver");