> -----Original Message----- > From: Dominique MARTINET <dominique.martinet@xxxxxxxxxxxxxxxxx> > Sent: 2021年4月19日 13:03 > To: Alice Guo (OSS) <alice.guo@xxxxxxxxxxx> > Subject: Re: [RFC v1 PATCH 3/3] driver: update all the code that use > soc_device_match > > Alice Guo (OSS) wrote on Mon, Apr 19, 2021 at 12:27:22PM +0800: > > From: Alice Guo <alice.guo@xxxxxxx> > > > > Update all the code that use soc_device_match > > A single patch might be difficult to accept for all components, a each maintainer > will probably want to have a say on their subsystem? > > I would suggest to split these for a non-RFC version; a this will really need to be > case-by-case handling. > > > because add support for soc_device_match returning -EPROBE_DEFER. > > (English does not parse here for me) > > I've only commented a couple of places in the code itself, but this doesn't seem > to add much support for errors, just sweep the problem under the rug. > > > Signed-off-by: Alice Guo <alice.guo@xxxxxxx> > > --- > > > > diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c index > > 5fae60f8c135..00c59aa217c1 100644 > > --- a/drivers/bus/ti-sysc.c > > +++ b/drivers/bus/ti-sysc.c > > @@ -2909,7 +2909,7 @@ static int sysc_init_soc(struct sysc *ddata) > > } > > > > match = soc_device_match(sysc_soc_feat_match); > > - if (!match) > > + if (!match || IS_ERR(match)) > > return 0; > > This function handles errors, I would recommend returning the error as is if > soc_device_match returned one so the probe can be retried later. > > > > > if (match->data) > > diff --git a/drivers/clk/renesas/r8a7795-cpg-mssr.c > > b/drivers/clk/renesas/r8a7795-cpg-mssr.c > > index c32d2c678046..90a18336a4c3 100644 > > --- a/drivers/clk/renesas/r8a7795-cpg-mssr.c > > +++ b/drivers/clk/renesas/r8a7795-cpg-mssr.c > > @@ -439,6 +439,7 @@ static const unsigned int r8a7795es2_mod_nullify[] > > __initconst = { > > > > static int __init r8a7795_cpg_mssr_init(struct device *dev) { > > + const struct soc_device_attribute *match; > > const struct rcar_gen3_cpg_pll_config *cpg_pll_config; > > u32 cpg_mode; > > int error; > > @@ -453,7 +454,8 @@ static int __init r8a7795_cpg_mssr_init(struct device > *dev) > > return -EINVAL; > > } > > > > - if (soc_device_match(r8a7795es1)) { > > + match = soc_device_match(r8a7795es1); > > + if (!IS_ERR(match) && match) { > > Same, return the error. > Assuming an error means no match will just lead to hard to debug problems > because the driver potentially assumed the wrong device when it's just not > ready yet. > > > cpg_core_nullify_range(r8a7795_core_clks, > > ARRAY_SIZE(r8a7795_core_clks), > > R8A7795_CLK_S0D2, R8A7795_CLK_S0D12); [...] > diff --git > > a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c index > > eaaec0a55cc6..13a06b613379 100644 > > --- a/drivers/iommu/ipmmu-vmsa.c > > +++ b/drivers/iommu/ipmmu-vmsa.c > > @@ -757,17 +757,20 @@ static const char * const devices_allowlist[] = > > { > > > > static bool ipmmu_device_is_allowed(struct device *dev) { > > + const struct soc_device_attribute *match1, *match2; > > unsigned int i; > > > > /* > > * R-Car Gen3 and RZ/G2 use the allow list to opt-in devices. > > * For Other SoCs, this returns true anyway. > > */ > > - if (!soc_device_match(soc_needs_opt_in)) > > + match1 = soc_device_match(soc_needs_opt_in); > > + if (!IS_ERR(match1) && !match1) > > I'm not sure what you intended to do, but !match1 already means there is no > error so the original code is identical. > > In this case ipmmu_device_is_allowed does not allow errors so this is one of the > "difficult" drivers that require slightly more thinking. > It is only called in ipmmu_of_xlate which does return errors properly, so in this > case the most straightforward approach would be to make > ipmmu_device_is_allowed return an int and forward errors as well. > I will reconsider the existing problems. Thank you for your advice > > ... > This is going to need quite some more work to be acceptable, in my opinion, but > I think it should be possible. > > Thanks, > -- > Dominique