Lines Matching refs:info

119 static int measure_vchg(struct pm860x_charger_info *info, int *data)  in measure_vchg()  argument
124 ret = pm860x_bulk_read(info->i2c, PM8607_VCHG_MEAS1, 2, buf); in measure_vchg()
132 dev_dbg(info->dev, "%s, vchg: %d mv\n", __func__, *data); in measure_vchg()
137 static void set_vchg_threshold(struct pm860x_charger_info *info, in set_vchg_threshold() argument
147 pm860x_reg_write(info->i2c, PM8607_VCHG_LOWTH, data); in set_vchg_threshold()
148 dev_dbg(info->dev, "VCHG_LOWTH:%dmv, 0x%x\n", min, data); in set_vchg_threshold()
154 pm860x_reg_write(info->i2c, PM8607_VCHG_HIGHTH, data); in set_vchg_threshold()
155 dev_dbg(info->dev, "VCHG_HIGHTH:%dmv, 0x%x\n", max, data); in set_vchg_threshold()
159 static void set_vbatt_threshold(struct pm860x_charger_info *info, in set_vbatt_threshold() argument
169 pm860x_reg_write(info->i2c, PM8607_VBAT_LOWTH, data); in set_vbatt_threshold()
170 dev_dbg(info->dev, "VBAT Min:%dmv, LOWTH:0x%x\n", min, data); in set_vbatt_threshold()
176 pm860x_reg_write(info->i2c, PM8607_VBAT_HIGHTH, data); in set_vbatt_threshold()
177 dev_dbg(info->dev, "VBAT Max:%dmv, HIGHTH:0x%x\n", max, data); in set_vbatt_threshold()
182 static int start_precharge(struct pm860x_charger_info *info) in start_precharge() argument
186 dev_dbg(info->dev, "Start Pre-charging!\n"); in start_precharge()
187 set_vbatt_threshold(info, 0, 0); in start_precharge()
189 ret = pm860x_reg_write(info->i2c_8606, PM8606_PREREGULATORA, in start_precharge()
194 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL1, 3, in start_precharge()
199 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL3, (0xf << 4), in start_precharge()
204 ret = pm860x_reg_write(info->i2c, PM8607_CHG_CTRL4, in start_precharge()
209 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL7, in start_precharge()
215 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL1, 3, in start_precharge()
221 static int start_fastcharge(struct pm860x_charger_info *info) in start_fastcharge() argument
225 dev_dbg(info->dev, "Start Fast-charging!\n"); in start_fastcharge()
228 ret = pm860x_reg_write(info->i2c, PM8607_CHG_CTRL1, in start_fastcharge()
233 ret = pm860x_reg_write(info->i2c_8606, PM8606_PREREGULATORA, in start_fastcharge()
237 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL2, 0x1f, in start_fastcharge()
242 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL3, (0xf << 4), in start_fastcharge()
247 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL4, in start_fastcharge()
252 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL6, in start_fastcharge()
259 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL7, in start_fastcharge()
265 ret = pm860x_set_bits(info->i2c, PM8607_CHG_CTRL1, 3, in start_fastcharge()
268 set_vchg_threshold(info, VCHG_NORMAL_LOW, VCHG_NORMAL_HIGH); in start_fastcharge()
273 static void stop_charge(struct pm860x_charger_info *info, int vbatt) in stop_charge() argument
275 dev_dbg(info->dev, "Stop charging!\n"); in stop_charge()
276 pm860x_set_bits(info->i2c, PM8607_CHG_CTRL1, 3, CC1_MODE_OFF); in stop_charge()
277 if (vbatt > CHARGE_THRESHOLD && info->online) in stop_charge()
278 set_vbatt_threshold(info, CHARGE_THRESHOLD, 0); in stop_charge()
281 static void power_off_notification(struct pm860x_charger_info *info) in power_off_notification() argument
283 dev_dbg(info->dev, "Power-off notification!\n"); in power_off_notification()
286 static int set_charging_fsm(struct pm860x_charger_info *info) in set_charging_fsm() argument
314 mutex_lock(&info->lock); in set_charging_fsm()
315 info->present = data.intval; in set_charging_fsm()
317 dev_dbg(info->dev, "Entering FSM:%s, Charger:%s, Battery:%s, " in set_charging_fsm()
319 &fsm_state[info->state][0], in set_charging_fsm()
320 (info->online) ? "online" : "N/A", in set_charging_fsm()
321 (info->present) ? "present" : "N/A", info->allowed); in set_charging_fsm()
322 dev_dbg(info->dev, "set_charging_fsm:vbatt:%d(mV)\n", vbatt); in set_charging_fsm()
324 switch (info->state) { in set_charging_fsm()
326 if (info->online && info->present && info->allowed) { in set_charging_fsm()
328 info->state = FSM_PRECHARGE; in set_charging_fsm()
329 start_precharge(info); in set_charging_fsm()
331 info->state = FSM_DISCHARGE; in set_charging_fsm()
332 stop_charge(info, vbatt); in set_charging_fsm()
334 info->state = FSM_FASTCHARGE; in set_charging_fsm()
335 start_fastcharge(info); in set_charging_fsm()
339 power_off_notification(info); in set_charging_fsm()
341 info->state = FSM_DISCHARGE; in set_charging_fsm()
342 stop_charge(info, vbatt); in set_charging_fsm()
347 if (info->online && info->present && info->allowed) { in set_charging_fsm()
349 info->state = FSM_FASTCHARGE; in set_charging_fsm()
350 start_fastcharge(info); in set_charging_fsm()
353 info->state = FSM_DISCHARGE; in set_charging_fsm()
354 stop_charge(info, vbatt); in set_charging_fsm()
358 if (info->online && info->present && info->allowed) { in set_charging_fsm()
360 info->state = FSM_PRECHARGE; in set_charging_fsm()
361 start_precharge(info); in set_charging_fsm()
364 info->state = FSM_DISCHARGE; in set_charging_fsm()
365 stop_charge(info, vbatt); in set_charging_fsm()
369 if (info->online && info->present && info->allowed) { in set_charging_fsm()
371 info->state = FSM_PRECHARGE; in set_charging_fsm()
372 start_precharge(info); in set_charging_fsm()
374 info->state = FSM_FASTCHARGE; in set_charging_fsm()
375 start_fastcharge(info); in set_charging_fsm()
379 power_off_notification(info); in set_charging_fsm()
380 else if (vbatt > CHARGE_THRESHOLD && info->online) in set_charging_fsm()
381 set_vbatt_threshold(info, CHARGE_THRESHOLD, 0); in set_charging_fsm()
385 dev_warn(info->dev, "FSM meets wrong state:%d\n", in set_charging_fsm()
386 info->state); in set_charging_fsm()
389 dev_dbg(info->dev, in set_charging_fsm()
391 &fsm_state[info->state][0], in set_charging_fsm()
392 (info->online) ? "online" : "N/A", in set_charging_fsm()
393 (info->present) ? "present" : "N/A", info->allowed); in set_charging_fsm()
394 mutex_unlock(&info->lock); in set_charging_fsm()
401 struct pm860x_charger_info *info = data; in pm860x_charger_handler() local
404 mutex_lock(&info->lock); in pm860x_charger_handler()
405 ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2); in pm860x_charger_handler()
407 mutex_unlock(&info->lock); in pm860x_charger_handler()
411 info->online = 1; in pm860x_charger_handler()
412 info->allowed = 1; in pm860x_charger_handler()
414 info->online = 0; in pm860x_charger_handler()
415 info->allowed = 0; in pm860x_charger_handler()
417 mutex_unlock(&info->lock); in pm860x_charger_handler()
418 dev_dbg(info->dev, "%s, Charger:%s, Allowed:%d\n", __func__, in pm860x_charger_handler()
419 (info->online) ? "online" : "N/A", info->allowed); in pm860x_charger_handler()
421 set_charging_fsm(info); in pm860x_charger_handler()
423 power_supply_changed(info->usb); in pm860x_charger_handler()
431 struct pm860x_charger_info *info = data; in pm860x_temp_handler() local
444 mutex_lock(&info->lock); in pm860x_temp_handler()
447 info->allowed = 0; in pm860x_temp_handler()
449 info->allowed = 1; in pm860x_temp_handler()
450 dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed); in pm860x_temp_handler()
451 mutex_unlock(&info->lock); in pm860x_temp_handler()
453 set_charging_fsm(info); in pm860x_temp_handler()
461 struct pm860x_charger_info *info = data; in pm860x_exception_handler() local
463 mutex_lock(&info->lock); in pm860x_exception_handler()
464 info->allowed = 0; in pm860x_exception_handler()
465 mutex_unlock(&info->lock); in pm860x_exception_handler()
466 dev_dbg(info->dev, "%s, irq: %d\n", __func__, irq); in pm860x_exception_handler()
468 set_charging_fsm(info); in pm860x_exception_handler()
474 struct pm860x_charger_info *info = data; in pm860x_done_handler() local
480 mutex_lock(&info->lock); in pm860x_done_handler()
482 if (info->state == FSM_PRECHARGE) { in pm860x_done_handler()
483 info->allowed = 1; in pm860x_done_handler()
491 info->allowed = 0; in pm860x_done_handler()
507 ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2); in pm860x_done_handler()
517 mutex_unlock(&info->lock); in pm860x_done_handler()
518 dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed); in pm860x_done_handler()
519 set_charging_fsm(info); in pm860x_done_handler()
526 struct pm860x_charger_info *info = data; in pm860x_vbattery_handler() local
528 mutex_lock(&info->lock); in pm860x_vbattery_handler()
530 set_vbatt_threshold(info, 0, 0); in pm860x_vbattery_handler()
532 if (info->present && info->online) in pm860x_vbattery_handler()
533 info->allowed = 1; in pm860x_vbattery_handler()
535 info->allowed = 0; in pm860x_vbattery_handler()
536 mutex_unlock(&info->lock); in pm860x_vbattery_handler()
537 dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed); in pm860x_vbattery_handler()
539 set_charging_fsm(info); in pm860x_vbattery_handler()
546 struct pm860x_charger_info *info = data; in pm860x_vchg_handler() local
549 if (info->present) in pm860x_vchg_handler()
552 measure_vchg(info, &vchg); in pm860x_vchg_handler()
554 mutex_lock(&info->lock); in pm860x_vchg_handler()
555 if (!info->online) { in pm860x_vchg_handler()
558 status = pm860x_reg_read(info->i2c_8606, PM8606_FLAGS); in pm860x_vchg_handler()
561 pm860x_set_bits(info->i2c_8606, PM8606_FLAGS, in pm860x_vchg_handler()
563 pm860x_set_bits(info->i2c_8606, in pm860x_vchg_handler()
567 dev_dbg(info->dev, in pm860x_vchg_handler()
573 set_vchg_threshold(info, VCHG_OVP_LOW, 0); in pm860x_vchg_handler()
574 info->allowed = 0; in pm860x_vchg_handler()
575 dev_dbg(info->dev, in pm860x_vchg_handler()
579 set_vchg_threshold(info, VCHG_NORMAL_LOW, in pm860x_vchg_handler()
581 info->allowed = 1; in pm860x_vchg_handler()
582 dev_dbg(info->dev, in pm860x_vchg_handler()
586 mutex_unlock(&info->lock); in pm860x_vchg_handler()
588 dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed); in pm860x_vchg_handler()
589 set_charging_fsm(info); in pm860x_vchg_handler()
598 struct pm860x_charger_info *info = power_supply_get_drvdata(psy); in pm860x_usb_get_prop() local
602 if (info->state == FSM_FASTCHARGE || in pm860x_usb_get_prop()
603 info->state == FSM_PRECHARGE) in pm860x_usb_get_prop()
609 val->intval = info->online; in pm860x_usb_get_prop()
622 static int pm860x_init_charger(struct pm860x_charger_info *info) in pm860x_init_charger() argument
626 ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2); in pm860x_init_charger()
630 mutex_lock(&info->lock); in pm860x_init_charger()
631 info->state = FSM_INIT; in pm860x_init_charger()
633 info->online = 1; in pm860x_init_charger()
634 info->allowed = 1; in pm860x_init_charger()
636 info->online = 0; in pm860x_init_charger()
637 info->allowed = 0; in pm860x_init_charger()
639 mutex_unlock(&info->lock); in pm860x_init_charger()
641 set_charging_fsm(info); in pm860x_init_charger()
670 struct pm860x_charger_info *info; in pm860x_charger_probe() local
676 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in pm860x_charger_probe()
677 if (!info) in pm860x_charger_probe()
682 info->irq[j] = platform_get_irq(pdev, i); in pm860x_charger_probe()
683 if (info->irq[j] < 0) in pm860x_charger_probe()
687 info->irq_nums = j; in pm860x_charger_probe()
689 info->chip = chip; in pm860x_charger_probe()
690 info->i2c = in pm860x_charger_probe()
692 info->i2c_8606 = in pm860x_charger_probe()
694 if (!info->i2c_8606) { in pm860x_charger_probe()
699 info->dev = &pdev->dev; in pm860x_charger_probe()
702 set_vchg_threshold(info, VCHG_NORMAL_LOW, VCHG_OVP_LOW); in pm860x_charger_probe()
704 mutex_init(&info->lock); in pm860x_charger_probe()
705 platform_set_drvdata(pdev, info); in pm860x_charger_probe()
707 psy_cfg.drv_data = info; in pm860x_charger_probe()
710 info->usb = power_supply_register(&pdev->dev, &pm860x_charger_desc, in pm860x_charger_probe()
712 if (IS_ERR(info->usb)) { in pm860x_charger_probe()
713 ret = PTR_ERR(info->usb); in pm860x_charger_probe()
717 pm860x_init_charger(info); in pm860x_charger_probe()
719 for (i = 0; i < ARRAY_SIZE(info->irq); i++) { in pm860x_charger_probe()
720 ret = request_threaded_irq(info->irq[i], NULL, in pm860x_charger_probe()
722 IRQF_ONESHOT, pm860x_irq_descs[i].name, info); in pm860x_charger_probe()
725 info->irq[i], ret); in pm860x_charger_probe()
732 power_supply_unregister(info->usb); in pm860x_charger_probe()
734 free_irq(info->irq[i], info); in pm860x_charger_probe()
741 struct pm860x_charger_info *info = platform_get_drvdata(pdev); in pm860x_charger_remove() local
744 power_supply_unregister(info->usb); in pm860x_charger_remove()
745 for (i = 0; i < info->irq_nums; i++) in pm860x_charger_remove()
746 free_irq(info->irq[i], info); in pm860x_charger_remove()