diff mbox

[RFC,1/3] component: alloc component_match without any comp to match

Message ID 1531318288-23380-2-git-send-email-ramalingam.c@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ramalingam C July 11, 2018, 2:11 p.m. UTC
If all the components associated to a component master is not added
to the component framework due to the HW capability or Kconfig
selection, component_match will be NULL at
component_master_add_with_match().

To avoid this, component_match_alloc() is added to the framework,
to allcoate the struct component_match with zero associated components.
Hence component master can be added with a component_match with zero
associated components.

This helps the component master bind call to get triggered always,
even if no component is registered for that particular master.

This is useful if we use the component master for waiting for few
components(features), only if they are registered, else proceed with
the normal flow.

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
 drivers/base/component.c  | 30 ++++++++++++++++++++++++++++++
 include/linux/component.h |  2 ++
 2 files changed, 32 insertions(+)

Comments

Daniel Vetter July 12, 2018, 8:21 a.m. UTC | #1
On Wed, Jul 11, 2018 at 07:41:26PM +0530, Ramalingam C wrote:
> If all the components associated to a component master is not added
> to the component framework due to the HW capability or Kconfig
> selection, component_match will be NULL at
> component_master_add_with_match().
> 
> To avoid this, component_match_alloc() is added to the framework,
> to allcoate the struct component_match with zero associated components.
> Hence component master can be added with a component_match with zero
> associated components.
> 
> This helps the component master bind call to get triggered always,
> even if no component is registered for that particular master.
> 
> This is useful if we use the component master for waiting for few
> components(features), only if they are registered, else proceed with
> the normal flow.

registered is a bit confusing here, I'd go with "supported by the
underlying hw". And maybe also explain that this is for big pci device
drivers where only some small/optional things are external components, so
different use-case from SoC drivers where the entire driver is always
built up from lots of small components.

When you submit this for real please also run script/get_maintainers.pl
for the full Cc: list.

> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>

Uh, don't do this, ever. I didn't put my s-o-b onto this patch. If you
want to credit me for the suggestion, use

Suggested-by: ...

s-o-b has legal meaning and is like signing a contract, you've just forged
my signature here. Same applies to reviewed-by tags btw.
-Daniel

