• Hans de Goede's avatar
    ACPI: delay enumeration of devices with a _DEP pointing to an INT3472 device · 9d9bcae4
    Hans de Goede authored
    The clk and regulator frameworks expect clk/regulator consumer-devices
    to have info about the consumed clks/regulators described in the device's
    fw_node.
    
    To work around cases where this info is not present in the firmware tables,
    which is often the case on x86/ACPI devices, both frameworks allow the
    provider-driver to attach info about consumers to the clks/regulators
    when registering these.
    
    This causes problems with the probe ordering wrt drivers for consumers
    of these clks/regulators. Since the lookups are only registered when the
    provider-driver binds, trying to get these clks/regulators before then
    results in a -ENOENT error for clks and a dummy regulator for regulators.
    
    One case where we hit this issue is camera sensors such as e.g. the OV8865
    sensor found on the Microsoft Surface Go. The sensor uses clks, regulators
    and GPIOs provided by a TPS68470 PMIC which is described in an INT3472
    ACPI device. There is special platform code handling this and setting
    platform_data with the necessary consumer info on the MFD cells
    instantiated for the PMIC under: drivers/platform/x86/intel/int3472.
    
    For this to work properly the ov8865 driver must not bind to the I2C-client
    for the OV8865 sensor until after the TPS68470 PMIC gpio, regulator and
    clk MFD cells have all been fully setup.
    
    The OV8865 on the Microsoft Surface Go is just one example, all X86
    devices using the Intel IPU3 camera block found on recent Intel SoCs
    have similar issues where there is an INT3472 HID ACPI-device, which
    describes the clks and regulators, and the driver for this INT3472 device
    must be fully initialized before the sensor driver (any sensor driver)
    binds for things to work properly.
    
    On these devices the ACPI nodes describing the sensors all have a _DEP
    dependency on the matching INT3472 ACPI device (there is one per sensor).
    
    This allows solving the probe-ordering problem by delaying the enumeration
    (instantiation of the I2C-client in the ov8865 example) of ACPI-devices
    which have a _DEP dependency on an INT3472 device.
    
    The new acpi_dev_ready_for_enumeration() helper used for this is also
    exported because for devices, which have the enumeration_by_parent flag
    set, the parent-driver will do its own scan of child ACPI devices and
    it will try to enumerate those during its probe(). Code doing this such
    as e.g. the i2c-core-acpi.c code must call this new helper to ensure
    that it too delays the enumeration until all the _DEP dependencies are
    met on devices which have the new honor_deps flag set.
    Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Link: https://lore.kernel.org/r/20211203102857.44539-2-hdegoede@redhat.com
    9d9bcae4
scan.c 67.1 KB