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;
}