Skip to content

Commit b8f5fe3

Browse files
hkallweitWolfram Sang
authored andcommitted
i2c: core: add device-managed version of i2c_new_dummy
i2c_new_dummy is typically called from the probe function of the driver for the primary i2c client. It requires calls to i2c_unregister_device in the error path of the probe function and in the remove function. This can be simplified by introducing a device-managed version. Note the changed error case return value type: i2c_new_dummy returns NULL whilst devm_i2c_new_dummy_device returns an ERR_PTR. 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 7159dbd commit b8f5fe3

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

Documentation/driver-model/devres.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,9 @@ GPIO
271271
devm_gpio_request_one()
272272
devm_gpio_free()
273273

274+
I2C
275+
devm_i2c_new_dummy_device()
276+
274277
IIO
275278
devm_iio_device_alloc()
276279
devm_iio_device_free()

drivers/i2c/i2c-core-base.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -929,6 +929,50 @@ struct i2c_client *i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
929929
}
930930
EXPORT_SYMBOL_GPL(i2c_new_dummy);
931931

932+
struct i2c_dummy_devres {
933+
struct i2c_client *client;
934+
};
935+
936+
static void devm_i2c_release_dummy(struct device *dev, void *res)
937+
{
938+
struct i2c_dummy_devres *this = res;
939+
940+
i2c_unregister_device(this->client);
941+
}
942+
943+
/**
944+
* devm_i2c_new_dummy_device - return a new i2c device bound to a dummy driver
945+
* @dev: device the managed resource is bound to
946+
* @adapter: the adapter managing the device
947+
* @address: seven bit address to be used
948+
* Context: can sleep
949+
*
950+
* This is the device-managed version of @i2c_new_dummy_device. It returns the
951+
* new i2c client or an ERR_PTR in case of an error.
952+
*/
953+
struct i2c_client *devm_i2c_new_dummy_device(struct device *dev,
954+
struct i2c_adapter *adapter,
955+
u16 address)
956+
{
957+
struct i2c_dummy_devres *dr;
958+
struct i2c_client *client;
959+
960+
dr = devres_alloc(devm_i2c_release_dummy, sizeof(*dr), GFP_KERNEL);
961+
if (!dr)
962+
return ERR_PTR(-ENOMEM);
963+
964+
client = i2c_new_dummy_device(adapter, address);
965+
if (IS_ERR(client)) {
966+
devres_free(dr);
967+
} else {
968+
dr->client = client;
969+
devres_add(dev, dr);
970+
}
971+
972+
return client;
973+
}
974+
EXPORT_SYMBOL_GPL(devm_i2c_new_dummy_device);
975+
932976
/**
933977
* i2c_new_secondary_device - Helper to get the instantiated secondary address
934978
* and create the associated device

include/linux/i2c.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,9 @@ extern int i2c_probe_func_quick_read(struct i2c_adapter *, unsigned short addr);
469469
extern struct i2c_client *
470470
i2c_new_dummy(struct i2c_adapter *adap, u16 address);
471471

472+
extern struct i2c_client *
473+
devm_i2c_new_dummy_device(struct device *dev, struct i2c_adapter *adap, u16 address);
474+
472475
extern struct i2c_client *
473476
i2c_new_secondary_device(struct i2c_client *client,
474477
const char *name,

0 commit comments

Comments
 (0)