static int sec_charger_probe(struct platform_device *pdev) { sec_battery_platform_data_t *pdata = NULL; struct sec_charger_info *charger; int ret = 0; dev_info(&pdev->dev, "%s: SEC Charger Driver Loading\n", __func__); charger = kzalloc(sizeof(*charger), GFP_KERNEL); if (!charger) return -ENOMEM; pdata = dev_get_platdata(&pdev->dev); charger->pdata = pdata; platform_set_drvdata(pdev, charger); 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(&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 : %d\n", __func__, ret); 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_info(&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; }
static int __devinit sec_charger_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct sec_charger_info *charger; struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); 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_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(&client->dev, "%s: Failed to Initialize GPIO\n", __func__); goto err_free; } if (!sec_hal_chg_init(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) { 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(&client->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(&client->dev, "%s: Failed to Enable Wakeup Source(%d)\n", __func__, ret); } ret = sec_chg_create_attrs(charger->psy_chg.dev); if (ret) { dev_err(&client->dev, "%s : Failed to create_attrs\n", __func__); goto err_req_irq; } dev_dbg(&client->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; }