Message ID | 1531318288-23380-2-git-send-email-ramalingam.c@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 >
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 --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,