diff options
| -rw-r--r-- | Documentation/driver-model/devres.txt | 3 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core-base.c | 44 | ||||
| -rw-r--r-- | include/linux/i2c.h | 3 |
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 | ||
| 274 | I2C | ||
| 275 | devm_i2c_new_dummy_device() | ||
| 276 | |||
| 274 | IIO | 277 | IIO |
| 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 | } |
| 930 | EXPORT_SYMBOL_GPL(i2c_new_dummy); | 930 | EXPORT_SYMBOL_GPL(i2c_new_dummy); |
| 931 | 931 | ||
| 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 | |||
| 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 * | |||
| 470 | i2c_new_dummy(struct i2c_adapter *adap, u16 address); | 470 | i2c_new_dummy(struct i2c_adapter *adap, u16 address); |
| 471 | 471 | ||
| 472 | extern struct i2c_client * | 472 | extern struct i2c_client * |
| 473 | devm_i2c_new_dummy_device(struct device *dev, struct i2c_adapter *adap, u16 address); | ||
| 474 | |||
| 475 | extern struct i2c_client * | ||
| 473 | i2c_new_secondary_device(struct i2c_client *client, | 476 | i2c_new_secondary_device(struct i2c_client *client, |
| 474 | const char *name, | 477 | const char *name, |
| 475 | u16 default_addr); | 478 | u16 default_addr); |
