static int __devinit sec_charger_probe(
    struct i2c_client *client,
    const struct i2c_device_id *id)
{
    struct i2c_adapter *adapter =
        to_i2c_adapter(client->dev.parent);
    struct sec_charger_info *charger;
    int ret = 0;

    dev_dbg(&client->dev,
            "%s: SEC Charger Driver Loading\n", __func__);

    if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE))
        return -EIO;

    charger = kzalloc(sizeof(*charger), GFP_KERNEL);
    if (!charger)
        return -ENOMEM;

    charger->client = client;
    charger->pdata = client->dev.platform_data;

    i2c_set_clientdata(client, charger);

    charger->psy_chg.name		= "sec-charger";
    charger->psy_chg.type		= POWER_SUPPLY_TYPE_BATTERY;
    charger->psy_chg.get_property	= sec_chg_get_property;
    charger->psy_chg.set_property	= sec_chg_set_property;
    charger->psy_chg.properties	= sec_charger_props;
    charger->psy_chg.num_properties	= ARRAY_SIZE(sec_charger_props);

    if (!charger->pdata->chg_gpio_init()) {
        dev_err(&client->dev,
                "%s: Failed to Initialize GPIO\n", __func__);
        goto err_free;
    }

    if (!sec_hal_chg_init(charger->client)) {
        dev_err(&client->dev,
                "%s: Failed to Initialize Charger\n", __func__);
        goto err_free;
    }

    ret = power_supply_register(&client->dev, &charger->psy_chg);
    if (ret) {
        dev_err(&client->dev,
                "%s: Failed to Register psy_chg\n", __func__);
        goto err_free;
    }

    if (charger->pdata->chg_irq) {
        ret = request_threaded_irq(charger->pdata->chg_irq,
                                   NULL, sec_chg_irq_thread,
                                   charger->pdata->chg_irq_attr,
                                   "charger-irq", charger);
        if (ret) {
            dev_err(&client->dev,
                    "%s: Failed to Reqeust IRQ\n", __func__);
            goto err_supply_unreg;
        }

        if (charger->pdata->full_check_type ==
                SEC_BATTERY_FULLCHARGED_CHGINT) {
            ret = enable_irq_wake(charger->pdata->chg_irq);
            if (ret < 0)
                dev_err(&client->dev,
                        "%s: Failed to Enable Wakeup Source(%d)\n",
                        __func__, ret);
        }

        INIT_DELAYED_WORK_DEFERRABLE(
            &charger->isr_work, sec_chg_isr_work);
    }

    ret = sec_chg_create_attrs(charger->psy_chg.dev);
    if (ret) {
        dev_err(&client->dev,
                "%s : Failed to create_attrs\n", __func__);
        goto err_supply_unreg;
    }

    dev_dbg(&client->dev,
            "%s: SEC Charger Driver Loaded\n", __func__);
    return 0;

err_supply_unreg:
    power_supply_unregister(&charger->psy_chg);
err_free:
    kfree(charger);

    return ret;
}
static int __devinit sec_charger_probe(struct platform_device *pdev)
{
	struct sec_charger_info *charger;
	sec_charger_dev_t *mfd_dev = dev_get_drvdata(pdev->dev.parent);
	sec_charger_pdata_t *pdata = dev_get_platdata(mfd_dev->dev);
	int ret = 0;

	dev_dbg(&pdev->dev,
		"%s: SEC Charger Driver Loading\n", __func__);

	charger = kzalloc(sizeof(*charger), GFP_KERNEL);
	if (!charger)
		return -ENOMEM;

	platform_set_drvdata(pdev, charger);

	charger->client = mfd_dev->i2c;
	charger->pdata = pdata->charger_data;

	charger->psy_chg.name		= "sec-charger";
	charger->psy_chg.type		= POWER_SUPPLY_TYPE_UNKNOWN;
	charger->psy_chg.get_property	= sec_chg_get_property;
	charger->psy_chg.set_property	= sec_chg_set_property;
	charger->psy_chg.properties	= sec_charger_props;
	charger->psy_chg.num_properties	= ARRAY_SIZE(sec_charger_props);

	if (!charger->pdata->chg_gpio_init()) {
		dev_err(&pdev->dev,
			"%s: Failed to Initialize GPIO\n", __func__);
		goto err_free;
	}

	if (!sec_hal_chg_init(charger)) {
		dev_err(&pdev->dev,
			"%s: Failed to Initialize Charger\n", __func__);
		goto err_free;
	}

	ret = power_supply_register(&pdev->dev, &charger->psy_chg);
	if (ret) {
		dev_err(&pdev->dev,
			"%s: Failed to Register psy_chg\n", __func__);
		goto err_free;
	}

	if (charger->pdata->chg_irq) {
		INIT_DELAYED_WORK_DEFERRABLE(
			&charger->isr_work, sec_chg_isr_work);

		ret = request_threaded_irq(charger->pdata->chg_irq,
				NULL, sec_chg_irq_thread,
				charger->pdata->chg_irq_attr,
				"charger-irq", charger);
		if (ret) {
			dev_err(&pdev->dev,
				"%s: Failed to Reqeust IRQ\n", __func__);
			goto err_supply_unreg;
		}

			ret = enable_irq_wake(charger->pdata->chg_irq);
			if (ret < 0)
				dev_err(&pdev->dev,
					"%s: Failed to Enable Wakeup Source(%d)\n",
					__func__, ret);
		}

	ret = sec_chg_create_attrs(charger->psy_chg.dev);
	if (ret) {
		dev_err(&pdev->dev,
			"%s : Failed to create_attrs\n", __func__);
		goto err_req_irq;
	}

	dev_dbg(&pdev->dev,
		"%s: SEC Charger Driver Loaded\n", __func__);
	return 0;

err_req_irq:
	if (charger->pdata->chg_irq)
		free_irq(charger->pdata->chg_irq, charger);
err_supply_unreg:
	power_supply_unregister(&charger->psy_chg);
err_free:
	kfree(charger);

	return ret;
}