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; }
int main(int argc,char**argv) { char*help[]={"help",NULL}; char*help_all[]={"help","all",NULL}; char*help_you[]={"help","you",NULL}; char*list[]={"list",NULL}; char*list_all[]={"list","all",NULL}; char*list_all_but[]={"list","all","but",NULL}; char*list_show[]={"list","show",NULL}; char*list_show_all[]={"list","show","all",NULL}; char*play[]={"play",NULL}; char*play_list[]={"play","list",NULL}; char*play_mode[]={"play","mode",NULL}; char*play_all[]={"play","all",NULL}; //init CmdWise cw_init(); cw_register_cmd(help,ARG_N,"help command",help_cb); cw_register_cmd(help_all,ARG_0,"help all command",help_all_cb); cw_register_cmd(help_you,ARG_0,"help you command",NULL); cw_register_cmd(list,ARG_0,"list command",list_cb); cw_register_cmd(list_all,ARG_0,"list all command",list_all_cb); cw_register_cmd(list_all_but,ARG_1,"list all but command",list_all_but_cb); cw_register_cmd(list_show,ARG_N,"list show command",list_show_cb); cw_register_cmd(list_show_all,ARG_0,"list show all command",list_show_all_cb); cw_register_cmd(play,ARG_N,"play command",NULL); cw_register_cmd(play_list,ARG_1,"play list command",NULL); cw_register_cmd(play_mode,ARG_1,"play mode command",NULL); cw_register_cmd(play_all,ARG_0,"play all command",NULL); cw_print_cmds_tree(); // printf("-----\n\n"); // cw_unregister_cmd(&RCMDs.heads,list_all); // cw_unregister_cmd(play_all); // cw_print_cmds_tree(); printf("==================\n\n"); char**argvs; char linebuf[1024]; while(fgets(linebuf,1024,stdin)){ argvs=cw_parse_line(linebuf); cw_print_argvs(argvs); cw_invoke_cmd(argvs); cw_free_argvs(argvs); printf("-=-=-=-=-=-=-=-=-=-\n"); } return 0; }
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; }