[PATCH 00/18] Add functionality to ipu3-cio2 driver allowing software_node connections to sensors on platforms designed for Windows

From: Daniel Scally
Date: Mon Nov 30 2020 - 08:33:04 EST


Hello all

Previous version:

https://lore.kernel.org/linux-media/20201019225903.14276-1-djrscally@xxxxxxxxx/

This series aims to add support for webcams on laptops with ACPI tables
designed for use with CIO2 on Windows. There are two main parts; the
first is extending the ipu3-cio2 driver to allow for patching the
firmware via software_nodes if endpoints aren't defined by ACPI. Patch #13
deals directly with that, all preceding patches are either supplemental
changes or incidental fixes along the way.

The second main part is a way to handle the unusual definition of resource
destined for the sensors in these ACPI tables; regulators and GPIO lines
that are supposed to be consumed by the sensor are lumped in the _CRS of
a dummy ACPI device upon which the sensor is dependent. Patch 18 defines a
new driver to handle those dummy devices and map the resources to the
sensor instead. 14-17 are supporting changes for that driver.

Changelogs mostly in the individual patches, but a broad summary:

- Altered fwnode_device_is_available() to return true if the
fwnode_handle doesn't implement that operation.
- Altered fwnode_graph_get_endpoint_by_id() to parse secondary
if no endpoint found on primary.
- Enforce parent->child ordering of software_nodes on registration
- Added a function to get the next ACPI device with matching _HID,
plus an iterator macro
- Altered cio2-bridge.c to store the bridge struct (and basically
everything else) in heap, plus removed the requirement to delay
ipu3-cio2 probe until after the i2c devices were instantiated.
Also now ensured we handle multiple sensors with the same _HID.
- Added a function to get devices _dependent_ on a given ACPI dev,
according to their _DEP entries.
- Added a function to explicitly construct the name of an I2C dev
created from an ACPI dev.
- Added a driver to handle the dummy ACPI devices discussed above.

Comments very welcome!

Dan Scally (1):
i2c: i2c-core-base: Use the new i2c_acpi_dev_name() in
i2c_set_dev_name()

Daniel Scally (16):
property: Return true in fwnode_device_is_available for node types
that do not implement this operation
property: Add support for calling fwnode_graph_get_endpoint_by_id()
for fwnode->secondary
software_node: Fix failure to put() and get() references to children
in software_node_get_next_child()
software_node: Enforce parent before child ordering of nodes array for
software_node_register_nodes()
software_node: Alter software_node_unregister_nodes() to unregister
the array in reverse order
software_node: amend software_node_unregister_node_group() to perform
unregistration of array in reverse order to be consistent with
software_node_unregister_nodes()
lib/test_printf.c: Use helper function to unwind array of
software_nodes
ipu3-cio2: Add T: entry to MAINTAINERS
ipu3-cio2: Rename ipu3-cio2.c to allow module to be built from
multiple source files retaining ipu3-cio2 name
media: v4l2-core: v4l2-async: Check possible match in match_fwnode
based on sd->fwnode->secondary
acpi: Add acpi_dev_get_next_match_dev() and macro to iterate through
acpi_devices matching a given _HID
ipu3-cio2: Add functionality allowing software_node connections to
sensors on platforms designed for Windows
acpi: utils: Add function to fetch dependent acpi_devices
i2c: i2c-core-acpi: Add i2c_acpi_dev_name()
gpio: gpiolib-acpi: Export acpi_get_gpiod()
ipu3: Add driver for dummy INT3472 ACPI device

Heikki Krogerus (1):
software_node: Add support for fwnode_graph*() family of functions

MAINTAINERS | 9 +
drivers/acpi/utils.c | 98 ++++-
drivers/base/property.c | 9 +
drivers/base/swnode.c | 157 +++++++-
drivers/gpio/gpiolib-acpi.c | 3 +-
drivers/i2c/i2c-core-acpi.c | 14 +
drivers/i2c/i2c-core-base.c | 2 +-
drivers/media/pci/intel/ipu3/Kconfig | 32 ++
drivers/media/pci/intel/ipu3/Makefile | 4 +
drivers/media/pci/intel/ipu3/cio2-bridge.c | 260 ++++++++++++
drivers/media/pci/intel/ipu3/cio2-bridge.h | 108 +++++
drivers/media/pci/intel/ipu3/int3472.c | 381 ++++++++++++++++++
drivers/media/pci/intel/ipu3/int3472.h | 96 +++++
.../ipu3/{ipu3-cio2.c => ipu3-cio2-main.c} | 27 ++
drivers/media/pci/intel/ipu3/ipu3-cio2.h | 6 +
drivers/media/v4l2-core/v4l2-async.c | 8 +
include/acpi/acpi_bus.h | 9 +
include/linux/acpi.h | 5 +
include/linux/i2c.h | 5 +
lib/test_printf.c | 4 +-
20 files changed, 1213 insertions(+), 24 deletions(-)
create mode 100644 drivers/media/pci/intel/ipu3/cio2-bridge.c
create mode 100644 drivers/media/pci/intel/ipu3/cio2-bridge.h
create mode 100644 drivers/media/pci/intel/ipu3/int3472.c
create mode 100644 drivers/media/pci/intel/ipu3/int3472.h
rename drivers/media/pci/intel/ipu3/{ipu3-cio2.c => ipu3-cio2-main.c} (98%)

--
2.25.1