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; }
static int __devinit smb349_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); struct smb349_charger_platform_data *pdata; int ret, irq_num; 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; pdata = client->dev.platform_data; if(!pdata) { ret = -ENXIO; goto error; } i2c_set_clientdata(client, charger); /* Check battery presence */ if (!smb349_battery_online()) { dev_err(&client->dev, "%s() No Battery present, exiting..\n", __func__); ret = -ENODEV; goto error; } charger->reg_desc.name = "vbus_charger"; charger->reg_desc.ops = &smb349_tegra_regulator_ops; charger->reg_desc.type = REGULATOR_CURRENT; charger->reg_desc.id = pdata->regulator_id; charger->reg_desc.owner = THIS_MODULE; charger->reg_init_data.supply_regulator = NULL; charger->reg_init_data.num_consumer_supplies = pdata->num_consumer_supplies; charger->reg_init_data.regulator_init = NULL; charger->reg_init_data.consumer_supplies = pdata->consumer_supplies; charger->reg_init_data.driver_data = charger; charger->reg_init_data.constraints.name = "vbus_charger"; charger->reg_init_data.constraints.min_uA = 0; charger->reg_init_data.constraints.max_uA = pdata->max_charge_current_mA * 1000; charger->reg_init_data.constraints.valid_modes_mask = REGULATOR_MODE_NORMAL | REGULATOR_MODE_STANDBY; charger->reg_init_data.constraints.valid_ops_mask = REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_CURRENT; charger->rdev = regulator_register(&charger->reg_desc, charger->dev, &charger->reg_init_data, charger); if (IS_ERR(charger->rdev)) { dev_err(&client->dev, "failed to register %s\n", charger->reg_desc.name); ret = PTR_ERR(charger->rdev); goto error; } /* disable OTG */ ret = smb349_configure_otg(client, 0); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring" "charger..\n", __func__); goto error; } ret = smb349_read(client, SMB349_STS_REG_D); if (ret < 0) { dev_err(&client->dev, "%s(): Failed in reading register" "0x%02x\n", __func__, SMB349_STS_REG_D); goto error; } else if (ret != 0) { /* configure charger */ ret = smb349_configure_charger(client, 1); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring" "charger..\n", __func__); goto error; } } else { /* disable charger */ ret = smb349_configure_charger(client, 0); if (ret < 0) { dev_err(&client->dev, "%s() error in configuring" "charger..\n", __func__); goto error; } } ret = register_otg_callback(smb349_otg_status, charger); if (ret < 0) goto error; return 0; error: kfree(charger); return ret; }