static int __devinit smb347_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); int ret, irq_num, i; uint8_t val, buf[15]; 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->dev = &client->dev; i2c_set_clientdata(client, charger); /* Restore default setting: APSD Enable & 5/1/HC mode Pin control */ smb347_default_setback(); ret = sysfs_create_group(&client->dev.kobj, &smb347_group); if (ret) { dev_err(&client->dev, "smb347_probe: unable to create the sysfs\n"); } mutex_init(&charger->cable_lock); smb347_wq = create_singlethread_workqueue("smb347_wq"); INIT_DELAYED_WORK_DEFERRABLE(&charger->inok_isr_work, inok_isr_work_function); //INIT_DELAYED_WORK(&charger->regs_dump_work, regs_dump_work_func); ret = smb347_inok_irq(charger); if (ret) { dev_err(&client->dev, "%s(): Failed in requesting ACOK# pin isr\n", __func__); goto error; } //queue_delayed_work(smb347_wq, &charger->regs_dump_work, 30*HZ); cable_type_detect(); ret = register_otg_callback( (callback_t)smb347_otg_status, charger); if (ret < 0) goto error; return 0; error: kfree(charger); return ret; }
static int __devinit smb347_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); int ret, irq_num; uint8_t buf[15]; 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->dev = &client->dev; i2c_set_clientdata(client, charger); /* disable STAT pin IRQ */ smb347_intr_sts(charger->client); ret = sysfs_create_group(&client->dev.kobj, &smb347_group); if (ret) { dev_err(&client->dev, "smb347_probe: unable to create the sysfs\n"); } mutex_init(&charger->cable_lock); smb347_wq = create_singlethread_workqueue("smb347_wq"); INIT_DELAYED_WORK_DEFERRABLE(&charger->inok_isr_work, inok_isr_work_function); INIT_DELAYED_WORK_DEFERRABLE(&charger->cable_det_work, cable_type_detect); wake_lock_init(&charger_wakelock, WAKE_LOCK_SUSPEND, "charger_configuration"); wake_lock_init(&charger_ac_detec_wakelock, WAKE_LOCK_SUSPEND, "charger_ac_detec_wakelock"); INIT_DELAYED_WORK(&charger->curr_limit_work, smb347_set_curr_limit_work_func); INIT_DELAYED_WORK(&charger->test_fail_clear_work, smb347_test_fail_clear_work_function); charger->curr_limit = UINT_MAX; smb347_set_InputCurrentlimit(charger->client, 900); charger->cur_cable_type = non_cable; charger->old_cable_type = non_cable; charger->test_1800mA_fail = 0; ret = smb347_inok_irq(charger); if (ret) { dev_err(&client->dev, "%s(): Failed in requesting ACOK# pin isr\n", __func__); goto error; } queue_delayed_work(smb347_wq, &charger->cable_det_work, 0.5*HZ); ret = register_otg_callback(smb347_otg_status, charger); if (ret < 0) goto error; smb347_charger_status = 1; return 0; error: kfree(charger); return ret; }