On Mon, Nov 16, 2020 at 02:15:01PM +0000, Dan Scally wrote: > On 16/11/2020 14:10, Laurent Pinchart wrote: > > On Mon, Nov 16, 2020 at 03:57:17PM +0200, Andy Shevchenko wrote: > >> On Mon, Nov 16, 2020 at 10:53 AM Laurent Pinchart wrote: > >>> On Fri, Nov 13, 2020 at 09:45:00PM +0200, Andy Shevchenko wrote: > >>>> On Fri, Nov 13, 2020 at 6:22 PM Laurent Pinchart wrote: > >>>>> On Fri, Nov 13, 2020 at 10:02:30AM +0000, Dan Scally wrote: > >>>>>> On 29/10/2020 22:51, Laurent Pinchart wrote: > >>>>>>> On Fri, Oct 30, 2020 at 12:22:15AM +0200, Andy Shevchenko wrote: > >>>>>>>> On Thu, Oct 29, 2020 at 11:29:30PM +0200, Laurent Pinchart wrote: > >>>> ... > >>>> > >>>>>>>> In this case we probably need something like > >>>>>>>> > >>>>>>>> struct acpi_device * > >>>>>>>> acpi_dev_get_next_match_dev(struct acpi_device *adev, > >>>>>>>> const char *hid, const char *uid, s64 hrv) > >>>>>>>> { > >>>>>>>> struct device *start = adev ? &adev->dev : NULL; > >>>>>>>> ... > >>>>>>>> dev = bus_find_device(&acpi_bus_type, start, &match, acpi_dev_match_cb); > >>>>>>>> ... > >>>>>>>> } > >>>>>>>> > >>>>>>>> in drivers/acpi/utils.c and > >>>>>>>> > >>>>>>>> static inline struct acpi_device * > >>>>>>>> acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv) > >>>>>>>> { > >>>>>>>> return acpi_dev_get_next_match_dev(NULL, hid, uid, hrv); > >>>>>>>> } > >>>>>>>> > >>>>>>>> in include/linux/acpi.h. > >>>>>>>> > >>>>>>>> Then we may add > >>>>>>>> > >>>>>>>> #define for_each_acpi_dev_match(adev, hid, uid, hrv) \ > >>>>>>>> for (adev = acpi_dev_get_first_match_dev(hid, uid, hrv); \ > >>>>>>>> adev; \ > >>>>>>>> adev = acpi_dev_get_next_match_dev(adev, hid, uid, hrv)) > >>>>>>> What the cio2-bridge code needs is indeed > >>>>>>> > >>>>>>> for each hid in supported hids: > >>>>>>> for each acpi device that is compatible with hid: > >>>>>>> ... > >>>>>>> > >>>>>>> which could also be expressed as > >>>>>>> > >>>>>>> for each acpi device: > >>>>>>> if acpi device hid is in supported hids: > >>>>>>> ... > >>>>>>> > >>>>>>> I don't mind either option, I'll happily follow the preference of the > >>>>>>> ACPI maintainers. > >>>>>> Does this need raising elsewhere then? The original idea of just > >>>>>> bus_for_each_dev(&acpi_bus_type...) I have now tested and it works fine, > >>>>>> but it does mean that I need to export acpi_bus_type (currently that > >>>>>> symbol's not available)...that seems much simpler to me but I'm not sure > >>>>>> whether that's something to avoid, and if so whether Andy's approach is > >>>>>> better. > >>>>>> > >>>>>> Thoughts? > >>>>> I like simple options :-) A patch to export acpi_bus_type, with enough > >>>>> context in the commit message (and in the cover latter of the series), > >>>>> should be enough to provide all the information the ACPI maintainers > >>>>> need to decide which option is best. With a bit of luck that patch will > >>>>> be considered the best option and no extra work will be needed. > >>>> The problem with ACPI bus is that it is not as simple as other buses, > >>>> i.e. it may have purely ACPI devices along with *companion* devices, > >>>> which are usually represented by platform bus. On top of that for > >>>> several ACPI devices there can be one physical node and it will be not > >>>> so clear what you are exactly looking for by traversing acpi_bus_type. > >>>> I believe it's hidden on purpose. > >>> Maybe there's something I don't get, as I'm not very familiar with the > >>> ACPI implementation in the kernel, but the code in the cio2-bridge, > >>> unless I'm mistaken, is really interested in ACPI devices on the ACPI > >>> bus, not companions or other devices related to the ACPI devices. > >> AFAICS cio2-bridge wants to find ACPI companion devices which are > >> enumerated as platform ones (or I²C or SPI). > > I thought we were looking for ACPI devices, not companion devices, in > > order to extract information from the DSDT and store it in a software > > node. I could very well be wrong though. > This is correct - the code to fetch the various resources we're looking > at all uses acpi_device. Whether using Andy's iterator suggestions or > previous bus_for_each_dev(&acpi_bus_type...) I'm just getting the > acpi_device via to_acpi_dev() and using that. If you try to get an I²C ore SPI device out of pure ACPI device (with given APCI _HID) you will fail. So, it's not correct. You are retrieving companion devices, while they are still in the struct acpi_device. And don't ask me, why it's so. I wasn't designed that and didn't affect any decision made there. > >>> The > >>> iterators you have proposed above use bus_find_device() on > >>> acpi_bus_type, so I don't really see how they make a difference from a > >>> cio2-bridge point of view. > >> This seems to be true. The iterators have no means to distinguish > >> between companion devices and pure ACPI, for example. > >> For this one needs to call something like 'get first physical node' > >> followed by 'let's check that it has a companion and that the one we > >> have already got from ACPI bus iterator'. > >> > >>> Is your point that acpi_bus_type shouldn't be > >>> exported because it could then be misused by *other* drivers ? Couldn't > >>> those drivers then equally misuse the iterators ? > >> My point is that the ACPI bus type here is not homogenous. > >> And thus I think it was the reason behind hiding it. I might be > >> mistaken and you may ask ACPI maintainers for the clarification. > >> > >> In summary I think we are trying to solve a problem that has not yet > >> existed (devices with several same sensors). Do we have a DSDT of such > >> to look into? > > Not to my knowledge. -- With Best Regards, Andy Shevchenko