static int bq27xxx_battery_platform_probe(struct platform_device *pdev) { struct bq27xxx_device_info *di; struct bq27xxx_platform_data *pdata = pdev->dev.platform_data; if (!pdata) { dev_err(&pdev->dev, "no platform_data supplied\n"); return -EINVAL; } if (!pdata->read) { dev_err(&pdev->dev, "no hdq read callback supplied\n"); return -EINVAL; } if (!pdata->chip) { dev_err(&pdev->dev, "no device supplied\n"); return -EINVAL; } di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); if (!di) return -ENOMEM; platform_set_drvdata(pdev, di); di->dev = &pdev->dev; di->chip = pdata->chip; di->name = pdata->name ?: dev_name(&pdev->dev); di->bus.read = bq27xxx_battery_platform_read; return bq27xxx_battery_setup(di); }
static int bq27xxx_battery_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct bq27xxx_device_info *di; int ret; char *name; int num; /* Get new ID for the new battery device */ mutex_lock(&battery_mutex); num = idr_alloc(&battery_id, client, 0, 0, GFP_KERNEL); mutex_unlock(&battery_mutex); if (num < 0) return num; name = devm_kasprintf(&client->dev, GFP_KERNEL, "%s-%d", id->name, num); if (!name) goto err_mem; di = devm_kzalloc(&client->dev, sizeof(*di), GFP_KERNEL); if (!di) goto err_mem; di->id = num; di->dev = &client->dev; di->chip = id->driver_data; di->name = name; di->bus.read = bq27xxx_battery_i2c_read; ret = bq27xxx_battery_setup(di); if (ret) goto err_failed; /* Schedule a polling after about 1 min */ schedule_delayed_work(&di->work, 60 * HZ); i2c_set_clientdata(client, di); if (client->irq) { ret = devm_request_threaded_irq(&client->dev, client->irq, NULL, bq27xxx_battery_irq_handler_thread, IRQF_ONESHOT, di->name, di); if (ret) { dev_err(&client->dev, "Unable to register IRQ %d error %d\n", client->irq, ret); return ret; } } return 0; err_mem: ret = -ENOMEM; err_failed: mutex_lock(&battery_mutex); idr_remove(&battery_id, num); mutex_unlock(&battery_mutex); return ret; }