Lines Matching refs:charger

3  * Battery charger driver for Dialog Semiconductor DA9030
105 /* charger status */
139 struct da9030_charger *charger = s->private;
141 seq_printf(s, "charger is %s\n", charger->is_on ? "on" : "off");
142 if (charger->chdet) {
144 charger->mA, charger->mV);
148 charger->adc.vbat_res,
149 da9030_reg_to_mV(charger->adc.vbat_res));
151 charger->adc.vbatmin_res,
152 da9030_reg_to_mV(charger->adc.vbatmin_res));
154 charger->adc.vbatmintxon,
155 da9030_reg_to_mV(charger->adc.vbatmintxon));
157 charger->adc.ichmax_res,
158 da9030_reg_to_mV(charger->adc.ichmax_res));
160 charger->adc.ichmin_res,
161 da9030_reg_to_mA(charger->adc.ichmin_res));
163 charger->adc.ichaverage_res,
164 da9030_reg_to_mA(charger->adc.ichaverage_res));
166 charger->adc.vchmax_res,
167 da9030_reg_to_mA(charger->adc.vchmax_res));
169 charger->adc.vchmin_res,
170 da9030_reg_to_mV(charger->adc.vchmin_res));
177 static struct dentry *da9030_bat_create_debugfs(struct da9030_charger *charger)
179 charger->debug_file = debugfs_create_file("charger", 0666, NULL,
180 charger, &bat_debug_fops);
181 return charger->debug_file;
184 static void da9030_bat_remove_debugfs(struct da9030_charger *charger)
186 debugfs_remove(charger->debug_file);
189 static inline struct dentry *da9030_bat_create_debugfs(struct da9030_charger *charger)
193 static inline void da9030_bat_remove_debugfs(struct da9030_charger *charger)
198 static inline void da9030_read_adc(struct da9030_charger *charger,
201 da903x_reads(charger->master, DA9030_VBAT_RES,
205 static void da9030_charger_update_state(struct da9030_charger *charger)
209 da903x_read(charger->master, DA9030_CHARGE_CONTROL, &val);
210 charger->is_on = (val & DA9030_CHRG_CHARGER_ENABLE) ? 1 : 0;
211 charger->mA = ((val >> 3) & 0xf) * 100;
212 charger->mV = (val & 0x7) * 50 + 4000;
214 da9030_read_adc(charger, &charger->adc);
215 da903x_read(charger->master, DA9030_FAULT_LOG, &charger->fault);
216 charger->chdet = da903x_query_status(charger->master,
220 static void da9030_set_charge(struct da9030_charger *charger, int on)
226 val |= (charger->charge_milliamp / 100) << 3;
227 val |= (charger->charge_millivolt - 4000) / 50;
228 charger->is_on = 1;
231 charger->is_on = 0;
234 da903x_write(charger->master, DA9030_CHARGE_CONTROL, val);
236 power_supply_changed(charger->psy);
239 static void da9030_charger_check_state(struct da9030_charger *charger)
241 da9030_charger_update_state(charger);
244 if (!charger->is_on) {
245 if ((charger->chdet) &&
246 (charger->adc.vbat_res <
247 charger->thresholds.vbat_charge_start)) {
248 da9030_set_charge(charger, 1);
252 if (!charger->chdet) {
253 da9030_set_charge(charger, 0);
257 if (charger->adc.vbat_res >=
258 charger->thresholds.vbat_charge_stop) {
259 da9030_set_charge(charger, 0);
260 da903x_write(charger->master, DA9030_VBATMON,
261 charger->thresholds.vbat_charge_restart);
262 } else if (charger->adc.vbat_res >
263 charger->thresholds.vbat_low) {
267 da903x_write(charger->master, DA9030_VBATMON,
268 charger->thresholds.vbat_low);
270 if (charger->adc.vchmax_res > charger->thresholds.vcharge_max ||
271 charger->adc.vchmin_res < charger->thresholds.vcharge_min ||
273 charger->adc.tbat_res < charger->thresholds.tbat_high ||
274 charger->adc.tbat_res > charger->thresholds.tbat_low) {
275 /* disable charger */
276 da9030_set_charge(charger, 0);
283 struct da9030_charger *charger;
285 charger = container_of(work, struct da9030_charger, work.work);
287 da9030_charger_check_state(charger);
290 schedule_delayed_work(&charger->work, charger->interval);
304 static void da9030_battery_check_status(struct da9030_charger *charger,
307 if (charger->chdet) {
308 if (charger->is_on)
317 static void da9030_battery_check_health(struct da9030_charger *charger,
320 if (charger->fault & DA9030_FAULT_LOG_OVER_TEMP)
322 else if (charger->fault & DA9030_FAULT_LOG_VBAT_OVER)
332 struct da9030_charger *charger = power_supply_get_drvdata(psy);
336 da9030_battery_check_status(charger, val);
339 da9030_battery_check_health(charger, val);
342 val->intval = charger->battery_info->technology;
345 val->intval = charger->battery_info->voltage_max_design;
348 val->intval = charger->battery_info->voltage_min_design;
351 val->intval = da9030_reg_to_mV(charger->adc.vbat_res) * 1000;
355 da9030_reg_to_mA(charger->adc.ichaverage_res) * 1000;
358 val->strval = charger->battery_info->name;
367 static void da9030_battery_vbat_event(struct da9030_charger *charger)
369 da9030_read_adc(charger, &charger->adc);
371 if (charger->is_on)
374 if (charger->adc.vbat_res < charger->thresholds.vbat_low) {
376 da903x_write(charger->master, DA9030_VBATMON,
377 charger->thresholds.vbat_crit);
378 if (charger->battery_low)
379 charger->battery_low();
380 } else if (charger->adc.vbat_res <
381 charger->thresholds.vbat_crit) {
383 if (charger->battery_critical)
384 charger->battery_critical();
391 struct da9030_charger *charger =
396 cancel_delayed_work_sync(&charger->work);
397 schedule_work(&charger->work.work);
400 da9030_battery_vbat_event(charger);
404 da9030_set_charge(charger, 0);
411 static void da9030_battery_convert_thresholds(struct da9030_charger *charger,
414 charger->thresholds.tbat_low = pdata->tbat_low;
415 charger->thresholds.tbat_high = pdata->tbat_high;
416 charger->thresholds.tbat_restart = pdata->tbat_restart;
418 charger->thresholds.vbat_low =
420 charger->thresholds.vbat_crit =
422 charger->thresholds.vbat_charge_start =
424 charger->thresholds.vbat_charge_stop =
426 charger->thresholds.vbat_charge_restart =
429 charger->thresholds.vcharge_min =
431 charger->thresholds.vcharge_max =
435 static void da9030_battery_setup_psy(struct da9030_charger *charger)
437 struct power_supply_desc *psy_desc = &charger->psy_desc;
438 struct power_supply_info *info = charger->battery_info;
449 static int da9030_battery_charger_init(struct da9030_charger *charger)
454 v[0] = v[1] = charger->thresholds.vbat_low;
455 v[2] = charger->thresholds.tbat_high;
456 v[3] = charger->thresholds.tbat_restart;
457 v[4] = charger->thresholds.tbat_low;
459 ret = da903x_writes(charger->master, DA9030_VBATMON, 5, v);
467 ret = da903x_write(charger->master, DA9030_ADC_MAN_CONTROL,
474 return da903x_write(charger->master, DA9030_ADC_AUTO_CONTROL,
483 struct da9030_charger *charger;
496 charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL);
497 if (charger == NULL)
500 charger->master = pdev->dev.parent;
504 charger->interval = msecs_to_jiffies(
507 charger->charge_milliamp = pdata->charge_milliamp;
508 charger->charge_millivolt = pdata->charge_millivolt;
509 charger->battery_info = pdata->battery_info;
510 charger->battery_low = pdata->battery_low;
511 charger->battery_critical = pdata->battery_critical;
513 da9030_battery_convert_thresholds(charger, pdata);
515 ret = da9030_battery_charger_init(charger);
519 INIT_DELAYED_WORK(&charger->work, da9030_charging_monitor);
520 schedule_delayed_work(&charger->work, charger->interval);
522 charger->nb.notifier_call = da9030_battery_event;
523 ret = da903x_register_notifier(charger->master, &charger->nb,
531 da9030_battery_setup_psy(charger);
532 psy_cfg.drv_data = charger;
533 charger->psy = power_supply_register(&pdev->dev, &charger->psy_desc,
535 if (IS_ERR(charger->psy)) {
536 ret = PTR_ERR(charger->psy);
540 charger->debug_file = da9030_bat_create_debugfs(charger);
541 platform_set_drvdata(pdev, charger);
545 da903x_unregister_notifier(charger->master, &charger->nb,
549 cancel_delayed_work(&charger->work);
557 struct da9030_charger *charger = platform_get_drvdata(dev);
559 da9030_bat_remove_debugfs(charger);
561 da903x_unregister_notifier(charger->master, &charger->nb,
564 cancel_delayed_work_sync(&charger->work);
565 da9030_set_charge(charger, 0);
566 power_supply_unregister(charger->psy);
581 MODULE_DESCRIPTION("DA9030 battery charger driver");