static int bdata_probe(struct platform_device *pdev) { struct semc_battery_platform_data *pdata; struct data_info *di; pr_info("%s: probe\n", SEMC_BDATA_NAME); di = kzalloc(sizeof(struct data_info), GFP_KERNEL); if (!di) { pr_err("%s: Memory alloc fail\n", SEMC_BDATA_NAME); return -ENOMEM; } di->bdata_ps.name = pdev->name; di->bdata_ps.type = POWER_SUPPLY_TYPE_BATTERY; di->bdata_ps.properties = batt_props; di->bdata_ps.num_properties = ARRAY_SIZE(batt_props); di->bdata_ps.get_property = bdata_get_property; di->bdata_ps.external_power_changed = bdata_external_power_changed; di->bdata.technology = BATTERY_TECHNOLOGY_UNKNOWN; di->bdata.cap_percent = 50; di->bdata.temp_celsius = 25; di->bdata.temp_celsius_amb = 25; pdata = (struct semc_battery_platform_data *)pdev->dev.platform_data; if (pdata) { di->set_battery_health = pdata->set_battery_health; di->use_fuelgauge = pdata->use_fuelgauge; if (di->use_fuelgauge) { di->bdata_ps.properties = batt_props_with_fg; di->bdata_ps.num_properties = ARRAY_SIZE(batt_props_with_fg); } if (pdata->supplied_to) { di->bdata_ps.supplied_to = pdata->supplied_to; di->bdata_ps.num_supplicants = pdata->num_supplicants; } } mutex_init(&di->lock); INIT_WORK(&di->external_change_work, bdata_external_power_changed_work); INIT_DELAYED_WORK(&di->oem_rapi_client_start_work, bdata_oem_rapi_client_start_work); if (power_supply_register(&pdev->dev, &di->bdata_ps)) { pr_err("%s: Failed to register power supply\n", SEMC_BDATA_NAME); kfree(di); return -EPERM; } platform_set_drvdata(pdev, di); schedule_delayed_work(&di->oem_rapi_client_start_work, 0); #ifdef DEBUG_FS if (semc_battery_create_attrs(di->bdata_ps.dev)) pr_info("%s: Debug support failed\n", SEMC_BDATA_NAME); #endif return 0; }
static int bdata_probe(struct platform_device *pdev) { int rc = 0; struct semc_battery_platform_data *pdata; struct data_info *di; dev_info(&pdev->dev, "probe\n"); di = kzalloc(sizeof(struct data_info), GFP_KERNEL); if (!di) { dev_err(&pdev->dev, "Memory alloc fail\n"); rc = -ENOMEM; goto probe_exit; } di->dev = &pdev->dev; di->bdata_ps.name = pdev->name; di->bdata_ps.type = POWER_SUPPLY_TYPE_BATTERY; di->bdata_ps.properties = batt_props; di->bdata_ps.num_properties = ARRAY_SIZE(batt_props); di->bdata_ps.get_property = bdata_get_property; di->bdata_ps.external_power_changed = bdata_external_power_changed; di->technology = BATTERY_TECHNOLOGY_UNKNOWN; di->temp_celsius = 25; di->temp_celsius_amb = 25; pdata = (struct semc_battery_platform_data *)pdev->dev.platform_data; if (pdata) { if (pdata->supplied_to) { di->bdata_ps.supplied_to = pdata->supplied_to; di->bdata_ps.num_supplicants = pdata->num_supplicants; } di->pdata = pdata; } mutex_init(&di->lock); hrtimer_init(&di->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); di->timer.function = semc_battery_timer_func; di->wq = create_singlethread_workqueue("semc_battery_work"); if (!di->wq) { dev_err(&pdev->dev, "Failed creating workqueue\n"); rc = -EIO; goto probe_exit_free; } INIT_WORK(&di->timer_work, semc_battery_timer_worker); INIT_WORK(&di->external_change_work, bdata_external_power_changed_work); if (power_supply_register(&pdev->dev, &di->bdata_ps)) { dev_err(&pdev->dev, "Failed to register power supply\n"); rc = -EPERM; goto probe_exit_destroy_wq; } semc_battery_timer_start(di); if (semc_battery_create_attrs(di->bdata_ps.dev)) dev_info(&pdev->dev, "Debug support failed\n"); return rc; probe_exit_destroy_wq: destroy_workqueue(di->wq); probe_exit_free: kfree(di); probe_exit: return rc; }