Lines Matching defs:pm2
107 static void set_lpn_pin(struct pm2xxx_charger *pm2)
109 if (!pm2->ac.charger_connected && gpio_is_valid(pm2->lpn_pin)) {
110 gpio_set_value(pm2->lpn_pin, 1);
115 static void clear_lpn_pin(struct pm2xxx_charger *pm2)
117 if (!pm2->ac.charger_connected && gpio_is_valid(pm2->lpn_pin))
118 gpio_set_value(pm2->lpn_pin, 0);
121 static int pm2xxx_reg_read(struct pm2xxx_charger *pm2, int reg, u8 *val)
126 pm_runtime_get_sync(pm2->dev);
128 ret = i2c_smbus_read_i2c_block_data(pm2->config.pm2xxx_i2c, reg,
131 dev_err(pm2->dev, "Error reading register at 0x%x\n", reg);
135 pm_runtime_put_sync(pm2->dev);
140 static int pm2xxx_reg_write(struct pm2xxx_charger *pm2, int reg, u8 val)
145 pm_runtime_get_sync(pm2->dev);
147 ret = i2c_smbus_write_i2c_block_data(pm2->config.pm2xxx_i2c, reg,
150 dev_err(pm2->dev, "Error writing register at 0x%x\n", reg);
154 pm_runtime_put_sync(pm2->dev);
159 static int pm2xxx_charging_enable_mngt(struct pm2xxx_charger *pm2)
164 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2,
170 static int pm2xxx_charging_disable_mngt(struct pm2xxx_charger *pm2)
175 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG, PM2XXX_SWCTRL_HW);
177 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
182 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG2,
185 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
192 static int pm2xxx_charger_batt_therm_mngt(struct pm2xxx_charger *pm2, int val)
194 queue_work(pm2->charger_wq, &pm2->check_main_thermal_prot_work);
200 static int pm2xxx_charger_die_therm_mngt(struct pm2xxx_charger *pm2, int val)
202 queue_work(pm2->charger_wq, &pm2->check_main_thermal_prot_work);
207 static int pm2xxx_charger_ovv_mngt(struct pm2xxx_charger *pm2, int val)
209 dev_err(pm2->dev, "Overvoltage detected\n");
210 pm2->flags.ovv = true;
211 power_supply_changed(pm2->ac_chg.psy);
214 queue_delayed_work(pm2->charger_wq, &pm2->check_hw_failure_work, 0);
219 static int pm2xxx_charger_wd_exp_mngt(struct pm2xxx_charger *pm2, int val)
221 dev_dbg(pm2->dev , "20 minutes watchdog expired\n");
223 pm2->ac.wd_expired = true;
224 power_supply_changed(pm2->ac_chg.psy);
229 static int pm2xxx_charger_vbat_lsig_mngt(struct pm2xxx_charger *pm2, int val)
235 dev_dbg(pm2->dev, "VBAT grows above VBAT_LOW level\n");
237 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG,
240 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
246 dev_dbg(pm2->dev, "VBAT drops below VBAT_LOW level\n");
248 ret = pm2xxx_reg_write(pm2, PM2XXX_SW_CTRL_REG,
251 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
257 dev_err(pm2->dev, "Unknown VBAT level\n");
263 static int pm2xxx_charger_bat_disc_mngt(struct pm2xxx_charger *pm2, int val)
265 dev_dbg(pm2->dev, "battery disconnected\n");
270 static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val)
274 ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT2, val);
277 dev_err(pm2->dev, "Charger detection failed\n");
287 static int pm2xxx_charger_itv_pwr_plug_mngt(struct pm2xxx_charger *pm2, int val)
298 ret = pm2xxx_charger_detection(pm2, &read_val);
301 pm2->ac.charger_connected = 1;
302 pm2->ac_conn = true;
303 queue_work(pm2->charger_wq, &pm2->ac_work);
310 static int pm2xxx_charger_itv_pwr_unplug_mngt(struct pm2xxx_charger *pm2,
313 pm2->ac.charger_connected = 0;
314 queue_work(pm2->charger_wq, &pm2->ac_work);
321 struct pm2xxx_charger *pm2 = pm2_data;
325 ret = pm2xxx_charger_vbat_lsig_mngt(pm2,
332 ret = pm2xxx_charger_vbat_lsig_mngt(pm2,
339 ret = pm2xxx_charger_bat_disc_mngt(pm2,
350 struct pm2xxx_charger *pm2 = pm2_data;
354 dev_dbg(pm2->dev , "Main charger plugged\n");
355 ret = pm2xxx_charger_itv_pwr_plug_mngt(pm2, val &
361 dev_dbg(pm2->dev , "Main charger unplugged\n");
362 ret = pm2xxx_charger_itv_pwr_unplug_mngt(pm2, val &
372 struct pm2xxx_charger *pm2 = pm2_data;
376 ret = pm2xxx_charger_wd_exp_mngt(pm2, val);
380 dev_dbg(pm2->dev,
389 struct pm2xxx_charger *pm2 = pm2_data;
393 dev_dbg(pm2->dev ,
398 dev_dbg(pm2->dev,
403 dev_dbg(pm2->dev , "battery fully detected\n");
407 dev_dbg(pm2->dev, "CV phase enter with 0.5C charging\n");
411 pm2->failure_case = VPWR_OVV;
412 ret = pm2xxx_charger_ovv_mngt(pm2, val &
414 dev_dbg(pm2->dev, "VPWR/VSYSTEM overvoltage detected\n");
419 ret = pm2xxx_charger_batt_therm_mngt(pm2, val &
422 dev_dbg(pm2->dev, "BTEMP is too Low/High\n");
430 struct pm2xxx_charger *pm2 = pm2_data;
434 pm2->failure_case = VSYSTEM_OVV;
435 ret = pm2xxx_charger_ovv_mngt(pm2, val &
437 dev_dbg(pm2->dev, "VSYSTEM overvoltage detected\n");
444 dev_dbg(pm2->dev, "BTEMP die temperature is too Low/High\n");
445 ret = pm2xxx_charger_die_therm_mngt(pm2, val &
457 struct pm2xxx_charger *pm2 = pm2_data;
461 dev_dbg(pm2->dev, "VMPWR drop to VBAT level\n");
468 dev_dbg(pm2->dev, "Falling/Rising edge on WPWR1/2\n");
476 struct pm2xxx_charger *pm2 = data;
477 struct pm2xxx_interrupts *interrupt = pm2->pm2_int;
481 pm_runtime_get_sync(pm2->dev);
485 pm2xxx_reg_read(pm2,
490 interrupt->handler[i](pm2, interrupt->reg[i]);
492 } while (gpio_get_value(pm2->pdata->gpio_irq_number) == 0);
494 pm_runtime_mark_last_busy(pm2->dev);
495 pm_runtime_put_autosuspend(pm2->dev);
500 static int pm2xxx_charger_get_ac_cv(struct pm2xxx_charger *pm2)
505 if (pm2->ac.charger_connected && pm2->ac.charger_online) {
507 ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT4, &val);
509 dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
565 struct pm2xxx_charger *pm2;
569 pm2 = to_pm2xxx_charger_ac_device_info(charger);
575 dev_err(pm2->dev,
580 ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val);
584 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val);
586 dev_err(pm2->dev,
591 dev_err(pm2->dev, "%s read failed\n", __func__);
600 struct pm2xxx_charger *pm2;
602 pm2 = to_pm2xxx_charger_ac_device_info(psy_to_ux500_charger(psy));
606 if (pm2->flags.mainextchnotok)
608 else if (pm2->ac.wd_expired)
610 else if (pm2->flags.main_thermal_prot)
612 else if (pm2->flags.ovv)
618 val->intval = pm2->ac.charger_online;
621 val->intval = pm2->ac.charger_connected;
624 pm2->ac.cv_active = pm2xxx_charger_get_ac_cv(pm2);
625 val->intval = pm2->ac.cv_active;
633 static int pm2xxx_charging_init(struct pm2xxx_charger *pm2)
638 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG3,
644 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG4,
648 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG5,
656 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6,
665 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG7,
669 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8,
673 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG9,
679 ret = pm2xxx_reg_write(pm2, PM2XXX_INP_VOLT_VPWR2,
681 ret = pm2xxx_reg_write(pm2, PM2XXX_INP_VOLT_VPWR1,
685 ret = pm2xxx_reg_write(pm2, PM2XXX_INP_DROP_VPWR2,
688 ret = pm2xxx_reg_write(pm2, PM2XXX_INP_DROP_VPWR1,
693 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_LOW_LEV_COMP_REG,
707 struct pm2xxx_charger *pm2 = to_pm2xxx_charger_ac_device_info(charger);
710 if (!pm2->ac.charger_connected) {
711 dev_dbg(pm2->dev, "AC charger not connected\n");
715 dev_dbg(pm2->dev, "Enable AC: %dmV %dmA\n", vset, iset);
716 if (!pm2->vddadc_en_ac) {
717 ret = regulator_enable(pm2->regu);
719 dev_warn(pm2->dev,
722 pm2->vddadc_en_ac = true;
725 ret = pm2xxx_charging_init(pm2);
727 dev_err(pm2->dev, "%s charging init failed\n",
736 dev_err(pm2->dev,
742 ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG8, &val);
744 dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
749 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, val);
751 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
755 ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val);
757 dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
762 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val);
764 dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
768 if (!pm2->bat->enable_overshoot) {
769 ret = pm2xxx_reg_read(pm2, PM2XXX_LED_CTRL_REG, &val);
771 dev_err(pm2->dev, "%s pm2xxx read failed\n",
776 ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG, val);
778 dev_err(pm2->dev, "%s pm2xxx write failed\n",
784 ret = pm2xxx_charging_enable_mngt(pm2);
786 dev_err(pm2->dev, "Failed to enable"
791 pm2->ac.charger_online = 1;
793 pm2->ac.charger_online = 0;
794 pm2->ac.wd_expired = false;
797 if (pm2->vddadc_en_ac) {
798 regulator_disable(pm2->regu);
799 pm2->vddadc_en_ac = false;
802 ret = pm2xxx_charging_disable_mngt(pm2);
804 dev_err(pm2->dev, "failed to disable"
809 dev_dbg(pm2->dev, "PM2301: " "Disabled AC charging\n");
811 power_supply_changed(pm2->ac_chg.psy);
820 struct pm2xxx_charger *pm2;
823 pm2 = to_pm2xxx_charger_ac_device_info(charger);
827 ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_WD_KICK, WD_TIMER);
829 dev_err(pm2->dev, "Failed to kick WD!\n");
836 struct pm2xxx_charger *pm2 = container_of(work,
840 power_supply_changed(pm2->ac_chg.psy);
841 sysfs_notify(&pm2->ac_chg.psy->dev.kobj, NULL, "present");
848 struct pm2xxx_charger *pm2 = container_of(work,
851 if (pm2->flags.ovv) {
852 pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT4, ®_value);
856 pm2->flags.ovv = false;
857 power_supply_changed(pm2->ac_chg.psy);
862 if (pm2->flags.ovv) {
863 queue_delayed_work(pm2->charger_wq,
864 &pm2->check_hw_failure_work, round_jiffies(HZ));
874 struct pm2xxx_charger *pm2 = container_of(work, struct pm2xxx_charger,
878 ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT5, &val);
880 dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
885 pm2->flags.main_thermal_prot = true;
888 pm2->flags.main_thermal_prot = false;
890 power_supply_changed(pm2->ac_chg.psy);
909 struct pm2xxx_charger *pm2;
911 pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(i2c_client);
912 set_lpn_pin(pm2);
915 if (pm2->flags.ovv)
916 queue_delayed_work(pm2->charger_wq,
917 &pm2->check_hw_failure_work, 0);
925 struct pm2xxx_charger *pm2;
927 pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(i2c_client);
928 clear_lpn_pin(pm2);
931 if (delayed_work_pending(&pm2->check_hw_failure_work))
932 cancel_delayed_work(&pm2->check_hw_failure_work);
934 flush_work(&pm2->ac_work);
935 flush_work(&pm2->check_main_thermal_prot_work);
943 struct pm2xxx_charger *pm2;
945 pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(pm2xxx_i2c_client);
946 clear_lpn_pin(pm2);
954 struct pm2xxx_charger *pm2;
956 pm2 = (struct pm2xxx_charger *)i2c_get_clientdata(pm2xxx_i2c_client);
958 if (gpio_is_valid(pm2->lpn_pin) && gpio_get_value(pm2->lpn_pin) == 0)
959 set_lpn_pin(pm2);
975 struct pm2xxx_charger *pm2;
985 pm2 = kzalloc(sizeof(struct pm2xxx_charger), GFP_KERNEL);
986 if (!pm2) {
992 pm2->dev = &i2c_client->dev;
994 pm2->pm2_int = &pm2xxx_int;
998 dev_err(pm2->dev, "no charger platform data supplied\n");
1003 pm2->pdata = pl_data->wall_charger;
1007 dev_err(pm2->dev, "no battery platform data supplied\n");
1012 pm2->bat = pl_data->battery;
1018 dev_info(pm2->dev, "pm2301 i2c_check_functionality failed\n");
1022 pm2->config.pm2xxx_i2c = i2c_client;
1023 pm2->config.pm2xxx_id = (struct i2c_device_id *) id;
1024 i2c_set_clientdata(i2c_client, pm2);
1028 pm2->ac_chg_desc.name = pm2->pdata->label;
1029 pm2->ac_chg_desc.type = POWER_SUPPLY_TYPE_MAINS;
1030 pm2->ac_chg_desc.properties = pm2xxx_charger_ac_props;
1031 pm2->ac_chg_desc.num_properties = ARRAY_SIZE(pm2xxx_charger_ac_props);
1032 pm2->ac_chg_desc.get_property = pm2xxx_charger_ac_get_property;
1034 psy_cfg.supplied_to = pm2->pdata->supplied_to;
1035 psy_cfg.num_supplicants = pm2->pdata->num_supplicants;
1037 pm2->ac_chg.ops.enable = &pm2xxx_charger_ac_en;
1038 pm2->ac_chg.ops.kick_wd = &pm2xxx_charger_watchdog_kick;
1039 pm2->ac_chg.ops.update_curr = &pm2xxx_charger_update_charger_current;
1040 pm2->ac_chg.max_out_volt = pm2xxx_charger_voltage_map[
1042 pm2->ac_chg.max_out_curr = pm2xxx_charger_current_map[
1044 pm2->ac_chg.wdt_refresh = WD_KICK_INTERVAL;
1045 pm2->ac_chg.enabled = true;
1046 pm2->ac_chg.external = true;
1049 pm2->charger_wq = alloc_ordered_workqueue("pm2xxx_charger_wq",
1051 if (pm2->charger_wq == NULL) {
1053 dev_err(pm2->dev, "failed to create work queue\n");
1058 INIT_WORK(&pm2->ac_work, pm2xxx_charger_ac_work);
1061 INIT_WORK(&pm2->check_main_thermal_prot_work,
1065 INIT_DEFERRABLE_WORK(&pm2->check_hw_failure_work,
1073 pm2->regu = regulator_get(pm2->dev, "vddadc");
1074 if (IS_ERR(pm2->regu)) {
1075 ret = PTR_ERR(pm2->regu);
1076 dev_err(pm2->dev, "failed to get vddadc regulator\n");
1081 pm2->ac_chg.psy = power_supply_register(pm2->dev, &pm2->ac_chg_desc,
1083 if (IS_ERR(pm2->ac_chg.psy)) {
1084 dev_err(pm2->dev, "failed to register AC charger\n");
1085 ret = PTR_ERR(pm2->ac_chg.psy);
1090 ret = request_threaded_irq(gpio_to_irq(pm2->pdata->gpio_irq_number),
1093 pm2->pdata->irq_type | IRQF_ONESHOT,
1094 pm2xxx_charger_irq[0].name, pm2);
1097 dev_err(pm2->dev, "failed to request %s IRQ %d: %d\n",
1099 gpio_to_irq(pm2->pdata->gpio_irq_number), ret);
1103 ret = pm_runtime_set_active(pm2->dev);
1105 dev_err(pm2->dev, "set active Error\n");
1107 pm_runtime_enable(pm2->dev);
1108 pm_runtime_set_autosuspend_delay(pm2->dev, PM2XXX_AUTOSUSPEND_DELAY);
1109 pm_runtime_use_autosuspend(pm2->dev);
1110 pm_runtime_resume(pm2->dev);
1113 ret = enable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number));
1115 dev_err(pm2->dev, "failed to set irq wake\n");
1119 mutex_init(&pm2->lock);
1121 if (gpio_is_valid(pm2->pdata->lpn_gpio)) {
1123 pm2->lpn_pin = pm2->pdata->lpn_gpio;
1130 ret = gpio_request(pm2->lpn_pin, "pm2301_lpm_gpio");
1133 dev_err(pm2->dev, "pm2301_lpm_gpio request failed\n");
1136 ret = gpio_direction_output(pm2->lpn_pin, 0);
1138 dev_err(pm2->dev, "pm2301_lpm_gpio direction failed\n");
1141 set_lpn_pin(pm2);
1146 pm2xxx_reg_read(pm2,
1150 ret = pm2xxx_charger_detection(pm2, &val);
1153 pm2->ac.charger_connected = 1;
1156 pm2->ac_conn = true;
1157 power_supply_changed(pm2->ac_chg.psy);
1158 sysfs_notify(&pm2->ac_chg.psy->dev.kobj, NULL, "present");
1164 if (gpio_is_valid(pm2->lpn_pin))
1165 gpio_free(pm2->lpn_pin);
1167 disable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number));
1170 free_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), pm2);
1173 power_supply_unregister(pm2->ac_chg.psy);
1176 regulator_put(pm2->regu);
1178 destroy_workqueue(pm2->charger_wq);
1180 kfree(pm2);
1187 struct pm2xxx_charger *pm2 = i2c_get_clientdata(i2c_client);
1190 pm_runtime_disable(pm2->dev);
1192 pm2xxx_charger_ac_en(&pm2->ac_chg, false, 0, 0);
1195 disable_irq_wake(gpio_to_irq(pm2->pdata->gpio_irq_number));
1198 free_irq(gpio_to_irq(pm2->pdata->gpio_irq_number), pm2);
1201 destroy_workqueue(pm2->charger_wq);
1206 regulator_put(pm2->regu);
1208 power_supply_unregister(pm2->ac_chg.psy);
1210 if (gpio_is_valid(pm2->lpn_pin))
1211 gpio_free(pm2->lpn_pin);
1213 kfree(pm2);