On Thu, Mar 16, 2023 at 10:06 PM Anshuman Khandual <anshuman.khandual@xxxxxxx> wrote: > > Allow other drivers to claim a device, disregarding the "priority" of > "arm,primecell". e.g., CoreSight ETM4x devices could be accessed via MMIO > (AMBA Bus) or via CPU system instructions. The OS can pick which one, use both, or this is a system integration time decision? > The CoreSight ETM4x platform > driver can now handle both types of devices. In order to make sure the > driver gets to handle the "MMIO based" devices, which always had the > "arm,primecell" compatible, we have two options : > > 1) Remove the "arm,primecell" from the DTS. But this may be problematic > for an older kernel without the support. > > 2) The other option is to allow OF code to "ignore" the arm,primecell > priority for a selected list of compatibles. This would make sure that > both older kernels and the new kernels work fine without breaking > the functionality. The new DTS could always have the "arm,primecell" > removed. 3) Drop patches 6 and 7 and just register as both AMBA and platform drivers. It's just some extra boilerplate. I would also do different compatible strings for CPU system instruction version (assuming this is an integration time decision). > > This patch implements Option (2). > > Cc: Rob Herring <robh+dt@xxxxxxxxxx> > Cc: Frank Rowand <frowand.list@xxxxxxxxx> > Cc: Russell King (Oracle) <linux@xxxxxxxxxxxxxxx> > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Cc: devicetree@xxxxxxxxxxxxxxx > Cc: linux-kernel@xxxxxxxxxxxxxxx > Co-developed-by: Suzuki Poulose <suzuki.poulose@xxxxxxx> > Signed-off-by: Suzuki Poulose <suzuki.poulose@xxxxxxx> > Signed-off-by: Anshuman Khandual <anshuman.khandual@xxxxxxx> > --- > drivers/of/platform.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/of/platform.c b/drivers/of/platform.c > index b2bd2e783445..59ff1a38ccaa 100644 > --- a/drivers/of/platform.c > +++ b/drivers/of/platform.c > @@ -325,6 +325,13 @@ static const struct of_dev_auxdata *of_dev_lookup(const struct of_dev_auxdata *l > return NULL; > } > > +static const struct of_device_id of_ignore_amba_table[] = { > +#ifdef CONFIG_CORESIGHT_SOURCE_ETM4X > + { .compatible = "arm,coresight-etm4x" }, > +#endif > + {} /* NULL terminated */ > +}; > + > /** > * of_platform_bus_create() - Create a device for a node and its children. > * @bus: device node of the bus to instantiate > @@ -373,7 +380,8 @@ static int of_platform_bus_create(struct device_node *bus, > platform_data = auxdata->platform_data; > } > > - if (of_device_is_compatible(bus, "arm,primecell")) { > + if (of_device_is_compatible(bus, "arm,primecell") && > + unlikely(!of_match_node(of_ignore_amba_table, bus))) { of_match_node is going to take orders of magnitude longer than any difference unlikely() would make. Drop it. > /* > * Don't return an error here to keep compatibility with older > * device tree files. > -- > 2.25.1 >