Skip to content

Commit 7159dbd

Browse files
hkallweitWolfram Sang
authored andcommitted
i2c: core: improve return value handling of i2c_new_device and i2c_new_dummy
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 compatibility 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 <[email protected]> [wsa: rename new functions and fix minor kdoc issues] Signed-off-by: Wolfram Sang <[email protected]> Reviewed-by: Peter Rosin <[email protected]> Reviewed-by: Kieran Bingham <[email protected]> Reviewed-by: Bartosz Golaszewski <[email protected]> Signed-off-by: Wolfram Sang <[email protected]>
1 parent a6a4b66 commit 7159dbd

File tree

1 file changed

+61
-13
lines changed

1 file changed

+61
-13
lines changed

drivers/i2c/i2c-core-base.c

Lines changed: 61 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,7 @@ static int i2c_dev_irq_from_resources(const struct resource *resources,
714714
}
715715

716716
/**
717-
* i2c_new_device - instantiate an i2c device
717+
* i2c_new_client_device - instantiate an i2c device
718718
* @adap: the adapter managing the device
719719
* @info: describes one I2C device; bus_num is ignored
720720
* Context: can sleep
@@ -727,17 +727,17 @@ static int i2c_dev_irq_from_resources(const struct resource *resources,
727727
* before any i2c_adapter could exist.
728728
*
729729
* This returns the new i2c client, which may be saved for later use with
730-
* i2c_unregister_device(); or NULL to indicate an error.
730+
* i2c_unregister_device(); or an ERR_PTR to describe the error.
731731
*/
732-
struct i2c_client *
733-
i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
732+
static struct i2c_client *
733+
i2c_new_client_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
734734
{
735735
struct i2c_client *client;
736736
int status;
737737

738738
client = kzalloc(sizeof *client, GFP_KERNEL);
739739
if (!client)
740-
return NULL;
740+
return ERR_PTR(-ENOMEM);
741741

742742
client->adapter = adap;
743743

@@ -803,7 +803,31 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
803803
client->name, client->addr, status);
804804
out_err_silent:
805805
kfree(client);
806-
return NULL;
806+
return ERR_PTR(status);
807+
}
808+
EXPORT_SYMBOL_GPL(i2c_new_client_device);
809+
810+
/**
811+
* i2c_new_device - instantiate an i2c device
812+
* @adap: the adapter managing the device
813+
* @info: describes one I2C device; bus_num is ignored
814+
* Context: can sleep
815+
*
816+
* This deprecated function has the same functionality as
817+
* @i2c_new_client_device, it just returns NULL instead of an ERR_PTR in case of
818+
* an error for compatibility with current I2C API. It will be removed once all
819+
* users are converted.
820+
*
821+
* This returns the new i2c client, which may be saved for later use with
822+
* i2c_unregister_device(); or NULL to indicate an error.
823+
*/
824+
struct i2c_client *
825+
i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
826+
{
827+
struct i2c_client *ret;
828+
829+
ret = i2c_new_client_device(adap, info);
830+
return IS_ERR(ret) ? NULL : ret;
807831
}
808832
EXPORT_SYMBOL_GPL(i2c_new_device);
809833

@@ -854,7 +878,7 @@ static struct i2c_driver dummy_driver = {
854878
};
855879

856880
/**
857-
* i2c_new_dummy - return a new i2c device bound to a dummy driver
881+
* i2c_new_dummy_device - return a new i2c device bound to a dummy driver
858882
* @adapter: the adapter managing the device
859883
* @address: seven bit address to be used
860884
* Context: can sleep
@@ -869,15 +893,39 @@ static struct i2c_driver dummy_driver = {
869893
* different driver.
870894
*
871895
* This returns the new i2c client, which should be saved for later use with
872-
* i2c_unregister_device(); or NULL to indicate an error.
896+
* i2c_unregister_device(); or an ERR_PTR to describe the error.
873897
*/
874-
struct i2c_client *i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
898+
static struct i2c_client *
899+
i2c_new_dummy_device(struct i2c_adapter *adapter, u16 address)
875900
{
876901
struct i2c_board_info info = {
877902
I2C_BOARD_INFO("dummy", address),
878903
};
879904

880-
return i2c_new_device(adapter, &info);
905+
return i2c_new_client_device(adapter, &info);
906+
}
907+
EXPORT_SYMBOL_GPL(i2c_new_dummy_device);
908+
909+
/**
910+
* i2c_new_dummy - return a new i2c device bound to a dummy driver
911+
* @adapter: the adapter managing the device
912+
* @address: seven bit address to be used
913+
* Context: can sleep
914+
*
915+
* This deprecated function has the same functionality as @i2c_new_dummy_device,
916+
* it just returns NULL instead of an ERR_PTR in case of an error for
917+
* compatibility with current I2C API. It will be removed once all users are
918+
* converted.
919+
*
920+
* This returns the new i2c client, which should be saved for later use with
921+
* i2c_unregister_device(); or NULL to indicate an error.
922+
*/
923+
struct i2c_client *i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
924+
{
925+
struct i2c_client *ret;
926+
927+
ret = i2c_new_dummy_device(adapter, address);
928+
return IS_ERR(ret) ? NULL : ret;
881929
}
882930
EXPORT_SYMBOL_GPL(i2c_new_dummy);
883931

@@ -1000,9 +1048,9 @@ i2c_sysfs_new_device(struct device *dev, struct device_attribute *attr,
10001048
info.flags |= I2C_CLIENT_SLAVE;
10011049
}
10021050

1003-
client = i2c_new_device(adap, &info);
1004-
if (!client)
1005-
return -EINVAL;
1051+
client = i2c_new_client_device(adap, &info);
1052+
if (IS_ERR(client))
1053+
return PTR_ERR(client);
10061054

10071055
/* Keep track of the added device */
10081056
mutex_lock(&adap->userspace_clients_lock);

0 commit comments

Comments
 (0)