From patchwork Fri Dec 15 17:43:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 849278 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-i2c-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="s7WloNnr"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yyyVP5NRtz9ryk for ; Sat, 16 Dec 2017 04:44:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755899AbdLORo2 (ORCPT ); Fri, 15 Dec 2017 12:44:28 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:41002 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755650AbdLORo1 (ORCPT ); Fri, 15 Dec 2017 12:44:27 -0500 Received: by mail-wm0-f67.google.com with SMTP id g75so19072404wme.0; Fri, 15 Dec 2017 09:44:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=KyX88uEtMQ3364t/TX/7WHD7Ud/01PuQoKpoAALZdr0=; b=s7WloNnrOVB/dawwupvuTQLAwrVA01InGR+uBr6LPChPT5PfRO87GhqXX85Y4kXOf1 JlRpUaiqukS4nmB4vrZF2gESh3cglbe0q++higpkd6TIIHvNagYRoul6llboxJYWxa80 u/9hbZnUi1Y07Lib0wcdcA9pggQJOLeE+PidDH5U2okY0TMPMbWNXj7qWnahIMyp9WNq NrIEHUorJIl1i/UtKZiLlTAGgvfTwux9ZKSRNbqAEzbiqyhX1KzY5QNWzPQnT8prDv/T eQ86s2VcJYWqvXVEWzNDdjNUChVehPGq3Q8JY3/arKTAfwjMWJs4AdCPwBr2O2c2BQQf Ee1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=KyX88uEtMQ3364t/TX/7WHD7Ud/01PuQoKpoAALZdr0=; b=mv/mwNDBMlu4HIPuY8aZ1AN+kzXmv5FBdfy2jpSPlX2p5PpiwOUSDBqYPvKQLbFCtX UZyjGdQe/ggR0ulS8FpZ+r33Lpkn5sUrVXo7wHvmXijNvYpiPGTjvPokYVTYa52R0+hR qvtl1+YR+PIxMOAdK5NpPjOW+rmFoPo6a0tYu6Ub51Zjq+K73ep7gi51Agd1dGInpmwV F8ItfrW9yU4+EAwAireqcXCHdYxZcAnn3vj7u52kglYmlG6rz/bjS9IdeRY3rasDgGdS GXWIWOAJRp5I8YHGOw51OSaDRdUGnMixoXUGvt12OE4pZh5fFtwlYEyCNpf9M4wPVf7z roLA== X-Gm-Message-State: AKGB3mJaHTYeb09Uz1zq4Y+ryrhQcT95LeXa0m5y7zHP0lYqhV38zOlp bYcpivbXehHUlcPYOs91RL5H5g== X-Google-Smtp-Source: ACJfBovj9ISPWL3YjWSYGbpsizoh7tV08CfMVzict2SKzFAKedA1izkwUHsNv/KpzeghHbp/cEIo3Q== X-Received: by 10.80.214.202 with SMTP id l10mr17759799edj.58.1513359865511; Fri, 15 Dec 2017 09:44:25 -0800 (PST) Received: from ?IPv6:2003:ea:8bc0:e400:b0d3:a11f:88fd:f202? (p200300EA8BC0E400B0D3A11F88FDF202.dip0.t-ipconnect.de. [2003:ea:8bc0:e400:b0d3:a11f:88fd:f202]) by smtp.googlemail.com with ESMTPSA id a38sm5811964edf.3.2017.12.15.09.44.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 15 Dec 2017 09:44:24 -0800 (PST) From: Heiner Kallweit Subject: [PATCH v4 1/3] i2c: core: improve return value handling of i2c_new_device and i2c_new_dummy To: Bartosz Golaszewski , Wolfram Sang , Peter Rosin Cc: "linux-i2c@vger.kernel.org" , Linux Kernel Mailing List References: <083569b1-489a-d84f-1a87-bca52fad53e1@gmail.com> Message-ID: <8d2c0c10-e308-d038-4b68-e030404abe26@gmail.com> Date: Fri, 15 Dec 2017 18:43:44 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <083569b1-489a-d84f-1a87-bca52fad53e1@gmail.com> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Currently i2c_new_device and i2c_new_dummy return just NULL in error case although they have more error details internally. Therefore move the functionality into new functions returning detailed errors and add wrappers for compatibilty with the current API. This allows to use these functions with detailed error codes within the i2c core or for API extensions. Signed-off-by: Heiner Kallweit Reviewed-by: Bartosz Golaszewski --- v3: - prefix i2c_new_device and i2c_new_dummy with two underscores instead one v4: - add missing kernel doc - add reviewed-by --- drivers/i2c/i2c-core-base.c | 70 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 13 deletions(-) diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index bb34a5d41..3b962456c 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -656,7 +656,7 @@ static int i2c_dev_irq_from_resources(const struct resource *resources, } /** - * i2c_new_device - instantiate an i2c device + * __i2c_new_device - instantiate an i2c device * @adap: the adapter managing the device * @info: describes one I2C device; bus_num is ignored * Context: can sleep @@ -669,17 +669,17 @@ static int i2c_dev_irq_from_resources(const struct resource *resources, * before any i2c_adapter could exist. * * This returns the new i2c client, which may be saved for later use with - * i2c_unregister_device(); or NULL to indicate an error. + * i2c_unregister_device(); or an ERR_PTR to indicate an error. */ -struct i2c_client * -i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) +static struct i2c_client * +__i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) { struct i2c_client *client; int status; client = kzalloc(sizeof *client, GFP_KERNEL); if (!client) - return NULL; + return ERR_PTR(-ENOMEM); client->adapter = adap; @@ -746,7 +746,29 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) client->name, client->addr, status); out_err_silent: kfree(client); - return NULL; + return ERR_PTR(status); +} + +/** + * i2c_new_device - instantiate an i2c device + * @adap: the adapter managing the device + * @info: describes one I2C device; bus_num is ignored + * Context: can sleep + * + * This function has the same functionality like __i2_new_device, it just + * returns NULL instead of an ERR_PTR in case of an error for compatibility + * with current I2C API. + * + * This returns the new i2c client, which may be saved for later use with + * i2c_unregister_device(); or NULL to indicate an error. + */ +struct i2c_client * +i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) +{ + struct i2c_client *ret; + + ret = __i2c_new_device(adap, info); + return IS_ERR(ret) ? NULL : ret; } EXPORT_SYMBOL_GPL(i2c_new_device); @@ -793,7 +815,7 @@ static struct i2c_driver dummy_driver = { }; /** - * i2c_new_dummy - return a new i2c device bound to a dummy driver + * __i2c_new_dummy - return a new i2c device bound to a dummy driver * @adapter: the adapter managing the device * @address: seven bit address to be used * Context: can sleep @@ -808,15 +830,37 @@ static struct i2c_driver dummy_driver = { * different driver. * * This returns the new i2c client, which should be saved for later use with - * i2c_unregister_device(); or NULL to indicate an error. + * i2c_unregister_device(); or an ERR_PTR to indicate an error. */ -struct i2c_client *i2c_new_dummy(struct i2c_adapter *adapter, u16 address) +static struct i2c_client * +__i2c_new_dummy(struct i2c_adapter *adapter, u16 address) { struct i2c_board_info info = { I2C_BOARD_INFO("dummy", address), }; - return i2c_new_device(adapter, &info); + return __i2c_new_device(adapter, &info); +} + +/** + * i2c_new_dummy - return a new i2c device bound to a dummy driver + * @adapter: the adapter managing the device + * @address: seven bit address to be used + * Context: can sleep + * + * This function has the same functionality like __i2_new_dummy, it just + * returns NULL instead of an ERR_PTR in case of an error for compatibility + * with current I2C API. + * + * This returns the new i2c client, which should be saved for later use with + * i2c_unregister_device(); or an ERR_PTR to indicate an error. + */ +struct i2c_client *i2c_new_dummy(struct i2c_adapter *adapter, u16 address) +{ + struct i2c_client *ret; + + ret = __i2c_new_dummy(adapter, address); + return IS_ERR(ret) ? NULL : ret; } EXPORT_SYMBOL_GPL(i2c_new_dummy); @@ -939,9 +983,9 @@ i2c_sysfs_new_device(struct device *dev, struct device_attribute *attr, info.flags |= I2C_CLIENT_SLAVE; } - client = i2c_new_device(adap, &info); - if (!client) - return -EINVAL; + client = __i2c_new_device(adap, &info); + if (IS_ERR(client)) + return PTR_ERR(client); /* Keep track of the added device */ mutex_lock(&adap->userspace_clients_lock);