Lines Matching full:info

116 static int measure_vchg(struct pm860x_charger_info *info, int *data)
121 ret = pm860x_bulk_read(info->i2c, PM8607_VCHG_MEAS1, 2, buf);
129 dev_dbg(info->dev, "%s, vchg: %d mv\n", __func__, *data);
134 static void set_vchg_threshold(struct pm860x_charger_info *info,
144 pm860x_reg_write(info->i2c, PM8607_VCHG_LOWTH, data);
145 dev_dbg(info->dev, "VCHG_LOWTH:%dmv, 0x%x\n", min, data);
151 pm860x_reg_write(info->i2c, PM8607_VCHG_HIGHTH, data);
152 dev_dbg(info->dev, "VCHG_HIGHTH:%dmv, 0x%x\n", max, data);
156 static void set_vbatt_threshold(struct pm860x_charger_info *info,
166 pm860x_reg_write(info->i2c, PM8607_VBAT_LOWTH, data);
167 dev_dbg(info->dev, "VBAT Min:%dmv, LOWTH:0x%x\n", min, data);
173 pm860x_reg_write(info->i2c, PM8607_VBAT_HIGHTH, data);
174 dev_dbg(info->dev, "VBAT Max:%dmv, HIGHTH:0x%x\n", max, data);
179 static int start_precharge(struct pm860x_charger_info *info)
183 dev_dbg(info->dev, "Start Pre-charging!\n");
184 set_vbatt_threshold(info, 0, 0);
186 ret = pm860x_reg_write(info->i2c_8606, PM8606_PREREGULATORA,
191 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL1, 3,
196 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL3, (0xf << 4),
201 ret = pm860x_reg_write(info->i2c, PM8607_CHG_CTRL4,
206 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL7,
212 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL1, 3,
218 static int start_fastcharge(struct pm860x_charger_info *info)
222 dev_dbg(info->dev, "Start Fast-charging!\n");
225 ret = pm860x_reg_write(info->i2c, PM8607_CHG_CTRL1,
230 ret = pm860x_reg_write(info->i2c_8606, PM8606_PREREGULATORA,
234 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL2, 0x1f,
239 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL3, (0xf << 4),
244 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL4,
249 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL6,
256 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL7,
262 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL1, 3,
265 set_vchg_threshold(info, VCHG_NORMAL_LOW, VCHG_NORMAL_HIGH);
270 static void stop_charge(struct pm860x_charger_info *info, int vbatt)
272 dev_dbg(info->dev, "Stop charging!\n");
273 pm860x_set_bits(info->i2c, PM8607_CHG_CTRL1, 3, CC1_MODE_OFF);
274 if (vbatt > CHARGE_THRESHOLD && info->online)
275 set_vbatt_threshold(info, CHARGE_THRESHOLD, 0);
278 static void power_off_notification(struct pm860x_charger_info *info)
280 dev_dbg(info->dev, "Power-off notification!\n");
283 static int set_charging_fsm(struct pm860x_charger_info *info)
311 mutex_lock(&info->lock);
312 info->present = data.intval;
314 dev_dbg(info->dev, "Entering FSM:%s, Charger:%s, Battery:%s, "
316 &fsm_state[info->state][0],
317 (info->online) ? "online" : "N/A",
318 (info->present) ? "present" : "N/A", info->allowed);
319 dev_dbg(info->dev, "set_charging_fsm:vbatt:%d(mV)\n", vbatt);
321 switch (info->state) {
323 if (info->online && info->present && info->allowed) {
325 info->state = FSM_PRECHARGE;
326 start_precharge(info);
328 info->state = FSM_DISCHARGE;
329 stop_charge(info, vbatt);
331 info->state = FSM_FASTCHARGE;
332 start_fastcharge(info);
336 power_off_notification(info);
338 info->state = FSM_DISCHARGE;
339 stop_charge(info, vbatt);
344 if (info->online && info->present && info->allowed) {
346 info->state = FSM_FASTCHARGE;
347 start_fastcharge(info);
350 info->state = FSM_DISCHARGE;
351 stop_charge(info, vbatt);
355 if (info->online && info->present && info->allowed) {
357 info->state = FSM_PRECHARGE;
358 start_precharge(info);
361 info->state = FSM_DISCHARGE;
362 stop_charge(info, vbatt);
366 if (info->online && info->present && info->allowed) {
368 info->state = FSM_PRECHARGE;
369 start_precharge(info);
371 info->state = FSM_FASTCHARGE;
372 start_fastcharge(info);
376 power_off_notification(info);
377 else if (vbatt > CHARGE_THRESHOLD && info->online)
378 set_vbatt_threshold(info, CHARGE_THRESHOLD, 0);
382 dev_warn(info->dev, "FSM meets wrong state:%d\n",
383 info->state);
386 dev_dbg(info->dev,
388 &fsm_state[info->state][0],
389 (info->online) ? "online" : "N/A",
390 (info->present) ? "present" : "N/A", info->allowed);
391 mutex_unlock(&info->lock);
398 struct pm860x_charger_info *info = data;
401 mutex_lock(&info->lock);
402 ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2);
404 mutex_unlock(&info->lock);
408 info->online = 1;
409 info->allowed = 1;
411 info->online = 0;
412 info->allowed = 0;
414 mutex_unlock(&info->lock);
415 dev_dbg(info->dev, "%s, Charger:%s, Allowed:%d\n", __func__,
416 (info->online) ? "online" : "N/A", info->allowed);
418 set_charging_fsm(info);
420 power_supply_changed(info->usb);
428 struct pm860x_charger_info *info = data;
441 mutex_lock(&info->lock);
444 info->allowed = 0;
446 info->allowed = 1;
447 dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed);
448 mutex_unlock(&info->lock);
450 set_charging_fsm(info);
458 struct pm860x_charger_info *info = data;
460 mutex_lock(&info->lock);
461 info->allowed = 0;
462 mutex_unlock(&info->lock);
463 dev_dbg(info->dev, "%s, irq: %d\n", __func__, irq);
465 set_charging_fsm(info);
471 struct pm860x_charger_info *info = data;
477 mutex_lock(&info->lock);
479 if (info->state == FSM_PRECHARGE) {
480 info->allowed = 1;
488 info->allowed = 0;
499 * plug in/out usb, So we can not rely on info->online, we
504 ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2);
514 mutex_unlock(&info->lock);
515 dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed);
516 set_charging_fsm(info);
523 struct pm860x_charger_info *info = data;
525 mutex_lock(&info->lock);
527 set_vbatt_threshold(info, 0, 0);
529 if (info->present && info->online)
530 info->allowed = 1;
532 info->allowed = 0;
533 mutex_unlock(&info->lock);
534 dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed);
536 set_charging_fsm(info);
543 struct pm860x_charger_info *info = data;
546 if (info->present)
549 measure_vchg(info, &vchg);
551 mutex_lock(&info->lock);
552 if (!info->online) {
555 status = pm860x_reg_read(info->i2c_8606, PM8606_FLAGS);
558 pm860x_set_bits(info->i2c_8606, PM8606_FLAGS,
560 pm860x_set_bits(info->i2c_8606,
564 dev_dbg(info->dev,
570 set_vchg_threshold(info, VCHG_OVP_LOW, 0);
571 info->allowed = 0;
572 dev_dbg(info->dev,
576 set_vchg_threshold(info, VCHG_NORMAL_LOW,
578 info->allowed = 1;
579 dev_dbg(info->dev,
583 mutex_unlock(&info->lock);
585 dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed);
586 set_charging_fsm(info);
595 struct pm860x_charger_info *info = power_supply_get_drvdata(psy);
599 if (info->state == FSM_FASTCHARGE ||
600 info->state == FSM_PRECHARGE)
606 val->intval = info->online;
619 static int pm860x_init_charger(struct pm860x_charger_info *info)
623 ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2);
627 mutex_lock(&info->lock);
628 info->state = FSM_INIT;
630 info->online = 1;
631 info->allowed = 1;
633 info->online = 0;
634 info->allowed = 0;
636 mutex_unlock(&info->lock);
638 set_charging_fsm(info);
667 struct pm860x_charger_info *info;
673 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
674 if (!info)
679 info->irq[j] = platform_get_irq(pdev, i);
680 if (info->irq[j] < 0)
684 info->irq_nums = j;
686 info->chip = chip;
687 info->i2c =
689 info->i2c_8606 =
691 if (!info->i2c_8606) {
695 info->dev = &pdev->dev;
698 set_vchg_threshold(info, VCHG_NORMAL_LOW, VCHG_OVP_LOW);
700 mutex_init(&info->lock);
701 platform_set_drvdata(pdev, info);
703 psy_cfg.drv_data = info;
706 info->usb = devm_power_supply_register(&pdev->dev, &pm860x_charger_desc,
708 if (IS_ERR(info->usb)) {
709 return PTR_ERR(info->usb);
712 pm860x_init_charger(info);
714 for (i = 0; i < ARRAY_SIZE(info->irq); i++) {
715 ret = devm_request_threaded_irq(&pdev->dev, info->irq[i], NULL,
718 pm860x_irq_descs[i].name, info);
721 info->irq[i], ret);