aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/driver-model/devres.txt3
-rw-r--r--drivers/i2c/i2c-core-base.c44
-rw-r--r--include/linux/i2c.h3
3 files changed, 50 insertions, 0 deletions
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt
index 99994a461359..69c7fa7f616c 100644
--- a/Documentation/driver-model/devres.txt
+++ b/Documentation/driver-model/devres.txt
@@ -271,6 +271,9 @@ GPIO
271 devm_gpio_request_one() 271 devm_gpio_request_one()
272 devm_gpio_free() 272 devm_gpio_free()
273 273
274I2C
275 devm_i2c_new_dummy_device()
276
274IIO 277IIO
275 devm_iio_device_alloc() 278 devm_iio_device_alloc()
276 devm_iio_device_free() 279 devm_iio_device_free()
diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c
index 9c38dde73366..d389d4fb0623 100644
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@ -929,6 +929,50 @@ struct i2c_client *i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
929} 929}
930EXPORT_SYMBOL_GPL(i2c_new_dummy); 930EXPORT_SYMBOL_GPL(i2c_new_dummy);
931 931
932struct i2c_dummy_devres {
933 struct i2c_client *client;
934};
935
936static 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 */
953struct 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}
974EXPORT_SYMBOL_GPL(devm_i2c_new_dummy_device);
975
932/** 976/**
933 * i2c_new_secondary_device - Helper to get the instantiated secondary address 977 * i2c_new_secondary_device - Helper to get the instantiated secondary address
934 * and create the associated device 978 * and create the associated device
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index be27062f8ed1..6c4db54714f6 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -470,6 +470,9 @@ extern struct i2c_client *
470i2c_new_dummy(struct i2c_adapter *adap, u16 address); 470i2c_new_dummy(struct i2c_adapter *adap, u16 address);
471 471
472extern struct i2c_client * 472extern struct i2c_client *
473devm_i2c_new_dummy_device(struct device *dev, struct i2c_adapter *adap, u16 address);
474
475extern struct i2c_client *
473i2c_new_secondary_device(struct i2c_client *client, 476i2c_new_secondary_device(struct i2c_client *client,
474 const char *name, 477 const char *name,
475 u16 default_addr); 478 u16 default_addr);