static int rk_ac_update_online(struct cw_battery *cw_bat) { int ret = 0; if(cw_bat->plat_data->dc_det_pin == INVALID_GPIO) { cw_bat->dc_online = 0; return 0; } #if 0 if (cw_bat->plat_data->is_dc_charge == 0) { cw_bat->dc_online = 0; return 0; } #endif if (gpio_get_value(cw_bat->plat_data->dc_det_pin) == cw_bat->plat_data->dc_det_level) { if (cw_bat->dc_online != 1) { cw_update_time_member_charge_start(cw_bat); cw_bat->dc_online = 1; if (cw_bat->charger_mode != AC_CHARGER_MODE) cw_bat->charger_mode = AC_CHARGER_MODE; ret = 1; } } else { if (cw_bat->dc_online != 0) { cw_update_time_member_charge_start(cw_bat); cw_bat->dc_online = 0; if (cw_bat->usb_online == 0) cw_bat->charger_mode = 0; ret = 1; } } return ret; }
static int rk_usb_update_online(struct cw_battery *cw_bat) { int ret = 0; int usb_status = 0; if (cw_bat->plat_data->is_usb_charge == 0) { cw_bat->usb_online = 0; return 0; } usb_status = get_usb_charge_state(cw_bat); if (usb_status == 2) { if (cw_bat->charger_mode != AC_CHARGER_MODE) { cw_bat->charger_mode = AC_CHARGER_MODE; ret = 1; } if (cw_bat->plat_data->chg_mode_sel_pin != INVALID_GPIO) { if (gpio_get_value (cw_bat->plat_data->chg_mode_sel_pin) != cw_bat->plat_data->chg_mode_sel_level) gpio_direction_output(cw_bat->plat_data->chg_mode_sel_pin, (cw_bat->plat_data->chg_mode_sel_level==GPIO_HIGH) ? GPIO_HIGH : GPIO_LOW); } if (cw_bat->usb_online != 1) { cw_bat->usb_online = 1; cw_update_time_member_charge_start(cw_bat); } } else if (usb_status == 1) { if ((cw_bat->charger_mode != USB_CHARGER_MODE) && (cw_bat->dc_online == 0)) { cw_bat->charger_mode = USB_CHARGER_MODE; ret = 1; } if (cw_bat->plat_data->chg_mode_sel_pin != INVALID_GPIO) { if (gpio_get_value (cw_bat->plat_data->chg_mode_sel_pin) == cw_bat->plat_data->chg_mode_sel_level) gpio_direction_output(cw_bat->plat_data->chg_mode_sel_pin, (cw_bat->plat_data->chg_mode_sel_level==GPIO_HIGH) ? GPIO_LOW : GPIO_HIGH); } if (cw_bat->usb_online != 1){ cw_bat->usb_online = 1; cw_update_time_member_charge_start(cw_bat); } } else if (usb_status == 0 && cw_bat->usb_online != 0) { if (cw_bat->plat_data->chg_mode_sel_pin != INVALID_GPIO) { if (gpio_get_value (cw_bat->plat_data->chg_mode_sel_pin == cw_bat->plat_data->chg_mode_sel_level)) gpio_direction_output(cw_bat->plat_data->chg_mode_sel_pin, (cw_bat->plat_data->chg_mode_sel_level==GPIO_HIGH) ? GPIO_LOW : GPIO_HIGH); } if (cw_bat->dc_online == 0) cw_bat->charger_mode = 0; cw_update_time_member_charge_start(cw_bat); cw_bat->usb_online = 0; ret = 1; } return ret; }
static int cw_bat_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct cw_battery *cw_bat; int ret; int irq; int irq_flags; int loop = 0; cw_bat = devm_kzalloc(&client->dev, sizeof(*cw_bat), GFP_KERNEL); if (!cw_bat) { dev_err(&cw_bat->client->dev, "fail to allocate memory\n"); return -ENOMEM; } i2c_set_clientdata(client, cw_bat); cw_bat->plat_data = client->dev.platform_data; ret = cw_bat_gpio_init(cw_bat); if (ret) { dev_err(&cw_bat->client->dev, "cw_bat_gpio_init error\n"); return ret; } cw_bat->client = client; ret = cw_init(cw_bat); while ((loop++ < 200) && (ret != 0)) { ret = cw_init(cw_bat); } if (ret) return ret; cw_bat->rk_bat.name = "rk-bat"; cw_bat->rk_bat.type = POWER_SUPPLY_TYPE_BATTERY; cw_bat->rk_bat.properties = rk_battery_properties; cw_bat->rk_bat.num_properties = ARRAY_SIZE(rk_battery_properties); cw_bat->rk_bat.get_property = rk_battery_get_property; ret = power_supply_register(&client->dev, &cw_bat->rk_bat); if(ret < 0) { dev_err(&cw_bat->client->dev, "power supply register rk_bat error\n"); goto rk_bat_register_fail; } cw_bat->rk_ac.name = "rk-ac"; cw_bat->rk_ac.type = POWER_SUPPLY_TYPE_MAINS; cw_bat->rk_ac.properties = rk_ac_properties; cw_bat->rk_ac.num_properties = ARRAY_SIZE(rk_ac_properties); cw_bat->rk_ac.get_property = rk_ac_get_property; ret = power_supply_register(&client->dev, &cw_bat->rk_ac); if(ret < 0) { dev_err(&cw_bat->client->dev, "power supply register rk_ac error\n"); goto rk_ac_register_fail; } cw_bat->rk_usb.name = "rk-usb"; cw_bat->rk_usb.type = POWER_SUPPLY_TYPE_USB; cw_bat->rk_usb.properties = rk_usb_properties; cw_bat->rk_usb.num_properties = ARRAY_SIZE(rk_usb_properties); cw_bat->rk_usb.get_property = rk_usb_get_property; ret = power_supply_register(&client->dev, &cw_bat->rk_usb); if(ret < 0) { dev_err(&cw_bat->client->dev, "power supply register rk_ac error\n"); goto rk_usb_register_fail; } cw_bat->charger_init_mode = dwc_otg_check_dpdm(); cw_bat->dc_online = 0; cw_bat->usb_online = 0; cw_bat->charger_mode = 0; cw_bat->capacity = 2; cw_bat->voltage = 0; cw_bat->status = 0; cw_bat->time_to_empty = 0; cw_bat->bat_change = 0; cw_update_time_member_capacity_change(cw_bat); cw_update_time_member_charge_start(cw_bat); cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery"); INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work); INIT_DELAYED_WORK(&cw_bat->dc_wakeup_work, dc_detect_do_wakeup); queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(10)); if (cw_bat->plat_data->dc_det_pin != INVALID_GPIO) { irq = gpio_to_irq(cw_bat->plat_data->dc_det_pin); irq_flags = gpio_get_value(cw_bat->plat_data->dc_det_pin) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING; ret = request_irq(irq, dc_detect_irq_handler, irq_flags, "usb_detect", cw_bat); if (ret < 0) { pr_err("%s: request_irq(%d) failed\n", __func__, irq); } enable_irq_wake(irq); } #ifdef BAT_LOW_INTERRUPT INIT_DELAYED_WORK(&cw_bat->bat_low_wakeup_work, bat_low_detect_do_wakeup); wake_lock_init(&bat_low_wakelock, WAKE_LOCK_SUSPEND, "bat_low_detect"); if (cw_bat->plat_data->bat_low_pin != INVALID_GPIO) { irq = gpio_to_irq(cw_bat->plat_data->bat_low_pin); ret = request_irq(irq, bat_low_detect_irq_handler, IRQF_TRIGGER_RISING, "bat_low_detect", cw_bat); if (ret < 0) { gpio_free(cw_bat->plat_data->bat_low_pin); } enable_irq_wake(irq); } #endif dev_info(&cw_bat->client->dev, "cw2015/cw2013 driver v1.2 probe sucess\n"); return 0; rk_usb_register_fail: power_supply_unregister(&cw_bat->rk_bat); rk_ac_register_fail: power_supply_unregister(&cw_bat->rk_ac); rk_bat_register_fail: dev_info(&cw_bat->client->dev, "cw2015/cw2013 driver v1.2 probe error!!!!\n"); return ret; }
static int cw_bat_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct cw_bat_platform_data *pdata = client->dev.platform_data; struct cw_battery *cw_bat; int ret; int loop = 0; printk("\ncw2015/cw2013 driver v1.2 probe start, battery_type_id is %d\n", battery_type_id); cw_bat = kzalloc(sizeof(struct cw_battery), GFP_KERNEL); if (!cw_bat) { dev_err(&cw_bat->client->dev, "fail to allocate memory\n"); return -ENOMEM; } if (client->dev.of_node) { pdata = devm_kzalloc(&client->dev, sizeof(struct cw_bat_platform_data), GFP_KERNEL); if (!pdata) { dev_err(&client->dev, "GTP Failed to allocate memory for pdata\n"); return -ENOMEM; } ret = cw_bat_parse_dt(&client->dev, pdata); if (ret) return ret; } else { pdata = client->dev.platform_data; } if (!pdata) { dev_err(&client->dev, "Invalid pdata\n"); return -EINVAL; } if (battery_type_id == 0) { pdata->cw_bat_config_info = config_info_desai ; } else if (battery_type_id == 1) { pdata->cw_bat_config_info = config_info_feimaotui ; } else if (battery_type_id == 2) { pdata->cw_bat_config_info = config_info_guanyu ; } else if (battery_type_id == 3) { pdata->cw_bat_config_info = config_info_xinwangda; } else { pdata->cw_bat_config_info = config_info; } if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "I2C not supported\n"); return -ENODEV; } cw_bat->client = client; i2c_set_clientdata(client, cw_bat); cw_bat->plat_data = pdata; ret = cw_check_ic(cw_bat); while ((loop++ < 5) && (ret != 0)) { pr_debug(" check ret is %d, loop is %d \n" , ret, loop); ret = cw_check_ic(cw_bat); } if (ret != 0) { pr_debug(" wc_check_ic fail , return ENODEV \n"); return -ENODEV; } ret = cw_init(cw_bat); while ((loop++ < 2000) && (ret != 0)) { ret = cw_init(cw_bat); } if (ret) { return ret; } cw_bat->rk_bat.name = "rk-bat"; cw_bat->rk_bat.type = POWER_SUPPLY_TYPE_BATTERY; cw_bat->rk_bat.properties = rk_battery_properties; cw_bat->rk_bat.num_properties = ARRAY_SIZE(rk_battery_properties); cw_bat->rk_bat.get_property = rk_battery_get_property; ret = power_supply_register(&client->dev, &cw_bat->rk_bat); if (ret < 0) { dev_err(&cw_bat->client->dev, "power supply register rk_bat error\n"); printk("rk_bat_register_fail\n"); goto rk_bat_register_fail; } cw_bat->charger_mode = 0; cw_bat->capacity = 0; cw_bat->voltage = 0; cw_bat->status = 0; cw_bat->time_to_empty = 0; cw_bat->bat_change = 0; cw_update_time_member_capacity_change(cw_bat); cw_update_time_member_charge_start(cw_bat); cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery"); INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work); queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(10)); #ifdef BAT_LOW_INTERRUPT ret = cw_bat_regulator_configure(cw_bat, true); if (ret < 0) { dev_err(&client->dev, "%s Failed to configure regulators\n", __func__); goto err_reg_configure; } ret = cw_bat_power_on(cw_bat, true); if (ret < 0) { dev_err(&client->dev, "%s Failed to power on\n", __func__); goto err_power_device; } ret = cw_bat_pinctrl_init(cw_bat); if (!ret && cw_bat->ts_pinctrl) { ret = pinctrl_select_state(cw_bat->ts_pinctrl, cw_bat->pinctrl_state_active); if (ret < 0) goto err_pinctrl_select; } ret = cw_bat_gpio_configure(cw_bat, true); if (ret < 0) { dev_err(&client->dev, "%s Failed to configure gpios\n", __func__); goto err_gpio_config; } INIT_DELAYED_WORK(&cw_bat->bat_low_wakeup_work, bat_low_detect_do_wakeup); wake_lock_init(&bat_low_wakelock, WAKE_LOCK_SUSPEND, "bat_low_detect"); cw_bat->client->irq = gpio_to_irq(pdata->bat_low_pin); ret = request_threaded_irq(client->irq, NULL, bat_low_detect_irq_handler, pdata->irq_flags, "bat_low_detect", cw_bat); if (ret) { dev_err(&client->dev, "request irq failed\n"); gpio_free(cw_bat->plat_data->bat_low_pin); } /*Chaman add for charger detect*/ charge_psy = power_supply_get_by_name("usb"); err_gpio_config: if (cw_bat->ts_pinctrl) { ret = cw_bat_pinctrl_select(cw_bat, false); if (ret < 0) pr_err("Cannot get idle pinctrl state\n"); } err_pinctrl_select: if (cw_bat->ts_pinctrl) { pinctrl_put(cw_bat->ts_pinctrl); } err_power_device: cw_bat_power_on(cw_bat, false); err_reg_configure: cw_bat_regulator_configure(cw_bat, false); #endif printk("\ncw2015/cw2013 driver v1.2 probe sucess\n"); return 0; rk_bat_register_fail: dev_dbg(&cw_bat->client->dev, "cw2015/cw2013 driver v1.2 probe error!!!!\n"); return ret; }