> ---
>  drivers/base/component.c  | 30 ++++++++++++++++++++++++++++++
>  include/linux/component.h |  2 ++
>  2 files changed, 32 insertions(+)
> 
> diff --git a/drivers/base/component.c b/drivers/base/component.c
> index 8946dfee4768..007fb738263a 100644
> --- a/drivers/base/component.c
> +++ b/drivers/base/component.c
> @@ -312,6 +312,36 @@ static int component_match_realloc(struct device *dev,
>  }
>  
>  /*
> + * Allocate the match without any component_match_array elements.
> + *
> + * This function is useful when the component master might end up
> + * registering itself without any matching components.
> + */
> +void component_match_alloc(struct device *master,
> +	struct component_match **matchptr)
> +{
> +	struct component_match *match = *matchptr;
> +
> +	if (IS_ERR(match))
> +		return;
> +
> +	if (match)
> +		return;
> +
> +	match = devres_alloc(devm_component_match_release,
> +			     sizeof(*match), GFP_KERNEL);
> +	if (!match) {
> +		*matchptr = ERR_PTR(-ENOMEM);
> +		return;
> +	}
> +
> +	devres_add(master, match);
> +
> +	*matchptr = match;
> +}
> +EXPORT_SYMBOL(component_match_alloc);
> +
> +/*
>   * Add a component to be matched, with a release function.
>   *
>   * The match array is first created or extended if necessary.
> diff --git a/include/linux/component.h b/include/linux/component.h
> index e71fbbbc74e2..3f6b420a58f8 100644
> --- a/include/linux/component.h
> +++ b/include/linux/component.h
> @@ -37,6 +37,8 @@ void component_match_add_release(struct device *master,
>  	struct component_match **matchptr,
>  	void (*release)(struct device *, void *),
>  	int (*compare)(struct device *, void *), void *compare_data);
> +void component_match_alloc(struct device *master,
> +	struct component_match **matchptr);
>  
>  static inline void component_match_add(struct device *master,
>  	struct component_match **matchptr,
> -- 
> 2.7.4
>
Ramalingam C July 12, 2018, 8:53 a.m. UTC | #2
On Thursday 12 July 2018 01:51 PM, Daniel Vetter wrote:
> On Wed, Jul 11, 2018 at 07:41:26PM +0530, Ramalingam C wrote:
>> If all the components associated to a component master is not added
>> to the component framework due to the HW capability or Kconfig
>> selection, component_match will be NULL at
>> component_master_add_with_match().
>>
>> To avoid this, component_match_alloc() is added to the framework,
>> to allcoate the struct component_match with zero associated components.
>> Hence component master can be added with a component_match with zero
>> associated components.
>>
>> This helps the component master bind call to get triggered always,
>> even if no component is registered for that particular master.
>>
>> This is useful if we use the component master for waiting for few
>> components(features), only if they are registered, else proceed with
>> the normal flow.
> registered is a bit confusing here, I'd go with "supported by the
> underlying hw". And maybe also explain that this is for big pci device
> drivers where only some small/optional things are external components, so
> different use-case from SoC drivers where the entire driver is always
> built up from lots of small components.
>
> When you submit this for real please also run script/get_maintainers.pl
> for the full Cc: list.
sure.
>
>> Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
>> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> Uh, don't do this, ever. I didn't put my s-o-b onto this patch. If you
> want to credit me for the suggestion, use
>
> Suggested-by: ...
>
> s-o-b has legal meaning and is like signing a contract, you've just forged
> my signature here. Same applies to reviewed-by tags btw.

Since the idea is suggested by you, thought that its my responsibility
to give the credit. Sure got your point.

I will add Suggested-by: instead.

Thanks,
Ram.

> -Daniel
>
>> ---
>>   drivers/base/component.c  | 30 ++++++++++++++++++++++++++++++
>>   include/linux/component.h |  2 ++
>>   2 files changed, 32 insertions(+)
>>
>> diff --git a/drivers/base/component.c b/drivers/base/component.c
>> index 8946dfee4768..007fb738263a 100644
>> --- a/drivers/base/component.c
>> +++ b/drivers/base/component.c
>> @@ -312,6 +312,36 @@ static int component_match_realloc(struct device *dev,
>>   }
>>   
>>   /*
>> + * Allocate the match without any component_match_array elements.
>> + *
>> + * This function is useful when the component master might end up
>> + * registering itself without any matching components.
>> + */
>> +void component_match_alloc(struct device *master,
>> +	struct component_match **matchptr)
>> +{
>> +	struct component_match *match = *matchptr;
>> +
>> +	if (IS_ERR(match))
>> +		return;
>> +
>> +	if (match)
>> +		return;
>> +
>> +	match = devres_alloc(devm_component_match_release,
>> +			     sizeof(*match), GFP_KERNEL);
>> +	if (!match) {
>> +		*matchptr = ERR_PTR(-ENOMEM);
>> +		return;
>> +	}
>> +
>> +	devres_add(master, match);
>> +
>> +	*matchptr = match;
>> +}
>> +EXPORT_SYMBOL(component_match_alloc);
>> +
>> +/*
>>    * Add a component to be matched, with a release function.
>>    *
>>    * The match array is first created or extended if necessary.
>> diff --git a/include/linux/component.h b/include/linux/component.h
>> index e71fbbbc74e2..3f6b420a58f8 100644
>> --- a/include/linux/component.h
>> +++ b/include/linux/component.h
>> @@ -37,6 +37,8 @@ void component_match_add_release(struct device *master,
>>   	struct component_match **matchptr,
>>   	void (*release)(struct device *, void *),
>>   	int (*compare)(struct device *, void *), void *compare_data);
>> +void component_match_alloc(struct device *master,
>> +	struct component_match **matchptr);
>>   
>>   static inline void component_match_add(struct device *master,
>>   	struct component_match **matchptr,
>> -- 
>> 2.7.4
>>
diff mbox

Patch

diff --git a/drivers/base/component.c b/drivers/base/component.c
index 8946dfee4768..007fb738263a 100644
--- a/drivers/base/component.c
+++ b/drivers/base/component.c
@@ -312,6 +312,36 @@  static int component_match_realloc(struct device *dev,
 }
 
 /*
+ * Allocate the match without any component_match_array elements.
+ *
+ * This function is useful when the component master might end up
+ * registering itself without any matching components.
+ */
+void component_match_alloc(struct device *master,
+	struct component_match **matchptr)
+{
+	struct component_match *match = *matchptr;
+
+	if (IS_ERR(match))
+		return;
+
+	if (match)
+		return;
+
+	match = devres_alloc(devm_component_match_release,
+			     sizeof(*match), GFP_KERNEL);
+	if (!match) {
+		*matchptr = ERR_PTR(-ENOMEM);
+		return;
+	}
+
+	devres_add(master, match);
+
+	*matchptr = match;
+}
+EXPORT_SYMBOL(component_match_alloc);
+
+/*
  * Add a component to be matched, with a release function.
  *
  * The match array is first created or extended if necessary.
diff --git a/include/linux/component.h b/include/linux/component.h
index e71fbbbc74e2..3f6b420a58f8 100644
--- a/include/linux/component.h
+++ b/include/linux/component.h
@@ -37,6 +37,8 @@  void component_match_add_release(struct device *master,
 	struct component_match **matchptr,
 	void (*release)(struct device *, void *),
 	int (*compare)(struct device *, void *), void *compare_data);
+void component_match_alloc(struct device *master,
+	struct component_match **matchptr);
 
 static inline void component_match_add(struct device *master,
 	struct component_match **matchptr,