Message ID | 20201130133129.1024662-16-djrscally@gmail.com |
---|---|
State | New |
Headers | show |
Series | None | expand |
On 30/11/2020 17:11, Laurent Pinchart wrote: > Hi Daniel, > > Thank you for the patch. > > On Mon, Nov 30, 2020 at 01:31:26PM +0000, Daniel Scally wrote: >> Some places in the kernel allow users to map resources to a device >> using device name (for example, gpiod_lookup_table). Currently >> this involves waiting for the i2c_client to have been registered so we >> can use dev_name(&client->dev). Adding this function means that we can >> achieve the same thing without having to wait to the i2c device. >> >> Signed-off-by: Daniel Scally <djrscally@gmail.com> >> --- >> Changes since RFC v3: >> >> - Patch introduced >> >> drivers/i2c/i2c-core-acpi.c | 14 ++++++++++++++ >> include/linux/i2c.h | 5 +++++ >> 2 files changed, 19 insertions(+) >> >> diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c >> index 37c510d9347a..d3a653eac79e 100644 >> --- a/drivers/i2c/i2c-core-acpi.c >> +++ b/drivers/i2c/i2c-core-acpi.c >> @@ -497,6 +497,20 @@ struct i2c_client *i2c_acpi_new_device(struct device *dev, int index, >> } >> EXPORT_SYMBOL_GPL(i2c_acpi_new_device); >> >> +/** >> + * i2c_acpi_dev_name - Construct i2c device name for devs sourced from ACPI >> + * @adev: ACPI device to construct the name for >> + * >> + * Prefixes "i2c-" to the ACPI device name, for use in i2c_dev_set_name() and >> + * also anywhere else in the kernel that needs to refer to an i2c device by >> + * name but before they have been instantiated. > > The documentation should state that the caller must free the return > value. Updated to include that - thanks >> + */ >> +char *i2c_acpi_dev_name(struct acpi_device *adev) >> +{ >> + return kasprintf(GFP_KERNEL, "i2c-%s", acpi_dev_name(adev)); >> +} >> +EXPORT_SYMBOL_GPL(i2c_acpi_dev_name); >> + >> #ifdef CONFIG_ACPI_I2C_OPREGION >> static int acpi_gsb_i2c_read_bytes(struct i2c_client *client, >> u8 cmd, u8 *data, u8 data_len) >> diff --git a/include/linux/i2c.h b/include/linux/i2c.h >> index 56622658b215..ab0e505b2ca6 100644 >> --- a/include/linux/i2c.h >> +++ b/include/linux/i2c.h >> @@ -995,6 +995,7 @@ bool i2c_acpi_get_i2c_resource(struct acpi_resource *ares, >> u32 i2c_acpi_find_bus_speed(struct device *dev); >> struct i2c_client *i2c_acpi_new_device(struct device *dev, int index, >> struct i2c_board_info *info); >> +char *i2c_acpi_dev_name(struct acpi_device *adev); >> struct i2c_adapter *i2c_acpi_find_adapter_by_handle(acpi_handle handle); >> #else >> static inline bool i2c_acpi_get_i2c_resource(struct acpi_resource *ares, >> @@ -1011,6 +1012,10 @@ static inline struct i2c_client *i2c_acpi_new_device(struct device *dev, >> { >> return ERR_PTR(-ENODEV); >> } >> +static inline char *i2c_acpi_dev_name(struct acpi_device *adev) >> +{ >> + return NULL; >> +} >> static inline struct i2c_adapter *i2c_acpi_find_adapter_by_handle(acpi_handle handle) >> { >> return NULL; >
diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c index 37c510d9347a..d3a653eac79e 100644 --- a/drivers/i2c/i2c-core-acpi.c +++ b/drivers/i2c/i2c-core-acpi.c @@ -497,6 +497,20 @@ struct i2c_client *i2c_acpi_new_device(struct device *dev, int index, } EXPORT_SYMBOL_GPL(i2c_acpi_new_device); +/** + * i2c_acpi_dev_name - Construct i2c device name for devs sourced from ACPI + * @adev: ACPI device to construct the name for + * + * Prefixes "i2c-" to the ACPI device name, for use in i2c_dev_set_name() and + * also anywhere else in the kernel that needs to refer to an i2c device by + * name but before they have been instantiated. + */ +char *i2c_acpi_dev_name(struct acpi_device *adev) +{ + return kasprintf(GFP_KERNEL, "i2c-%s", acpi_dev_name(adev)); +} +EXPORT_SYMBOL_GPL(i2c_acpi_dev_name); + #ifdef CONFIG_ACPI_I2C_OPREGION static int acpi_gsb_i2c_read_bytes(struct i2c_client *client, u8 cmd, u8 *data, u8 data_len) diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 56622658b215..ab0e505b2ca6 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -995,6 +995,7 @@ bool i2c_acpi_get_i2c_resource(struct acpi_resource *ares, u32 i2c_acpi_find_bus_speed(struct device *dev); struct i2c_client *i2c_acpi_new_device(struct device *dev, int index, struct i2c_board_info *info); +char *i2c_acpi_dev_name(struct acpi_device *adev); struct i2c_adapter *i2c_acpi_find_adapter_by_handle(acpi_handle handle); #else static inline bool i2c_acpi_get_i2c_resource(struct acpi_resource *ares, @@ -1011,6 +1012,10 @@ static inline struct i2c_client *i2c_acpi_new_device(struct device *dev, { return ERR_PTR(-ENODEV); } +static inline char *i2c_acpi_dev_name(struct acpi_device *adev) +{ + return NULL; +} static inline struct i2c_adapter *i2c_acpi_find_adapter_by_handle(acpi_handle handle) { return NULL;
Some places in the kernel allow users to map resources to a device using device name (for example, gpiod_lookup_table). Currently this involves waiting for the i2c_client to have been registered so we can use dev_name(&client->dev). Adding this function means that we can achieve the same thing without having to wait to the i2c device. Signed-off-by: Daniel Scally <djrscally@gmail.com> --- Changes since RFC v3: - Patch introduced drivers/i2c/i2c-core-acpi.c | 14 ++++++++++++++ include/linux/i2c.h | 5 +++++ 2 files changed, 19 insertions(+)